一、归因分析概述:什么是策略归因分析?为什么需要归因分析?归因分析在量化投资中的核心价值
1.1 从一次回测翻车说起
先讲个我自己的故事。
几年前,我开发了一套基于均线交叉的趋势策略。回测曲线漂亮得不像话——年化收益35%,最大回撤不到8%。我当时觉得,嗯,稳了。结果实盘跑了三个月,净值曲线一路向南,最后亏了12%。
问题出在哪?
我花了整整两周去排查。是市场环境变了?还是参数过拟合?或者是交易成本没算对?说实话,当时我就像无头苍蝇一样乱撞。直到后来我系统地做了归因分析,才发现真相:那段时间的收益,几乎全部来自某几只小市值股票的异常波动。一旦风格切换,策略就彻底失效了。
这就是我今天要讲的主题——策略归因分析。
1.2 什么是策略归因分析?
说白了,归因分析就是回答一个问题:策略赚的钱,到底是从哪来的?
它把策略的总收益拆解成不同因素的贡献。比如:
- 市场整体上涨带来的收益(β收益)
- 行业配置带来的收益
- 个股选择带来的收益
- 交易时机带来的收益
- 运气成分带来的收益
我个人习惯把归因分析比作「体检报告」。你去看医生,不能只问「我健康吗?」。你得知道血压、血糖、血脂各是多少,哪个指标出了问题。策略也是一样——你不能只看总收益,你得知道每个环节的贡献。
核心定义:策略归因分析是一种将投资组合的收益或风险,按照预设的因子或决策维度进行分解的方法论。它帮助我们理解策略的收益来源、风险暴露以及决策质量。
1.3 为什么需要归因分析?
你可能会问:我回测跑得好好的,干嘛要搞这么复杂?
我在项目中遇到过太多这样的案例了。一个策略看起来赚钱,但其实是「假把式」。比如:
- 运气 vs 能力:你赚的钱,到底是策略有效,还是刚好赶上了风口?归因分析能帮你区分。
- 过拟合的陷阱:回测曲线漂亮,但归因后发现收益全靠几个极端样本。这种策略你敢实盘吗?
- 风格漂移:策略本来做的是价值投资,结果不知不觉变成了成长风格。归因分析能帮你及时发现。
- 风险暴露失控:你以为自己在做α策略,结果β暴露高达0.8。归因分析能让你看清真实的风险敞口。
我的经验:每次开发新策略,我都会先跑一遍归因分析。如果发现收益来源过于集中(比如某只股票贡献了50%以上收益),我会直接打回去重新设计。因为这种策略大概率是过拟合的。
1.4 归因分析的核心价值
归因分析在量化投资中的价值,我总结为四点:
| 价值维度 | 具体说明 | 我的实战体会 |
|---|---|---|
| 诊断价值 | 识别策略的强项和弱项 | 曾经有个策略,归因后发现择时能力是负的,全靠选股在撑。后来我砍掉了择时模块,收益反而提升了。 |
| 改进价值 | 指导策略优化方向 | 归因分析告诉你哪个环节最薄弱,你就优先改哪里。而不是盲目调参。 |
| 风控价值 | 监控风险暴露是否在预期范围内 | 我每周都会跑一次归因分析,看看风格暴露有没有异常。有一次发现市值因子暴露突然变大,排查后发现是数据源出了问题。 |
| 信任价值 | 增强对策略的理解和信心 | 当你清楚地知道每一分钱是怎么赚来的,你才敢在回撤时坚持持有。 |
1.5 归因分析的分类框架
归因分析不是只有一种方法。根据不同的维度,可以分成几类:
- 按分析对象:收益归因 vs 风险归因
- 按分析维度:Brinson归因(行业/个股层面)、因子归因(风格因子层面)、风险归因(VaR分解)
- 按时间维度:单期归因 vs 多期归因
下面这张图是我自己整理的归因分析知识体系,你可以看看:
1.6 一个简单的归因计算示例
光说不练假把式。我们来看一个最简单的归因计算。
假设你的策略在某个月赚了5%。同期大盘涨了2%。那么:
- 市场收益(β):2% —— 这部分是市场给的,跟你能力无关
- 超额收益(α):5% - 2% = 3% —— 这才是你策略真正的贡献
但这3%的超额收益又是怎么来的?我们可以进一步拆解:
# 简单的Brinson归因示例
import pandas as pd
# 假设数据
portfolio_weights = {'金融': 0.3, '科技': 0.4, '消费': 0.3}
benchmark_weights = {'金融': 0.4, '科技': 0.3, '消费': 0.3}
portfolio_returns = {'金融': 0.02, '科技': 0.05, '消费': 0.01}
benchmark_returns = {'金融': 0.01, '科技': 0.03, '消费': 0.02}
# 行业配置收益
allocation_effect = sum(
(portfolio_weights[i] - benchmark_weights[i]) * benchmark_returns[i]
for i in portfolio_weights
)
# 个股选择收益
selection_effect = sum(
benchmark_weights[i] * (portfolio_returns[i] - benchmark_returns[i])
for i in portfolio_weights
)
print(f"行业配置贡献: {allocation_effect:.4f}")
print(f"个股选择贡献: {selection_effect:.4f}")
print(f"总超额收益: {allocation_effect + selection_effect:.4f}")
输出结果:
行业配置贡献: 0.0040
个股选择贡献: 0.0080
总超额收益: 0.0120
你看,这个例子中,超额收益主要来自个股选择(0.8%),行业配置贡献较小(0.4%)。这说明策略的选股能力更强。
注意:这个例子只是为了演示原理。实际项目中,归因分析要复杂得多。你需要考虑多期归因、交互效应、交易成本、风格漂移等问题。我曾经因为忽略了交互效应,导致归因结果偏差了20%以上。嗯,那是个惨痛的教训。
1.7 归因分析的常见误区
最后,我分享几个常见的坑:
- 误区一:归因分析只是事后诸葛亮——其实它更应该是一个持续监控的工具。我每周都会跑一次。
- 误区二:归因结果越细越好——拆得太细反而容易迷失。我建议先粗后细,先看大类再看细节。
- 误区三:归因分析能解释一切——不能。它只能解释你能建模的部分。随机性永远存在。
- 误区四:归因结果就是绝对真理——不同的归因方法可能得出不同的结论。要结合业务逻辑去判断。
好了,这一章的内容就到这里。归因分析不是万能的,但没有归因分析,你的策略就像在黑夜里开车——你不知道前面是弯道还是悬崖。下一章,我会带你深入Brinson归因模型的具体实现。
公众号:蓝海资料掘金营,微信deep3321