7 · 30 分钟

库中的经典策略

动量、趋势、均值回归、风险平价 — 1,800+ 策略背后的模式。

动量均值回归模板案例

大多数已发表的量化想法都属于少数几大家族。Quant Buffet 用 backtest.templates 与自定义代码在全库中实现它们。一旦能识别家族,你就能在两分钟内读懂任意策略文章——因为你已经知道它的经济逻辑和典型失效方式。

Momentum

Winners keep winning over 3–12 month horizons. Library favorite: dual_momentum (623 strategies).

Quant Buffet templates: abs_momentumdual_momentummomentum_rotation

Watch out: Crash risk when trends reverse sharply (2009, 2020).

模板速查表

模板经济逻辑库内占比
dual_momentum持有最强标的,但趋势为负时转现金约 35%
abs_momentum等权持有近期赢家约 19%
momentum_rotation每月轮动到前 N 名约 14%
sma_trend仅持有位于长期均线上方的标的约 13%
equal_weight朴素分散并定期再平衡约 11%
mean_reversion买入超卖的 z-score约 6%
vol_target / risk_parity按波动率而非主观信心分配仓位少见但重要

家族一 — 趋势跟踪

来源。 Mebane Faber 2007 年的战术资产配置论文,使「仅在价格高于 10 个月(约 200 日)均线时持有」这一做法广为人知。为何可能有效。 投资者对信息反应渐进、机构降风险缓慢,因此下跌具有聚集性。典型失效。 震荡市中来回打脸——规则在回调后卖出,又在更高价位买回,反复发生。

python
from backtest.templates import make_sma_trend

ASSETS = ["SPY", "EFA", "TLT", "GLD", "BIL"]

def make_on_day(prices):
    # 按月调仓;BIL 几乎总在自身均线之上,因此充当防御仓
    return make_sma_trend(prices, ASSETS, {"sma_days": 200})

家族二 — 横截面动量

来源。 Jegadeesh 与 Titman(1993)发现过去 3–12 个月的赢家会继续跑赢输家。为何可能有效。 对信息反应不足,加上追逐业绩的资金流。典型失效。 在剧烈转折点发生「动量崩塌」:2009 年春季市场见底反弹时,动量组合仍持有防御型赢家,几周内即遭受严重损失。

python
from backtest.templates import make_momentum_rotation

ASSETS = ["XLK", "XLF", "XLE", "XLV", "XLI", "XLP", "XLU", "XLY", "BIL"]

def make_on_day(prices):
    # 持有最强的 3 个板块,每月刷新
    return make_momentum_rotation(prices, ASSETS, {"lookback": 126, "top_n": 3})

家族三 — 双动量

来源。 Gary Antonacci(2014)把*相对*强度(哪个标的最强?)与*绝对*强度(它是否跑得过现金?)结合起来。为何在本库中占主导。 它用两行逻辑回答了真实配置者会问的两个问题。典型失效。 极度集中:该模板同一时间只持有一个仓位,因此某个糟糕月份会被完整承受。

python
from backtest.templates import make_dual_momentum

ASSETS = ["SPY", "EFA", "EEM", "TLT", "GLD", "BIL"]

def make_on_day(prices):
    # 始终只持有一个标的:最强的风险资产,若均为负则持有现金
    return make_dual_momentum(prices, ASSETS, {"lookback": 252, "cash_symbol": "BIL"})

家族四 — 均值回归

来源。 De Bondt 与 Thaler(1985)记录了长周期反转;短周期版本在 2000 年代成为主流。为何可能有效。 被动抛售与提供流动性会获得报酬。典型失效。 它本质上是变相做空波动率——它买入正在下跌的资产,因此真正的危机恰是它最痛的时候;而它的高换手率(第 5 课)还会吃掉 edge。

python
from backtest.templates import make_mean_reversion

ASSETS = ["SPY", "QQQ", "IWM", "BIL"]

def make_on_day(prices):
    # 当 10 日 z-score 向下偏离足够多时买入
    return make_mean_reversion(
        prices, ASSETS, {"lookback": 10, "entry_z": -1.0, "exit_z": 0.0}
    )

家族五 — 基于风险的配置

来源。 Bridgewater 的全天候与 Harry Browne 的永久组合,后来被形式化为风险平价。为何可能有效。金额不等于等风险——60/40 组合中约 90% 的风险来自股票。按波动率倒数配权可以平衡风险贡献。典型失效。 又是 2022 年:当所有仓位同跌且利率上行,带杠杆或久期偏重的风险平价组合无处可躲。

python
from backtest.templates import make_risk_parity, make_vol_target

ASSETS = ["SPY", "TLT", "GLD", "DBC"]

def make_on_day(prices):
    # 按 63 日(约一个季度)窗口计算的波动率倒数权重
    # 若想把总敞口缩放到波动率预算,请改用 make_vol_target。
    return make_risk_parity(prices, ASSETS, {"vol_lookback": 63})

一张表读懂任意策略页

家族经典来源现实载体何时失效
趋势Faber(2007)管理期货基金横盘震荡市
横截面动量Jegadeesh & Titman(1993)MTUM急剧反转(2009 年春)
时序动量Moskowitz、Ooi & Pedersen(2012)CTA 策略利率机制切换
均值回归De Bondt & Thaler(1985)统计套利交易台危机;换手成本
风险平价Bridgewater 全天候RPARNTSX利率上行、同向抛售

案例:现在就在 IDE 里跑一遍

打开任意一个双动量策略,依次做以下三处修改(一次只改一处),并在每次运行后记录 Sharpe 与最大回撤。这就是完整的研究闭环,五分钟即可完成。

  1. 基线 — 原样运行,记录 CAGR、Sharpe 与最大回撤。
  2. 回看窗口 — 把 lookback 从 252 改为 126。更快的信号反应更早但打脸更多,因此要同时关注换手率与收益。
  3. 集中度 — 把 make_dual_momentum 换成 make_momentum_rotation 并设 top_n: 3。预期 CAGR 下降但回撤变浅;你用上行空间换取了稳定性。
  4. 资产池 — 把 ASSETS 换成 MULTI_ASSET 资产池。更多仓位通常让曲线更平滑,也会稀释最好的年份。
  5. 压力区间 — 把 start 设为 2007-01-01,只用 2008 与 2022 两年来评判策略。

接下来去哪里

  • 策略库 — 按动量、均值回归或风险平价筛选,连读同一家族的三篇文章,观察不同作者的差异。
  • API 文档ASSETSmake_on_dayPortfolioEnginecompute_metrics 的完整参考。
  • 平台导出 — 当你超出实验室能力时,把任意策略导出到 QuantConnect、Backtrader、Zipline、VectorBT 或 Freqtrade。
  • 个人中心 → 回测使用记录 — 追踪你的研究实际产生了多少次运行与多少笔模拟成交。

课程完成 — 您现在能够

  • 说明日频数据如何进入 `make_on_day`
  • 列举主要资产类别、各自驱动因素与合适的 ETF 代理。
  • 描述券商 / 交易所 / 平台层级与现实的成本模型。
  • 对比订单类型与 Quant Buffet 的权重执行,并估算换手成本。
  • 对照真实基准解读 Sharpe 与回撤,并修复常见实验室错误。
  • 识别全部五大策略家族、其经典论文与失效模式。