第 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 日)均线时持有」这一做法广为人知。为何可能有效。 投资者对信息反应渐进、机构降风险缓慢,因此下跌具有聚集性。典型失效。 震荡市中来回打脸——规则在回调后卖出,又在更高价位买回,反复发生。
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 年春季市场见底反弹时,动量组合仍持有防御型赢家,几周内即遭受严重损失。
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)把*相对*强度(哪个标的最强?)与*绝对*强度(它是否跑得过现金?)结合起来。为何在本库中占主导。 它用两行逻辑回答了真实配置者会问的两个问题。典型失效。 极度集中:该模板同一时间只持有一个仓位,因此某个糟糕月份会被完整承受。
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。
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 年:当所有仓位同跌且利率上行,带杠杆或久期偏重的风险平价组合无处可躲。
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 全天候 | RPAR、NTSX | 利率上行、同向抛售 |
案例:现在就在 IDE 里跑一遍
打开任意一个双动量策略,依次做以下三处修改(一次只改一处),并在每次运行后记录 Sharpe 与最大回撤。这就是完整的研究闭环,五分钟即可完成。
- 基线 — 原样运行,记录 CAGR、Sharpe 与最大回撤。
- 回看窗口 — 把
lookback从 252 改为 126。更快的信号反应更早但打脸更多,因此要同时关注换手率与收益。 - 集中度 — 把
make_dual_momentum换成make_momentum_rotation并设top_n: 3。预期 CAGR 下降但回撤变浅;你用上行空间换取了稳定性。 - 资产池 — 把
ASSETS换成MULTI_ASSET资产池。更多仓位通常让曲线更平滑,也会稀释最好的年份。 - 压力区间 — 把
start设为2007-01-01,只用 2008 与 2022 两年来评判策略。
接下来去哪里
- 策略库 — 按动量、均值回归或风险平价筛选,连读同一家族的三篇文章,观察不同作者的差异。
- API 文档 —
ASSETS、make_on_day、PortfolioEngine与compute_metrics的完整参考。 - 平台导出 — 当你超出实验室能力时,把任意策略导出到 QuantConnect、Backtrader、Zipline、VectorBT 或 Freqtrade。
- 个人中心 → 回测使用记录 — 追踪你的研究实际产生了多少次运行与多少笔模拟成交。
课程完成 — 您现在能够
- 说明日频数据如何进入 `make_on_day`。
- 列举主要资产类别、各自驱动因素与合适的 ETF 代理。
- 描述券商 / 交易所 / 平台层级与现实的成本模型。
- 对比订单类型与 Quant Buffet 的权重执行,并估算换手成本。
- 对照真实基准解读 Sharpe 与回撤,并修复常见实验室错误。
- 识别全部五大策略家族、其经典论文与失效模式。