第 4 章 · 05 单因子与多因子回测


文档摘要

第 4 章 · 05 单因子与多因子回测 本节摘要:本节是「Alpha 因子研究与特征工程」的收官,把因子从「评估」推进到「模拟交易」。原项目用三个 notebook 串起这条链: 用 Zipline 离线跑一个均值回归单因子回测; 在 Quantopian 研究环境里组合市场、基本面、另类多源因子; 提供现成的因子库。本节讲清 Zipline 的 CustomFactor/Pipeline 机制、单因子信号如何转化为多空组合、以及多因子如何用简单等权 rank 合成作为 ML 模型的基线。读完本节,你能用 Zipline 跑一个完整的事件驱动因子回测,并理解多因子组合为何最终要交给 ML 来学权重。 内容来源:原项目 、 、 ,汉化并套用体系化模板。

第 4 章 · 05 单因子与多因子回测

本节摘要:本节是「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.ipynb05_multiple_factors_quantopian_research.ipynb07_factor_library_quantopian.ipynb,汉化并套用体系化模板。

⚠️ 风险提示:Zipline 回测须用 ml4t-zipline 环境(作者打补丁版,见第 1 章);多因子等权 rank 只是基线,实盘前必须扣交易成本、做样本外验证。

学习目标

阅读完本节,你应当能够:

  1. 说清 Zipline 的 CustomFactor + Pipeline 机制。
  2. 用 Zipline 跑一个 均值回归单因子 回测。
  3. 解释信号到 多空组合 的转换。
  4. 在 Quantopian 研究环境 组合多源因子(市场+基本面+另类)。
  5. 理解 等权 rank 合成 为何只是 ML 的基线。
  6. 知道 QTradableStocksUS 这类规范 Universe 的作用。

一、从评估到回测:为什么要走这一步

Alphalens(上节)告诉你「因子有信号」,但没告诉你「信号变成交易能不能赚钱」。这两件事中间隔着:组合规则、调仓频率、交易成本、容量。要把这些纳入考虑,必须用事件驱动回测引擎模拟交易。Zipline 就是 Quantopian 维护的事件驱动引擎。

⚠️ 警告:本节的 notebook 须在 ml4t-zipline conda 环境跑(第 1 章第 03 节),用作者打补丁的 Zipline fork,否则会因为 IEX 基准依赖等问题跑不通。

二、Zipline 的核心抽象:CustomFactor 与 Pipeline

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

要点:

  • inputs 声明要哪些数据(此处是 252 日收益)。
  • window_length 是回看窗口。
  • compute 实现「输入数据 → 因子值」的计算,这里算的是「最近一月收益相对历史的 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。

四、信号到组合的转换

单因子信号怎么变成「买哪些/卖哪些」?典型做法:

  1. 横截面排序:每天把所有股票按因子值排序。
  2. 分位选择:取底部 X%(多头)、顶部 X%(空头)。
  3. 等权或信号加权:每个标的权重相等,或按因子强度加权。

notebook 此处不下单,只产出 long/short/ranking 列,把组合规则留给后续章节(第 5 章)。本节重点是「因子回测框架的搭建」,不是组合优化。

五、多因子组合:从单源到多源

05_multiple_factors_quantopian_research.ipynb 把单因子扩展为多因子,关键变化:

  1. 数据源扩展:除了市场数据,还纳入 Morningstar 基本面(数百个变量)与 StockTwits 另类信号
  2. Universe 规范化:用 QTradableStocksUS——一个加了多重流动性过滤的 Universe,只保留回测期内「现实可交易」的股票。
  3. 因子合成:notebook 用朴素等权 rank 合成——把每个因子的 rank 直接相加。
# 伪码示意 combined_rank = (mean_rev_rank + value_rank + quality_rank + ...)

notebook 明确指出这是朴素方法——它假设每个因子同等重要。这正是机器学习要取代的部分:

这种朴素合成只用了各因子 rank 的简单求和。我们想考虑相对重要性与预测收益的增量信息——这正是后续 ML 算法要做的,沿用同一套回测框架。

💡 核心心法:等权 rank 合成是基线(baseline)——任何 ML 模型都要先打败它才值得用。第 7 章线性模型、第 9 章树模型,本质都是学习因子间的合成权重

六、AggregateFundamentals:解决基本面频率问题

基本面数据是季度披露,但 ML 训练需要日频特征。notebook 用一个自定义 AggregateFundamentals 因子,取最近一次申报的基本面值,解决「季度数据如何放到日频 Pipeline」的问题。

⚠️ 警告:这种处理要警惕point-in-time——必须确保某天用的基本面是「该天已公告」的最新值,不能把未披露的季度数据提前用到日频特征里。Zipline 的 Pipeline 帮你管这件事,自己手撸要格外小心。

七、因子库与下一步

07_factor_library_quantopian.ipynb 提供了 Quantopian 平台上的现成因子库,对应原书第 24 章 Appendix。本节之后,我们手里已经有了:

  • 数据:第 2~3 章。
  • 特征/因子:第 4 章(特征工程、TA-Lib、滤波、Alphalens 评估、单/多因子回测)。

下一步就是评估与组合(第 5 章 策略评估与组合优化),把因子变成有规则的组合,系统化衡量绩效。

本节要点回顾

  1. Zipline 抽象:CustomFactor(自定义计算)+ Pipeline(每日批量算)。
  2. Pipeline 的价值:强制 point-in-time,自动避免未来函数。
  3. 单因子回测:MeanReversion z-score → 横截面 rank → 多空。
  4. 入口函数:run_algorithm(),需指定 bundle 与 ml4t-zipline 环境。
  5. 多因子扩展:多源数据(Morningstar/StockTwits)+ QTradableStocksUS 规范 Universe。
  6. 等权 rank 是基线:朴素合成假设等权,ML 的任务是学习合成权重。
  7. AggregateFundamentals:季度基本面转日频要注意 point-in-time。

下一章(第 5 章 策略评估与组合优化),我们把因子回测推进到组合构建与绩效评估,用 pyfolio 出绩效报告,用均值方差优化做组合,用凯利公式管仓位。


发布者: 作者: 灏天文库 转发
评论区 (0)
U