1. 课程导入

欢迎进入《量化策略组合回测与归因实战》。在正式动手写代码之前,我们需要先建立一张清晰的“认知地图”:这门课到底解决什么问题,它和普通的单策略回测有什么区别,学完之后你能独立完成哪些工作。本章不涉及复杂公式,而是帮你把后续30章的知识骨架先搭起来。

一、什么是量化策略组合回测与归因

量化策略组合回测,指的是把多个已经成型的量化策略(例如动量、均值回归、多因子选股、CTA趋势等)按照某种权重组合在一起,在历史数据上模拟其整体资金曲线的过程。它关注的不是单个策略“能不能赚钱”,而是组合层面“收益是否更稳、回撤是否更小、资金容量是否更大”。

归因分析(Attribution)则是回测之后的“解剖”环节。它回答三个核心问题:

  • 收益从哪来:组合的收益是来自资产配置、策略选择,还是市场整体Beta?
  • 风险从哪来:回撤是由某个策略失效、行业暴露过高,还是风格切换导致?
  • 决策对不对:权重调整、再平衡频率、择时开关是否真正贡献了超额收益?

简单说,回测是“造镜子”,归因是“照镜子”。没有归因的回测,只是一条漂亮的资金曲线;有了归因,才能把曲线拆解成可解释、可优化、可复现的决策依据。

核心定义一句话:量化策略组合回测与归因,是以组合为单位,用历史数据验证多策略协同表现,并将收益与风险拆解到策略、权重、风格、行业等维度,从而指导实盘配置的一整套工程化方法。

二、学习目标:学完你能做什么

本课程的目标不是让你记住某个指标公式,而是让你具备独立搭建组合回测与归因系统的能力。具体分为四个层次:

  1. 数据层:能清洗、对齐多策略的净值序列与持仓数据,处理停牌、分红、交易日不一致等常见问题。
  2. 回测层:能实现等权、风险平价、均值方差、动量加权等组合权重方案,并支持定期再平衡与交易成本模拟。
  3. 归因层:能完成Brinson归因、因子归因、风险归因,并输出可读的归因报告。
  4. 实战层:能根据归因结果调整策略池与权重,识别过拟合,并形成可复用的组合监控流程。

学习建议:每章至少动手跑一遍示例代码,把参数改成你自己的策略数据。归因部分建议先理解“拆解逻辑”,再追求指标精度。

三、整体课程框架与核心流程

30章内容按“数据→回测→归因→实战”四段递进。下图展示了组合回测与归因的核心数据链路:从多个单策略净值出发,经过权重配置与再平衡,生成组合净值,再进入归因引擎拆解收益与风险,最终反馈到策略池优化。

策略A净值 动量/选股 策略B净值 均值回归 策略C净值 CTA趋势 权重配置 等权/风险平价 再平衡规则 组合回测 净值/回撤/换手 交易成本 收益归因 Brinson/因子拆解 风险归因 波动/回撤/暴露 策略池优化 调权/淘汰/新增 反馈迭代

围绕这条链路,课程分为六个模块:

模块 章节范围 核心产出
基础与数据 第1–5章 可对齐的多策略净值与持仓数据集
组合回测引擎 第6–12章 支持多权重方案与再平衡的回测框架
绩效与风险指标 第13–17章 夏普、卡玛、最大回撤、换手率等指标库
归因分析 第18–24章 Brinson、因子、风险归因报告
实战与优化 第25–30章 策略池迭代、过拟合检验、监控流程

四、实战价值与常见误区

组合回测与归因的实战价值,体现在三个“从…到…”:

  • 从单策略到组合:降低单一策略失效带来的尾部风险,提升资金曲线平滑度。
  • 从看结果到看过程:归因让每一分收益和回撤都有出处,避免“黑箱赚钱、黑箱亏钱”。
  • 从拍脑袋到可复现:权重、再平衡、成本假设全部参数化,便于团队协作与审计。

三个高频误区:

  1. 把回测当预测:历史表现好不等于未来好,归因的目的正是识别收益是否可持续。
  2. 忽略交易成本与容量:组合换手叠加后成本可能吃掉大部分超额收益,回测必须计入。
  3. 归因只看收益不看风险:只拆收益会掩盖风险集中度,必须收益与风险双维度归因。

下面是一段最小化的组合回测伪代码,帮助你建立工程直觉。后续章节会逐步替换为完整实现。

# 组合回测核心伪代码
nav_list = load_nav(["strategy_a.csv", "strategy_b.csv", "strategy_c.csv"])
weights = {"A": 0.4, "B": 0.3, "C": 0.3}
rebalance_freq = "M"   # 每月再平衡
cost_rate = 0.0005     # 单边交易成本

portfolio_nav = [1.0]
for t in range(1, len(nav_list)):
    ret = sum(weights[k] * nav_list[k].pct_change()[t] for k in weights)
    if is_rebalance_day(t, rebalance_freq):
        turnover = calc_turnover(weights, nav_list, t)
        ret -= turnover * cost_rate
    portfolio_nav.append(portfolio_nav[-1] * (1 + ret))

report = attribution(portfolio_nav, nav_list, weights)
print(report.summary())

本章作为导入,核心是让你先看清全局:回测负责“验证”,归因负责“解释”,两者结合才构成可迭代的量化组合管理闭环。接下来,我们将从数据准备开始,一步步把这套闭环真正跑起来。