XGBoost 多因子量化选股
由bq5973r5创建,最终由bq5973r5 被浏览 3 用户
很多人听到“机器学习量化”,第一反应是:黑箱、难解释、只在回测里好看。\n这篇文章我们用尽量直观的方式解释:我们如何用 XGBoost做一套可解释、可落地的选股策略——从数据、因子、标签,到训练、打分、选股、调仓,走完完整闭环。
1. 我们先解决一个现实问题:股票“能不能交易”
任何策略落地前,都要先过滤掉不可交易噪声。\n因此我们采用相对成熟、流动性较好的股票池:沪深300 + 中证500,并剔除:
- ST、停牌、上市时间过短
- 明显异常或不可比的财务数据(例如 PE、PB为非正)
这样做的目的很简单:让模型训练与组合执行更贴近真实市场,减少回测与实盘偏差。
2. 因子不是越多越好,而是要覆盖“驱动维度”
我们每日为每只股票计算 21 个特征(因子),覆盖五类市场驱动:
- 趋势与反转:短中长期动量、短期反转
- 风险刻画:短中期波动率
- 技术状态:如 RSI、MACD等
- 估值与成长(截面排名):估值便宜程度、盈利能力相对水平
- 成交/资金/行业:成交活跃度变化、资金流入强度、是否跑赢行业
举个简单例子:同一天两只股票 A 和 B,如果 A 的趋势更强、成交更活跃、且相对行业更强,那么它更可能属于“强势组”。\n机器学习的价值就是:它能学习不同因子在不同市场环境下的组合权重,而不是只依赖某一个信号。
动量这类指标本身很直观,例如:
但我们并不依赖单因子,而是用多因子共同刻画股票状态。
3. 关键设计:用“相对强弱”做标签,聚焦选股能力
很多策略喜欢用“未来 5 天收益是否为正”当标签。但这个标签有个明显问题:它会被大盘带偏。\n牛市里大家都涨,熊市里大家都跌,模型容易学成“择时”而不是“选股”。
因此我们采用更贴近“选股超额”的标签方式:\n同一天内,把所有股票的未来 5 天收益做排名,排名靠前(比如 Top30%)的标记为正样本,其余为负样本。
这样模型学到的核心能力是:\n在同一市场环境下,哪些股票更可能跑赢其它股票。
4. XGBoost 在做什么:多轮“纠错”的评分系统
你可以把 XGBoost 理解成一个“多轮纠错”的评分系统:
- 第一轮:先用一些简单规则(决策树)对强弱做初步判断
- 第二轮:专门去纠正第一轮最容易错的地方
- 第三轮:继续纠错
- 多轮叠加后,得到一个更稳的综合评分
为什么这比单因子更稳?\n因为市场信号经常是“条件成立才有效”。比如:
- 动量强未必一定好,有时是冲高回落
- 但“动量强 + 换手提升 + 资金流入”往往更可信
- “动量强但波动突然放大、趋势开始减弱”,可信度就会下降
树模型很擅长表达这种“条件组合”,而 boosting 会让它一轮轮修正偏差。
xgb_score 是什么?
训练完成后,模型会对每只股票每天输出一个分数(xgb_score)。\n你可以把它理解成:这只股票更像“强势组”的概率/置信度。\n它不是“保证盈利”,而是用来做排序:分数越高,越值得排在组合候选的前面。
5. 为什么要滚动训练(Walk-Forward):让模型不过时
市场环境会变化。为了降低“训练期有效、未来失效”的概率,我们采用滚动训练方式:
- 用过去一段数据训练模型
- 对未来一段时间进行预测打分
- 再把新的数据纳入训练,更新模型
你可以把它理解为模型定期“复训升级”,而不是用一套旧规则一直跑到最后。
6. 从评分到交易:TopN 等权 + 每 5 个交易日调仓
当每天的评分出来之后,交易执行非常清晰、也更可解释:
- 每天按 xgb_score 对股票排序
- 选择评分最高的 TopN(例如 10 只)
- 等权配置(每只 10%)
- 每 5 个交易日调仓一次,以控制换手与成本
为什么用等权?\n因为我们更想依赖“排序能力”,而不是过度相信分数的绝对刻度。同时等权也更稳定、更容易解释。
为什么不是每天换?\n每天换会带来更高的交易成本和滑点,很多时候会吃掉超额收益。\n因此我们用“固定调仓频率”在信号响应速度与交易成本之间做折中。
回测结果
策略源码https://bigquant.com/square/ai/64292903-922b-b472-8890-de21f0e54d28