Skip to content

Latest commit

 

History

History
69 lines (50 loc) · 7.4 KB

File metadata and controls

69 lines (50 loc) · 7.4 KB

量化新手入门:为什么用XGB做简单的截面选股是个好选择?以及需要注意哪些具体细节?

这是我问deepseek的问题。 /home/fatih/IDEundCode/mininconda3/envs/pretorch/bin/python /home/fatih/PycharmProjects/Hands-on-AA/cp1_code_re_prompt.py 这个问题问得很好,触及了量化新手入门的一个经典且高效的路径。用XGBoost做截面选股,确实是性价比极高的起点。我来详细拆解一下为什么,以及需要注意哪些具体细节。

为什么说“用XGB做简单的截面选股”是新手入门的好选择?

  1. 模型能力与复杂度的平衡:XGBoost(梯度提升树)是“结构化数据”上的王者。它天然能处理特征间的非线性关系、特征交互,并且对缺失值、异常值有不错的鲁棒性。相比线性模型(如逻辑回归),它能捕捉更复杂的市场规律;相比深度学习(如LSTM),它训练快、调参相对简单、可解释性也更好。对于截面数据(同一时间点,不同股票的特征),XGBoost是“开箱即用”的利器。

  2. 截面选股的本质:截面选股的核心是相对价值。我们不是预测某只股票未来涨跌的绝对值,而是预测在当下这个时间点,哪些股票相对于其他股票未来表现更好。XGBoost通过大量特征(估值、动量、波动率等)来学习这种“相对强弱”的规律,非常契合。

  3. 快速验证与迭代:新手最需要的是快速跑通一个完整的策略流程(数据获取、特征工程、模型训练、回测、分析)。XGBoost的API非常成熟(Python的xgboost库),几行代码就能训练一个模型。这能让你在短时间内看到策略的盈亏,获得正反馈,并理解量化投资的完整闭环。

实行这个策略时,需要注意哪些具体细节?

这是问题的核心。很多新手跑出来的回测曲线很漂亮,一上实盘就亏钱,往往就是忽略了这些细节。我把它们分为几个关键阶段:

1. 数据与特征工程(最容易被忽视,但最重要)

  • 避免未来信息:这是量化第一铁律。例如,用当天的收盘价计算因子,去预测当天的收益率,这就是未来函数。正确的做法是:用t-1日(或更早)的数据,预测t日(或t+1日)的收益率。通常用t+1日的收益率作为标签(Label)。
  • 特征处理
    • 去极值:市场数据常有极端值(比如某天涨停或跌停)。用MAD(中位数绝对偏差)或分位数法(如上下1%截断)处理。
    • 标准化:不同特征量纲差异巨大(比如市盈率是几十,换手率是百分之几)。XGBoost虽然对尺度不敏感,但标准化有助于模型收敛和特征重要性解释。常用Z-score或Rank标准化。
    • 行业中性化:不同行业的估值、波动率天然不同。如果不做中性化,模型可能只是学会了“买银行股”或“买科技股”,而不是真正的选股能力。做法:对每个特征,减去其所在行业的均值,再除以行业标准差。
    • 市值中性化:小市值股票长期有超额收益(A股尤其明显)。如果不做中性化,模型可能只是“小市值因子”的代理。做法类似行业中性化,或者将市值作为特征之一,但要注意控制。
  • 标签(Label)定义:预测未来N日的收益率。常见的有:
    • 未来5日收益率(close_t+5 - close_t) / close_t。这是中短期选股常用窗口。
    • 未来20日收益率:更偏向中期。
    • 超额收益率:减去基准指数(如沪深300)的同期收益率。这更符合“选股”的初衷——跑赢大盘。
    • Rank IC:预测未来收益率的排名,而不是绝对值。XGBoost可以用rank:ndcgrank:map目标函数直接优化排序。

2. 模型训练与验证(防止过拟合)

  • 时间序列交叉验证绝对不能用随机打乱的K-Fold! 金融数据是时间序列,用未来的数据训练去预测过去,就是作弊。必须用滚动时间窗口扩展时间窗口。例如:用2015-2017年数据训练,2018年验证;再用2016-2018年训练,2019年验证。
  • 防止过拟合
    • 早停法:在验证集上监控AUC或Rank IC,当连续N轮不再提升时停止训练。
    • 正则化参数:调大lambda(L2正则)、alpha(L1正则)、gamma(分裂所需的最小损失减少量)。
    • 降低模型复杂度:限制max_depth(树深度,通常3-6)、min_child_weight(叶子节点最小样本权重和)、subsample(行采样)、colsample_bytree(列采样)。
  • 特征选择:不要一股脑把所有因子都扔进去。用XGBoost的feature_importances_筛选出Top 20-50个最重要的特征。过多的噪声特征会降低模型稳定性。

3. 策略构建与回测(模拟真实交易)

  • 换仓频率:截面选股通常是定期调仓(如每月、每周)。调仓频率越高,交易成本越高。新手建议从月度调仓开始。
  • 交易成本必须包含!包括佣金(万1-万3)、印花税(卖出时千1)、滑点(假设成交价与信号价有0.1%-0.5%的偏差)。很多漂亮的回测曲线,加上千分之二的成本就变成亏损。
  • 持仓数量:不要只选Top 1股票。通常选Top 10-50只股票,等权或按预测值加权。分散化可以降低非系统性风险。
  • 基准比较:始终与一个基准(如沪深300、中证500)对比。看超额收益(Alpha)、信息比率(IR)、最大回撤等指标。
  • 幸存者偏差:回测时,必须使用当时的股票池。例如,回测2015年,不能包含2016年才上市的公司。要使用退市公司的数据,否则回测结果会虚高。

4. 实盘与监控(从理论到实践)

  • 模型衰减:市场风格会变化。一个模型可能半年后就不灵了。需要定期重新训练(如每月或每季度),并监控Rank IC的稳定性。
  • 风险控制:设置单只股票最大仓位(如不超过总资金的5%)、行业集中度限制(如单一行业不超过20%)。
  • 日志与归因:记录每次调仓的预测值、实际收益率、交易成本。定期分析:模型在哪些股票上赚了钱?哪些特征贡献最大?哪些时间段表现不好?

总结与建议

新手入门路径

  1. 数据:用tushareaksharebaostock获取A股日线数据。
  2. 特征:构建20-30个经典因子(如PE、PB、ROE、动量、反转、波动率、换手率等),并做行业/市值中性化。
  3. 标签:未来20个交易日收益率。
  4. 模型:用xgboost库,设置objective='reg:squarederror''rank:ndcg',用时间序列交叉验证。
  5. 回测:用backtraderzipline(较复杂)或自己写一个简单的循环。务必包含交易成本
  6. 分析:看超额收益、最大回撤、信息比率、月度胜率、特征重要性。

最后一句忠告不要追求完美的回测曲线,而要追求稳健的逻辑和可解释性。 一个在回测中每年赚50%的模型,大概率是过拟合的。一个每年稳定跑赢基准5-10%,最大回撤可控的模型,才是值得实盘的。

祝你量化之路顺利!

Process finished with exit code 0