feat(factors): 新增筹码集中度相关因子并优化训练框架
- 添加 19 个筹码分布和胜率相关因子(包括chip_dispersion、winner_rate等系列) - LightGBM模型添加早停和训练指标记录功能 - 统一Label配置到common.py模块 - 新增list_factors.py因子列表脚本
This commit is contained in:
@@ -250,67 +250,58 @@ SELECTED_FACTORS = [
|
||||
"GTJA_alpha188",
|
||||
"GTJA_alpha189",
|
||||
"GTJA_alpha191",
|
||||
"chip_dispersion_90",
|
||||
"chip_dispersion_70",
|
||||
"cost_skewness",
|
||||
"dispersion_change_20",
|
||||
"price_to_avg_cost",
|
||||
"price_to_median_cost",
|
||||
"mean_median_dev",
|
||||
"trap_pressure",
|
||||
"bottom_profit",
|
||||
"history_position",
|
||||
"winner_rate_surge_5",
|
||||
"winner_rate_cs_rank",
|
||||
"winner_rate_dev_20",
|
||||
"winner_rate_volatility",
|
||||
"smart_money_accumulation",
|
||||
"winner_vol_corr_20",
|
||||
"cost_base_momentum",
|
||||
"bottom_cost_stability",
|
||||
"pivot_reversion",
|
||||
"chip_transition",
|
||||
]
|
||||
|
||||
# 因子定义字典(完整因子库,用于存放尚未注册到metadata的因子)
|
||||
FACTOR_DEFINITIONS = {"cs_rank_circ_mv": "cs_rank(circ_mv)"}
|
||||
|
||||
# 需要排除的因子列表(这些因子不会被计算和使用)
|
||||
# 用于临时屏蔽效果不好的因子,无需从 SELECTED_FACTORS 中删除
|
||||
# EXCLUDED_FACTORS: List[str] = [
|
||||
# # "GTJA_alpha005",
|
||||
# # "GTJA_alpha028",
|
||||
# # "GTJA_alpha023",
|
||||
# # "GTJA_alpha002",
|
||||
# # "GTJA_alpha010",
|
||||
# # "GTJA_alpha011",
|
||||
# # "GTJA_alpha044",
|
||||
# # "GTJA_alpha036",
|
||||
# # "GTJA_alpha027",
|
||||
# # "GTJA_alpha109",
|
||||
# # "GTJA_alpha104",
|
||||
# # "GTJA_alpha103",
|
||||
# # "GTJA_alpha085",
|
||||
# # "GTJA_alpha111",
|
||||
# # "GTJA_alpha092",
|
||||
# # "GTJA_alpha067",
|
||||
# # "GTJA_alpha060",
|
||||
# # "GTJA_alpha062",
|
||||
# # "GTJA_alpha063",
|
||||
# # "GTJA_alpha079",
|
||||
# # "GTJA_alpha073",
|
||||
# # "GTJA_alpha087",
|
||||
# # "GTJA_alpha117",
|
||||
# # "GTJA_alpha113",
|
||||
# # "GTJA_alpha138",
|
||||
# # "GTJA_alpha121",
|
||||
# # "GTJA_alpha124",
|
||||
# # "GTJA_alpha133",
|
||||
# # "GTJA_alpha131",
|
||||
# # "GTJA_alpha118",
|
||||
# # "GTJA_alpha164",
|
||||
# # "GTJA_alpha162",
|
||||
# # "GTJA_alpha157",
|
||||
# # "GTJA_alpha171",
|
||||
# # "GTJA_alpha177",
|
||||
# # "GTJA_alpha180",
|
||||
# # "GTJA_alpha188",
|
||||
# # "GTJA_alpha191",
|
||||
# ]
|
||||
|
||||
# =============================================================================
|
||||
# Label 配置(统一绑定 label_name 和 label_dsl)
|
||||
# =============================================================================
|
||||
# Label 名称
|
||||
LABEL_NAME = "future_return_5"
|
||||
|
||||
# Label DSL 公式
|
||||
LABEL_DSL = "(ts_delay(close, -5) / ts_delay(open, -1)) - 1"
|
||||
|
||||
# Label 配置字典(绑定 name 和 dsl)
|
||||
LABEL_FACTOR = {LABEL_NAME: LABEL_DSL}
|
||||
|
||||
|
||||
def get_label_factor(label_name: str) -> dict:
|
||||
"""获取Label因子定义字典。
|
||||
|
||||
警告: 此函数已废弃,请直接使用 LABEL_FACTOR 常量。
|
||||
label_name 参数将被忽略,始终返回预定义的 LABEL_FACTOR。
|
||||
|
||||
Args:
|
||||
label_name: label因子名称
|
||||
label_name: label因子名称(已废弃,仅保留参数保持向后兼容)
|
||||
|
||||
Returns:
|
||||
Label因子定义字典
|
||||
"""
|
||||
return {
|
||||
label_name: "(ts_delay(close, -5) / ts_delay(open, -1)) - 1",
|
||||
}
|
||||
return LABEL_FACTOR
|
||||
|
||||
|
||||
# =============================================================================
|
||||
|
||||
@@ -21,7 +21,8 @@ from src.training.components.filters import STFilter
|
||||
from src.experiment.common import (
|
||||
SELECTED_FACTORS,
|
||||
FACTOR_DEFINITIONS,
|
||||
get_label_factor,
|
||||
LABEL_NAME,
|
||||
LABEL_FACTOR,
|
||||
TRAIN_START,
|
||||
TRAIN_END,
|
||||
VAL_START,
|
||||
@@ -44,171 +45,39 @@ TRAINING_TYPE = "rank"
|
||||
# %% md
|
||||
# ## 2. 训练特定配置
|
||||
# %%
|
||||
# Label 配置
|
||||
LABEL_NAME = "future_return_5"
|
||||
LABEL_FACTOR = get_label_factor(LABEL_NAME)
|
||||
# Label 配置(从 common.py 统一导入)
|
||||
# LABEL_NAME 和 LABEL_FACTOR 已在 common.py 中绑定,只需从 common 导入
|
||||
|
||||
# 分位数配置
|
||||
N_QUANTILES = 20
|
||||
|
||||
# 排除的因子列表
|
||||
EXCLUDED_FACTORS = [
|
||||
"volatility_5",
|
||||
"volume_ratio_5_20",
|
||||
"capital_retention_20",
|
||||
"volatility_squeeze_5_60",
|
||||
"drawdown_from_high_60",
|
||||
"ma_ratio_5_20",
|
||||
"bias_10",
|
||||
"high_low_ratio",
|
||||
"bbi_ratio",
|
||||
"volatility_20",
|
||||
"std_return_20",
|
||||
"sharpe_ratio_20",
|
||||
"ma_5",
|
||||
"max_ret_20",
|
||||
"CP",
|
||||
"net_profit_yoy",
|
||||
"debt_to_equity",
|
||||
"EP_rank",
|
||||
"turnover_rank",
|
||||
"return_5_rank",
|
||||
"ebit_rank",
|
||||
"BP",
|
||||
"EP",
|
||||
"amihud_illiq_20",
|
||||
"profit_margin",
|
||||
"return_5",
|
||||
"return_20",
|
||||
"kaufman_ER_20",
|
||||
"GTJA_alpha043",
|
||||
"GTJA_alpha042",
|
||||
"GTJA_alpha041",
|
||||
"GTJA_alpha040",
|
||||
"GTJA_alpha039",
|
||||
"GTJA_alpha037",
|
||||
"GTJA_alpha036",
|
||||
"GTJA_alpha035",
|
||||
"GTJA_alpha033",
|
||||
"GTJA_alpha032",
|
||||
"GTJA_alpha031",
|
||||
"GTJA_alpha028",
|
||||
"GTJA_alpha026",
|
||||
"GTJA_alpha027",
|
||||
"GTJA_alpha023",
|
||||
"GTJA_alpha024",
|
||||
"GTJA_alpha009",
|
||||
"GTJA_alpha011",
|
||||
"GTJA_alpha022",
|
||||
"GTJA_alpha020",
|
||||
"GTJA_alpha018",
|
||||
"GTJA_alpha019",
|
||||
"GTJA_alpha014",
|
||||
"GTJA_alpha013",
|
||||
"GTJA_alpha010",
|
||||
"GTJA_alpha001",
|
||||
"GTJA_alpha003",
|
||||
"GTJA_alpha002",
|
||||
"GTJA_alpha004",
|
||||
"GTJA_alpha005",
|
||||
"GTJA_alpha006",
|
||||
"GTJA_alpha008",
|
||||
"turnover_deviation",
|
||||
"turnover_cv_20",
|
||||
"roa",
|
||||
"GTJA_alpha073",
|
||||
"GTJA_alpha078",
|
||||
"GTJA_alpha077",
|
||||
"GTJA_alpha076",
|
||||
"GTJA_alpha067",
|
||||
"GTJA_alpha085",
|
||||
"GTJA_alpha084",
|
||||
"GTJA_alpha087",
|
||||
"GTJA_alpha088",
|
||||
"GTJA_alpha090",
|
||||
"GTJA_alpha083",
|
||||
"GTJA_alpha079",
|
||||
"GTJA_alpha080",
|
||||
"GTJA_alpha094",
|
||||
"GTJA_alpha092",
|
||||
"GTJA_alpha089",
|
||||
"GTJA_alpha095",
|
||||
"GTJA_alpha064",
|
||||
"GTJA_alpha065",
|
||||
"GTJA_alpha066",
|
||||
"GTJA_alpha063",
|
||||
"GTJA_alpha060",
|
||||
"GTJA_alpha058",
|
||||
"GTJA_alpha057",
|
||||
"GTJA_alpha056",
|
||||
"GTJA_alpha046",
|
||||
"GTJA_alpha002",
|
||||
"GTJA_alpha027",
|
||||
"GTJA_alpha051",
|
||||
"GTJA_alpha044",
|
||||
"GTJA_alpha049",
|
||||
"GTJA_alpha050",
|
||||
"GTJA_alpha110",
|
||||
"GTJA_alpha107",
|
||||
"GTJA_alpha104",
|
||||
"GTJA_alpha106",
|
||||
"GTJA_alpha103",
|
||||
"GTJA_alpha100",
|
||||
"GTJA_alpha101",
|
||||
"GTJA_alpha102",
|
||||
"GTJA_alpha098",
|
||||
"GTJA_alpha097",
|
||||
"GTJA_alpha096",
|
||||
"GTJA_alpha099",
|
||||
"GTJA_alpha117",
|
||||
"GTJA_alpha118",
|
||||
"GTJA_alpha114",
|
||||
"GTJA_alpha111",
|
||||
"GTJA_alpha129",
|
||||
"GTJA_alpha130",
|
||||
"GTJA_alpha132",
|
||||
"GTJA_alpha041",
|
||||
"GTJA_alpha131",
|
||||
"GTJA_alpha134",
|
||||
"GTJA_alpha135",
|
||||
"GTJA_alpha136",
|
||||
"GTJA_alpha112",
|
||||
"GTJA_alpha120",
|
||||
"GTJA_alpha119",
|
||||
"GTJA_alpha122",
|
||||
"GTJA_alpha124",
|
||||
"GTJA_alpha126",
|
||||
"GTJA_alpha103",
|
||||
"GTJA_alpha087",
|
||||
"GTJA_alpha093",
|
||||
"GTJA_alpha092",
|
||||
"GTJA_alpha073",
|
||||
"GTJA_alpha127",
|
||||
"GTJA_alpha128",
|
||||
"GTJA_alpha115",
|
||||
"GTJA_alpha153",
|
||||
"GTJA_alpha152",
|
||||
"GTJA_alpha151",
|
||||
"GTJA_alpha150",
|
||||
"GTJA_alpha148",
|
||||
"GTJA_alpha142",
|
||||
"GTJA_alpha141",
|
||||
"GTJA_alpha139",
|
||||
"GTJA_alpha133",
|
||||
"GTJA_alpha161",
|
||||
"GTJA_alpha164",
|
||||
"GTJA_alpha117",
|
||||
"GTJA_alpha124",
|
||||
"GTJA_alpha162",
|
||||
"GTJA_alpha157",
|
||||
"GTJA_alpha156",
|
||||
"GTJA_alpha160",
|
||||
"GTJA_alpha155",
|
||||
"GTJA_alpha170",
|
||||
"GTJA_alpha169",
|
||||
"GTJA_alpha168",
|
||||
"GTJA_alpha166",
|
||||
"GTJA_alpha163",
|
||||
"GTJA_alpha176",
|
||||
"GTJA_alpha175",
|
||||
"GTJA_alpha174",
|
||||
"GTJA_alpha178",
|
||||
"GTJA_alpha177",
|
||||
"GTJA_alpha185",
|
||||
"GTJA_alpha180",
|
||||
"GTJA_alpha187",
|
||||
"GTJA_alpha188",
|
||||
"GTJA_alpha189",
|
||||
"GTJA_alpha191",
|
||||
"smart_money_accumulation",
|
||||
"GTJA_alpha014",
|
||||
"GTJA_alpha056",
|
||||
"GTJA_alpha085",
|
||||
"GTJA_alpha154",
|
||||
"GTJA_alpha141",
|
||||
]
|
||||
|
||||
# LambdaRank 模型参数配置
|
||||
|
||||
@@ -15,13 +15,15 @@ from src.training import (
|
||||
NullFiller,
|
||||
Winsorizer,
|
||||
StandardScaler,
|
||||
CrossSectionalStandardScaler,
|
||||
)
|
||||
from src.training.core.trainer_v2 import Trainer
|
||||
from src.training.components.filters import STFilter
|
||||
from src.experiment.common import (
|
||||
SELECTED_FACTORS,
|
||||
FACTOR_DEFINITIONS,
|
||||
get_label_factor,
|
||||
LABEL_NAME,
|
||||
LABEL_FACTOR,
|
||||
TRAIN_START,
|
||||
TRAIN_END,
|
||||
VAL_START,
|
||||
@@ -44,58 +46,93 @@ TRAINING_TYPE = "regression"
|
||||
# %% md
|
||||
# ## 2. 训练特定配置
|
||||
# %%
|
||||
# Label 配置
|
||||
LABEL_NAME = "future_return_5"
|
||||
LABEL_FACTOR = get_label_factor(LABEL_NAME)
|
||||
# Label 配置(从 common.py 统一导入)
|
||||
# LABEL_NAME 和 LABEL_FACTOR 已在 common.py 中绑定,只需从 common 导入
|
||||
|
||||
# 排除的因子列表
|
||||
EXCLUDED_FACTORS = [
|
||||
"GTJA_alpha062",
|
||||
"GTJA_alpha060",
|
||||
"GTJA_alpha058",
|
||||
"GTJA_alpha056",
|
||||
"GTJA_alpha053",
|
||||
"GTJA_alpha040",
|
||||
"GTJA_alpha043",
|
||||
"GTJA_alpha027",
|
||||
"CP",
|
||||
"max_ret_20",
|
||||
"debt_to_equity",
|
||||
"close_vwap_deviation",
|
||||
"EP",
|
||||
"BP",
|
||||
"EP_rank",
|
||||
"GTJA_alpha044",
|
||||
"GTJA_alpha036",
|
||||
"GTJA_alpha010",
|
||||
"GTJA_alpha005",
|
||||
"GTJA_alpha036",
|
||||
"GTJA_alpha027",
|
||||
"GTJA_alpha044",
|
||||
"GTJA_alpha001",
|
||||
"GTJA_alpha002",
|
||||
"GTJA_alpha007",
|
||||
"GTJA_alpha016",
|
||||
"GTJA_alpha073",
|
||||
"GTJA_alpha104",
|
||||
"GTJA_alpha103",
|
||||
"GTJA_alpha105",
|
||||
"GTJA_alpha092",
|
||||
"GTJA_alpha087",
|
||||
"GTJA_alpha085",
|
||||
"GTJA_alpha062",
|
||||
"GTJA_alpha124",
|
||||
"GTJA_alpha133",
|
||||
"GTJA_alpha131",
|
||||
"GTJA_alpha117",
|
||||
"GTJA_alpha124",
|
||||
"GTJA_alpha120",
|
||||
"GTJA_alpha119",
|
||||
"GTJA_alpha103",
|
||||
"GTJA_alpha099",
|
||||
"GTJA_alpha105",
|
||||
"GTJA_alpha104",
|
||||
"GTJA_alpha090",
|
||||
"GTJA_alpha085",
|
||||
"GTJA_alpha083",
|
||||
"GTJA_alpha084",
|
||||
"GTJA_alpha087",
|
||||
"GTJA_alpha092",
|
||||
"GTJA_alpha074",
|
||||
"GTJA_alpha089",
|
||||
"GTJA_alpha173",
|
||||
"GTJA_alpha157",
|
||||
"GTJA_alpha139",
|
||||
"GTJA_alpha162",
|
||||
"GTJA_alpha163",
|
||||
"GTJA_alpha177",
|
||||
"GTJA_alpha180",
|
||||
"price_to_avg_cost",
|
||||
"cost_skewness",
|
||||
"GTJA_alpha191",
|
||||
"GTJA_alpha180",
|
||||
"history_position",
|
||||
"bottom_profit",
|
||||
"smart_money_accumulation",
|
||||
]
|
||||
|
||||
# 模型参数配置
|
||||
MODEL_PARAMS = {
|
||||
# 基础设置
|
||||
"objective": "regression_l1",
|
||||
# ==================== 基础设置 ====================
|
||||
"objective": "huber", # 【修改】相比纯 L1(MAE),huber 对异常值鲁棒且在极小误差处平滑,更适合收益率预测
|
||||
"metric": "mae",
|
||||
# 树结构约束
|
||||
"max_depth": 5,
|
||||
"num_leaves": 24,
|
||||
"min_data_in_leaf": 100,
|
||||
# 学习参数
|
||||
"learning_rate": 0.01,
|
||||
"n_estimators": 1500,
|
||||
# 随机采样
|
||||
"subsample": 0.8,
|
||||
# ==================== 树结构约束 ====================
|
||||
"max_depth": 5, # 【修改】适当加深,允许捕捉一定的高阶交叉
|
||||
"num_leaves": 31, # 【修改】限制为 31(2的5次方-1),确保树是不对称生长的,防止过拟合
|
||||
"min_data_in_leaf": 512, # 【大幅增加】从256加到1000。训练集有97万条,极大地限制叶子节点样本量能有效抵抗股市噪音
|
||||
# ==================== 学习参数 ====================
|
||||
"learning_rate": 0.02, # 【修改】稍微调大一点,帮助模型跳出初始的局部最优(避免十几轮就早停)
|
||||
"n_estimators": 2000,
|
||||
# ==================== 随机采样与降维 ====================
|
||||
"subsample": 0.85,
|
||||
"subsample_freq": 1,
|
||||
"colsample_bytree": 0.8,
|
||||
# 正则化
|
||||
"reg_alpha": 0.5,
|
||||
"reg_lambda": 1.0,
|
||||
# 杂项
|
||||
"colsample_bytree": 0.4, # 【大幅降低】从0.8降到0.4。强制打压 GTJA_alpha127 的霸权,逼迫模型去学习其他因子的信息
|
||||
"extra_trees": True, # 【新增且极度推荐】极度随机树模式。在分裂点选择时增加随机性,是量化比赛中防过拟合的神器
|
||||
# ==================== 正则化 ====================
|
||||
"reg_alpha": 1.0, # 【修改】L1正则增加,强行把一些无用特征的权重压到0
|
||||
"reg_lambda": 5.0, # 【修改】L2正则大幅增加(从1到5),惩罚过大的叶子节点输出权重
|
||||
"max_bin": 127, # 【新增】默认255,降低到127相当于对连续特征做了一次粗颗粒度的分箱,也是极好的正则化手段
|
||||
# ==================== 杂项 ====================
|
||||
"verbose": -1,
|
||||
"random_state": 42,
|
||||
"n_jobs": -1,
|
||||
}
|
||||
|
||||
# 日期范围配置
|
||||
@@ -143,6 +180,7 @@ def main():
|
||||
(NullFiller, {"strategy": "mean"}),
|
||||
(Winsorizer, {"lower": 0.01, "upper": 0.99}),
|
||||
(StandardScaler, {}),
|
||||
# (CrossSectionalStandardScaler, {}),
|
||||
],
|
||||
filters=[STFilter(data_router=engine.router)],
|
||||
stock_pool_filter_func=stock_pool_filter,
|
||||
|
||||
Reference in New Issue
Block a user