Files
NewStock/code/train/Rank.ipynb
2025-03-31 23:08:35 +08:00

1686 lines
202 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "code",
"id": "79a7758178bafdd3",
"metadata": {
"jupyter": {
"source_hidden": true
},
"ExecuteTime": {
"end_time": "2025-03-27T14:25:59.032991Z",
"start_time": "2025-03-27T14:25:59.027760Z"
}
},
"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"
],
"outputs": [],
"execution_count": 33
},
{
"cell_type": "code",
"id": "a79cafb06a7e0e43",
"metadata": {
"scrolled": true,
"ExecuteTime": {
"end_time": "2025-03-27T14:26:52.270461Z",
"start_time": "2025-03-27T14:25:59.040949Z"
}
},
"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())"
],
"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"
]
}
],
"execution_count": 34
},
{
"cell_type": "code",
"id": "cac01788dac10678",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-27T14:27:10.055900Z",
"start_time": "2025-03-27T14:26:52.371488Z"
}
},
"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']])"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"industry\n"
]
}
],
"execution_count": 35
},
{
"cell_type": "code",
"id": "c4e9e1d31da6dba6",
"metadata": {
"jupyter": {
"source_hidden": true
},
"ExecuteTime": {
"end_time": "2025-03-27T14:27:10.498744Z",
"start_time": "2025-03-27T14:27:10.308136Z"
}
},
"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"
],
"outputs": [],
"execution_count": 36
},
{
"cell_type": "code",
"id": "a735bc02ceb4d872",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-27T14:27:10.555260Z",
"start_time": "2025-03-27T14:27:10.509757Z"
}
},
"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['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['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['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"
],
"outputs": [],
"execution_count": 37
},
{
"cell_type": "code",
"id": "53f86ddc0677a6d7",
"metadata": {
"jupyter": {
"source_hidden": true
},
"scrolled": true,
"ExecuteTime": {
"end_time": "2025-03-27T14:27:17.720085Z",
"start_time": "2025-03-27T14:27:10.615702Z"
}
},
"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"
],
"outputs": [],
"execution_count": 38
},
{
"cell_type": "code",
"id": "dbe2fd8021b9417f",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-27T14:27:17.843735Z",
"start_time": "2025-03-27T14:27:17.837462Z"
}
},
"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)"
],
"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"
]
}
],
"execution_count": 39
},
{
"cell_type": "code",
"id": "85c3e3d0235ffffa",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-27T14:27:18.126281Z",
"start_time": "2025-03-27T14:27:17.932953Z"
}
},
"source": [
"print(df[df['is_st']][['ts_code', 'trade_date', 'is_st']])"
],
"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"
]
}
],
"execution_count": 40
},
{
"cell_type": "code",
"id": "92d84ce15a562ec6",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-27T14:29:28.359109Z",
"start_time": "2025-03-27T14:27:18.133287Z"
}
},
"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())"
],
"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"
]
}
],
"execution_count": 41
},
{
"cell_type": "code",
"id": "b87b938028afa206",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-27T14:29:29.063060Z",
"start_time": "2025-03-27T14:29:29.044370Z"
}
},
"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"
],
"outputs": [],
"execution_count": 42
},
{
"cell_type": "code",
"id": "f4f16d63ad18d1bc",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-27T14:29:29.468775Z",
"start_time": "2025-03-27T14:29:29.452331Z"
}
},
"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"
],
"outputs": [],
"execution_count": 43
},
{
"cell_type": "code",
"id": "40e6b68a91b30c79",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-27T14:29:31.276518Z",
"start_time": "2025-03-27T14:29:29.638999Z"
}
},
"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()"
],
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 44
},
{
"cell_type": "code",
"id": "47c12bb34062ae7a",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-27T15:01:53.894366Z",
"start_time": "2025-03-27T14:59:19.610939Z"
}
},
"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",
"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, feature_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, feature_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')"
],
"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"
]
}
],
"execution_count": 72
},
{
"cell_type": "code",
"id": "8f134d435f71e9e2",
"metadata": {
"jupyter": {
"source_hidden": true
},
"ExecuteTime": {
"end_time": "2025-03-27T15:01:54.350330Z",
"start_time": "2025-03-27T15:01:54.264148Z"
}
},
"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"
],
"outputs": [],
"execution_count": 73
},
{
"cell_type": "code",
"id": "c6eb5cd4-e714-420a-ac48-39af3e11ee81",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-27T15:05:04.709244Z",
"start_time": "2025-03-27T15:01:54.503922Z"
}
},
"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))"
],
"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.793308\tvalid's ndcg@1: 0.572619\n",
"Early stopping, best iteration is:\n",
"[59]\ttrain's ndcg@1: 0.754956\tvalid's ndcg@1: 0.624334\n",
"Evaluated only: ndcg@1\n"
]
},
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAgjZJREFUeJzt3Xd8VMUWwPHf7qb3nlACofcaioAICIiiCFgpIqCiUmyIXUBAxWdBsOJTEfWJYAOVKl0pUkLvLYWSBJKQ3nfv+2OSTUISSN9kc76fTz67e/fu3bMDSU5mzszoNE3TEEIIIYSwEnpLByCEEEIIUZEkuRFCCCGEVZHkRgghhBBWRZIbIYQQQlgVSW6EEEIIYVUkuRFCCCGEVZHkRgghhBBWRZIbIYQQQlgVSW6EEEIIYVUkuRFCsHjxYnQ6HWFhYZX2Hm+88QY6na7GXNfSwsLC0Ol0LF68uEyv1+l0vPHGGxUakxA1hSQ3QlSh3CRCp9Oxbdu2Qs9rmkZgYCA6nY677rqrTO/x2WeflfkXoiidJUuWMH/+fEuHIYS4hiQ3QliAg4MDS5YsKXR869atXLhwAXt7+zJfuyzJzZgxY0hLS6Nhw4Zlfl9Lef3110lLS7PIe1dmctOwYUPS0tIYM2ZMmV6flpbG66+/XsFRCVEzSHIjhAUMHjyYn3/+mezs7ALHlyxZQnBwMAEBAVUSR0pKCgAGgwEHB4caNbyTG7uNjQ0ODg4WjubG0tPTMZlMJT5fp9Ph4OCAwWAo0/s5ODhgY2NTptcKUdNJciOEBYwcOZLY2FjWr19vPpaZmckvv/zCqFGjinyNyWRi/vz5tGnTBgcHB/z9/XniiSe4evWq+ZygoCCOHj3K1q1bzcNfffv2BfKGxLZu3cqkSZPw8/Ojfv36BZ67tuZmzZo19OnTB1dXV9zc3OjatWuRPU7X2rZtG127dsXBwYEmTZrwxRdfFDrnejUl19aL5NbVHDt2jFGjRuHp6cnNN99c4LlrXz9lyhRWrFhB27Ztsbe3p02bNqxdu7bQe23ZsoUuXboUiLUkdTx9+/Zl1apVhIeHm9s6KCjIfE2dTsfSpUt5/fXXqVevHk5OTiQmJhIXF8e0adNo164dLi4uuLm5cccdd3Dw4MEbts+4ceNwcXHh4sWLDBs2DBcXF3x9fZk2bRpGo7FEbXjmzBnGjRuHh4cH7u7ujB8/ntTU1AKvTUtL4+mnn8bHxwdXV1fuvvtuLl68KHU8osaQtF4ICwgKCqJHjx78+OOP3HHHHYBKJBISEhgxYgQfffRRodc88cQTLF68mPHjx/P0008TGhrKJ598wv79+9m+fTu2trbMnz+fp556ChcXF1577TUA/P39C1xn0qRJ+Pr6MmPGDHPvR1EWL17MI488Qps2bXjllVfw8PBg//79rF27ttgEDODw4cPcdttt+Pr68sYbb5Cdnc3MmTMLxVEW999/P82aNePtt99G07Trnrtt2zZ+++03Jk2ahKurKx999BH33nsvEREReHt7A7B//35uv/126tSpw6xZszAajcyePRtfX98bxvLaa6+RkJDAhQsX+PDDDwFwcXEpcM6cOXOws7Nj2rRpZGRkYGdnx7Fjx1ixYgX3338/jRo1Ijo6mi+++II+ffpw7Ngx6tate933NRqNDBo0iO7du/P++++zYcMGPvjgA5o0acLEiRNvGPcDDzxAo0aNmDt3Lvv27eOrr77Cz8+P//znP+Zzxo0bx08//cSYMWO46aab2Lp1K3feeecNry1EtaEJIarMN998owHanj17tE8++URzdXXVUlNTNU3TtPvvv1/r16+fpmma1rBhQ+3OO+80v+6ff/7RAO2HH34ocL21a9cWOt6mTRutT58+xb73zTffrGVnZxf5XGhoqKZpmhYfH6+5urpq3bt319LS0gqcazKZrvsZhw0bpjk4OGjh4eHmY8eOHdMMBoOW/0dOaGioBmjffPNNoWsA2syZM82PZ86cqQHayJEjC52b+9y1r7ezs9POnDljPnbw4EEN0D7++GPzsSFDhmhOTk7axYsXzcdOnz6t2djYFLpmUe68806tYcOGhY5v3rxZA7TGjRub/31zpaena0ajscCx0NBQzd7eXps9e3aBY9e2z9ixYzWgwHmapmmdOnXSgoODC7VBUW34yCOPFDhv+PDhmre3t/lxSEiIBmjPPvtsgfPGjRtX6JpCVFcyLCWEhTzwwAOkpaWxcuVKkpKSWLlyZbE9Ij///DPu7u4MHDiQmJgY81dwcDAuLi5s3ry5xO87YcKEG9ZxrF+/nqSkJF5++eVC9SzXG64xGo2sW7eOYcOG0aBBA/PxVq1aMWjQoBLHWJwnn3yyxOcOGDCAJk2amB+3b98eNzc3zp07Z451w4YNDBs2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"
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "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"
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"train data size: 2539543\n"
]
}
],
"execution_count": 74
},
{
"cell_type": "code",
"id": "1a248706-e58a-406f-9268-6dce3de2d863",
"metadata": {
"jupyter": {
"source_hidden": true
},
"ExecuteTime": {
"end_time": "2025-03-27T15:05:05.002439Z",
"start_time": "2025-03-27T15:05:04.994562Z"
}
},
"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)"
],
"outputs": [],
"execution_count": 75
},
{
"cell_type": "code",
"id": "5d1522a7538db91b",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-27T15:05:48.344702Z",
"start_time": "2025-03-27T15:05:05.075376Z"
}
},
"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))"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"34.45215759849906\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",
"986371 2023-01-09 603129.SH 0.005034 0.028874 47.0\n",
"270858 2023-01-10 002238.SZ 0.137958 0.110154 49.0\n",
"254244 2023-01-11 002188.SZ -0.014411 0.009928 33.0\n",
"315695 2023-01-12 002368.SZ 0.064003 0.047429 47.0\n",
"1076977 2023-01-13 603530.SH -0.033076 0.001755 17.0\n",
"179564 2023-01-16 001339.SZ -0.045814 -0.015564 3.0\n"
]
}
],
"execution_count": 76
},
{
"cell_type": "code",
"id": "d86af99d15cb3bdd",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-27T15:05:48.949443Z",
"start_time": "2025-03-27T15:05:48.354713Z"
}
},
"source": [
"print(df[(df['ts_code'] == '603577.SH') & (df['trade_date'] >= '2018-06-04')][\n",
" ['trade_date', 'ts_code', 'close', 'open', 'future_return']])"
],
"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"
]
}
],
"execution_count": 77
},
{
"cell_type": "code",
"id": "ef9d068e-67f7-412c-bbd8-cdee7492dbc9",
"metadata": {
"ExecuteTime": {
"end_time": "2025-03-27T15:05:49.093930Z",
"start_time": "2025-03-27T15:05:49.014773Z"
}
},
"source": [
"print(train_data[\"future_score\"].corr(train_data[\"label\"]))\n",
"print(test_data[\"future_score\"].corr(test_data[\"label\"]))\n"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.7431901412574308\n",
"0.6963809182594688\n"
]
}
],
"execution_count": 78
}
],
"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
}