1695 lines
211 KiB
Plaintext
1695 lines
211 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"id": "79a7758178bafdd3",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:07:49.871896Z",
|
||
"start_time": "2025-03-27T16:07:49.868138Z"
|
||
},
|
||
"jupyter": {
|
||
"source_hidden": true
|
||
}
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# %load_ext autoreload\n",
|
||
"# %autoreload 2\n",
|
||
"\n",
|
||
"import pandas as pd\n",
|
||
"import warnings\n",
|
||
"\n",
|
||
"warnings.filterwarnings(\"ignore\")\n",
|
||
"\n",
|
||
"pd.set_option('display.max_columns', None)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"id": "a79cafb06a7e0e43",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:08:46.495166Z",
|
||
"start_time": "2025-03-27T16:07:49.887412Z"
|
||
},
|
||
"scrolled": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"daily data\n",
|
||
"daily basic\n",
|
||
"inner merge on ['ts_code', 'trade_date']\n",
|
||
"stk limit\n",
|
||
"left merge on ['ts_code', 'trade_date']\n",
|
||
"money flow\n",
|
||
"left merge on ['ts_code', 'trade_date']\n",
|
||
"cyq perf\n",
|
||
"left merge on ['ts_code', 'trade_date']\n",
|
||
"<class 'pandas.core.frame.DataFrame'>\n",
|
||
"RangeIndex: 8450470 entries, 0 to 8450469\n",
|
||
"Data columns (total 31 columns):\n",
|
||
" # Column Dtype \n",
|
||
"--- ------ ----- \n",
|
||
" 0 ts_code object \n",
|
||
" 1 trade_date datetime64[ns]\n",
|
||
" 2 open float64 \n",
|
||
" 3 close float64 \n",
|
||
" 4 high float64 \n",
|
||
" 5 low float64 \n",
|
||
" 6 vol float64 \n",
|
||
" 7 pct_chg float64 \n",
|
||
" 8 turnover_rate float64 \n",
|
||
" 9 pe_ttm float64 \n",
|
||
" 10 circ_mv float64 \n",
|
||
" 11 volume_ratio float64 \n",
|
||
" 12 is_st bool \n",
|
||
" 13 up_limit float64 \n",
|
||
" 14 down_limit float64 \n",
|
||
" 15 buy_sm_vol float64 \n",
|
||
" 16 sell_sm_vol float64 \n",
|
||
" 17 buy_lg_vol float64 \n",
|
||
" 18 sell_lg_vol float64 \n",
|
||
" 19 buy_elg_vol float64 \n",
|
||
" 20 sell_elg_vol float64 \n",
|
||
" 21 net_mf_vol float64 \n",
|
||
" 22 his_low float64 \n",
|
||
" 23 his_high float64 \n",
|
||
" 24 cost_5pct float64 \n",
|
||
" 25 cost_15pct float64 \n",
|
||
" 26 cost_50pct float64 \n",
|
||
" 27 cost_85pct float64 \n",
|
||
" 28 cost_95pct float64 \n",
|
||
" 29 weight_avg float64 \n",
|
||
" 30 winner_rate float64 \n",
|
||
"dtypes: bool(1), datetime64[ns](1), float64(28), object(1)\n",
|
||
"memory usage: 1.9+ GB\n",
|
||
"None\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"from utils.utils import read_and_merge_h5_data\n",
|
||
"\n",
|
||
"print('daily data')\n",
|
||
"df = read_and_merge_h5_data('../../data/daily_data.h5', key='daily_data',\n",
|
||
" columns=['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'pct_chg'],\n",
|
||
" df=None)\n",
|
||
"\n",
|
||
"print('daily basic')\n",
|
||
"df = read_and_merge_h5_data('../../data/daily_basic.h5', key='daily_basic',\n",
|
||
" columns=['ts_code', 'trade_date', 'turnover_rate', 'pe_ttm', 'circ_mv', 'volume_ratio',\n",
|
||
" 'is_st'], df=df, join='inner')\n",
|
||
"\n",
|
||
"print('stk limit')\n",
|
||
"df = read_and_merge_h5_data('../../data/stk_limit.h5', key='stk_limit',\n",
|
||
" columns=['ts_code', 'trade_date', 'pre_close', 'up_limit', 'down_limit'],\n",
|
||
" df=df)\n",
|
||
"print('money flow')\n",
|
||
"df = read_and_merge_h5_data('../../data/money_flow.h5', key='money_flow',\n",
|
||
" columns=['ts_code', 'trade_date', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol',\n",
|
||
" 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol'],\n",
|
||
" df=df)\n",
|
||
"print('cyq perf')\n",
|
||
"df = read_and_merge_h5_data('../../data/cyq_perf.h5', key='cyq_perf',\n",
|
||
" columns=['ts_code', 'trade_date', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct',\n",
|
||
" 'cost_50pct',\n",
|
||
" 'cost_85pct', 'cost_95pct', 'weight_avg', 'winner_rate'],\n",
|
||
" df=df)\n",
|
||
"print(df.info())"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"id": "cac01788dac10678",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:08:58.716303Z",
|
||
"start_time": "2025-03-27T16:08:46.882680Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"industry\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print('industry')\n",
|
||
"industry_df = read_and_merge_h5_data('../../data/industry_data.h5', key='industry_data',\n",
|
||
" columns=['ts_code', 'l2_code', 'in_date'],\n",
|
||
" df=None, on=['ts_code'], join='left')\n",
|
||
"\n",
|
||
"\n",
|
||
"def merge_with_industry_data(df, industry_df):\n",
|
||
" # 确保日期字段是 datetime 类型\n",
|
||
" df['trade_date'] = pd.to_datetime(df['trade_date'])\n",
|
||
" industry_df['in_date'] = pd.to_datetime(industry_df['in_date'])\n",
|
||
"\n",
|
||
" # 对 industry_df 按 ts_code 和 in_date 排序\n",
|
||
" industry_df_sorted = industry_df.sort_values(['in_date', 'ts_code'])\n",
|
||
"\n",
|
||
" # 对原始 df 按 ts_code 和 trade_date 排序\n",
|
||
" df_sorted = df.sort_values(['trade_date', 'ts_code'])\n",
|
||
"\n",
|
||
" # 使用 merge_asof 进行向后合并\n",
|
||
" merged = pd.merge_asof(\n",
|
||
" df_sorted,\n",
|
||
" industry_df_sorted,\n",
|
||
" by='ts_code', # 按 ts_code 分组\n",
|
||
" left_on='trade_date',\n",
|
||
" right_on='in_date',\n",
|
||
" direction='backward'\n",
|
||
" )\n",
|
||
"\n",
|
||
" # 获取每个 ts_code 的最早 in_date 记录\n",
|
||
" min_in_date_per_ts = (industry_df_sorted\n",
|
||
" .groupby('ts_code')\n",
|
||
" .first()\n",
|
||
" .reset_index()[['ts_code', 'l2_code']])\n",
|
||
"\n",
|
||
" # 填充未匹配到的记录(trade_date 早于所有 in_date 的情况)\n",
|
||
" merged['l2_code'] = merged['l2_code'].fillna(\n",
|
||
" merged['ts_code'].map(min_in_date_per_ts.set_index('ts_code')['l2_code'])\n",
|
||
" )\n",
|
||
"\n",
|
||
" # 保留需要的列并重置索引\n",
|
||
" result = merged.reset_index(drop=True)\n",
|
||
" return result\n",
|
||
"\n",
|
||
"\n",
|
||
"# 使用示例\n",
|
||
"df = merge_with_industry_data(df, industry_df)\n",
|
||
"# print(mdf[mdf['ts_code'] == '600751.SH'][['ts_code', 'trade_date', 'l2_code']])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"id": "c4e9e1d31da6dba6",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:08:59.028881Z",
|
||
"start_time": "2025-03-27T16:08:58.826823Z"
|
||
},
|
||
"jupyter": {
|
||
"source_hidden": true
|
||
}
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"def calculate_indicators(df):\n",
|
||
" \"\"\"\n",
|
||
" 计算四个指标:当日涨跌幅、5日移动平均、RSI、MACD。\n",
|
||
" \"\"\"\n",
|
||
" df = df.sort_values('trade_date')\n",
|
||
" df['daily_return'] = (df['close'] - df['pre_close']) / df['pre_close'] * 100\n",
|
||
" # df['5_day_ma'] = df['close'].rolling(window=5).mean()\n",
|
||
" delta = df['close'].diff()\n",
|
||
" gain = delta.where(delta > 0, 0)\n",
|
||
" loss = -delta.where(delta < 0, 0)\n",
|
||
" avg_gain = gain.rolling(window=14).mean()\n",
|
||
" avg_loss = loss.rolling(window=14).mean()\n",
|
||
" rs = avg_gain / avg_loss\n",
|
||
" df['RSI'] = 100 - (100 / (1 + rs))\n",
|
||
"\n",
|
||
" # 计算MACD\n",
|
||
" ema12 = df['close'].ewm(span=12, adjust=False).mean()\n",
|
||
" ema26 = df['close'].ewm(span=26, adjust=False).mean()\n",
|
||
" df['MACD'] = ema12 - ema26\n",
|
||
" df['Signal_line'] = df['MACD'].ewm(span=9, adjust=False).mean()\n",
|
||
" df['MACD_hist'] = df['MACD'] - df['Signal_line']\n",
|
||
"\n",
|
||
" # 4. 情绪因子1:市场上涨比例(Up Ratio)\n",
|
||
" df['up_ratio'] = df['daily_return'].apply(lambda x: 1 if x > 0 else 0)\n",
|
||
" df['up_ratio_20d'] = df['up_ratio'].rolling(window=20).mean() # 过去20天上涨比例\n",
|
||
"\n",
|
||
" # 5. 情绪因子2:成交量变化率(Volume Change Rate)\n",
|
||
" df['volume_mean'] = df['vol'].rolling(window=20).mean() # 过去20天的平均成交量\n",
|
||
" df['volume_change_rate'] = (df['vol'] - df['volume_mean']) / df['volume_mean'] * 100 # 成交量变化率\n",
|
||
"\n",
|
||
" # 6. 情绪因子3:波动率(Volatility)\n",
|
||
" df['volatility'] = df['daily_return'].rolling(window=20).std() # 过去20天的日收益率标准差\n",
|
||
"\n",
|
||
" # 7. 情绪因子4:成交额变化率(Amount Change Rate)\n",
|
||
" df['amount_mean'] = df['amount'].rolling(window=20).mean() # 过去20天的平均成交额\n",
|
||
" df['amount_change_rate'] = (df['amount'] - df['amount_mean']) / df['amount_mean'] * 100 # 成交额变化率\n",
|
||
"\n",
|
||
" return df\n",
|
||
"\n",
|
||
"\n",
|
||
"def generate_index_indicators(h5_filename):\n",
|
||
" df = pd.read_hdf(h5_filename, key='index_data')\n",
|
||
" df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')\n",
|
||
" df = df.sort_values('trade_date')\n",
|
||
"\n",
|
||
" # 计算每个ts_code的相关指标\n",
|
||
" df_indicators = []\n",
|
||
" for ts_code in df['ts_code'].unique():\n",
|
||
" df_index = df[df['ts_code'] == ts_code].copy()\n",
|
||
" df_index = calculate_indicators(df_index)\n",
|
||
" df_indicators.append(df_index)\n",
|
||
"\n",
|
||
" # 合并所有指数的结果\n",
|
||
" df_all_indicators = pd.concat(df_indicators, ignore_index=True)\n",
|
||
"\n",
|
||
" # 保留trade_date列,并将同一天的数据按ts_code合并成一行\n",
|
||
" df_final = df_all_indicators.pivot_table(\n",
|
||
" index='trade_date',\n",
|
||
" columns='ts_code',\n",
|
||
" values=['daily_return', 'RSI', 'MACD', 'Signal_line',\n",
|
||
" 'MACD_hist', 'up_ratio_20d', 'volume_change_rate', 'volatility',\n",
|
||
" 'amount_change_rate', 'amount_mean'],\n",
|
||
" aggfunc='last'\n",
|
||
" )\n",
|
||
"\n",
|
||
" df_final.columns = [f\"{col[1]}_{col[0]}\" for col in df_final.columns]\n",
|
||
" df_final = df_final.reset_index()\n",
|
||
"\n",
|
||
" return df_final\n",
|
||
"\n",
|
||
"\n",
|
||
"# 使用函数\n",
|
||
"h5_filename = '../../data/index_data.h5'\n",
|
||
"index_data = generate_index_indicators(h5_filename)\n",
|
||
"index_data = index_data.dropna()\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"id": "a735bc02ceb4d872",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:09:00.562306Z",
|
||
"start_time": "2025-03-27T16:08:59.257145Z"
|
||
}
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"import talib\n",
|
||
"\n",
|
||
"\n",
|
||
"def get_rolling_factor(df):\n",
|
||
" old_columns = df.columns.tolist()[:]\n",
|
||
" # 按股票和日期排序\n",
|
||
" df = df.sort_values(by=['ts_code', 'trade_date'])\n",
|
||
" grouped = df.groupby('ts_code', group_keys=False)\n",
|
||
"\n",
|
||
" # df[\"gap_next_open\"] = (df[\"open\"].shift(-1) - df[\"close\"]) / df[\"close\"]\n",
|
||
"\n",
|
||
" df['return_skew'] = grouped['pct_chg'].rolling(window=5).skew().reset_index(0, drop=True)\n",
|
||
" df['return_kurtosis'] = grouped['pct_chg'].rolling(window=5).kurt().reset_index(0, drop=True)\n",
|
||
"\n",
|
||
" # 因子 1:短期成交量变化率\n",
|
||
" df['volume_change_rate'] = (\n",
|
||
" grouped['vol'].rolling(window=2).mean() /\n",
|
||
" grouped['vol'].rolling(window=10).mean() - 1\n",
|
||
" ).reset_index(level=0, drop=True) # 确保索引对齐\n",
|
||
"\n",
|
||
" # 因子 2:成交量突破信号\n",
|
||
" max_volume = grouped['vol'].rolling(window=5).max().reset_index(level=0, drop=True) # 确保索引对齐\n",
|
||
" df['cat_volume_breakout'] = (df['vol'] > max_volume)\n",
|
||
"\n",
|
||
" # 因子 3:换手率均线偏离度\n",
|
||
" mean_turnover = grouped['turnover_rate'].rolling(window=3).mean().reset_index(level=0, drop=True)\n",
|
||
" std_turnover = grouped['turnover_rate'].rolling(window=3).std().reset_index(level=0, drop=True)\n",
|
||
" df['turnover_deviation'] = (df['turnover_rate'] - mean_turnover) / std_turnover\n",
|
||
"\n",
|
||
" # 因子 4:换手率激增信号\n",
|
||
" df['cat_turnover_spike'] = (df['turnover_rate'] > mean_turnover + 2 * std_turnover)\n",
|
||
"\n",
|
||
" # 因子 5:量比均值\n",
|
||
" df['avg_volume_ratio'] = grouped['volume_ratio'].rolling(window=3).mean().reset_index(level=0, drop=True)\n",
|
||
"\n",
|
||
" # 因子 6:量比突破信号\n",
|
||
" max_volume_ratio = grouped['volume_ratio'].rolling(window=5).max().reset_index(level=0, drop=True)\n",
|
||
" df['cat_volume_ratio_breakout'] = (df['volume_ratio'] > max_volume_ratio)\n",
|
||
"\n",
|
||
" df['vol_spike'] = grouped.apply(\n",
|
||
" lambda x: pd.Series(x['vol'].rolling(20).mean(), index=x.index)\n",
|
||
" )\n",
|
||
" df['vol_std_5'] = df['vol'].pct_change().rolling(5).std()\n",
|
||
"\n",
|
||
" # 计算 ATR\n",
|
||
" df['atr_14'] = grouped.apply(\n",
|
||
" lambda x: pd.Series(talib.ATR(x['high'].values, x['low'].values, x['close'].values, timeperiod=14),\n",
|
||
" index=x.index)\n",
|
||
" )\n",
|
||
" df['atr_6'] = grouped.apply(\n",
|
||
" lambda x: pd.Series(talib.ATR(x['high'].values, x['low'].values, x['close'].values, timeperiod=6),\n",
|
||
" index=x.index)\n",
|
||
" )\n",
|
||
"\n",
|
||
" # 计算 OBV 及其均线\n",
|
||
" df['obv'] = grouped.apply(\n",
|
||
" lambda x: pd.Series(talib.OBV(x['close'].values, x['vol'].values), index=x.index)\n",
|
||
" )\n",
|
||
" df['maobv_6'] = grouped.apply(\n",
|
||
" lambda x: pd.Series(talib.SMA(x['obv'].values, timeperiod=6), index=x.index)\n",
|
||
" )\n",
|
||
"\n",
|
||
" df['rsi_3'] = grouped.apply(\n",
|
||
" lambda x: pd.Series(talib.RSI(x['close'].values, timeperiod=3), index=x.index)\n",
|
||
" )\n",
|
||
" # df['rsi_6'] = grouped.apply(\n",
|
||
" # lambda x: pd.Series(talib.RSI(x['close'].values, timeperiod=6), index=x.index)\n",
|
||
" # )\n",
|
||
" # df['rsi_9'] = grouped.apply(\n",
|
||
" # lambda x: pd.Series(talib.RSI(x['close'].values, timeperiod=9), index=x.index)\n",
|
||
" # )\n",
|
||
"\n",
|
||
" # 计算 return_10 和 return_20\n",
|
||
" df['return_5'] = grouped['close'].apply(lambda x: x / x.shift(5) - 1)\n",
|
||
" # df['return_10'] = grouped['close'].apply(lambda x: x / x.shift(10) - 1)\n",
|
||
" df['return_20'] = grouped['close'].apply(lambda x: x / x.shift(20) - 1)\n",
|
||
"\n",
|
||
" # df['avg_close_5'] = grouped['close'].apply(lambda x: x.rolling(window=5).mean() / x)\n",
|
||
"\n",
|
||
" # 计算标准差指标\n",
|
||
" df['std_return_5'] = grouped['close'].apply(lambda x: x.pct_change().rolling(window=5).std())\n",
|
||
" # df['std_return_15'] = grouped['close'].apply(lambda x: x.pct_change().rolling(window=15).std())\n",
|
||
" # df['std_return_25'] = grouped['close'].apply(lambda x: x.pct_change().rolling(window=25).std())\n",
|
||
" df['std_return_90'] = grouped['close'].apply(lambda x: x.pct_change().rolling(window=90).std())\n",
|
||
" df['std_return_90_2'] = grouped['close'].apply(lambda x: x.shift(10).pct_change().rolling(window=90).std())\n",
|
||
"\n",
|
||
" # 计算 EMA 指标\n",
|
||
" df['_ema_5'] = grouped['close'].apply(\n",
|
||
" lambda x: pd.Series(talib.EMA(x.values, timeperiod=5), index=x.index)\n",
|
||
" )\n",
|
||
" df['_ema_13'] = grouped['close'].apply(\n",
|
||
" lambda x: pd.Series(talib.EMA(x.values, timeperiod=13), index=x.index)\n",
|
||
" )\n",
|
||
" df['_ema_20'] = grouped['close'].apply(\n",
|
||
" lambda x: pd.Series(talib.EMA(x.values, timeperiod=20), index=x.index)\n",
|
||
" )\n",
|
||
" df['_ema_60'] = grouped['close'].apply(\n",
|
||
" lambda x: pd.Series(talib.EMA(x.values, timeperiod=60), index=x.index)\n",
|
||
" )\n",
|
||
"\n",
|
||
" # 计算 act_factor1, act_factor2, act_factor3, act_factor4\n",
|
||
" df['act_factor1'] = grouped['_ema_5'].apply(\n",
|
||
" lambda x: np.arctan((x / x.shift(1) - 1) * 100) * 57.3 / 50\n",
|
||
" )\n",
|
||
" df['act_factor2'] = grouped['_ema_13'].apply(\n",
|
||
" lambda x: np.arctan((x / x.shift(1) - 1) * 100) * 57.3 / 40\n",
|
||
" )\n",
|
||
" df['act_factor3'] = grouped['_ema_20'].apply(\n",
|
||
" lambda x: np.arctan((x / x.shift(1) - 1) * 100) * 57.3 / 21\n",
|
||
" )\n",
|
||
" df['act_factor4'] = grouped['_ema_60'].apply(\n",
|
||
" lambda x: np.arctan((x / x.shift(1) - 1) * 100) * 57.3 / 10\n",
|
||
" )\n",
|
||
"\n",
|
||
" # 根据 trade_date 截面计算排名\n",
|
||
" df['rank_act_factor1'] = df.groupby('trade_date', group_keys=False)['act_factor1'].rank(ascending=False, pct=True)\n",
|
||
" df['rank_act_factor2'] = df.groupby('trade_date', group_keys=False)['act_factor2'].rank(ascending=False, pct=True)\n",
|
||
" df['rank_act_factor3'] = df.groupby('trade_date', group_keys=False)['act_factor3'].rank(ascending=False, pct=True)\n",
|
||
"\n",
|
||
" df['log(circ_mv)'] = np.log(df['circ_mv'])\n",
|
||
"\n",
|
||
" def rolling_covariance(x, y, window):\n",
|
||
" return x.rolling(window).cov(y)\n",
|
||
"\n",
|
||
" def delta(series, period):\n",
|
||
" return series.diff(period)\n",
|
||
"\n",
|
||
" def rank(series):\n",
|
||
" return series.rank(pct=True)\n",
|
||
"\n",
|
||
" def stddev(series, window):\n",
|
||
" return series.rolling(window).std()\n",
|
||
"\n",
|
||
" window_high_volume = 5\n",
|
||
" window_close_stddev = 20\n",
|
||
" period_delta = 5\n",
|
||
" df['cov'] = rolling_covariance(df['high'], df['vol'], window_high_volume)\n",
|
||
" df['delta_cov'] = delta(df['cov'], period_delta)\n",
|
||
" df['_rank_stddev'] = rank(stddev(df['close'], window_close_stddev))\n",
|
||
" df['alpha_22_improved'] = -1 * df['delta_cov'] * df['_rank_stddev']\n",
|
||
"\n",
|
||
" df['alpha_003'] = np.where(df['high'] != df['low'],\n",
|
||
" (df['close'] - df['open']) / (df['high'] - df['low']),\n",
|
||
" 0)\n",
|
||
"\n",
|
||
" df['alpha_007'] = grouped.apply(lambda x: x['close'].rolling(5).corr(x['vol'])).reset_index(level=0, drop=True)\n",
|
||
" df['alpha_007'] = df.groupby('trade_date', group_keys=False)['alpha_007'].rank(ascending=True, pct=True)\n",
|
||
"\n",
|
||
" df['alpha_013'] = grouped['close'].transform(lambda x: x.rolling(5).sum() - x.rolling(20).sum())\n",
|
||
" df['alpha_013'] = df.groupby('trade_date', group_keys=False)['alpha_013'].rank(ascending=True, pct=True)\n",
|
||
"\n",
|
||
" df['cat_up_limit'] = (df['close'] == df['up_limit']) # 是否涨停(1表示涨停,0表示未涨停)\n",
|
||
" df['cat_down_limit'] = (df['close'] == df['down_limit']) # 是否跌停(1表示跌停,0表示未跌停)\n",
|
||
" df['up_limit_count_10d'] = grouped['cat_up_limit'].rolling(window=10, min_periods=1).sum().reset_index(level=0,\n",
|
||
" drop=True)\n",
|
||
" df['down_limit_count_10d'] = grouped['cat_down_limit'].rolling(window=10, min_periods=1).sum().reset_index(level=0,\n",
|
||
" drop=True)\n",
|
||
"\n",
|
||
" # 3. 最近连续涨跌停天数\n",
|
||
" def calculate_consecutive_limits(series):\n",
|
||
" \"\"\"\n",
|
||
" 计算连续涨停/跌停天数。\n",
|
||
" \"\"\"\n",
|
||
" consecutive_up = series * (series.groupby((series != series.shift()).cumsum()).cumcount() + 1)\n",
|
||
" consecutive_down = series * (series.groupby((series != series.shift()).cumsum()).cumcount() + 1)\n",
|
||
" return consecutive_up, consecutive_down\n",
|
||
"\n",
|
||
" # 连续涨停天数\n",
|
||
" df['consecutive_up_limit'] = grouped['cat_up_limit'].apply(\n",
|
||
" lambda x: calculate_consecutive_limits(x)[0]\n",
|
||
" ).reset_index(level=0, drop=True)\n",
|
||
"\n",
|
||
" df['vol_break'] = np.where((df['close'] > df['cost_85pct']) & (df['volume_ratio'] > 2), 1, 0)\n",
|
||
"\n",
|
||
" df['weight_roc5'] = grouped['weight_avg'].apply(lambda x: x.pct_change(5))\n",
|
||
"\n",
|
||
" def rolling_corr(group):\n",
|
||
" roc_close = group['close'].pct_change()\n",
|
||
" roc_weight = group['weight_avg'].pct_change()\n",
|
||
" return roc_close.rolling(10).corr(roc_weight)\n",
|
||
"\n",
|
||
" df['price_cost_divergence'] = grouped.apply(rolling_corr)\n",
|
||
"\n",
|
||
" df['smallcap_concentration'] = (1 / df['log(circ_mv)']) * (df['cost_85pct'] - df['cost_15pct'])\n",
|
||
"\n",
|
||
" # 16. 筹码稳定性指数 (20日波动率)\n",
|
||
" df['weight_std20'] = grouped['weight_avg'].apply(lambda x: x.rolling(20).std())\n",
|
||
" df['cost_stability'] = df['weight_std20'] / grouped['weight_avg'].transform(lambda x: x.rolling(20).mean())\n",
|
||
"\n",
|
||
" # 17. 成本区间突破标记\n",
|
||
" df['high_cost_break_days'] = grouped.apply(lambda g: g['close'].gt(g['cost_95pct']).rolling(5).sum())\n",
|
||
"\n",
|
||
" # 20. 筹码-流动性风险\n",
|
||
" df['liquidity_risk'] = (df['cost_95pct'] - df['cost_5pct']) * (\n",
|
||
" 1 / grouped['vol'].transform(lambda x: x.rolling(10).mean()))\n",
|
||
"\n",
|
||
" # 7. 市值波动率因子\n",
|
||
" df['turnover_std'] = grouped['turnover_rate'].rolling(window=20).std().reset_index(level=0, drop=True)\n",
|
||
" df['mv_volatility'] = grouped.apply(lambda x: x['turnover_std'] / x['log(circ_mv)']).reset_index(level=0, drop=True)\n",
|
||
"\n",
|
||
" # 8. 市值成长性因子\n",
|
||
" df['volume_growth'] = grouped['vol'].pct_change(periods=20).reset_index(level=0, drop=True)\n",
|
||
" df['mv_growth'] = grouped.apply(lambda x: x['volume_growth'] / x['log(circ_mv)']).reset_index(level=0, drop=True)\n",
|
||
"\n",
|
||
" df[\"ar\"] = df[\"high\"].div(df[\"open\"]).rolling(3).sum() / df[\"open\"].div(df[\"low\"]).rolling(3).sum() * 100\n",
|
||
" # 计算 BR 指标\n",
|
||
" df[\"pre_close\"] = df[\"close\"].shift(1)\n",
|
||
" df[\"br_up\"] = (df[\"high\"] - df[\"pre_close\"]).clip(lower=0)\n",
|
||
" df[\"br_down\"] = (df[\"pre_close\"] - df[\"low\"]).clip(lower=0)\n",
|
||
" df[\"br\"] = df[\"br_up\"].rolling(3).sum() / df[\"br_down\"].rolling(3).sum() * 100\n",
|
||
" df['arbr'] = df['ar'] - df['br']\n",
|
||
" df.drop(columns=[\"pre_close\", \"br_up\", \"br_down\", 'ar', 'br'], inplace=True)\n",
|
||
" \n",
|
||
" df.drop(columns=['weight_std20'], inplace=True, errors='ignore')\n",
|
||
" new_columns = [col for col in df.columns.tolist()[:] if col not in old_columns]\n",
|
||
"\n",
|
||
" return df, new_columns\n",
|
||
"\n",
|
||
"\n",
|
||
"def get_simple_factor(df):\n",
|
||
" old_columns = df.columns.tolist()[:]\n",
|
||
" df = df.sort_values(by=['ts_code', 'trade_date'])\n",
|
||
"\n",
|
||
" alpha = 0.5\n",
|
||
" df['momentum_factor'] = df['volume_change_rate'] + alpha * df['turnover_deviation']\n",
|
||
" df['resonance_factor'] = df['volume_ratio'] * df['pct_chg']\n",
|
||
" df['log_close'] = np.log(df['close'])\n",
|
||
"\n",
|
||
" df['cat_vol_spike'] = df['vol'] > 2 * df['vol_spike']\n",
|
||
"\n",
|
||
" df['up'] = (df['high'] - df[['close', 'open']].max(axis=1)) / df['close']\n",
|
||
" df['down'] = (df[['close', 'open']].min(axis=1) - df['low']) / df['close']\n",
|
||
"\n",
|
||
" df['obv-maobv_6'] = df['obv'] - df['maobv_6']\n",
|
||
"\n",
|
||
" # 计算比值指标\n",
|
||
" df['std_return_5 / std_return_90'] = df['std_return_5'] / df['std_return_90']\n",
|
||
" # df['std_return_5 / std_return_25'] = df['std_return_5'] / df['std_return_25']\n",
|
||
"\n",
|
||
" # 计算标准差差值\n",
|
||
" df['std_return_90 - std_return_90_2'] = df['std_return_90'] - df['std_return_90_2']\n",
|
||
"\n",
|
||
" # df['cat_af1'] = df['act_factor1'] > 0\n",
|
||
" df['cat_af2'] = df['act_factor2'] > df['act_factor1']\n",
|
||
" df['cat_af3'] = df['act_factor3'] > df['act_factor2']\n",
|
||
" df['cat_af4'] = df['act_factor4'] > df['act_factor3']\n",
|
||
"\n",
|
||
" # 计算 act_factor5 和 act_factor6\n",
|
||
" df['act_factor5'] = df['act_factor1'] + df['act_factor2'] + df['act_factor3'] + df['act_factor4']\n",
|
||
" df['act_factor6'] = (df['act_factor1'] - df['act_factor2']) / np.sqrt(\n",
|
||
" df['act_factor1'] ** 2 + df['act_factor2'] ** 2)\n",
|
||
"\n",
|
||
" df['active_buy_volume_large'] = df['buy_lg_vol'] / df['net_mf_vol']\n",
|
||
" df['active_buy_volume_big'] = df['buy_elg_vol'] / df['net_mf_vol']\n",
|
||
" df['active_buy_volume_small'] = df['buy_sm_vol'] / df['net_mf_vol']\n",
|
||
"\n",
|
||
" df['buy_lg_vol_minus_sell_lg_vol'] = (df['buy_lg_vol'] - df['sell_lg_vol']) / df['net_mf_vol']\n",
|
||
" df['buy_elg_vol_minus_sell_elg_vol'] = (df['buy_elg_vol'] - df['sell_elg_vol']) / df['net_mf_vol']\n",
|
||
"\n",
|
||
" df['log(circ_mv)'] = np.log(df['circ_mv'])\n",
|
||
"\n",
|
||
" df['ctrl_strength'] = (df['cost_85pct'] - df['cost_15pct']) / (df['his_high'] - df['his_low'])\n",
|
||
"\n",
|
||
" df['low_cost_dev'] = (df['close'] - df['cost_5pct']) / (df['cost_50pct'] - df['cost_5pct'])\n",
|
||
"\n",
|
||
" df['asymmetry'] = (df['cost_95pct'] - df['cost_50pct']) / (df['cost_50pct'] - df['cost_5pct'])\n",
|
||
"\n",
|
||
" df['lock_factor'] = df['turnover_rate'] * (\n",
|
||
" 1 - (df['cost_95pct'] - df['cost_5pct']) / (df['his_high'] - df['his_low']))\n",
|
||
"\n",
|
||
" df['cat_vol_break'] = (df['close'] > df['cost_85pct']) & (df['volume_ratio'] > 2)\n",
|
||
"\n",
|
||
" df['cost_atr_adj'] = (df['cost_95pct'] - df['cost_5pct']) / df['atr_14']\n",
|
||
"\n",
|
||
" # 12. 小盘股筹码集中度\n",
|
||
" df['smallcap_concentration'] = (1 / df['log(circ_mv)']) * (df['cost_85pct'] - df['cost_15pct'])\n",
|
||
"\n",
|
||
" df['cat_golden_resonance'] = ((df['close'] > df['weight_avg']) &\n",
|
||
" (df['volume_ratio'] > 1.5) &\n",
|
||
" (df['winner_rate'] > 0.7))\n",
|
||
"\n",
|
||
" df['mv_turnover_ratio'] = df['turnover_rate'] / df['log(circ_mv)']\n",
|
||
"\n",
|
||
" df['mv_adjusted_volume'] = df['vol'] / df['log(circ_mv)']\n",
|
||
"\n",
|
||
" df['mv_weighted_turnover'] = df['turnover_rate'] * (1 / df['log(circ_mv)'])\n",
|
||
"\n",
|
||
" df['nonlinear_mv_volume'] = df['vol'] / df['log(circ_mv)']\n",
|
||
"\n",
|
||
" df['mv_volume_ratio'] = df['volume_ratio'] / df['log(circ_mv)']\n",
|
||
"\n",
|
||
" df['mv_momentum'] = df['turnover_rate'] * df['volume_ratio'] / df['log(circ_mv)']\n",
|
||
"\n",
|
||
" drop_columns = [col for col in df.columns if col.startswith('_')]\n",
|
||
" df.drop(columns=drop_columns, inplace=True, errors='ignore')\n",
|
||
"\n",
|
||
" new_columns = [col for col in df.columns.tolist()[:] if col not in old_columns]\n",
|
||
" return df, new_columns\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"id": "53f86ddc0677a6d7",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:09:06.284706Z",
|
||
"start_time": "2025-03-27T16:09:00.574333Z"
|
||
},
|
||
"jupyter": {
|
||
"source_hidden": true
|
||
},
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from utils.factor import get_act_factor\n",
|
||
"\n",
|
||
"\n",
|
||
"def read_industry_data(h5_filename):\n",
|
||
" # 读取 H5 文件中所有的行业数据\n",
|
||
" industry_data = pd.read_hdf(h5_filename, key='sw_daily', columns=[\n",
|
||
" 'ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'pe', 'pb', 'vol'\n",
|
||
" ]) # 假设 H5 文件的键是 'industry_data'\n",
|
||
" industry_data = industry_data.sort_values(by=['ts_code', 'trade_date'])\n",
|
||
" industry_data = industry_data.reindex()\n",
|
||
" industry_data['trade_date'] = pd.to_datetime(industry_data['trade_date'], format='%Y%m%d')\n",
|
||
"\n",
|
||
" grouped = industry_data.groupby('ts_code', group_keys=False)\n",
|
||
" industry_data['obv'] = grouped.apply(\n",
|
||
" lambda x: pd.Series(talib.OBV(x['close'].values, x['vol'].values), index=x.index)\n",
|
||
" )\n",
|
||
" industry_data['return_5'] = grouped['close'].apply(lambda x: x / x.shift(5) - 1)\n",
|
||
" industry_data['return_20'] = grouped['close'].apply(lambda x: x / x.shift(20) - 1)\n",
|
||
"\n",
|
||
" industry_data = get_act_factor(industry_data, cat=False)\n",
|
||
" industry_data = industry_data.sort_values(by=['trade_date', 'ts_code'])\n",
|
||
"\n",
|
||
" # # 计算每天每个 ts_code 的因子和当天所有 ts_code 的中位数的偏差\n",
|
||
" # factor_columns = ['obv', 'return_5', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4'] # 因子列\n",
|
||
" # \n",
|
||
" # for factor in factor_columns:\n",
|
||
" # if factor in industry_data.columns:\n",
|
||
" # # 计算每天每个 ts_code 的因子值与当天所有 ts_code 的中位数的偏差\n",
|
||
" # industry_data[f'{factor}_deviation'] = industry_data.groupby('trade_date')[factor].transform(\n",
|
||
" # lambda x: x - x.mean())\n",
|
||
"\n",
|
||
" industry_data['return_5_percentile'] = industry_data.groupby('trade_date')['return_5'].transform(\n",
|
||
" lambda x: x.rank(pct=True))\n",
|
||
" industry_data['return_20_percentile'] = industry_data.groupby('trade_date')['return_20'].transform(\n",
|
||
" lambda x: x.rank(pct=True))\n",
|
||
" industry_data = industry_data.drop(columns=['open', 'close', 'high', 'low', 'pe', 'pb', 'vol'])\n",
|
||
"\n",
|
||
" industry_data = industry_data.rename(\n",
|
||
" columns={col: f'industry_{col}' for col in industry_data.columns if col not in ['ts_code', 'trade_date']})\n",
|
||
"\n",
|
||
" industry_data = industry_data.rename(columns={'ts_code': 'cat_l2_code'})\n",
|
||
" return industry_data\n",
|
||
"\n",
|
||
"\n",
|
||
"industry_df = read_industry_data('../../data/sw_daily.h5')\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"id": "dbe2fd8021b9417f",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:09:06.368116Z",
|
||
"start_time": "2025-03-27T16:09:06.362512Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"['ts_code', 'open', 'close', 'high', 'low', 'circ_mv', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg', 'in_date']\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"origin_columns = df.columns.tolist()\n",
|
||
"origin_columns = [col for col in origin_columns if\n",
|
||
" col not in ['turnover_rate', 'pe_ttm', 'volume_ratio', 'vol', 'pct_chg', 'l2_code', 'winner_rate']]\n",
|
||
"origin_columns = [col for col in origin_columns if col not in index_data.columns]\n",
|
||
"origin_columns = [col for col in origin_columns if 'cyq' not in col]\n",
|
||
"print(origin_columns)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"id": "85c3e3d0235ffffa",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:09:06.530886Z",
|
||
"start_time": "2025-03-27T16:09:06.449319Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" ts_code trade_date is_st\n",
|
||
"29 000037.SZ 2017-01-03 True\n",
|
||
"72 000408.SZ 2017-01-03 True\n",
|
||
"95 000504.SZ 2017-01-03 True\n",
|
||
"96 000505.SZ 2017-01-03 True\n",
|
||
"101 000511.SZ 2017-01-03 True\n",
|
||
"... ... ... ...\n",
|
||
"8449447 603869.SH 2025-03-21 True\n",
|
||
"8449452 603879.SH 2025-03-21 True\n",
|
||
"8449499 603959.SH 2025-03-21 True\n",
|
||
"8449881 688282.SH 2025-03-21 True\n",
|
||
"8449885 688287.SH 2025-03-21 True\n",
|
||
"\n",
|
||
"[192172 rows x 3 columns]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print(df[df['is_st']][['ts_code', 'trade_date', 'is_st']])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"id": "92d84ce15a562ec6",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:11:19.076831Z",
|
||
"start_time": "2025-03-27T16:09:06.609989Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"<class 'pandas.core.frame.DataFrame'>\n",
|
||
"Index: 5102787 entries, 0 to 5102786\n",
|
||
"Columns: 116 entries, ts_code to mv_momentum\n",
|
||
"dtypes: bool(12), datetime64[ns](2), float64(98), int32(1), int64(1), object(2)\n",
|
||
"memory usage: 4.0+ GB\n",
|
||
"None\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"def filter_data(df):\n",
|
||
" # df = df.groupby('trade_date').apply(lambda x: x.nlargest(1000, 'act_factor1'))\n",
|
||
" df = df[~df['is_st']]\n",
|
||
" df = df[~df['ts_code'].str.endswith('BJ')]\n",
|
||
" df = df[~df['ts_code'].str.startswith('30')]\n",
|
||
" df = df[~df['ts_code'].str.startswith('68')]\n",
|
||
" df = df[~df['ts_code'].str.startswith('8')]\n",
|
||
" df = df[df['trade_date'] >= '20180101']\n",
|
||
" df = df.reset_index(drop=True)\n",
|
||
" return df\n",
|
||
"\n",
|
||
"\n",
|
||
"df = filter_data(df)\n",
|
||
"# df = get_technical_factor(df)\n",
|
||
"# df = get_act_factor(df)\n",
|
||
"# df = get_money_flow_factor(df)\n",
|
||
"# df = get_alpha_factor(df)\n",
|
||
"# df = get_limit_factor(df)\n",
|
||
"# df = get_cyp_perf_factor(df)\n",
|
||
"# df = get_mv_factors(df)\n",
|
||
"df, _ = get_rolling_factor(df)\n",
|
||
"df, _ = get_simple_factor(df)\n",
|
||
"# df = df.merge(industry_df, on=['l2_code', 'trade_date'], how='left')\n",
|
||
"df = df.rename(columns={'l2_code': 'cat_l2_code'})\n",
|
||
"# df = df.merge(index_data, on='trade_date', how='left')\n",
|
||
"\n",
|
||
"print(df.info())"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"id": "b87b938028afa206",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:11:19.515797Z",
|
||
"start_time": "2025-03-27T16:11:19.496797Z"
|
||
}
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from scipy.stats import ks_2samp, wasserstein_distance\n",
|
||
"from sklearn.metrics import roc_auc_score\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"\n",
|
||
"\n",
|
||
"def remove_shifted_features(train_data, test_data, feature_columns, ks_threshold=0.05, wasserstein_threshold=0.1,\n",
|
||
" importance_threshold=0.05):\n",
|
||
" dropped_features = []\n",
|
||
"\n",
|
||
" # **统计数据漂移**\n",
|
||
" numeric_columns = train_data.select_dtypes(include=['float64', 'int64']).columns\n",
|
||
" numeric_columns = [col for col in numeric_columns if col in feature_columns]\n",
|
||
" for feature in numeric_columns:\n",
|
||
" ks_stat, p_value = ks_2samp(train_data[feature], test_data[feature])\n",
|
||
" wasserstein_dist = wasserstein_distance(train_data[feature], test_data[feature])\n",
|
||
"\n",
|
||
" if p_value < ks_threshold or wasserstein_dist > wasserstein_threshold:\n",
|
||
" dropped_features.append(feature)\n",
|
||
"\n",
|
||
" print(f\"检测到 {len(dropped_features)} 个可能漂移的特征: {dropped_features}\")\n",
|
||
"\n",
|
||
" # **应用阈值进行最终筛选**\n",
|
||
" filtered_features = [f for f in feature_columns if f not in dropped_features]\n",
|
||
"\n",
|
||
" return filtered_features, dropped_features\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"id": "f4f16d63ad18d1bc",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:11:19.707351Z",
|
||
"start_time": "2025-03-27T16:11:19.695730Z"
|
||
}
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"def create_deviation_within_dates(df, feature_columns):\n",
|
||
" groupby_col = 'cat_l2_code' # 使用 trade_date 进行分组\n",
|
||
" new_columns = {}\n",
|
||
" ret_feature_columns = feature_columns[:]\n",
|
||
"\n",
|
||
" # 自动选择所有数值型特征\n",
|
||
" num_features = [col for col in feature_columns if 'cat' not in col and 'index' not in col]\n",
|
||
"\n",
|
||
" # num_features = ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'cat_vol_spike', 'obv', 'maobv_6', 'return_5', 'return_10', 'return_20', 'std_return_5', 'std_return_15', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'act_factor5', 'act_factor6', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'alpha_022', 'alpha_003', 'alpha_007', 'alpha_013']\n",
|
||
" num_features = [col for col in num_features if 'cat' not in col and 'industry' not in col]\n",
|
||
" num_features = [col for col in num_features if 'limit' not in col]\n",
|
||
" num_features = [col for col in num_features if 'cyq' not in col]\n",
|
||
"\n",
|
||
" # 遍历所有数值型特征\n",
|
||
" for feature in num_features:\n",
|
||
" if feature == 'trade_date': # 不需要对 'trade_date' 计算偏差\n",
|
||
" continue\n",
|
||
"\n",
|
||
" # grouped_mean = df.groupby(['trade_date'])[feature].transform('mean')\n",
|
||
" # deviation_col_name = f'deviation_mean_{feature}'\n",
|
||
" # new_columns[deviation_col_name] = df[feature] - grouped_mean\n",
|
||
" # ret_feature_columns.append(deviation_col_name)\n",
|
||
"\n",
|
||
" grouped_mean = df.groupby(['trade_date', groupby_col])[feature].transform('mean')\n",
|
||
" deviation_col_name = f'deviation_mean_{feature}'\n",
|
||
" new_columns[deviation_col_name] = df[feature] - grouped_mean\n",
|
||
" ret_feature_columns.append(deviation_col_name)\n",
|
||
"\n",
|
||
" # 将新计算的偏差特征与原始 DataFrame 合并\n",
|
||
" df = pd.concat([df, pd.DataFrame(new_columns)], axis=1)\n",
|
||
"\n",
|
||
" # for feature in ['obv', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4']:\n",
|
||
" # df[f'deviation_industry_{feature}'] = df[feature] - df[f'industry_{feature}']\n",
|
||
"\n",
|
||
" return df, ret_feature_columns\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"id": "40e6b68a91b30c79",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:11:21.058403Z",
|
||
"start_time": "2025-03-27T16:11:19.827355Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0"
|
||
]
|
||
},
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"\n",
|
||
"\n",
|
||
"def remove_outliers_label_percentile(label: pd.Series, lower_percentile: float = 0.01, upper_percentile: float = 0.99,\n",
|
||
" log=True):\n",
|
||
" if not (0 <= lower_percentile < upper_percentile <= 1):\n",
|
||
" raise ValueError(\"Percentile values must satisfy 0 <= lower_percentile < upper_percentile <= 1.\")\n",
|
||
"\n",
|
||
" # Calculate lower and upper bounds based on percentiles\n",
|
||
" lower_bound = label.quantile(lower_percentile)\n",
|
||
" upper_bound = label.quantile(upper_percentile)\n",
|
||
"\n",
|
||
" # Filter out values outside the bounds\n",
|
||
" filtered_label = label[(label >= lower_bound) & (label <= upper_bound)]\n",
|
||
"\n",
|
||
" # Print the number of removed outliers\n",
|
||
" if log:\n",
|
||
" print(f\"Removed {len(label) - len(filtered_label)} outliers.\")\n",
|
||
" return filtered_label\n",
|
||
"\n",
|
||
"\n",
|
||
"def calculate_risk_adjusted_target(df, days=5):\n",
|
||
" df = df.sort_values(by=['ts_code', 'trade_date'])\n",
|
||
"\n",
|
||
" df['future_close'] = df.groupby('ts_code')['close'].shift(-days)\n",
|
||
" df['future_open'] = df.groupby('ts_code')['open'].shift(-1)\n",
|
||
" df['future_return'] = (df['future_close'] - df['future_open']) / df['future_open']\n",
|
||
"\n",
|
||
" df['future_volatility'] = df.groupby('ts_code')['future_return'].rolling(days, min_periods=1).std().reset_index(\n",
|
||
" level=0, drop=True)\n",
|
||
" sharpe_ratio = df['future_return'] * df['future_volatility']\n",
|
||
" sharpe_ratio.replace([np.inf, -np.inf], np.nan, inplace=True)\n",
|
||
"\n",
|
||
" return sharpe_ratio\n",
|
||
"\n",
|
||
"\n",
|
||
"def calculate_score(df, days=5, lambda_param=1.0):\n",
|
||
" def calculate_max_drawdown(prices):\n",
|
||
" peak = prices.iloc[0] # 初始化峰值\n",
|
||
" max_drawdown = 0 # 初始化最大回撤\n",
|
||
"\n",
|
||
" for price in prices:\n",
|
||
" if price > peak:\n",
|
||
" peak = price # 更新峰值\n",
|
||
" else:\n",
|
||
" drawdown = (peak - price) / peak # 计算当前回撤\n",
|
||
" max_drawdown = max(max_drawdown, drawdown) # 更新最大回撤\n",
|
||
"\n",
|
||
" return max_drawdown\n",
|
||
"\n",
|
||
" def compute_stock_score(stock_df):\n",
|
||
" stock_df = stock_df.sort_values(by=['trade_date'])\n",
|
||
" future_return = stock_df['future_return']\n",
|
||
" volatility = stock_df['close'].pct_change().rolling(days).std().shift(-days)\n",
|
||
" max_drawdown = stock_df['close'].rolling(days).apply(calculate_max_drawdown, raw=False).shift(-days)\n",
|
||
" score = future_return - lambda_param * max_drawdown\n",
|
||
"\n",
|
||
" return score\n",
|
||
"\n",
|
||
" scores = df.groupby('ts_code').apply(lambda x: compute_stock_score(x))\n",
|
||
" scores = scores.reset_index(level=0, drop=True)\n",
|
||
"\n",
|
||
" return scores\n",
|
||
"\n",
|
||
"\n",
|
||
"def remove_highly_correlated_features(df, feature_columns, threshold=0.9):\n",
|
||
" numeric_features = df[feature_columns].select_dtypes(include=[np.number]).columns.tolist()\n",
|
||
" if not numeric_features:\n",
|
||
" raise ValueError(\"No numeric features found in the provided data.\")\n",
|
||
"\n",
|
||
" corr_matrix = df[numeric_features].corr().abs()\n",
|
||
" upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))\n",
|
||
" to_drop = [column for column in upper.columns if any(upper[column] > threshold)]\n",
|
||
" remaining_features = [col for col in feature_columns if col not in to_drop\n",
|
||
" or 'act' in col or 'af' in col]\n",
|
||
" return remaining_features\n",
|
||
"\n",
|
||
"import pandas as pd\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"\n",
|
||
"def cross_sectional_standardization(df, features):\n",
|
||
" df_sorted = df.sort_values(by='trade_date') # 按时间排序\n",
|
||
" df_standardized = df_sorted.copy()\n",
|
||
"\n",
|
||
" for date in df_sorted['trade_date'].unique():\n",
|
||
" # 获取当前时间点的数据\n",
|
||
" current_data = df_standardized[df_standardized['trade_date'] == date]\n",
|
||
"\n",
|
||
" # 只对指定特征进行标准化\n",
|
||
" scaler = StandardScaler()\n",
|
||
" standardized_values = scaler.fit_transform(current_data[features])\n",
|
||
"\n",
|
||
" # 将标准化结果重新赋值回去\n",
|
||
" df_standardized.loc[df_standardized['trade_date'] == date, features] = standardized_values\n",
|
||
"\n",
|
||
" return df_standardized\n",
|
||
"\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import statsmodels.api as sm\n",
|
||
"\n",
|
||
"def mad_filter(df, features, n=3):\n",
|
||
" \"\"\" 使用中位数绝对偏差(MAD)去极值 \"\"\"\n",
|
||
" df = df.copy()\n",
|
||
" for col in features:\n",
|
||
" median = df[col].median()\n",
|
||
" mad = np.median(np.abs(df[col] - median))\n",
|
||
" upper = median + n * mad\n",
|
||
" lower = median - n * mad\n",
|
||
" df[col] = np.clip(df[col], lower, upper) # 截断极值\n",
|
||
" return df\n",
|
||
"\n",
|
||
"from concurrent.futures import ProcessPoolExecutor\n",
|
||
"\n",
|
||
"def neutralize_manual(df, features, industry_col, mkt_cap_col):\n",
|
||
" \"\"\" 手动实现简单回归以提升速度 \"\"\"\n",
|
||
"\n",
|
||
" for col in features:\n",
|
||
" residuals = []\n",
|
||
" for _, group in df.groupby(industry_col):\n",
|
||
" if len(group) > 1:\n",
|
||
" x = np.log(group[mkt_cap_col]) # 市值对数\n",
|
||
" y = group[col] # 因子值\n",
|
||
" beta = np.cov(y, x)[0, 1] / np.var(x) # 计算斜率\n",
|
||
" alpha = np.mean(y) - beta * np.mean(x) # 计算截距\n",
|
||
" resid = y - (alpha + beta * x) # 计算残差\n",
|
||
" residuals.extend(resid)\n",
|
||
" else:\n",
|
||
" residuals.extend(group[col]) # 样本不足时保留原值\n",
|
||
"\n",
|
||
" df[col] = residuals\n",
|
||
"\n",
|
||
" return df\n",
|
||
"\n",
|
||
"\n",
|
||
"import gc\n",
|
||
"\n",
|
||
"gc.collect()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"id": "47c12bb34062ae7a",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:14:38.093106Z",
|
||
"start_time": "2025-03-27T16:11:21.203458Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"feature_columns size: 106\n",
|
||
"去极值\n",
|
||
"去极值\n",
|
||
"检测到 17 个可能漂移的特征: ['vol', 'pct_chg', 'turnover_rate', 'vol_std_5', 'obv', 'log(circ_mv)', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'log_close', 'up', 'down', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume']\n",
|
||
"feature_columns: ['pe_ttm', 'volume_ratio', 'winner_rate', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'atr_14', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'alpha_007', 'alpha_013', 'cat_up_limit', 'cat_down_limit', 'up_limit_count_10d', 'down_limit_count_10d', 'consecutive_up_limit', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'arbr', 'momentum_factor', 'resonance_factor', 'cat_vol_spike', 'obv-maobv_6', 'std_return_5 / std_return_90', 'std_return_90 - std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_momentum', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile']\n",
|
||
"2539543\n",
|
||
"最小日期: 2018-06-04\n",
|
||
"最大日期: 2022-12-30\n",
|
||
"1232105\n",
|
||
"最小日期: 2023-01-03\n",
|
||
"最大日期: 2025-03-19\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"days = 2\n",
|
||
"validation_days = 120\n",
|
||
"\n",
|
||
"import gc\n",
|
||
"\n",
|
||
"gc.collect()\n",
|
||
"\n",
|
||
"# df['future_return'] = df.groupby('ts_code', group_keys=False)['close'].apply(lambda x: x.shift(-days) / x - 1)\n",
|
||
"df['future_return'] = (df.groupby('ts_code')['close'].shift(-days) - df.groupby('ts_code')['open'].shift(-1)) / \\\n",
|
||
" df.groupby('ts_code')['open'].shift(-1)\n",
|
||
"df['future_volatility'] = (\n",
|
||
" df.groupby('ts_code')['future_return']\n",
|
||
" .transform(lambda x: x.rolling(days).std())\n",
|
||
")\n",
|
||
"\n",
|
||
"df['future_score'] = (\n",
|
||
" 0.7 * df['future_return'] +\n",
|
||
" 0.3 * df['future_volatility']\n",
|
||
")\n",
|
||
"\n",
|
||
"filter_index = df['future_return'].between(df['future_return'].quantile(0.01), df['future_return'].quantile(0.99))\n",
|
||
"filter_index = df['future_volatility'].between(df['future_volatility'].quantile(0.01),\n",
|
||
" df['future_volatility'].quantile(0.99)) | filter_index\n",
|
||
"\n",
|
||
"# df['label'] = df.groupby('trade_date', group_keys=False)['future_volatility'].transform(\n",
|
||
"# lambda x: pd.qcut(x, q=30, labels=False, duplicates='drop')\n",
|
||
"# )\n",
|
||
"\n",
|
||
"df['label'] = df.groupby('trade_date', group_keys=False)['future_score'].transform(\n",
|
||
" lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n",
|
||
")\n",
|
||
"\n",
|
||
"\n",
|
||
"# df['1_score'] = df.groupby('ts_code', group_keys=False)['future_score'].shift(days)\n",
|
||
"# df['2_score'] = df.groupby('ts_code', group_keys=False)['future_score'].shift(1 + days)\n",
|
||
"# df['3_score'] = df.groupby('ts_code', group_keys=False)['future_score'].shift(3 + days - 1)\n",
|
||
"\n",
|
||
"def symmetric_log_transform(values):\n",
|
||
" return np.sign(values) * np.log1p(np.abs(values))\n",
|
||
"\n",
|
||
"\n",
|
||
"train_data = df[filter_index & (df['trade_date'] <= '2023-01-01') & (df['trade_date'] >= '2000-01-01')]\n",
|
||
"test_data = df[filter_index & (df['trade_date'] >= '2023-01-01')]\n",
|
||
"\n",
|
||
"\n",
|
||
"def select_pre_zt_stocks_dynamic(stock_df):\n",
|
||
" # 排序数据\n",
|
||
" stock_df = stock_df.sort_values(by=['trade_date', 'ts_code'])\n",
|
||
"\n",
|
||
" # avg_vol_3 = stock_df.groupby('ts_code')['vol'].rolling(window=3).mean().reset_index(level=0, drop=True)\n",
|
||
" # avg_vol_5 = stock_df.groupby('ts_code')['vol'].rolling(window=5).mean().shift(3).reset_index(level=0, drop=True)\n",
|
||
"\n",
|
||
" # stock_df = stock_df[\n",
|
||
" # (stock_df['cat_up_limit'] == 1) |\n",
|
||
" # (stock_df['vol'] > vol_spike_multiplier * stock_df['vol_spike'])\n",
|
||
" # ]\n",
|
||
" # cd1 = stock_df[\"close\"] > stock_df[\"close\"].shift(1)\n",
|
||
"\n",
|
||
" # cd2 = stock_df[\"close\"] > stock_df[\"close\"].rolling(window=10).mean()\n",
|
||
" #\n",
|
||
" # cd3 = (avg_vol_3 > avg_vol_5 * 2)\n",
|
||
" #\n",
|
||
" # cd4 = stock_df['gap_next_open'] < 0\n",
|
||
"\n",
|
||
" # stock_df = stock_df[(cd2 & cd4) | cd3]\n",
|
||
" stock_df = stock_df.groupby('trade_date', group_keys=False).apply(\n",
|
||
" lambda x: x.nlargest(1000, 'return_20')\n",
|
||
" )\n",
|
||
"\n",
|
||
" return stock_df\n",
|
||
"\n",
|
||
"\n",
|
||
"# train_data = select_pre_zt_stocks_dynamic(train_data)\n",
|
||
"# test_data = select_pre_zt_stocks_dynamic(test_data)\n",
|
||
"\n",
|
||
"train_data, _ = get_simple_factor(train_data)\n",
|
||
"test_data, _ = get_simple_factor(test_data)\n",
|
||
"\n",
|
||
"# train_data['label'] = train_data.groupby('trade_date', group_keys=False)['future_score'].transform(\n",
|
||
"# lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n",
|
||
"# )\n",
|
||
"# test_data['label'] = test_data.groupby('trade_date', group_keys=False)['future_score'].transform(\n",
|
||
"# lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n",
|
||
"# )\n",
|
||
"\n",
|
||
"industry_df = industry_df.sort_values(by=['trade_date'])\n",
|
||
"index_data = index_data.sort_values(by=['trade_date'])\n",
|
||
"\n",
|
||
"train_data = train_data.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n",
|
||
"# train_data = train_data.merge(index_data, on='trade_date', how='left')\n",
|
||
"test_data = test_data.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n",
|
||
"# test_data = test_data.merge(index_data, on='trade_date', how='left')\n",
|
||
"\n",
|
||
"train_data, test_data = train_data.replace([np.inf, -np.inf], np.nan), test_data.replace([np.inf, -np.inf], np.nan)\n",
|
||
"\n",
|
||
"# feature_columns_new = feature_columns[:]\n",
|
||
"# train_data, _ = create_deviation_within_dates(train_data, feature_columns)\n",
|
||
"# test_data, _ = create_deviation_within_dates(test_data, feature_columns)\n",
|
||
"\n",
|
||
"feature_columns = [col for col in train_data.columns if col in train_data.columns]\n",
|
||
"feature_columns = [col for col in feature_columns if col not in ['trade_date',\n",
|
||
" 'ts_code',\n",
|
||
" 'label']]\n",
|
||
"feature_columns = [col for col in feature_columns if 'future' not in col]\n",
|
||
"feature_columns = [col for col in feature_columns if 'label' not in col]\n",
|
||
"feature_columns = [col for col in feature_columns if 'score' not in col]\n",
|
||
"feature_columns = [col for col in feature_columns if 'gen' not in col]\n",
|
||
"feature_columns = [col for col in feature_columns if 'cat_l2_code' not in col]\n",
|
||
"feature_columns = [col for col in feature_columns if col not in origin_columns]\n",
|
||
"feature_columns = [col for col in feature_columns if not col.startswith('_')]\n",
|
||
"print(f'feature_columns size: {len(feature_columns)}')\n",
|
||
"\n",
|
||
"# train_data = train_data.dropna(subset=feature_columns)\n",
|
||
"# train_data = train_data.dropna(subset=['label'])\n",
|
||
"# train_data = train_data.reset_index(drop=True)\n",
|
||
"#\n",
|
||
"# # print(test_data.tail())\n",
|
||
"# test_data = test_data.dropna(subset=feature_columns)\n",
|
||
"# # test_data = test_data.dropna(subset=['label'])\n",
|
||
"# test_data = test_data.reset_index(drop=True)\n",
|
||
"\n",
|
||
"numeric_columns = train_data.select_dtypes(include=['float64', 'int64']).columns\n",
|
||
"numeric_columns = [col for col in numeric_columns if col in feature_columns]\n",
|
||
"print('去极值')\n",
|
||
"train_data = mad_filter(train_data, numeric_columns) # 去极值\n",
|
||
"# print('中性化')\n",
|
||
"# train_data = neutralize_manual(train_data, numeric_columns, industry_col='cat_l2_code', mkt_cap_col='log(circ_mv)') # 中性化\n",
|
||
"print('去极值')\n",
|
||
"test_data = mad_filter(test_data, numeric_columns) # 去极值\n",
|
||
"# print('中性化')\n",
|
||
"# test_data = neutralize_manual(test_data, numeric_columns, industry_col='cat_l2_code', mkt_cap_col='log(circ_mv)')\n",
|
||
"\n",
|
||
"feature_columns, _ = remove_shifted_features(train_data[train_data['label'] == train_data['label'].max()],\n",
|
||
" test_data[test_data['label'] == test_data['label'].max()],\n",
|
||
" feature_columns)\n",
|
||
"\n",
|
||
"feature_columns = remove_highly_correlated_features(train_data[train_data['label'] == train_data['label'].max()],\n",
|
||
" feature_columns)\n",
|
||
"keep_columns = [col for col in train_data.columns if\n",
|
||
" col in feature_columns or col in ['ts_code', 'trade_date', 'label', 'future_return',\n",
|
||
" 'future_score', 'future_volatility']]\n",
|
||
"# train_data = train_data[keep_columns]\n",
|
||
"print(f'feature_columns: {feature_columns}')\n",
|
||
"\n",
|
||
"train_data = train_data.dropna(subset=feature_columns)\n",
|
||
"train_data = train_data.dropna(subset=['label'])\n",
|
||
"train_data = train_data.reset_index(drop=True)\n",
|
||
"\n",
|
||
"# print(test_data.tail())\n",
|
||
"test_data = test_data.dropna(subset=feature_columns)\n",
|
||
"# test_data = test_data.dropna(subset=['label'])\n",
|
||
"test_data = test_data.reset_index(drop=True)\n",
|
||
"\n",
|
||
"print(len(train_data))\n",
|
||
"print(f\"最小日期: {train_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n",
|
||
"print(f\"最大日期: {train_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n",
|
||
"print(len(test_data))\n",
|
||
"print(f\"最小日期: {test_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n",
|
||
"print(f\"最大日期: {test_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n",
|
||
"\n",
|
||
"cat_columns = [col for col in feature_columns if col.startswith('cat')]\n",
|
||
"for col in cat_columns:\n",
|
||
" train_data[col] = train_data[col].astype('category')\n",
|
||
" test_data[col] = test_data[col].astype('category')\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"# feature_columns_new.remove('cat_l2_code')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"id": "8f134d435f71e9e2",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:14:38.583761Z",
|
||
"start_time": "2025-03-27T16:14:38.545794Z"
|
||
},
|
||
"jupyter": {
|
||
"source_hidden": true
|
||
}
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"import lightgbm as lgb\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.decomposition import PCA\n",
|
||
"\n",
|
||
"\n",
|
||
"def train_light_model(train_data_df, params, feature_columns, callbacks, evals,\n",
|
||
" print_feature_importance=True, num_boost_round=100,\n",
|
||
" validation_days=180, use_pca=False, split_date=None): # 新增参数:validation_days\n",
|
||
" # 确保数据按时间排序\n",
|
||
" train_data_df = train_data_df.sort_values(by='trade_date')\n",
|
||
"\n",
|
||
" numeric_columns = train_data_df.select_dtypes(include=['float64', 'int64']).columns\n",
|
||
" numeric_columns = [col for col in numeric_columns if col in feature_columns]\n",
|
||
" # X_train.loc[:, numeric_columns] = scaler.fit_transform(X_train[numeric_columns])\n",
|
||
" # X_val.loc[:, numeric_columns] = scaler.transform(X_val[numeric_columns])\n",
|
||
" train_data_df = cross_sectional_standardization(train_data_df, numeric_columns)\n",
|
||
"\n",
|
||
" # 去除标签为空的样本\n",
|
||
" train_data_df = train_data_df.dropna(subset=['label'])\n",
|
||
" print('原始训练集大小: ', len(train_data_df))\n",
|
||
"\n",
|
||
" # 按时间顺序划分训练集和验证集\n",
|
||
" if split_date is None:\n",
|
||
" all_dates = train_data_df['trade_date'].unique() # 获取所有唯一的 trade_date\n",
|
||
" split_date = all_dates[-validation_days] # 划分点为倒数第 validation_days 天\n",
|
||
" train_data_split = train_data_df[train_data_df['trade_date'] < split_date] # 训练集\n",
|
||
" val_data_split = train_data_df[train_data_df['trade_date'] >= split_date] # 验证集\n",
|
||
"\n",
|
||
" # 打印划分结果\n",
|
||
" print(f\"划分后的训练集大小: {len(train_data_split)}, 验证集大小: {len(val_data_split)}\")\n",
|
||
"\n",
|
||
" # 提取特征和标签\n",
|
||
" X_train = train_data_split[feature_columns]\n",
|
||
" y_train = train_data_split['label']\n",
|
||
"\n",
|
||
" X_val = val_data_split[feature_columns]\n",
|
||
" y_val = val_data_split['label']\n",
|
||
"\n",
|
||
" # 标准化数值特征\n",
|
||
" scaler = StandardScaler()\n",
|
||
"\n",
|
||
"\n",
|
||
" # 计算每个 trade_date 内的样本数(LTR 需要 group 信息)\n",
|
||
" train_groups = train_data_split.groupby('trade_date').size().tolist()\n",
|
||
" val_groups = val_data_split.groupby('trade_date').size().tolist()\n",
|
||
"\n",
|
||
" # 处理类别特征\n",
|
||
" categorical_feature = [col for col in feature_columns if 'cat' in col]\n",
|
||
"\n",
|
||
" pca = None\n",
|
||
" if use_pca:\n",
|
||
" pca = PCA(n_components=0.95) # 或指定 n_components=固定值(如 10)\n",
|
||
" numeric_features = [col for col in feature_columns if col not in categorical_feature]\n",
|
||
" numeric_pca = pca.fit_transform(X_train[numeric_features])\n",
|
||
" X_train = pd.concat([pd.DataFrame(numeric_pca, index=X_train.index), X_train[categorical_feature]], axis=1)\n",
|
||
"\n",
|
||
" numeric_pca = pca.transform(X_val[numeric_features])\n",
|
||
" X_val = pd.concat([pd.DataFrame(numeric_pca, index=X_val.index), X_val[categorical_feature]], axis=1)\n",
|
||
"\n",
|
||
" # 计算权重(基于时间)\n",
|
||
" # trade_date = train_data_split['trade_date'] # 交易日期\n",
|
||
" # weights = (trade_date - trade_date.min()).dt.days / (trade_date.max() - trade_date.min()).days + 1\n",
|
||
" # weights = train_data_split.groupby('trade_date')['std_return_5'].transform(\n",
|
||
" # lambda x: x / x.mean()\n",
|
||
" # )\n",
|
||
" ud = sorted(train_data_split[\"trade_date\"].unique().tolist())\n",
|
||
" date_weights = {date: weight * weight for date, weight in zip(ud, np.linspace(1, 10, len(ud)))}\n",
|
||
" params['weight'] = train_data_split[\"trade_date\"].map(date_weights).tolist()\n",
|
||
"\n",
|
||
" print('feature_columns size: ', len(X_train.columns.tolist()))\n",
|
||
"\n",
|
||
" train_dataset = lgb.Dataset(\n",
|
||
" X_train, label=y_train, group=train_groups,\n",
|
||
" categorical_feature=categorical_feature\n",
|
||
" )\n",
|
||
"\n",
|
||
" # weights = val_data_split.groupby('trade_date')['std_return_5'].transform(\n",
|
||
" # lambda x: x / x.mean()\n",
|
||
" # )\n",
|
||
" val_dataset = lgb.Dataset(\n",
|
||
" X_val, label=y_val, group=val_groups,\n",
|
||
" categorical_feature=categorical_feature\n",
|
||
" )\n",
|
||
"\n",
|
||
" # 训练模型\n",
|
||
" model = lgb.train(\n",
|
||
" params, train_dataset, num_boost_round=num_boost_round,\n",
|
||
" valid_sets=[train_dataset, val_dataset], valid_names=['train', 'valid'],\n",
|
||
" callbacks=callbacks\n",
|
||
" )\n",
|
||
"\n",
|
||
" # 打印特征重要性(如果需要)\n",
|
||
" if print_feature_importance:\n",
|
||
" lgb.plot_metric(evals)\n",
|
||
" lgb.plot_importance(model, importance_type='split', max_num_features=20)\n",
|
||
" plt.show()\n",
|
||
"\n",
|
||
" return model, scaler, pca\n",
|
||
"\n",
|
||
"\n",
|
||
"from catboost import CatBoostRanker, Pool\n",
|
||
"import numpy as np\n",
|
||
"\n",
|
||
"\n",
|
||
"def train_catboost(train_data_df, test_data_df, feature_columns, params=None, plot=False):\n",
|
||
" X_train = train_data_df[feature_columns]\n",
|
||
" y_train = train_data_df['label']\n",
|
||
"\n",
|
||
" X_val = test_data_df[feature_columns]\n",
|
||
" y_val = test_data_df['label']\n",
|
||
"\n",
|
||
" scaler = StandardScaler()\n",
|
||
" numeric_columns = X_train.select_dtypes(include=['float64', 'int64']).columns\n",
|
||
" X_train.loc[:, numeric_columns] = scaler.fit_transform(X_train[numeric_columns])\n",
|
||
" X_val.loc[:, numeric_columns] = scaler.transform(X_val[numeric_columns])\n",
|
||
"\n",
|
||
" group_train = train_data_df['trade_date'].factorize()[0]\n",
|
||
" group_val = test_data_df['trade_date'].factorize()[0]\n",
|
||
"\n",
|
||
" cat_features = [i for i, col in enumerate(feature_columns) if col.startswith('cat')]\n",
|
||
" print(f'cat_features: {cat_features}')\n",
|
||
"\n",
|
||
" train_pool = Pool(\n",
|
||
" data=X_train,\n",
|
||
" label=y_train,\n",
|
||
" group_id=group_train,\n",
|
||
" cat_features=cat_features\n",
|
||
" )\n",
|
||
"\n",
|
||
" val_pool = Pool(\n",
|
||
" data=X_val,\n",
|
||
" label=y_val,\n",
|
||
" group_id=group_val,\n",
|
||
" cat_features=cat_features\n",
|
||
" )\n",
|
||
"\n",
|
||
" # CatBoost 排序学习模型\n",
|
||
" model = CatBoostRanker(**params)\n",
|
||
" model.fit(train_pool, eval_set=val_pool, plot=plot, use_best_model=True)\n",
|
||
"\n",
|
||
" return model, scaler\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"id": "c6eb5cd4-e714-420a-ac48-39af3e11ee81",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:17:43.124162Z",
|
||
"start_time": "2025-03-27T16:14:38.735110Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"train data size: 2539543\n",
|
||
"feature_contri: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n",
|
||
"原始训练集大小: 2539543\n",
|
||
"划分后的训练集大小: 2258414, 验证集大小: 281129\n",
|
||
"feature_columns size: 84\n",
|
||
"Training until validation scores don't improve for 50 rounds\n",
|
||
"[100]\ttrain's ndcg@1: 0.792371\tvalid's ndcg@1: 0.569953\n",
|
||
"Early stopping, best iteration is:\n",
|
||
"[132]\ttrain's ndcg@1: 0.814715\tvalid's ndcg@1: 0.623046\n",
|
||
"Evaluated only: ndcg@1\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAjn9JREFUeJzs3Xd8k9X+wPFPko5070VpKXvPMgSVoQzFAU4UVEBFZTguF7ey9Cde9SIOFO9VxKuiOBAHigICyt57zzK6S/dM8vz+OE3a0EFb2qbj+369+kpy8jxPTk4D+fac7zlHp2mahhBCCCFEA6F3dAWEEEIIIaqTBDdCCCGEaFAkuBFCCCFEgyLBjRBCCCEaFAluhBBCCNGgSHAjhBBCiAZFghshhBBCNCgS3AghhBCiQZHgRgghhBANigQ3QggWLVqETqfj9OnTNfYaM2fORKfT1ZvrOtrp06fR6XQsWrSoSufrdDpmzpxZrXUSor6Q4EaIWmQNInQ6HevXry/xvKZpREREoNPpuPnmm6v0Gh988EGVvxBF5SxevJh58+Y5uhpCiEtIcCOEAxiNRhYvXlyifN26dZw7dw5XV9cqX7sqwc39999PTk4OzZo1q/LrOspLL71ETk6OQ167JoObZs2akZOTw/3331+l83NycnjppZequVZC1A8S3AjhAMOHD+fbb7/FZDLZlS9evJjo6GhCQ0NrpR5ZWVkAGAwGjEZjvRresdbdyckJo9Ho4NpcXm5uLhaLpcLH63Q6jEYjBoOhSq9nNBpxcnKq0rlC1HcS3AjhAPfeey/JycmsXLnSVpafn893333H6NGjSz3HYrEwb948OnbsiNFoJCQkhEcffZSLFy/ajomKiuLAgQOsW7fONvw1cOBAoGhIbN26dUyaNIng4GCaNm1q99ylOTe//fYbAwYMwMvLC29vb3r16lVqj9Ol1q9fT69evTAajbRs2ZKPPvqoxDHl5ZRcmi9izas5ePAgo0ePxs/Pj2uuucbuuUvPnzJlCsuWLaNTp064urrSsWNHVqxYUeK11q5dS8+ePe3qWpE8noEDB7J8+XLOnDlja+uoqCjbNXU6HV9//TUvvfQS4eHhuLu7k56eTkpKCtOmTaNz5854enri7e3NjTfeyJ49ey7bPuPGjcPT05Pz588zcuRIPD09CQoKYtq0aZjN5gq14fHjxxk3bhy+vr74+Pgwfvx4srOz7c7NycnhiSeeIDAwEC8vL2699VbOnz8veTyi3pCwXggHiIqKom/fvnz11VfceOONgAok0tLSuOeee3j33XdLnPPoo4+yaNEixo8fzxNPPMGpU6d4//332bVrFxs2bMDZ2Zl58+bx+OOP4+npyYsvvghASEiI3XUmTZpEUFAQ06dPt/V+lGbRokU8+OCDdOzYkeeffx5fX1927drFihUrygzAAPbt28fQoUMJCgpi5syZmEwmZsyYUaIeVXHXXXfRunVrXnvtNTRNK/fY9evXs3TpUiZNmoSXlxfvvvsud9xxBzExMQQEBACwa9cubrjhBsLCwpg1axZms5nZs2cTFBR02bq8+OKLpKWlce7cOd5++20APD097Y555ZVXcHFxYdq0aeTl5eHi4sLBgwdZtmwZd911F82bNyc+Pp6PPvqIAQMGcPDgQZo0aVLu65rNZoYNG0afPn146623WLVqFf/+979p2bIlEydOvGy97777bpo3b86cOXPYuXMnH3/8McHBwfzrX/+yHTNu3Di++eYb7r//fq666irWrVvHTTfddNlrC1FnaEKIWvPpp59qgLZt2zbt/fff17y8vLTs7GxN0zTtrrvu0gYNGqRpmqY1a9ZMu+mmm2zn/f333xqgffnll3bXW7FiRYnyjh07agMGDCjzta+55hrNZDKV+typU6c0TdO01NRUzcvLS+vTp4+Wk5Njd6zFYin3PY4cOVIzGo3amTNnbGUHDx7UDAaDVvy/nFOnTmmA9umnn5a4BqDNmDHD9njGjBkaoN17770ljrU+d+n5Li4u2vHjx21le/bs0QDtvffes5Xdcsstmru7u3b+/Hlb2bFjxzQnJ6cS1yzNTTfdpDVr1qxE+Zo1azRAa9Gihe33a5Wbm6uZzWa7slOnTmmurq7a7Nmz7coubZ+xY8dqgN1xmqZp3bt316Kjo0u0QWlt+OCDD9odd9ttt2kBAQG2xzt27NAA7amnnrI7bty4cSWuKURdJcNSQjjI3XffTU5ODr/88gsZGRn88ssvZfaIfPvtt/j4+DBkyBCSkpJsP9HR0Xh6erJmzZoKv+6ECRMum8excuVKMjIyeO6550rks5Q3XGM2m/n9998ZOXIkkZGRtvL27dszbNiwCtexLI899liFjx08eDAtW7a0Pe7SpQve3t6cPHnSVtdVq1Yx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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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b775huvXr1OtWjUmTJjAO++8A0BmZib9+/dn165dXL9+HScnJwYOHMjQoUOfGseRI0fw9fVl1KhRjBkzRuf4m4TvJKOU2Qsff0lgpK8wozHUDvuV1ExNYYfz2pI86a6k5+rS9Dd1LluxYkWcnJwICQlh8eLFmJmZMWfOHK5evcq1a9e0yn711Vd88sknpKSkUL16daKjozE0NHzZ4QtRZEhDXxQr7777LoMHD2b37t20bdsWgLt377Jt2zaioqLYsGEDQ4cOZe7cuXh7e7NlyxZ69+5NxYoVad269Qvtc/To0cydO5eaNWsye/Zs/Pz8uHjxItbW1mqZsWPHMnPmTCpXrkzZsmUJDw9nxYoVfP3117i6urJv3z7ef/99bGxsaNWqFVlZWVSsWJEff/wRa2trDhw4QP/+/bG3t6dbt265Yti1axddunRhxowZWqevn5Samkpqaqr6PCkpCQAjPQV9feWFjr2kMNJTtH6KvEmedFfSc5XTS/80GRkZpKenk56eTqlSpVi1ahUDBw7EysoKfX192rZti4+PD4qiaNXVrVs3vLy8uH79OrNnz+bdd99l7969WmcDiqOcHDwvr6J45Co/sWsURSmZ7zKi2PL398fa2ppvv/0WyO7lnzRpEleuXKFly5bUqlWLb775Ri3frVs3UlJS2Lp1K5B9Me6GDRuee6HrpUuXqFSpEtOnT1d70DMyMqhUqRKDBw/mk08+UXv0N27cSOfOnYHsBreVlRU7duzA09NTra9v3748evSIVatW5bm/4OBgrl+/zk8//QRkX4x7//59AgMD6dWrF0uXLqV79+5PjTcsLIxJkyblWr5q1SpMTU2feaxCCFFQ/P39GTt2LE2bNs21LiUlhYyMDCwtLRk9ejRVq1blo48+yrOe9PR03n//fQYNGsQbb7zxqsMWosA8evSInj178uDBAywsLJ5ZVnr0RbETEBBAv379+OqrrzAyMmLlypW899576Onpcfbs2Vw93s2bN2fevHkvvL8nG+ulSpWiYcOGnD17VqtMw4YN1d/j4+N59OgR7dq10yqTlpaGh4eH+nzhwoUsW7aMxMRE/vnnH9LS0qhXr57WNocOHWLLli389NNPz/1iEhISwogRI9TnSUlJODo60rp1a62zDyK39PR0oqOjadeuHQYGBoUdzmtL8qQ7ydWzNWjQAF9f36fm6cKF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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"train data size: 2539543\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print('train data size: ', len(train_data))\n",
|
||
"\n",
|
||
"label_gain = list(range(len(train_data['label'].unique())))\n",
|
||
"label_gain = [gain * gain for gain in label_gain]\n",
|
||
"light_params = {\n",
|
||
" 'label_gain': label_gain,\n",
|
||
" 'objective': 'lambdarank',\n",
|
||
" 'metric': 'lambdarank',\n",
|
||
" 'learning_rate': 0.1,\n",
|
||
" 'num_leaves': 1024,\n",
|
||
" 'min_data_in_leaf': 128,\n",
|
||
" 'max_depth': 16,\n",
|
||
" 'max_bin': 1024,\n",
|
||
" 'feature_fraction': 0.7,\n",
|
||
" 'bagging_fraction': 1,\n",
|
||
" 'bagging_freq': 5,\n",
|
||
" 'lambda_l1': 1,\n",
|
||
" 'lambda_l2': 1,\n",
|
||
" # 'boosting': 'dart',\n",
|
||
" 'verbosity': -1,\n",
|
||
" 'extra_trees': True,\n",
|
||
" 'max_position': 5,\n",
|
||
" 'ndcg_at': 1,\n",
|
||
" 'seed': 7\n",
|
||
"}\n",
|
||
"evals = {}\n",
|
||
"\n",
|
||
"gc.collect()\n",
|
||
"\n",
|
||
"use_pca = False\n",
|
||
"feature_contri = [2 if feat.startswith('act_factor') else 1 for feat in feature_columns]\n",
|
||
"light_params['feature_contri'] = feature_contri\n",
|
||
"print(f'feature_contri: {feature_contri}')\n",
|
||
"model, scaler, pca = train_light_model(train_data.dropna(subset=['label']),\n",
|
||
" light_params, feature_columns,\n",
|
||
" [lgb.log_evaluation(period=100),\n",
|
||
" lgb.callback.record_evaluation(evals),\n",
|
||
" lgb.early_stopping(50, first_metric_only=True)\n",
|
||
" ], evals,\n",
|
||
" num_boost_round=1000, validation_days=120,\n",
|
||
" print_feature_importance=True, use_pca=use_pca)\n",
|
||
"\n",
|
||
"print('train data size: ', len(train_data))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"id": "1a248706-e58a-406f-9268-6dce3de2d863",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:17:43.436380Z",
|
||
"start_time": "2025-03-27T16:17:43.431329Z"
|
||
},
|
||
"jupyter": {
|
||
"source_hidden": true
|
||
}
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"\n",
|
||
"\n",
|
||
"# catboost_params = {\n",
|
||
"# 'loss_function': 'QuerySoftMax',\n",
|
||
"# 'eval_metric': 'QuerySoftMax',\n",
|
||
"# # 'custom_metric': ['AverageGain:top=10'],\n",
|
||
"\n",
|
||
"# 'iterations': 5000,\n",
|
||
"# 'learning_rate': 0.01,\n",
|
||
"# 'depth': 10,\n",
|
||
"# 'grow_policy': 'Lossguide',\n",
|
||
"# # 'max_leaves': 64,\n",
|
||
"# # 'min_data_in_leaf': 50,\n",
|
||
"\n",
|
||
"# # 'l2_leaf_reg': 5,\n",
|
||
"# # 'random_strength': 2.0,\n",
|
||
"# # 'bagging_temperature': 1.2,\n",
|
||
"# # 'subsample': 0.8,\n",
|
||
"\n",
|
||
"# 'early_stopping_rounds': 100,\n",
|
||
"# 'task_type': 'GPU',\n",
|
||
"# 'verbose': 500,\n",
|
||
"\n",
|
||
"# 'one_hot_max_size': 64\n",
|
||
"# }\n",
|
||
"\n",
|
||
"# gc.collect()\n",
|
||
"\n",
|
||
"# feature_weights = {col: 2.0 if 'act_factor' in col\n",
|
||
"# # or 'af' in col\n",
|
||
"# or 'limit' in col\n",
|
||
"# else 1.0\n",
|
||
"# for col in feature_columns_new}\n",
|
||
"# catboost_params['feature_weights'] = feature_weights\n",
|
||
"\n",
|
||
"# # model, scaler = train_catboost(train_data, test_data.dropna(subset=['label']), feature_columns_new, catboost_params, plot=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"id": "5d1522a7538db91b",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:18:27.148839Z",
|
||
"start_time": "2025-03-27T16:17:43.570507Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"33.808630393996246\n",
|
||
" trade_date ts_code future_return future_score label\n",
|
||
"1018787 2023-01-03 603232.SH -0.048337 0.009385 25.0\n",
|
||
"861926 2023-01-04 601155.SH 0.011962 0.027340 43.0\n",
|
||
"56178 2023-01-05 000596.SZ 0.006810 0.025770 42.0\n",
|
||
"919818 2023-01-06 601865.SH -0.016155 0.009868 36.0\n",
|
||
"825775 2023-01-09 600961.SH -0.007557 0.016855 44.0\n",
|
||
"270858 2023-01-10 002238.SZ 0.137958 0.110154 49.0\n",
|
||
"440009 2023-01-11 002762.SZ 0.165666 0.126402 49.0\n",
|
||
"705317 2023-01-12 600556.SH 0.005312 0.028766 42.0\n",
|
||
"94754 2023-01-13 000786.SZ -0.011414 0.007786 28.0\n",
|
||
"179564 2023-01-16 001339.SZ -0.045814 -0.015564 3.0\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# train_data = train_data.sort_values(by='trade_date')\n",
|
||
"# all_dates = train_data['trade_date'].unique() # 获取所有唯一的 trade_date\n",
|
||
"# split_date = all_dates[-120] # 划分点为倒数第 validation_days 天\n",
|
||
"# print(split_date)\n",
|
||
"# print(all_dates)\n",
|
||
"# val_data_split = train_data[train_data['trade_date'] >= split_date] # 验证集\n",
|
||
"\n",
|
||
"score_df = test_data\n",
|
||
"numeric_columns = score_df.select_dtypes(include=['float64', 'int64']).columns\n",
|
||
"numeric_columns = [col for col in numeric_columns if col in feature_columns]\n",
|
||
"# score_df.loc[:, numeric_columns] = scaler.transform(score_df[numeric_columns])\n",
|
||
"score_df = cross_sectional_standardization(score_df, numeric_columns)\n",
|
||
"\n",
|
||
"if use_pca and pca is not None:\n",
|
||
" categorical_feature = [col for col in feature_columns if 'cat' in col]\n",
|
||
" numeric_features = [col for col in feature_columns if col not in categorical_feature]\n",
|
||
" numeric_pca = pca.transform(score_df[numeric_features])\n",
|
||
" score_df = pd.concat([pd.DataFrame(numeric_pca), score_df[categorical_feature],\n",
|
||
" score_df[['trade_date', 'ts_code', 'future_return', 'future_score', 'label']]], axis=1)\n",
|
||
" score_df['score'] = model.predict(score_df[[col for col in score_df.columns if\n",
|
||
" col not in ['trade_date', 'ts_code', 'future_return', 'future_score',\n",
|
||
" 'label']]])\n",
|
||
"else:\n",
|
||
" score_df['score'] = model.predict(score_df[feature_columns])\n",
|
||
"# train_data['score'] = catboost_model.predict(train_data[feature_columns])\n",
|
||
"score_df = score_df.loc[score_df.groupby('trade_date')['score'].idxmax()]\n",
|
||
"# score_df = score_df[score_df['score'] > 0]\n",
|
||
"score_df[['trade_date', 'score', 'ts_code']].to_csv('predictions_test.tsv', index=False)\n",
|
||
"print(score_df['label'].mean())\n",
|
||
"print(score_df[['trade_date', 'ts_code', 'future_return', 'future_score', 'label']].head(10))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"id": "d86af99d15cb3bdd",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:18:28.041081Z",
|
||
"start_time": "2025-03-27T16:18:27.264187Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" trade_date ts_code close open future_return\n",
|
||
"255411 2018-06-04 603577.SH 24.57 23.98 -0.044408\n",
|
||
"257982 2018-06-05 603577.SH 23.45 24.32 -0.037819\n",
|
||
"260550 2018-06-06 603577.SH 23.24 22.74 -0.052262\n",
|
||
"263114 2018-06-07 603577.SH 21.88 22.77 -0.028451\n",
|
||
"265676 2018-06-08 603577.SH 21.58 21.44 -0.002314\n",
|
||
"... ... ... ... ... ...\n",
|
||
"5090093 2025-03-17 603577.SH 20.05 20.20 0.011958\n",
|
||
"5093183 2025-03-18 603577.SH 20.27 20.07 0.015294\n",
|
||
"5096269 2025-03-19 603577.SH 20.31 20.27 0.017725\n",
|
||
"5099355 2025-03-20 603577.SH 20.58 20.31 NaN\n",
|
||
"5102442 2025-03-21 603577.SH 20.67 20.56 NaN\n",
|
||
"\n",
|
||
"[1650 rows x 5 columns]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print(df[(df['ts_code'] == '603577.SH') & (df['trade_date'] >= '2018-06-04')][\n",
|
||
" ['trade_date', 'ts_code', 'close', 'open', 'future_return']])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"id": "ef9d068e-67f7-412c-bbd8-cdee7492dbc9",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-03-27T16:18:28.111863Z",
|
||
"start_time": "2025-03-27T16:18:28.059714Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.7431901412574308\n",
|
||
"0.6963809182594688\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print(train_data[\"future_score\"].corr(train_data[\"label\"]))\n",
|
||
"print(test_data[\"future_score\"].corr(test_data[\"label\"]))\n"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3 (ipykernel)",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.11.11"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|