Files
NewQuant/data/ analysis/Trend.ipynb

590 lines
649 KiB
Plaintext
Raw Normal View History

2025-09-16 09:59:38 +08:00
{
"cells": [
{
"cell_type": "code",
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
2025-11-07 16:26:00 +08:00
"end_time": "2025-10-24T03:21:42.760995Z",
"start_time": "2025-10-24T03:21:42.757939Z"
2025-09-16 09:59:38 +08:00
}
},
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
2025-11-07 16:26:00 +08:00
"\n",
2025-09-16 09:59:38 +08:00
"\n",
"import warnings\n",
"\n",
"# 忽略所有警告\n",
"warnings.filterwarnings(\"ignore\")\n",
"\n",
"# --- 0. Configure your file path ---\n",
"# Please replace 'your_futures_data.csv' with the actual path to your CSV file\n",
2025-11-07 16:26:00 +08:00
"file_path = 'D:/PyProject/NewQuant/data/data/KQ_m@SHFE_rb/KQ_m@SHFE_rb_min15.csv'\n",
2025-09-16 09:59:38 +08:00
"\n",
"sns.set(style='whitegrid')\n",
"plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签\n",
"plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号\n"
],
"outputs": [],
2025-11-07 16:26:00 +08:00
"execution_count": 4
2025-09-16 09:59:38 +08:00
},
{
"metadata": {
"ExecuteTime": {
2025-11-07 16:26:00 +08:00
"end_time": "2025-10-24T03:21:42.809313Z",
"start_time": "2025-10-24T03:21:42.770559Z"
2025-09-16 09:59:38 +08:00
}
},
"cell_type": "code",
"source": [
"\n",
"# --- 1. Data Loading and Preprocessing ---\n",
"def load_and_preprocess_data(file_path):\n",
" \"\"\"\n",
" Loads historical futures data and performs basic preprocessing.\n",
" Assumes data contains 'datetime', 'open', 'high', 'low', 'close', 'volume' columns.\n",
" \"\"\"\n",
" try:\n",
" df = pd.read_csv(file_path, parse_dates=['datetime'], index_col='datetime')\n",
" # Ensure data is sorted by time\n",
" df = df.sort_index()\n",
" # Check and handle missing values\n",
" initial_rows = len(df)\n",
" df.dropna(inplace=True)\n",
" if len(df) < initial_rows:\n",
" print(f\"Warning: Missing values found in data, deleted {initial_rows - len(df)} rows.\")\n",
"\n",
" # Check if necessary columns exist\n",
" required_columns = ['open', 'high', 'low', 'close', 'volume']\n",
" if not all(col in df.columns for col in required_columns):\n",
" raise ValueError(f\"CSV file is missing required columns. Please ensure it contains: {required_columns}\")\n",
"\n",
" print(f\"Successfully loaded {len(df)} rows of data.\")\n",
" print(\"First 5 rows of data:\")\n",
" print(df.head())\n",
" return df\n",
" except FileNotFoundError:\n",
" print(f\"Error: File '{file_path}' not found. Please check the path.\")\n",
" return None\n",
" except Exception as e:\n",
" print(f\"Error during data loading or preprocessing: {e}\")\n",
" return None\n",
"\n",
"\n",
"df_raw = load_and_preprocess_data(file_path)\n",
2025-11-07 16:26:00 +08:00
"# df_raw = df_raw[df_raw.index >= '2024-01-01']"
2025-09-16 09:59:38 +08:00
],
"id": "1638e05ca7ef1ac8",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2025-11-07 16:26:00 +08:00
"Successfully loaded 25470 rows of data.\n",
2025-09-16 09:59:38 +08:00
"First 5 rows of data:\n",
2025-11-07 16:26:00 +08:00
" open high low close volume open_oi \\\n",
"datetime \n",
"2020-12-31 14:45:00 4352.0 4400.0 4345.0 4388.0 213731.0 1221661.0 \n",
"2021-01-04 09:00:00 4356.0 4368.0 4309.0 4336.0 338332.0 1217327.0 \n",
"2021-01-04 09:15:00 4336.0 4342.0 4307.0 4318.0 144479.0 1197881.0 \n",
"2021-01-04 09:30:00 4318.0 4329.0 4312.0 4317.0 85679.0 1194567.0 \n",
"2021-01-04 09:45:00 4317.0 4338.0 4316.0 4338.0 66461.0 1194592.0 \n",
2025-09-24 23:14:14 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" close_oi underlying_symbol \n",
"datetime \n",
"2020-12-31 14:45:00 1217327.0 SHFE.rb2105 \n",
"2021-01-04 09:00:00 1197881.0 SHFE.rb2105 \n",
"2021-01-04 09:15:00 1194567.0 SHFE.rb2105 \n",
"2021-01-04 09:30:00 1194592.0 SHFE.rb2105 \n",
"2021-01-04 09:45:00 1198035.0 SHFE.rb2105 \n"
2025-09-24 23:14:14 +08:00
]
2025-09-20 00:04:51 +08:00
}
],
2025-11-07 16:26:00 +08:00
"execution_count": 5
2025-09-20 00:04:51 +08:00
},
{
"metadata": {
"ExecuteTime": {
2025-11-07 16:26:00 +08:00
"end_time": "2025-10-24T03:24:17.635202Z",
"start_time": "2025-10-24T03:24:13.559808Z"
2025-09-20 00:04:51 +08:00
}
},
"cell_type": "code",
2025-09-24 23:14:14 +08:00
"source": [
2025-11-07 16:26:00 +08:00
"from statsmodels.graphics.tsaplots import plot_acf\n",
2025-09-24 23:14:14 +08:00
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
2025-11-07 16:26:00 +08:00
"from pandas.plotting import autocorrelation_plot\n",
2025-09-24 23:14:14 +08:00
"\n",
2025-11-07 16:26:00 +08:00
"# --- 0. 环境设置 ---\n",
"# 设置matplotlib样式使其更美观\n",
"sns.set_style(\"darkgrid\")\n",
"plt.rcParams['figure.figsize'] = (18, 12)\n",
"plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签\n",
"plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号\n",
"\n",
"# --- 1. 准备数据与计算指标 ---\n",
"\n",
"\n",
"# 1.2 定义霍克斯过程计算函数\n",
"def calculate_hawkes_imbalance(df, lookback=60, alpha=0.8, beta=0.2):\n",
" \"\"\"\n",
" 在DataFrame上计算霍克斯过程强度和不均衡指标。\n",
" 这是一个向量化的近似实现,以提高效率。\n",
" \"\"\"\n",
" df['range'] = df['high'] - df['low']\n",
" df['mark'] = df['range'] * df['volume']\n",
"\n",
" # 定义事件类型\n",
" df['long_event_mark'] = np.where(df['close'] > df['open'], df['mark'], 0)\n",
" df['short_event_mark'] = np.where(df['close'] < df['open'], df['mark'], 0)\n",
"\n",
" # 创建衰减权重 (这是一个关键的向量化技巧)\n",
" # weights: [e^(-beta*59), e^(-beta*58), ..., e^(-beta*0)]\n",
" decay_weights = np.exp(-beta * np.arange(lookback - 1, -1, -1))\n",
2025-09-24 23:14:14 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" # 使用 rolling apply 来计算加权和\n",
" # .apply(lambda x: (x * decay_weights).sum()) 效率会低,直接矩阵乘法更快\n",
" def weighted_sum(marks):\n",
" return (marks * decay_weights).sum()\n",
"\n",
" print(\"正在计算霍克斯强度...\")\n",
" df['lambda_long'] = alpha * df['long_event_mark'].rolling(window=lookback).apply(weighted_sum, raw=True)\n",
" df['lambda_short'] = alpha * df['short_event_mark'].rolling(window=lookback).apply(weighted_sum, raw=True)\n",
"\n",
" # 计算不均衡指标\n",
" df['imbalance'] = df['lambda_long'] - df['lambda_short']\n",
"\n",
" return df.dropna()\n",
"\n",
"# 1.3 在df_raw上运行计算\n",
"df_analysis = calculate_hawkes_imbalance(df_raw.copy())\n",
"print(\"霍克斯不均衡指标计算完成。\")\n",
"\n",
"\n",
"# --- 2. 核心假设验证:自相关性分析 ---\n",
"print(\"\\n--- 核心假设验证:自相关性分析 ---\")\n",
"\n",
"ser = df_analysis['imbalance'].dropna()\n",
"\n",
"# 2. 计算 1-50 阶自相关系数Pearson\n",
"imbalance_series = df_analysis['imbalance'].dropna()\n",
"\n",
"# 绘制 1~50 阶自相关图\n",
"plt.figure(figsize=(12, 6))\n",
"plot_acf(\n",
" imbalance_series,\n",
" lags=50, # 计算 0~50 阶共51个点图中会显示1~50\n",
" alpha=0.05, # 95% 置信区间\n",
" title=\"Autocorrelation of Imbalance (Lags 150)\"\n",
")\n",
"plt.xlabel(\"Lag\")\n",
"plt.ylabel(\"Autocorrelation\")\n",
"plt.tight_layout()\n",
2025-09-24 23:14:14 +08:00
"plt.show()\n",
"\n",
2025-11-07 16:26:00 +08:00
"# --- 3. 统计属性与“政体”划分 ---\n",
"print(\"\\n--- 统计属性划分 ---\")\n",
2025-09-24 23:14:14 +08:00
"\n",
2025-11-07 16:26:00 +08:00
"# 3.1 描述性统计\n",
"print(\"Imbalance 指标的描述性统计:\")\n",
"print(df_analysis['imbalance'].describe())\n",
"\n",
"# 3.2 可视化 Imbalance 指标及其波动性\n",
"fig, axes = plt.subplots(3, 1, figsize=(18, 15), sharex=True)\n",
"\n",
"# 图1: Imbalance 指标本身\n",
"df_analysis['imbalance'].plot(ax=axes[0], color='purple', label='Imbalance')\n",
"axes[0].set_title('多空力量差 (Imbalance) 时间序列', fontsize=16)\n",
"axes[0].set_ylabel('Imbalance Value')\n",
"axes[0].legend()\n",
"\n",
"# 图2: Imbalance 指标的滚动标准差(波动性)\n",
"imbalance_volatility = df_analysis['imbalance'].rolling(window=50).std()\n",
"imbalance_volatility.plot(ax=axes[1], color='orange', label='Imbalance Volatility (Rolling Std)')\n",
"axes[1].set_title('Imbalance 指标的波动性', fontsize=16)\n",
"axes[1].set_ylabel('Volatility')\n",
"axes[1].legend()\n",
"\n",
"\n",
"# 图3: 对应的价格序列(示例用指数或标的收盘价)\n",
"# 假设你已有价格列,名为 'close';若没有,替换成你的实际列名\n",
"df_analysis['close'].plot(ax=axes[2], color='black', label='Close Price')\n",
"axes[2].set_title('标的收盘价(对照)', fontsize=16)\n",
"axes[2].set_ylabel('Price')\n",
"axes[2].set_xlabel('Date')\n",
"axes[2].legend()\n",
"\n",
"plt.tight_layout()\n",
"plt.show()\n",
"\n"
2025-09-24 23:14:14 +08:00
],
2025-11-07 16:26:00 +08:00
"id": "5e9912a53438b337",
2025-09-20 00:04:51 +08:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2025-11-07 16:26:00 +08:00
"正在计算霍克斯强度...\n",
"霍克斯不均衡指标计算完成。\n",
2025-09-20 00:04:51 +08:00
"\n",
2025-11-07 16:26:00 +08:00
"--- 核心假设验证:自相关性分析 ---\n"
2025-09-24 23:14:14 +08:00
]
},
{
"data": {
"text/plain": [
2025-11-07 16:26:00 +08:00
"<Figure size 1200x600 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data",
"jetTransient": {
"display_id": null
}
},
{
"data": {
"text/plain": [
"<Figure size 1800x1200 with 1 Axes>"
2025-09-24 23:14:14 +08:00
],
2025-11-07 16:26:00 +08:00
"image/png": "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
2025-09-24 23:14:14 +08:00
},
"metadata": {},
2025-11-07 16:26:00 +08:00
"output_type": "display_data",
"jetTransient": {
"display_id": null
}
2025-09-24 23:14:14 +08:00
},
{
"name": "stdout",
"output_type": "stream",
"text": [
2025-09-20 00:04:51 +08:00
"\n",
2025-11-07 16:26:00 +08:00
"--- 统计属性划分 ---\n",
"Imbalance 指标的描述性统计:\n",
"count 2.541100e+04\n",
"mean -2.705202e+05\n",
"std 5.733969e+06\n",
"min -1.154640e+08\n",
"25% -1.507793e+06\n",
"50% -2.646948e+04\n",
"75% 1.376979e+06\n",
"max 1.414831e+08\n",
"Name: imbalance, dtype: float64\n"
2025-09-24 23:14:14 +08:00
]
},
{
"data": {
"text/plain": [
2025-11-07 16:26:00 +08:00
"<Figure size 1800x1500 with 3 Axes>"
2025-09-24 23:14:14 +08:00
],
2025-11-07 16:26:00 +08:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABvgAAAXLCAYAAAD5srvsAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Qd8FGX+x/EnIfQixYrYFQR7A3vvevbey3mWU0/vvDu94t87+xXPXrA37CIIKqgodkSKglRBQUCQ3qUk+b++TzLJs7MzszObTbKbfN6vV16BJLs7uzs788zze36/X1F5eXm5AQAAAAAAAAAAAFAQiut7AwAAAAAAAAAAAADER4APAAAAAAAAAAAAKCAE+AAAAAAAAAAAAIACQoAPAAAAAAAAAAAAKCAE+AAAAAAAAAAAAIACQoAPAAAAAAAAAAAAKCAE+AAAAAAAAAAAAIACQoAPAAAAAAAAAAAAKCAE+AAAAADEtmLFCl4tAAAAAADqGQE+AAAAoIFYtmyZmTBhQq3c9+rVq80111xj9tlnHzN37tyc3W9paam5/vrrzT333GO3P1tr165N/KXHTrKdjz76aOhzv//++81nn32W9fYDtW3cuHHm+OOPN3fddVfo35SXl5vHH3/cnHPOOWbVqlV19qYMHTrUnHvuuebee+81denTTz81Tz31lJkyZUqdPi4AAACQCyU5uRcAAAAA9aqsrMz89a9/Ne+//77p06eP2XHHHXN6/82aNbMT/srge+6558y1116bk/tt0qSJ6d+/v93+K664Iqv7WLp0qdl9990T365Hjx6mb9++sf72ww8/NP/5z3/MF198YQMgLgUme/fubYqLi+39bbHFFqY2KQijQMipp55qOnfuXKuPheQUZNd+csEFF+TVy6egtrZN+32YoqIi880335jhw4ebm2++2dxyyy3259qvR48ebY8D+szq78KceOKJpmvXrom2rWXLlubLL780ixcvNldffXXGv1+wYIH597//bZo3b24/d1GfFT3vFi1a2OOj36BBg8xLL71kNt54Y7PVVlsl2mYAAACgvhHgAwAAAAqcsutuuOEG884779jJ9datW0dmpGy22WampCT5pcDvfvc7M3LkSLN8+XKTS5qkV9CgadOmWd1ewQE57bTTzB//+MdYtznjjDOqbhfHIYccYg477DAzZMgQM2rUKLPLLrtU/e7VV1+1wc//+7//q/XgnigD64knnjC77rorAb48NGbMGHP77bfb/ev000/P6X0r+KbgYdjn+ogjjgi9rYJzkulzduutt5qxY8eaV155xfTs2dMcd9xx9nP/xhtvRAb4fvnlF/vVq1evtADfiBEjzLRp00IfUwF+bdekSZPMiy++WLWtCtApe3bNmjU2UHfAAQeYzTff3P57xowZNnCnAJ/+/8knn9jj2r777ptyv/pd27ZtAx9Xt5ew3wMAAAD5jAAfAAAAUMCmT59ug1rKrvEybaKy0k444QRz5513Bv7uz3/+s53Ez+TZZ5+1X2Guu+46c8kll5i4FDBQkC9bmtTXJL8CEq+99lqs2yhosOeee4b+Xq+DAhJeQEM6duxo9t9/f5vdpC/PM888YwMFS5YssZl8XlBCQT8FR3KZGaSMo8cee8y+h/vtt1/a74cNG2bOO+88G5iJeo/ieP31123g+KabbjJnnnlmje4rzuMoKHbSSSeZQqfMyvnz59sMuO7du+c0m1bB5f/+97+Bvzv88MMjA3xepltU9p20adPG/OUvf7EZb8qOFT0XfUW57777bKlaLzjn0jFJn0/dd9jiAi1MkP/9738pP/eCe/racMMNbYBv/fXXT9m/x48fbwN8W2+9tXnkkUcC73/OnDm29Kg+q2+++ab9mbet3mMDAAAAhYQAHwAAAFCANNmt0nIqG7nOOuvYye4ddtghMCtNWT/nn3++2W677SIn6b1slqOOOspstNFGWQUf9NWqVavEt40qs5eJgmnK1Dn77LPNjTfeGOs2xx57rH0Nw7z33nvmo48+soFHf8Diq6++soEPBSu810z/9gIO2hZ9rVy50mb65SrAt2jRIvv81KtMgUPkr8suu8xm8qm/pErQZpMxG8S7HzcYqkw2ZZgqA05BZQXE9HcKTOtzpS8F9bxAtf6vrF99ad/29u9//OMfdh+77bbb7P2p36a3fycRFODzsgbvvvvuwMB0LvoLyk477RT6N8rS04IIleMEAAAAGgICfAAAAECB+fjjj21WlSb2Fej529/+ZkvoHXzwwTbgp4l5z6effmp7Wm2zzTbm4YcfDpx893iZPcrWUpk9UcBOAap27dql/b2CWG5gThk8+nu/2bNn2+31suG8gINHZf0UbFPmXxQ9h0svvTTt5wqkyfPPP2+/4lLAM4wykcI88MADtgfeQw89ZDPl6ooyk5RpdM0119TZYyJ7CsYec8wxtoSrSsLmQlSgUJ+tF154wQb/oqhHp77kX//6lzn++OOrymhOnDjR3HHHHfb/+pwqSBlFWa1xAmbednufey1O+Pnnn6sCkXEC8lH9JtW/T7bcckt7vHEp+O4G42uSLQwAAADkEwJ8AAAAQIHZY489bADulltuMXvttZf92fbbb2822WQTGwBTiTtlyTz44IPm0UcftX2r1LctU2adsn9cQ4cONVdddZVZb731bEDLDYipVKQCASp5pz5jmkBXhowm+/0T9itWrLBBSS9byM0mEmUcKQvv888/D9wuZRqp/KVKEHoUEJw7d66drNfE/ddff52x9GAQbZu+tD0dOnRI+Z36GKpMpx7DvW89F/1fvQg/++yzlNuoPKe2Tdu8++67p91ntnR/ChQpWJtNhiTq3gYbbGBOPvlk89xzz9VZgE/Hgd/85jeBGXwLFy40Tz75pNl5553t8UH7lILmHu1X+jsvALZ48WJzyimnRG7PWWedZXtPxt1ub0HAW2+9ZTOLo3r66TOvbfQy88ICfFogoN6YouCmP8Cp46TKpnqPHSegCAAAABQCAnwAAABAgVFAS2X0XArCPfHEE+aCCy6wGV76v8pI/u53v7NBvzjBL/Xy++1vf2vWXXddGxhUoFCBNwUEdH8uBb4UAFAGkDLZVAJUj60vP2XVfPvtt4GPqSweBRvUO8vri+XXr18/86c//SklWKYsHZURdEVlJwZRYFEBOVEg49Zbb035vYKY99xzT2QZxijKUspVgE9lQRVQPProo3Nyf6gbv/rVr8xTTz1lfvzxRxuArynvc6zPn/YJmTdvnv2uAJaCyvoKooC1AnwK1F955ZWBZTTdjFyv3K8C6wr0+z+3F198cewSnt79et+ffvrptN6R6leoTGFl5GpBgXpb6vOjbd1tt91C71t9NxUMPOigg2z/Sc+AAQPs79SzDwAAAGiICPABAAAABU5BqgkTJpjBgwfbrDYFART82nTTTc1jjz1mS2wedthhGe9H5fbmz59vLrroIluur3379ra0pnry+SlLSFkxCu6p3J9KWqoHnQKEyurxem5l4pXT23DDDUP/RoEtUa9BNztKWUDKDNJj6XvSPmcKXipDSIG+oKw4PT+9bgpieM9H2XsqiXrFFVfYzMWg+/T673Xp0sXkytixY+372KlTp6zvw+vVduKJJ9pgkwIoytZSJqZ+p6CKXgtlCaqfoUfPR73TlEGoQEq3bt1swGf//fdPewzth8ocValWBZiVdaUSkBdeeGHiAKx/H1AAe+DAgeann36y+6b6G1577bVms802q/q7119/3dxwww02i2vHHXc0//73v+2+rH1DpWv/+te/2v3c9eGHH9qAtoLQeq+V1XbJJZcEPj/1etPzGz58uN2mLbbYwgaVtK8EUUad9i2VusxlgE/ldvUV9DtRLz3tg9n00vR4nycF3bp27ZryO+/zkjQbLugzqtdSCwO0r+h17927tw0g6nXV50yZwWG0j+kYJNon3SxjHR/EzVIEAAAAGhICfAAAAECBUWm7mTNn2owcBX5UnnLBggV2glxBJwUblBHz5z//2QaZlEGXiQJdf/nLX2wARQGdvffe2wZ+FEgLo+wa3UbBoJtvvtkGv5RZqGC
2025-09-24 23:14:14 +08:00
},
"metadata": {},
2025-11-07 16:26:00 +08:00
"output_type": "display_data",
"jetTransient": {
"display_id": null
}
2025-09-20 00:04:51 +08:00
}
],
2025-11-07 16:26:00 +08:00
"execution_count": 8
2025-09-20 00:04:51 +08:00
},
{
"metadata": {
"ExecuteTime": {
2025-11-07 16:26:00 +08:00
"end_time": "2025-10-24T03:21:51.101709Z",
"start_time": "2025-10-24T03:21:46.932013Z"
2025-09-16 09:59:38 +08:00
}
},
"cell_type": "code",
"source": [
2025-11-07 16:26:00 +08:00
"# ==============================================================================\n",
"# 注意:此代码块是独立的,需要先运行您提供的前半部分代码\n",
"# 以获得 df_analysis DataFrame\n",
"# ==============================================================================\n",
"from statsmodels.graphics.tsaplots import plot_acf\n",
2025-09-16 09:59:38 +08:00
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
2025-11-07 16:26:00 +08:00
"import seaborn as sns\n",
"from pandas.plotting import autocorrelation_plot\n",
"\n",
"# --- 0. 环境设置 ---\n",
"# 设置matplotlib样式使其更美观\n",
"sns.set_style(\"darkgrid\")\n",
"plt.rcParams['figure.figsize'] = (18, 12)\n",
"plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签\n",
"plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号\n",
"\n",
"# --- 1. 准备数据与计算指标 ---\n",
"# 假设您已经有了一个名为 df_raw 的 DataFrame\n",
"# df_raw = pd.read_csv('your_data.csv', index_col='datetime', parse_dates=True) # 示例加载方式\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
"# 1.2 定义霍克斯过程计算函数\n",
"def calculate_hawkes_imbalance(df, lookback=60, alpha=0.8, beta=0.2):\n",
2025-09-24 23:14:14 +08:00
" \"\"\"\n",
2025-11-07 16:26:00 +08:00
" 在DataFrame上计算霍克斯过程强度和不均衡指标。\n",
" 这是一个向量化的近似实现,以提高效率。\n",
2025-09-16 09:59:38 +08:00
" \"\"\"\n",
2025-11-07 16:26:00 +08:00
" df['range'] = df['high'] - df['low']\n",
" df['mark'] = df['range'] * df['volume']\n",
2025-09-24 23:14:14 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" # 定义事件类型\n",
" df['long_event_mark'] = np.where(df['close'] > df['open'], df['mark'], 0)\n",
" df['short_event_mark'] = np.where(df['close'] < df['open'], df['mark'], 0)\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" # 创建衰减权重\n",
" decay_weights = np.exp(-beta * np.arange(lookback - 1, -1, -1))\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" def weighted_sum(marks):\n",
" return (marks * decay_weights).sum()\n",
2025-09-24 23:14:14 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" print(\"正在计算霍克斯强度...\")\n",
" df['lambda_long'] = alpha * df['long_event_mark'].rolling(window=lookback).apply(weighted_sum, raw=True)\n",
" df['lambda_short'] = alpha * df['short_event_mark'].rolling(window=lookback).apply(weighted_sum, raw=True)\n",
2025-09-24 23:14:14 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" # 计算不均衡指标\n",
" df['imbalance'] = df['lambda_long'] - df['lambda_short']\n",
2025-09-24 23:14:14 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" return df.dropna()\n",
2025-09-16 09:59:38 +08:00
"\n",
"\n",
2025-11-07 16:26:00 +08:00
"# --- [之前代码的 Section 2 & 3] ---\n",
"# ... (此处省略您已有的自相关性分析和统计属性图,以便聚焦于新内容) ...\n",
2025-09-16 09:59:38 +08:00
"\n",
"\n",
2025-11-07 16:26:00 +08:00
"# --- 4. 不均衡变化率 (动能“加速度”) 分析 ---\n",
"print(\"\\n--- 4. 不均衡变化率 (动能“加速度”) 分析 ---\")\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
"# 4.1 计算变化率\n",
"# 我们使用简单的差分来表示变化率,它直接反映了动能的增减量\n",
"df_analysis['imbalance_change'] = df_analysis['imbalance'].diff()\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
"# 4.2 描述性统计\n",
"print(\"Imbalance 变化率的描述性统计:\")\n",
"print(df_analysis['imbalance_change'].describe())\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
"# 4.3 绘制变化率的自相关图\n",
"plt.figure(figsize=(12, 6))\n",
"plot_acf(\n",
" df_analysis['imbalance_change'].dropna(),\n",
" lags=50,\n",
" alpha=0.05,\n",
" title=\"多空力量差变化率 (加速度) 的自相关性\"\n",
")\n",
"plt.xlabel(\"Lag\")\n",
"plt.ylabel(\"Autocorrelation\")\n",
"plt.tight_layout()\n",
"plt.show()\n",
2025-09-16 09:59:38 +08:00
"\n",
"\n",
2025-11-07 16:26:00 +08:00
"# --- 5. 极端不均衡事件后的市场行为分析 (Event Study) ---\n",
"print(\"\\n--- 5. 极端不均衡事件后的市场行为分析 ---\")\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
"# 5.1 定义“异常值”或“极端事件”\n",
"# 我们使用滚动标准差来定义动态阈值\n",
"rolling_window = 250 # 定义计算统计量的滚动窗口\n",
"std_multiplier = 2.0 # 定义几倍标准差之外为“极端”\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
"df_analysis['imbalance_mean'] = df_analysis['imbalance'].rolling(window=rolling_window).mean()\n",
"df_analysis['imbalance_std'] = df_analysis['imbalance'].rolling(window=rolling_window).std()\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
"df_analysis['upper_band'] = df_analysis['imbalance_mean'] + std_multiplier * df_analysis['imbalance_std']\n",
"df_analysis['lower_band'] = df_analysis['imbalance_mean'] - std_multiplier * df_analysis['imbalance_std']\n",
2025-09-24 23:14:14 +08:00
"\n",
2025-11-07 16:26:00 +08:00
"# 找到所有极端事件发生的时刻点 (index)\n",
"positive_anomaly_indices = df_analysis[df_analysis['imbalance'] > df_analysis['upper_band']].index\n",
"negative_anomaly_indices = df_analysis[df_analysis['imbalance'] < df_analysis['lower_band']].index\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
"print(f\"在 {len(df_analysis)} 个数据点中,共发现 {len(positive_anomaly_indices)} 个正向极端事件,{len(negative_anomaly_indices)} 个负向极端事件。\")\n",
2025-09-16 09:59:38 +08:00
"\n",
"\n",
2025-11-07 16:26:00 +08:00
"# 5.2 提取事件窗口并进行平均\n",
"def get_event_study_trajectories(df, event_indices, pre_event_bars=10, post_event_bars=50):\n",
" \"\"\"\n",
" 对所有事件发生前后的数据进行提取、对齐和平均。\n",
" \"\"\"\n",
" imbalance_trajectories = []\n",
" price_trajectories_norm = [] # 价格走势(归一化)\n",
"\n",
" for idx in event_indices:\n",
" # 获取事件在DataFrame中的整数位置\n",
" loc = df.index.get_loc(idx)\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" # 确保窗口不越界\n",
" if loc < pre_event_bars or loc + post_event_bars + 1 > len(df):\n",
" continue\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" # 提取imbalance和价格的窗口\n",
" imbalance_window = df['imbalance'].iloc[loc - pre_event_bars : loc + post_event_bars + 1].values\n",
" price_window = df['close'].iloc[loc - pre_event_bars : loc + post_event_bars + 1].values\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" # 将价格窗口以事件发生点(t=0)的价格进行归一化,以便比较\n",
" normalized_price_window = price_window / price_window[pre_event_bars]\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" imbalance_trajectories.append(imbalance_window)\n",
" price_trajectories_norm.append(normalized_price_window)\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" if not imbalance_trajectories: # 如果没有找到任何有效的事件\n",
" return None, None\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" # 计算所有事件窗口的平均轨迹\n",
" avg_imbalance_traj = np.mean(np.array(imbalance_trajectories), axis=0)\n",
" avg_price_traj = np.mean(np.array(price_trajectories_norm), axis=0)\n",
"\n",
" return avg_imbalance_traj, avg_price_traj\n",
"\n",
"# 5.3 分别对正向和负向事件进行分析\n",
"pre_bars, post_bars = 10, 50\n",
"pos_avg_imbalance, pos_avg_price = get_event_study_trajectories(df_analysis, positive_anomaly_indices, pre_bars, post_bars)\n",
"neg_avg_imbalance, neg_avg_price = get_event_study_trajectories(df_analysis, negative_anomaly_indices, pre_bars, post_bars)\n",
"\n",
"\n",
"# 5.4 可视化分析结果\n",
"if pos_avg_imbalance is not None and neg_avg_imbalance is not None:\n",
" fig, axes = plt.subplots(2, 2, figsize=(20, 12))\n",
" x_axis = np.arange(-pre_bars, post_bars + 1)\n",
"\n",
" # --- 正向事件图 ---\n",
" # Imbalance 轨迹\n",
" axes[0, 0].plot(x_axis, pos_avg_imbalance, color='r', marker='o', markersize=3, label='平均Imbalance轨迹')\n",
" axes[0, 0].axvline(0, color='grey', linestyle='--', lw=2, label='事件发生点 (t=0)')\n",
" axes[0, 0].set_title('正向极端事件后,多空力量差的平均走势', fontsize=16)\n",
" axes[0, 0].set_xlabel('事件发生后的K线数')\n",
" axes[0, 0].set_ylabel('Imbalance')\n",
" axes[0, 0].grid(True)\n",
" axes[0, 0].legend()\n",
"\n",
" # 价格轨迹\n",
" axes[0, 1].plot(x_axis, pos_avg_price, color='g', marker='o', markersize=3, label='平均价格轨迹 (归一化)')\n",
" axes[0, 1].axvline(0, color='grey', linestyle='--', lw=2, label='事件发生点 (t=0)')\n",
" axes[0, 1].set_title('正向极端事件后,价格的平均走势', fontsize=16)\n",
" axes[0, 1].set_xlabel('事件发生后的K线数')\n",
" axes[0, 1].set_ylabel('归一化价格 (t=0 时价格为 1.0)')\n",
" axes[0, 1].grid(True)\n",
" axes[0, 1].legend()\n",
"\n",
" # --- 负向事件图 ---\n",
" # Imbalance 轨迹\n",
" axes[1, 0].plot(x_axis, neg_avg_imbalance, color='b', marker='o', markersize=3, label='平均Imbalance轨迹')\n",
" axes[1, 0].axvline(0, color='grey', linestyle='--', lw=2, label='事件发生点 (t=0)')\n",
" axes[1, 0].set_title('负向极端事件后,多空力量差的平均走势', fontsize=16)\n",
" axes[1, 0].set_xlabel('事件发生后的K线数')\n",
" axes[1, 0].set_ylabel('Imbalance')\n",
" axes[1, 0].grid(True)\n",
" axes[1, 0].legend()\n",
"\n",
" # 价格轨迹\n",
" axes[1, 1].plot(x_axis, neg_avg_price, color='m', marker='o', markersize=3, label='平均价格轨迹 (归一化)')\n",
" axes[1, 1].axvline(0, color='grey', linestyle='--', lw=2, label='事件发生点 (t=0)')\n",
" axes[1, 1].set_title('负向极端事件后,价格的平均走势', fontsize=16)\n",
" axes[1, 1].set_xlabel('事件发生后的K线数')\n",
" axes[1, 1].set_ylabel('归一化价格 (t=0 时价格为 1.0)')\n",
" axes[1, 1].grid(True)\n",
" axes[1, 1].legend()\n",
2025-09-16 09:59:38 +08:00
"\n",
2025-11-07 16:26:00 +08:00
" plt.tight_layout()\n",
" plt.show()\n",
2025-09-16 09:59:38 +08:00
"else:\n",
2025-11-07 16:26:00 +08:00
" print(\"未能找到足够的极端事件来进行分析,请尝试调整滚动窗口或标准差乘数。\")"
2025-09-16 09:59:38 +08:00
],
2025-11-07 16:26:00 +08:00
"id": "74ce3e38952410bb",
2025-09-16 09:59:38 +08:00
"outputs": [
2025-09-24 23:14:14 +08:00
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
2025-11-07 16:26:00 +08:00
"--- 4. 不均衡变化率 (动能“加速度”) 分析 ---\n",
"Imbalance 变化率的描述性统计:\n",
"count 2.541000e+04\n",
"mean 4.140188e+01\n",
"std 3.320329e+06\n",
"min -1.144125e+08\n",
"25% -7.201627e+05\n",
"50% -1.921090e+04\n",
"75% 7.054544e+05\n",
"max 9.373021e+07\n",
"Name: imbalance_change, dtype: float64\n"
2025-09-24 23:14:14 +08:00
]
},
2025-09-16 09:59:38 +08:00
{
"data": {
"text/plain": [
2025-11-07 16:26:00 +08:00
"<Figure size 1200x600 with 0 Axes>"
]
2025-09-16 09:59:38 +08:00
},
"metadata": {},
2025-11-07 16:26:00 +08:00
"output_type": "display_data",
"jetTransient": {
"display_id": null
}
2025-09-16 09:59:38 +08:00
},
{
"data": {
"text/plain": [
2025-11-07 16:26:00 +08:00
"<Figure size 1800x1200 with 1 Axes>"
2025-09-16 09:59:38 +08:00
],
2025-11-07 16:26:00 +08:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABvgAAASgCAYAAAA99k/BAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAimhJREFUeJzs3Ql4nGW5N/AnabqXbqyttlWgIksrZSmLrIWjgCKCyFG/43bQA7Ipigvo4QCyuiAqIgcXEJCPTwFRlrIjolQoa1kKoiCLRaC02JaWlib5rvuFCZM0SZM0yeTJ/H7XNVdm3jcz7zpPJu9/7uepaWxsbEwAAAAAAABAFmorvQIAAAAAAABAxwn4AAAAAAAAICMCPgAAAAAAAMiIgA8AAAAAAAAyIuADAAAAAACAjAj4AAAAAAAAICMCPgAAAAAAAMiIgA8AAAAAAAAyIuADAAAAAACAjAj4AACAXvfXv/41Pfvss/Z8SmnFihX2AwAAAJ0i4AMAADrssssuS3fdddca7bF//etf6cADD0w/+tGPuvwa3/zmN9MhhxySKuG5555L11133SrT//d//zc988wznXqt//mf/0mf/vSnO70Os2fPTosWLWp6/OSTT6abb745dcVLL72Uvvvd73Z63TvjL3/5yyrTYnk33XRTWrx4cZdes7Gxsc15++yzT3rsscc6/Zovvvhi+uhHP5ruv//+1QbU7S2/s/7+97+n+vr6VpfT2QA4zoOTTjopvfDCC5163vHHH5/OPvvsTj2nreUvX7682bS//e1v6ZZbbmn3ebH911xzTXr++edbnR/nS+wnAADgdQI+AACgQ2bNmpVOOeWUTgcHLY0aNSr9+7//exFKtRZqdMQrr7yS5s2b16nnbLbZZuk973lP2m+//dq8TZkyJf3mN79p93X++Mc/pmOOOaZZgBThw5lnnpn+8Ic/tPqcV199Nb322mupoaGh2fTtttsu3X333asEYPF7Eey0DEpCBEtf/epX0xe/+MWmabHcCAs7st9WrlzZbNqIESPSxRdfnK666qpV1iGW39o6dMavf/3r9IUvfGGVY/3II4+kww8/vAh8O+tLX/pSOuOMM4r7EQjFuRQVoaVbhLBxnpYeRzDUMsCM7Yt9UX4bM2ZM8bxf/epXzaYvXbq0WRB56qmnprPOOit1lzifvvGNb6wyPd5v/+f//J9OvdZDDz2Urr322jR27NhOPS/244IFC5oeRwC/ySabtHmLc7ql2EfHHntsOu2005pN/93vfpeOOuqoIuhrS5wfcU4/+uijTdOWLVvWdP+cc85Jp59+eqe2CQAA+rO6Sq8AAADQ911//fXpK1/5SnFRP8KVuJUbMGBAERJttdVWzaZ/6EMfKgKH9kK3lnbdddd03nnntbs+sbwhQ4Z0ahsGDx6cdtlll/TWt761zd+J5cbvtfTUU08VwVpdXV3afvvt0xZbbJGefvrpNHz48GL+T37yk/SOd7yjWPcIlCKsiPVbf/31i/kf+9jH0sMPP9zmcvfdd99Wp7/3ve9NP/jBD1apkIpwM5ZZMmjQoFRb2/z7m/E766yzTjGvfDkR5AwdOrTYhyHWNX7nF7/4RXEriYAxApYI4Y488sjUFXPnzi2CsF/+8pdNyyuJxzU1NWmDDTbo9OtOnTq1CFT/67/+K/34xz9OV1xxRbPtjEDu85//fNM+iXB10003TZdeemnT73z2s58twtrWxDG8/PLLm01717veVQR/4Tvf+U768Ic/nKZNm5Z22223tKaeeOKJdOihhzabFttwzz33pP/+7/9u97kRwEblYXnV35Zbbpn++c9/tvr7b3nLW4r93lLsq/JjNHDgwOKcjv1b7oEHHiiCuHgvtLTWWmsV7cTXv/71tNdeexXvlQhSI+D7yEc+kjbaaKM2tyOWV/4zRGVpnMcR7sX7srX3JgAAVCsBHwAA0KboBjICmqjuiqApLviPGzeuaX5URUV49clPfnKVcC9EyBUhVYQtpTCpZdBTLirTWl7Ej6qgmBaBQnmI1d7rtCUCiKjSakvLkKzk6KOPLoKT8hApgowIYeI1Sz74wQ8WQWBs5957791UyRTVUBGqRHeYsf8iOJsxY0YxPfbb//t//6/o/jSq3eK5pQq+1gKNCPYiqGwvLClVQ0VYcuGFFzYFOlHZFVV8a6+9dtPvRZeUW2+9dbHvY7mlfRBh7uOPP14EY10R+yG6iozqvbe97W1N0yPojO2KEC2Cxn/84x9N86Lq7LjjjiuqRctFFVscg5L3ve99RTVXBHQnnHBCcSu3zTbbpEsuuaQ4X9sS51O8bimsjvAvjud//ud/Nv1OLDO6+4wQr7xLzljP6CY2lrvjjjs2Oy86s38iJI5zIs6HCJ4jSI7XinNk5syZRXgX5////b//t+l5kydPLravPHD7+Mc/vsrr33rrra0ud86cOU3nVVQ2/ulPfyoeRyAYy4vzMM6L2D9x/rQMxEvHqzzgW7hwYXGL34+q1KjQHT16dHGM77333qIqMsLleBwVkfHenTBhQtPz45yMsDymRzXrkiVLimrbqJKN1wtxXpbOzVJ1aZw/AABQrQR8AABAqyJYOOCAA4oqsKhmim4QP/CBD6Sf//znRVeW0d1ejIO3xx57pM985jOtvkaEVBGARRh19dVXF5U4P/zhD5vCqRjPLwKGT33qU0XwFsFTy+CuPMxoKboKbE0ESxEylIvQIgKu9ir/IlhobcyzqBCLwKu8Ui6CtpgeQUzL5UTFWPlyIrCJACTCowjUonosxL6JsCiCinjdCOIOPvjgIrCJCrGWrrzyymJ8uCOOOCK159vf/nZRORnVV+XVWlGhd8EFFxTdW0ZIGPNje2P/R/Dz5S9/OX3/+98v1jeq9iLAjWVGt6qdFcFOabzFchHglXfDGEFO+XGL9YnwM8LSECFoy65N45z8/e9/31Qh+W//9m9FWNZeVWSE1OWBX+yXCKRiv8fP2NY4RqWqzBDneBzLOE7xs1wEexFSxTiCEQJ2Vrxe+bZHF7Gl6sQIeiNoW3fddYv3TXm4FttV/p4ohXXlwV1r7rzzzvSJT3yiWYVcdGUa495FWBfVllFN+dvf/raYF+/rtrR8j8Y+aNnFaITW5Q466KCm+xGYxpiVJVHdV2pDYp3OP//84hyIgC/aiGgzSuI9HOK9+OCDD7a5jgAA0N8J+AAAgFZFqPHTn/60CDHigv7EiROLC/ERTkUIFWFdBFHllVUtRdVfhA7RRWOMJxbdHJZXO0WFWAROF110URF+RbVgy6qcG264oSlYK4VrUZ0W6xRBVrmoEIp1jOqhENVCERjFa0YA0lHxnKiwKg9MIvCYP39+h0LG2Fc33nhj0+N4raj4ilCpteCuJNZ78803L7pljKAwtqUkxkf71re+tdp1j4Au9uf3vve9tPPOOzebF4FsrEsEk7Nnzy6Ob1SxRdeTUSUWQdXGG2/c1B1rhExdCfdKxy1er2V3kBH8xPGMZUfoVhr7LwLHOOdiXpxzEaCVKuvKQ6mSUrgX4jkRDkbVZNh9992L148gOarHouKvtfArzqf999+/CK/bOp4RXMXt7W9/e7ruuuuazXv/+99fTOtKwFd6H0SFZalKLd5TEXhHOBq32P8RppeUqjJbbkNHxXum/Pd32GGH4haVfFFpG0FpdK8Z4n0Z1Zatnd8tA74IYyOgjHUrHe94L8Z75rbbbmvWDWuc1y3HgYzfLVUKxnkQoXJ8kSAq+6JL2jh20SVrBMYnnnhiU4UrAABUMwEfAADQpvKuFUvjmEU3hnEBPsbXi/ChtfG8SiJMiG4MYwy/qKiL4Ko8oIhwKcKY6MoyqnSiUvD4448vppVMmjRpldd9+eWXi/HPosKpXGksslIodd9996VPf/rTxTKjMmt1XfpF+BVVfLGNEYbF+HMlv/nNb4pKp7hFl4oRXkTgttNOOzV7fgQYcSsXYVvsgwidYgy0WEYoVaaVnhP7MoLQ6H4w9ltUqu25555FmBFdXUaFY/kxaSnWJwKjCD7Lq8PKxVhvpZAvqqRiuREsRTerEdbG9kWgFT9HjhyZuiqqr2KMvJZKlY2
2025-09-16 09:59:38 +08:00
},
"metadata": {},
2025-11-07 16:26:00 +08:00
"output_type": "display_data",
"jetTransient": {
"display_id": null
}
},
2025-09-24 23:14:14 +08:00
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
2025-11-07 16:26:00 +08:00
"--- 5. 极端不均衡事件后的市场行为分析 ---\n",
"在 25411 个数据点中,共发现 689 个正向极端事件837 个负向极端事件。\n"
2025-09-24 23:14:14 +08:00
]
},
2025-09-16 09:59:38 +08:00
{
"data": {
"text/plain": [
2025-11-07 16:26:00 +08:00
"<Figure size 2000x1200 with 4 Axes>"
2025-09-16 09:59:38 +08:00
],
2025-11-07 16:26:00 +08:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAB8AAAASgCAYAAACHXFLNAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Qd4lFX2x/GTXgkEQkLoVbBgx4K9u7qra11XF0Fd265l17Kuvfe2f3Uta1mx69p711XXrogVUEA6hJBASJ0kk//zu+GNk8lMGkmm5PvhmWeGqXfeeefN3HvuOTehoaGhwQAAAAAAAAAAAAAAiHGJkW4AAAAAAAAAAAAAAABdgQA4AAAAAAAAAAAAACAuEAAHAAAAAAAAAAAAAMQFAuAAAAAAAAAAAAAAgLhAABwAAAAAAAAAAAAAEBcIgAMAAAAAAAAAAAAA4gIBcAAAAAAAAAAAAABAXCAADgAAAAAAAAAAAACICwTAAQAAAAAAAAAAAABxgQA4AADocpWVlWxVAAAAAAAAAECPIwAOAFHg5Zdftvnz56/38/j9fjvkkEPsiiuusK5UUlJi99xzT4vrGxoarK6urun/zz77rE2cONGde+rr692po0466SQ788wz16PVZp9//rn94Q9/cOehLFiwwM466yx78cUXrTv4fD6bNWuWPfHEE3bnnXdatCgvL3ft6q73/Je//MV22GEHW7lyZZc9r/ahv//97/Z///d/rv2dpf21o6eO7L+679133x32vd9222324YcfdqjNn332mb3//vtWU1MT8vavv/7annvuOauqqrJooONPuGOQ9rvDDjvMHnzwwS57vTfeeMO9//Xx73//20488URbuHBhi9vefPNNO+aYY9xxGgAAAOgOjAm0xJhA17rrrrvcNv3oo49a3FZWVmbHHnusvf32226cpyNjUDfccIM9//zzIW+fOXOmLV++vFPtXbJkiXve1atXh7x97dq1bpyqK8cd1sfDDz9s559/vi1btizkdlI/+Kqrrgrbr++oGTNm2NNPP+3G6zrrf//7n+sHq88bbMWKFXbkkUe6MRgAiFXJkW4AAEQrBbL0wzQtLc2SkpI69Fh1GGpra90pKyurzdfRj2RlzP7nP/+xTTfdtNNtTkxMtLlz59oGG2zQdN1bb71l3333naWkpIR9HwkJCXbccce5x4eiH7yPPfaY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
2025-09-16 09:59:38 +08:00
},
"metadata": {},
2025-11-07 16:26:00 +08:00
"output_type": "display_data",
"jetTransient": {
"display_id": null
}
2025-09-16 09:59:38 +08:00
}
],
2025-11-07 16:26:00 +08:00
"execution_count": 7
2025-09-16 09:59:38 +08:00
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}