PandaAI第五周内测|多因子机器学习挖掘完整工作流-阿斗
  了不起的阿斗 12天前 195 1

PandaAI第五周内测|多因子机器学习挖掘:从公式到模型的完整工作流

做量化有个经典难题:你手里有五六个因子,每个单看都有点道理,但你不知道怎么把它们合在一起用。等权加总?太粗糙。人工设阈值做条件过滤?参数爆炸,根本调不完。

这周在PandaAI上跑通了一条完整的多因子机器学习工作流,从因子公式编写到XGBoost训练再到合成因子输出,三个节点串起来就能跑。下面把整个流程拆开聊聊,希望对刚上手的朋友有帮助。

整体流程:三个节点,一条链

工作流的结构很简单:

特征工程构建 → XGBoost模型 → 非线性因子构建

第一个节点负责算数据,第二个节点负责学规律,第三个节点负责用规律去预测。数据从左往右流,每个节点只做一件事。

这三个节点的关系,可以用一个考试的比喻来理解。特征工程构建相当于出题+给答案(用历史数据计算因子值和未来收益率),XGBoost模型相当于学生刷题学解法(从因子和收益率的对应关系中学习规律),非线性因子构建相当于正式考试(用学到的解法在新数据上做预测)。

CleanShot 20260323 at 02.51.152x.jpg

节点一:特征工程构建

这个节点做的事情可以用一句话概括:把你的因子公式变成一张大表。

输入

你需要填两样东西:

formulas框里填因子公式,每行一个。比如你想同时用动量、波动率、换手率三个维度的因子,就写三行公式。节点会对全市场每只股票、每个交易日,逐行计算这些公式的值。

label框里填标签公式,只填一行。标签是你想让模型去预测的目标。最常用的是 FUTURE_RETURNS(CLOSE, N),N是你的预测周期。N=1就是预测明天涨跌幅,N=5就是预测未来一周。

输出

节点输出一张DataFrame,长这样(概念示意):

股票 日期 特征1 特征2 特征3 label
平安 0102 0.85 1.32 0.62 2.3%
茅台 0102 0.43 0.91 0.38 -1.1%

每个因子公式变成一列特征,标签公式变成label列。全市场几千只股票乘以几百个交易日,就是几十万行数据。

这张表有两个去处:一份传给XGBoost做训练数据,一份把公式配置(FeatureModel)传给下游的非线性因子构建节点,告诉它以后在新数据上怎么重新算这些特征。

公式编写的几个坑

第一,每行是一个独立公式,不支持中间变量赋值。如果你的因子逻辑很复杂,必须压缩成一行。可读性会下降,但语法上等价。

第二,公式里用到的函数必须严格匹配PandaAI的算子文档。常用的RANK、SLOPE、MA、STD、IF、SUMIF、TS_RANK、RETURNS等都支持,但有些看起来很自然的写法(比如AND、OR逻辑运算符)在公式模式下不能直接用。条件与逻辑需要用 AS_FLOAT(条件1) * AS_FLOAT(条件2) 来实现,两个0/1相乘就等价于AND。

第三,所有做除法的地方都建议套一个MAX(…, 0.0001)防止分母为零。全市场几千只票里总有几只在某些交易日的成交量、换手率为零,一个除零错误就会让整个节点报错。

节点二:XGBoost模型训练

这个节点接收特征工程构建节点输出的那张大表,用特征列拟合标签列,训练出一个模型。

它在学什么

从源码层面看,训练逻辑非常直白:

feature_cols = [除了label以外的所有列]
X = df[feature_cols]
y = df["label"]
model.fit(X, y)

把label列拆出来当y,其余所有列当X,然后fit。模型学的是一个从因子值到收益率预测的映射函数。

如果你填了三个因子公式,模型学的就是:给定某只股票某天的(动量值, 波动率值, 换手率值)这个三维向量,预测它未来N天的收益率。

XGBoost用决策树的集成来拟合这个映射。相比简单的线性加权,它的优势在于三点。

能学非线性关系:比如动量值在0.8-0.9之间表现最好,超过0.95反而是见顶信号。这种倒U型关系,线性模型捕捉不了,树模型天然擅长。

能学因子交互:比如只有当资金质量大于某个阈值且波动率开始放大时,动量信号才有效。这种条件组合规则,XGBoost通过树的分裂结构自动发现。

对异常值不敏感:因为树模型做的是分箱比较而不是数值运算,一个极端离群值不会像线性回归那样扭曲整个模型。

参数怎么调

默认参数就能跑,但如果想认真做,几个关键参数值得关注:

n_estimators(树的数量):默认100棵。因子数量不多的情况下100够用了,加到200-300可以试试,但注意观察是否过拟合。

max_depth(树深度):默认3层。这个参数直接控制模型复杂度。5个因子用3层就够了,8个因子可以放到4层。深度越大,模型越容易记住训练数据的噪声。

learning_rate(学习率):默认0.1。越小越保守,每棵树的贡献越小。如果你把树的数量加大了,学习率可以相应调小到0.05。

subsample和colsample_bytree:默认都是1,意味着每棵树用全部样本和全部特征。建议改成0.8和0.7。每棵树只看80%的样本和70%的特征,引入随机性,有效防过拟合,同时也强制让不同的树关注不同的因子组合。

reg_lambda(L2正则化):默认1。加大到5-10可以抑制模型对个别因子的过度依赖。

一个需要注意的点

