1. 课程导入
欢迎进入《量化策略组合回测与归因实战》。在正式动手写代码之前,我们需要先建立一张清晰的“认知地图”:这门课到底解决什么问题,它和普通的单策略回测有什么区别,学完之后你能独立完成哪些工作。本章不涉及复杂公式,而是帮你把后续30章的知识骨架先搭起来。
一、什么是量化策略组合回测与归因
量化策略组合回测,指的是把多个已经成型的量化策略(例如动量、均值回归、多因子选股、CTA趋势等)按照某种权重组合在一起,在历史数据上模拟其整体资金曲线的过程。它关注的不是单个策略“能不能赚钱”,而是组合层面“收益是否更稳、回撤是否更小、资金容量是否更大”。
归因分析(Attribution)则是回测之后的“解剖”环节。它回答三个核心问题:
- 收益从哪来:组合的收益是来自资产配置、策略选择,还是市场整体Beta?
- 风险从哪来:回撤是由某个策略失效、行业暴露过高,还是风格切换导致?
- 决策对不对:权重调整、再平衡频率、择时开关是否真正贡献了超额收益?
简单说,回测是“造镜子”,归因是“照镜子”。没有归因的回测,只是一条漂亮的资金曲线;有了归因,才能把曲线拆解成可解释、可优化、可复现的决策依据。
核心定义一句话:量化策略组合回测与归因,是以组合为单位,用历史数据验证多策略协同表现,并将收益与风险拆解到策略、权重、风格、行业等维度,从而指导实盘配置的一整套工程化方法。
二、学习目标:学完你能做什么
本课程的目标不是让你记住某个指标公式,而是让你具备独立搭建组合回测与归因系统的能力。具体分为四个层次:
- 数据层:能清洗、对齐多策略的净值序列与持仓数据,处理停牌、分红、交易日不一致等常见问题。
- 回测层:能实现等权、风险平价、均值方差、动量加权等组合权重方案,并支持定期再平衡与交易成本模拟。
- 归因层:能完成Brinson归因、因子归因、风险归因,并输出可读的归因报告。
- 实战层:能根据归因结果调整策略池与权重,识别过拟合,并形成可复用的组合监控流程。
学习建议:每章至少动手跑一遍示例代码,把参数改成你自己的策略数据。归因部分建议先理解“拆解逻辑”,再追求指标精度。
三、整体课程框架与核心流程
30章内容按“数据→回测→归因→实战”四段递进。下图展示了组合回测与归因的核心数据链路:从多个单策略净值出发,经过权重配置与再平衡,生成组合净值,再进入归因引擎拆解收益与风险,最终反馈到策略池优化。
围绕这条链路,课程分为六个模块:
| 模块 | 章节范围 | 核心产出 |
|---|---|---|
| 基础与数据 | 第1–5章 | 可对齐的多策略净值与持仓数据集 |
| 组合回测引擎 | 第6–12章 | 支持多权重方案与再平衡的回测框架 |
| 绩效与风险指标 | 第13–17章 | 夏普、卡玛、最大回撤、换手率等指标库 |
| 归因分析 | 第18–24章 | Brinson、因子、风险归因报告 |
| 实战与优化 | 第25–30章 | 策略池迭代、过拟合检验、监控流程 |
四、实战价值与常见误区
组合回测与归因的实战价值,体现在三个“从…到…”:
- 从单策略到组合:降低单一策略失效带来的尾部风险,提升资金曲线平滑度。
- 从看结果到看过程:归因让每一分收益和回撤都有出处,避免“黑箱赚钱、黑箱亏钱”。
- 从拍脑袋到可复现:权重、再平衡、成本假设全部参数化,便于团队协作与审计。
三个高频误区:
- 把回测当预测:历史表现好不等于未来好,归因的目的正是识别收益是否可持续。
- 忽略交易成本与容量:组合换手叠加后成本可能吃掉大部分超额收益,回测必须计入。
- 归因只看收益不看风险:只拆收益会掩盖风险集中度,必须收益与风险双维度归因。
下面是一段最小化的组合回测伪代码,帮助你建立工程直觉。后续章节会逐步替换为完整实现。
# 组合回测核心伪代码
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())
本章作为导入,核心是让你先看清全局:回测负责“验证”,归因负责“解释”,两者结合才构成可迭代的量化组合管理闭环。接下来,我们将从数据准备开始,一步步把这套闭环真正跑起来。