第 4 章 · 05 单因子与多因子回测 本节摘要:本节是「Alpha 因子研究与特征工程」的收官,把因子从「评估」推进到「模拟交易」。原项目用三个 notebook 串起这条链: 用 Zipline 离线跑一个均值回归单因子回测; 在 Quantopian 研究环境里组合市场、基本面、另类多源因子; 提供现成的因子库。本节讲清 Zipline 的 CustomFactor/Pipeline 机制、单因子信号如何转化为多空组合、以及多因子如何用简单等权 rank 合成作为 ML 模型的基线。读完本节,你能用 Zipline 跑一个完整的事件驱动因子回测,并理解多因子组合为何最终要交给 ML 来学权重。 内容来源:原项目 、 、 ,汉化并套用体系化模板。
本节摘要:本节是「Alpha 因子研究与特征工程」的收官,把因子从「评估」推进到「模拟交易」。原项目用三个 notebook 串起这条链:
04_single_factor_zipline.ipynb用 Zipline 离线跑一个均值回归单因子回测;05_multiple_factors_quantopian_research.ipynb在 Quantopian 研究环境里组合市场、基本面、另类多源因子;07_factor_library_quantopian.ipynb提供现成的因子库。本节讲清 Zipline 的 CustomFactor/Pipeline 机制、单因子信号如何转化为多空组合、以及多因子如何用简单等权 rank 合成作为 ML 模型的基线。读完本节,你能用 Zipline 跑一个完整的事件驱动因子回测,并理解多因子组合为何最终要交给 ML 来学权重。
内容来源:原项目
04_alpha_factor_research/04_single_factor_zipline.ipynb、05_multiple_factors_quantopian_research.ipynb、07_factor_library_quantopian.ipynb,汉化并套用体系化模板。
⚠️ 风险提示:Zipline 回测须用
ml4t-zipline环境(作者打补丁版,见第 1 章);多因子等权 rank 只是基线,实盘前必须扣交易成本、做样本外验证。
阅读完本节,你应当能够:
Alphalens(上节)告诉你「因子有信号」,但没告诉你「信号变成交易能不能赚钱」。这两件事中间隔着:组合规则、调仓频率、交易成本、容量。要把这些纳入考虑,必须用事件驱动回测引擎模拟交易。Zipline 就是 Quantopian 维护的事件驱动引擎。
⚠️ 警告:本节的 notebook 须在
ml4t-ziplineconda 环境跑(第 1 章第 03 节),用作者打补丁的 Zipline fork,否则会因为 IEX 基准依赖等问题跑不通。
Zipline 的因子回测围绕两个抽象:
| 抽象 | 职责 |
|---|---|
| CustomFactor | 自定义因子:输入若干窗口数据,输出每只股票每朝的因子值 |
| Pipeline | 因子计算图:注册多个 Factor,每天批量算,产出 DataFrame |
notebook 中的 MeanReversion 因子是个典型 CustomFactor:
from zipline.api import CustomFactor class MeanReversion(CustomFactor): inputs = [Returns(window_length=252)] # 默认输入:一年月度收益 window_length = 252 def compute(self, today, assets, out, monthly_returns): df = pd.DataFrame(monthly_returns) out[:] = df.iloc[-1].sub(df.mean()).div(df.std()) # z-score
要点:
💡 核心心法:Zipline 用 Pipeline 强制点在时间正确性(point-in-time correctness)——每天只能看到当时及之前的数据,自动避免未来函数。这是它优于「手工 pandas 回测」的根本原因。
notebook 的策略逻辑:短期反转——股票近期涨幅越大,未来越可能回归,故空头近期强、多头近期弱。
关键的 compute_factors() 创建 MeanReversion 实例,并产出 longs/shorts/ranking 三列:前两者是布尔(用于下单),后者是整体排名(用于评估)。AverageDollarVolume 因子用于限定流动性(只算更活跃的股票)。
Zipline 的入口 run_algorithm():
performance = run_algorithm( start=start, end=end, initialize=initialize, # 注册 Pipeline before_trading_start=before_trading_start, # 每天跑 Pipeline capital_base=capital_base, bundle='quandl-eod', # 数据 bundle trading_calendar=trading_calendar)
返回的 performance DataFrame 含因子值与价格,可直接喂 Alphalens。
单因子信号怎么变成「买哪些/卖哪些」?典型做法:
notebook 此处不下单,只产出 long/short/ranking 列,把组合规则留给后续章节(第 5 章)。本节重点是「因子回测框架的搭建」,不是组合优化。
05_multiple_factors_quantopian_research.ipynb 把单因子扩展为多因子,关键变化:
# 伪码示意 combined_rank = (mean_rev_rank + value_rank + quality_rank + ...)
notebook 明确指出这是朴素方法——它假设每个因子同等重要。这正是机器学习要取代的部分:
「这种朴素合成只用了各因子 rank 的简单求和。我们想考虑相对重要性与预测收益的增量信息——这正是后续 ML 算法要做的,沿用同一套回测框架。」
💡 核心心法:等权 rank 合成是基线(baseline)——任何 ML 模型都要先打败它才值得用。第 7 章线性模型、第 9 章树模型,本质都是学习因子间的合成权重。
基本面数据是季度披露,但 ML 训练需要日频特征。notebook 用一个自定义 AggregateFundamentals 因子,取最近一次申报的基本面值,解决「季度数据如何放到日频 Pipeline」的问题。
⚠️ 警告:这种处理要警惕point-in-time——必须确保某天用的基本面是「该天已公告」的最新值,不能把未披露的季度数据提前用到日频特征里。Zipline 的 Pipeline 帮你管这件事,自己手撸要格外小心。
07_factor_library_quantopian.ipynb 提供了 Quantopian 平台上的现成因子库,对应原书第 24 章 Appendix。本节之后,我们手里已经有了:
下一步就是评估与组合(第 5 章 策略评估与组合优化),把因子变成有规则的组合,系统化衡量绩效。
run_algorithm(),需指定 bundle 与 ml4t-zipline 环境。下一章(第 5 章 策略评估与组合优化),我们把因子回测推进到组合构建与绩效评估,用 pyfolio 出绩效报告,用均值方差优化做组合,用凯利公式管仓位。