305 lines
155 KiB
Plaintext
305 lines
155 KiB
Plaintext
|
|
{
|
|||
|
|
"cells": [
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"id": "initial_id",
|
|||
|
|
"metadata": {
|
|||
|
|
"collapsed": true,
|
|||
|
|
"ExecuteTime": {
|
|||
|
|
"end_time": "2025-09-13T05:56:31.464118Z",
|
|||
|
|
"start_time": "2025-09-13T05:56:31.460802Z"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"source": [
|
|||
|
|
"import pandas as pd\n",
|
|||
|
|
"import numpy as np\n",
|
|||
|
|
"import matplotlib.pyplot as plt\n",
|
|||
|
|
"import seaborn as sns\n",
|
|||
|
|
"import talib as ta # Make sure TA-Lib is installed: pip install TA-Lib\n",
|
|||
|
|
"import statsmodels.api as sm\n",
|
|||
|
|
"\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",
|
|||
|
|
"file_path = '/mnt/d/PyProject/NewQuant/data/data/KQ_m@CZCE_SA/KQ_m@CZCE_SA_min15.csv'\n",
|
|||
|
|
"\n",
|
|||
|
|
"sns.set(style='whitegrid')\n",
|
|||
|
|
"plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签\n",
|
|||
|
|
"plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号\n"
|
|||
|
|
],
|
|||
|
|
"outputs": [],
|
|||
|
|
"execution_count": 57
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"metadata": {
|
|||
|
|
"ExecuteTime": {
|
|||
|
|
"end_time": "2025-09-13T05:56:31.544397Z",
|
|||
|
|
"start_time": "2025-09-13T05:56:31.499612Z"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"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",
|
|||
|
|
"df_raw = df_raw[df_raw.index >= '2024-01-01']"
|
|||
|
|
],
|
|||
|
|
"id": "548c68daa68af8c1",
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"Successfully loaded 25662 rows of data.\n",
|
|||
|
|
"First 5 rows of data:\n",
|
|||
|
|
" open high low close volume open_oi \\\n",
|
|||
|
|
"datetime \n",
|
|||
|
|
"2020-12-31 14:45:00 1607.0 1611.0 1603.0 1611.0 19480.0 148833.0 \n",
|
|||
|
|
"2021-01-04 09:00:00 1610.0 1636.0 1601.0 1620.0 55486.0 146448.0 \n",
|
|||
|
|
"2021-01-04 09:15:00 1620.0 1620.0 1601.0 1604.0 30314.0 153373.0 \n",
|
|||
|
|
"2021-01-04 09:30:00 1604.0 1606.0 1590.0 1595.0 30803.0 157091.0 \n",
|
|||
|
|
"2021-01-04 09:45:00 1595.0 1601.0 1594.0 1600.0 10031.0 158730.0 \n",
|
|||
|
|
"\n",
|
|||
|
|
" close_oi underlying_symbol \n",
|
|||
|
|
"datetime \n",
|
|||
|
|
"2020-12-31 14:45:00 146448.0 CZCE.SA105 \n",
|
|||
|
|
"2021-01-04 09:00:00 153373.0 CZCE.SA105 \n",
|
|||
|
|
"2021-01-04 09:15:00 157091.0 CZCE.SA105 \n",
|
|||
|
|
"2021-01-04 09:30:00 158730.0 CZCE.SA105 \n",
|
|||
|
|
"2021-01-04 09:45:00 160031.0 CZCE.SA105 \n"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"execution_count": 58
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"metadata": {
|
|||
|
|
"ExecuteTime": {
|
|||
|
|
"end_time": "2025-09-13T05:56:31.825173Z",
|
|||
|
|
"start_time": "2025-09-13T05:56:31.581283Z"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"source": [
|
|||
|
|
"import pandas as pd\n",
|
|||
|
|
"import numpy as np\n",
|
|||
|
|
"import matplotlib.pyplot as plt\n",
|
|||
|
|
"import seaborn as sns\n",
|
|||
|
|
"\n",
|
|||
|
|
"df = df_raw\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"# --- 2. 因子计算 ---\n",
|
|||
|
|
"print(\"--- 正在计算因子 ---\")\n",
|
|||
|
|
"df['volume_safe'] = df['volume'].replace(0, 1e-6)\n",
|
|||
|
|
"df['price_impact_factor'] = np.abs(df['close'].pct_change()) / df['volume_safe']\n",
|
|||
|
|
"df['directional_impact_factor'] = (df['close'] - df['open']) / df['volume_safe']\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"# --- 3. 定义未来收益率 (我们要预测的目标) ---\n",
|
|||
|
|
"print(\"--- 正在计算未来收益率 ---\")\n",
|
|||
|
|
"forward_periods = [1, 5, 10]\n",
|
|||
|
|
"for n in forward_periods:\n",
|
|||
|
|
" df[f'fwd_return_{n}d'] = df['close'].pct_change(periods=n).shift(-n)\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 清理数据,删除因计算位移产生的NaN值\n",
|
|||
|
|
"df.dropna(inplace=True)\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"# --- 4. 核心:执行分位数分析 ---\n",
|
|||
|
|
"print(\"--- 正在执行分位数分析 ---\")\n",
|
|||
|
|
"num_quantiles = 5 # 分为5组\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 4.1 分析 价格冲击因子\n",
|
|||
|
|
"# 使用 pd.qcut 将因子值分为 N 组\n",
|
|||
|
|
"df['pi_quantile'] = pd.qcut(df['price_impact_factor'], q=num_quantiles, labels=False, duplicates='drop')\n",
|
|||
|
|
"pi_analysis = df.groupby('pi_quantile')[[f'fwd_return_{n}d' for n in forward_periods]].mean() * 100\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 4.2 分析 定向冲击因子\n",
|
|||
|
|
"df['di_quantile'] = pd.qcut(df['directional_impact_factor'], q=num_quantiles, labels=False, duplicates='drop')\n",
|
|||
|
|
"di_analysis = df.groupby('di_quantile')[[f'fwd_return_{n}d' for n in forward_periods]].mean() * 100\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"# --- 5. 结果可视化与解读 ---\n",
|
|||
|
|
"print(\"\\n--- 因子有效性分析结果 ---\")\n",
|
|||
|
|
"fig, axes = plt.subplots(1, 2, figsize=(18, 7))\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 价格冲击因子 结果\n",
|
|||
|
|
"print(\"\\n价格冲击因子 (Price Impact Factor) 分位数分析:\")\n",
|
|||
|
|
"print(pi_analysis)\n",
|
|||
|
|
"pi_analysis.plot(kind='bar', ax=axes[0], title='价格冲击因子 vs 未来收益率\\n(Price Impact Factor vs. Forward Returns)')\n",
|
|||
|
|
"axes[0].set_xlabel('因子分位数 (Q1: 最低, Q5: 最高)')\n",
|
|||
|
|
"axes[0].set_ylabel('平均未来收益率 (%)')\n",
|
|||
|
|
"axes[0].set_xticklabels([f'Q{i+1}' for i in range(len(pi_analysis))], rotation=0)\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 定向冲击因子 结果\n",
|
|||
|
|
"print(\"\\n定向冲击因子 (Directional Impact Factor) 分位数分析:\")\n",
|
|||
|
|
"print(di_analysis)\n",
|
|||
|
|
"di_analysis.plot(kind='bar', ax=axes[1], title='定向冲击因子 vs 未来收益率\\n(Directional Impact Factor vs. Forward Returns)')\n",
|
|||
|
|
"axes[1].set_xlabel('因子分位数 (Q1: 最低, Q5: 最高)')\n",
|
|||
|
|
"axes[1].set_ylabel('平均未来收益率 (%)')\n",
|
|||
|
|
"axes[1].set_xticklabels([f'Q{i+1}' for i in range(len(di_analysis))], rotation=0)\n",
|
|||
|
|
"\n",
|
|||
|
|
"plt.suptitle('因子有效性分位数分析', fontsize=16)\n",
|
|||
|
|
"plt.tight_layout(rect=[0, 0.03, 1, 0.95])\n",
|
|||
|
|
"plt.show()\n",
|
|||
|
|
"\n",
|
|||
|
|
"# --- 6. 进阶分析: 在特定市场状态下的表现 ---\n",
|
|||
|
|
"print(\"\\n--- 进阶分析:因子在不同市场状态下的表现 ---\")\n",
|
|||
|
|
"# 定义市场状态:使用ATR的移动平均值来衡量波动性\n",
|
|||
|
|
"high_low = df['high'] - df['low']\n",
|
|||
|
|
"high_close = np.abs(df['high'] - df['close'].shift())\n",
|
|||
|
|
"low_close = np.abs(df['low'] - df['close'].shift())\n",
|
|||
|
|
"tr = pd.concat([high_low, high_close, low_close], axis=1).max(axis=1)\n",
|
|||
|
|
"df['atr_pct'] = (tr / df['close']).ewm(span=20, adjust=False).mean()\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 定义高波动状态为ATR百分比位于最高的30%的时间\n",
|
|||
|
|
"high_vol_threshold = df['atr_pct'].quantile(0.7)\n",
|
|||
|
|
"df_high_vol = df[df['atr_pct'] > high_vol_threshold]\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 在高波动状态下,重新分析定向冲击因子\n",
|
|||
|
|
"di_analysis_high_vol = df_high_vol.groupby('di_quantile')[[f'fwd_return_{n}d' for n in forward_periods]].mean() * 100\n",
|
|||
|
|
"\n",
|
|||
|
|
"print(\"\\n定向冲击因子在高波动市场下的表现:\")\n",
|
|||
|
|
"print(di_analysis_high_vol)\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 可视化高波动状态下的结果\n",
|
|||
|
|
"fig, ax = plt.subplots(figsize=(10, 6))\n",
|
|||
|
|
"di_analysis_high_vol.plot(kind='bar', ax=ax, title='定向冲击因子在高波动市场状态下的表现\\n(Directional Impact Factor in HIGH VOLATILITY Regime)')\n",
|
|||
|
|
"ax.set_xlabel('因子分位数 (Q1: 最低, Q5: 最高)')\n",
|
|||
|
|
"ax.set_ylabel('平均未来收益率 (%)')\n",
|
|||
|
|
"ax.set_xticklabels([f'Q{i+1}' for i in range(len(di_analysis_high_vol))], rotation=0)\n",
|
|||
|
|
"plt.tight_layout()\n",
|
|||
|
|
"plt.show()"
|
|||
|
|
],
|
|||
|
|
"id": "e9248ae41d9a1b1d",
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"--- 正在计算因子 ---\n",
|
|||
|
|
"--- 正在计算未来收益率 ---\n",
|
|||
|
|
"--- 正在执行分位数分析 ---\n",
|
|||
|
|
"\n",
|
|||
|
|
"--- 因子有效性分析结果 ---\n",
|
|||
|
|
"\n",
|
|||
|
|
"价格冲击因子 (Price Impact Factor) 分位数分析:\n",
|
|||
|
|
" fwd_return_1d fwd_return_5d fwd_return_10d\n",
|
|||
|
|
"pi_quantile \n",
|
|||
|
|
"0 -0.010825 -0.055032 -0.042790\n",
|
|||
|
|
"1 0.001791 -0.008909 -0.010649\n",
|
|||
|
|
"2 -0.001939 -0.008222 -0.060071\n",
|
|||
|
|
"3 0.004476 -0.001045 -0.046483\n",
|
|||
|
|
"4 -0.011277 -0.015913 -0.018583\n",
|
|||
|
|
"\n",
|
|||
|
|
"定向冲击因子 (Directional Impact Factor) 分位数分析:\n",
|
|||
|
|
" fwd_return_1d fwd_return_5d fwd_return_10d\n",
|
|||
|
|
"di_quantile \n",
|
|||
|
|
"0 -0.010517 -0.023939 -0.079702\n",
|
|||
|
|
"1 -0.002474 0.011427 -0.013968\n",
|
|||
|
|
"2 -0.004617 -0.048772 -0.039226\n",
|
|||
|
|
"3 0.004874 -0.008277 -0.024593\n",
|
|||
|
|
"4 -0.005044 -0.019583 -0.021074\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 1800x700 with 2 Axes>"
|
|||
|
|
],
|
|||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAABvgAAAKbCAYAAAAwm42VAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAA+8hJREFUeJzs3Xd0VMX7x/HPpiwJPUAINZQAoUPo1QJIFREQUOm9N+lKkSJNelW6dAHpRQREEKUGpBskgFJDF0JC2u7vD365X9YUkpBC4P06x3Oyd+6dee7uEHfy3JkxWa1WqwAAAAAAAAAAAAAkC3ZJHQAAAAAAAAAAAACAmCPBBwAAAAAAAAAAACQjJPgAAAAAAAAAAACAZIQEHwAAAAAAAAAAAJCMkOADAAAAAAAAAAAAkhESfAAAAAAAAAAAAEAyQoIPAAAAAAAAAAAASEZI8AEAAAAAAAAAAADJCAk+AAAAAIijgIAAhYSERFkeHBysS5cuJWJEAAAAAIA3AQk+AAAAADFisVgUGhr60v+9CmrVqqVevXrJ398/znVs375dlStX1qZNm6I859SpU6pTp46aN2+up0+fxqjeNm3aqGHDhi88r1evXhozZkyM433e33//rQMHDtgc279/vz755BP5+PjEur6lS5dqyJAhOnXqVISyEydOqGnTpvr1119jXF9ISIjCwsIkSffv39ekSZO0e/duSc+SpuFlknTy5EmdOnVKFosl1nFL0sGDB3X58mWbY999950++eSTaJO3UZk4caKGDBkiq9Ua42seP36sv//+O9ZtAQAAAHhzOSR1AAAAAACShw4dOui333576XoOHTokFxcX4/Xff/+tDRs2yNnZWfb29jKZTLGqr02bNrK3t4/x+RcuXNCVK1eUMmVKpU6dOlZtPa9kyZIKCgrSokWL1Lhx40jj9vb2liRVrVpVTk5OMar3/v37unv3boTjQUFBSpEihfH6119/VZ48eeIU++LFi7Vq1Sp9+eWX+uSTTyRJZrNZx48f17x58zR58uRY1bdr1y4dOXJEbm5uKl68eIS4T548qa+++kpbtmyRo6NjtHWFhISoS5cuypIli7766is9efJE8+fPV9u2bVWjRg2tWrXKiD9r1qxau3at1q5dqxkzZqhWrVqxeyMkjRkzRpcuXdKWLVuUL18+SdK///6r48ePa/369WrWrFms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
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"\n",
|
|||
|
|
"--- 进阶分析:因子在不同市场状态下的表现 ---\n",
|
|||
|
|
"\n",
|
|||
|
|
"定向冲击因子在高波动市场下的表现:\n",
|
|||
|
|
" fwd_return_1d fwd_return_5d fwd_return_10d\n",
|
|||
|
|
"di_quantile \n",
|
|||
|
|
"0 0.006045 0.020305 -0.076809\n",
|
|||
|
|
"1 -0.014321 0.074963 0.062119\n",
|
|||
|
|
"2 0.002337 -0.057309 0.007566\n",
|
|||
|
|
"3 0.029277 0.064093 0.062086\n",
|
|||
|
|
"4 -0.009715 -0.030420 -0.030257\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 1000x600 with 1 Axes>"
|
|||
|
|
],
|
|||
|
|
"image/png": "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
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"execution_count": 59
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"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
|
|||
|
|
}
|