当前节点的训练代码里,eval_set用的和训练集是同一份数据。这意味着你在日志里看到的训练误差可能非常漂亮,但它不代表模型在未见过的数据上也能这样表现。真正的样本外检验要靠下一个节点,在不同时间段上做预测来验证。

节点三:非线性因子构建

这个节点做两件事。第一,用和训练时完全一样的公式,在新的时间段上重新计算特征值。第二,用训练好的模型对这些新特征做预测。

为什么需要重新计算特征

因为时间变了。训练时用的是比如2024年全年的行情数据,特征值是基于2024年的CLOSE、VOLUME、TURNOVER算出来的。现在你想在2025年用这个模型,2025年的行情数据和2024年完全不同,所以必须在2025年的数据上重新跑一遍那些公式,得到2025年每只股票每天的因子值,然后才能喂给模型做预测。

公式是同一套公式,但数据是新的。就像同一张试卷的出题模板不变,但具体的数字变了。

输出是什么

输出是一张三列的表:date、symbol、value。value列就是模型的预测值,可以理解为一个合成因子。每只股票每天一个数,数越大模型越看好。

这个合成因子可以直接接到下游的因子分析节点做IC测试、分组回测,也可以接到选股节点做实盘选股。你不用再分别处理原来的五六个因子,一个合成因子把所有信息都压缩进去了。

实操中踩过的坑和经验

因子设计:先求正交,再求数量

很多人(包括我最初)会犯一个错误:堆因子数量。觉得五个因子IC不够高,那就加到八个十个。但如果新加的因子和已有因子高度相关(比如都是从收盘价涨跌幅派生出来的),加再多也只是在重复同一份信息,模型并不能从中学到新东西。

更好的做法是先想清楚你的因子在信息维度上是否正交。量价趋势是一个维度,波动率结构是一个维度,日内价格行为(利用OPEN/HIGH/LOW)是一个维度,中期反转是一个维度。每个维度选一个最有代表性的因子,比堆十个同质因子管用得多。

一个简单的检验方法:把你的因子两两算相关系数,如果某一对超过0.6,考虑砍掉其中一个。

标签选择:周期要和因子匹配

标签的预测周期N不是随便选的。如果你的因子公式里用的窗口最长到60天,说明你在捕捉中期维度的信号,那标签设成1天就太短了,信噪比会很低。建议标签周期和因子体系的主要观察窗口保持量级匹配:短线因子(窗口5-10天)配FUTURE_RETURNS(CLOSE, 1)到3,中线因子(窗口20-60天)配FUTURE_RETURNS(CLOSE, 5)到10。

另外,FUTURE_RETURNS计算的是原始收益率,包含了大盘涨跌的成分。模型会花一部分精力去学市场整体方向,而这部分信息你的因子其实捕捉不了。如果有条件,可以在后续的因子分析环节做行业中性或市值中性处理,把这部分噪声过滤掉。

训练区间和预测区间:严格分开

这是最基本也最容易被忽视的原则。特征工程构建节点的时间段(比如2024年)是训练集,非线性因子构建节点的时间段(比如2025年)是测试集。两者绝对不能有重叠,否则你看到的因子表现就是样本内过拟合的幻觉。

建议的做法是:训练用最近两年的数据(足够模型看到不同的市场状态),预测用最近半年的数据来验证。如果在半年的样本外数据上IC还能保持0.03以上,这个模型就有实用价值了。

单因子测试:先验尸再合葬

不要一上来就把所有因子扔进XGBoost。先对每个因子单独跑一遍因子分析,看IC、分组收益、单调性。如果某个因子单独测出来IC几乎为零、分组完全没有区分度,那它放进多因子模型里也大概率是噪声源。

有一个容易误判的情况:门控型因子(输出大量零值的因子)在单因子测试中天然表现差,因为零值样本稀释了分组的区分度。这不一定说明因子无效,可能只是测试方法和因子设计意图不匹配。遇到这种情况,可以把门控条件改成软衰减函数,让因子对所有股票都输出一个连续的非零分值,再重新测试。

XGBoost参数:宁欠勿过

对于日频量价因子这种信噪比本身就不高的场景,模型复杂度低一点(浅树、少树、高正则化)往往比复杂模型更稳健。训练误差可能不太好看,但样本外的衰减会小很多。

一个实用的检验方法:如果你在训练集上的IC是0.08,到测试集上掉到0.01,说明严重过拟合了。正常的衰减幅度应该在30%-50%之间,比如训练集IC 0.05,测试集0.03,这是健康的。

小结

多因子机器学习的工作流,说到底就是三步:算特征、学规律、做预测。PandaAI把这三步封装成了三个可视化节点,连线就能跑。但工具简单不代表活好干。因子质量、信息正交性、标签周期匹配、训练-测试分离,这些基本功决定了最终结果的天花板。工具只是把天花板以下的工程实现成本降到了最低。

接下来的计划是在现有框架上做两件事:一是拓展因子的信息维度,把日内价格结构、波动率不对称性、中期反转这些和传统量价动量正交的维度加进来;二是在更长的历史区间和不同的市场状态(牛/熊/震荡)下做分段验证,看因子体系的稳健性到底如何。

最后一次编辑于 12天前 3

yanglaiyang

mark

2026-03-27 10:42:45      回复

推荐阅读
  18764136999   11天前   59   0   0 中频交易
  LOJU   11天前   93   0   0 机器学习策略