第1章:单期Brinson归因——从理论到代码
各位同学,咱们今天聊点实在的。
做指数增强基金,最核心的问题是什么?说白了就两个:我到底赚了谁的钱?是押对了行业?还是选对了股票?
Brinson归因就是干这个的。它把超额收益拆成三块:配置效应、选股效应、交互效应。今天咱们先搞定单期版本——也就是一天、一周或一个月的数据,怎么算,怎么看。
1.1 Brinson归因的核心逻辑
先别急着看公式。我带你走一遍直觉。
假设你是一个基金经理。基准指数里,银行板块权重20%,你配了30%。结果银行涨了5%,基准涨了3%。
- 配置效应:你多配了银行,赌对了方向。赚的就是超配部分带来的收益。
- 选股效应:同样在银行里,你选的股票比基准里的银行股涨得好。这部分是选股能力。
- 交互效应:你既超配了银行,又选了好股票。这两件事同时发生,产生的额外收益。
嗯,这里要注意:交互效应在单期里其实挺常见的。很多人把它忽略掉,或者合并到选股里。我个人习惯是单独列出来,因为它在某些市场环境下能揭示很有意思的信息。
1.2 数学公式:别怕,就三行
咱们用最标准的Brinson模型。记:
w_p_i:组合在行业i的权重w_b_i:基准在行业i的权重r_p_i:组合在行业i的收益率r_b_i:基准在行业i的收益率
那么:
配置效应 = Σ (w_p_i - w_b_i) × (r_b_i - r_b)
选股效应 = Σ w_b_i × (r_p_i - r_b_i)
交互效应 = Σ (w_p_i - w_b_i) × (r_p_i - r_b_i)
其中 r_b 是基准总收益率。
你可能会问:为什么配置效应里要减掉基准总收益?
因为你要看的是相对表现。你超配银行,如果银行只是跟着大盘走,那不算你厉害。只有银行跑赢了大盘,你的超配才有价值。
关键点:三个效应加起来,正好等于组合的超额收益。这是Brinson模型的数学保证。
1.3 Python实现:手把手写代码
好,理论讲完了。咱们直接上代码。我用的是最朴素的写法,方便你理解每一步在干什么。
import pandas as pd
import numpy as np
def brinson_single_period(portfolio_weights, benchmark_weights,
portfolio_returns, benchmark_returns):
"""
单期Brinson归因
参数都是Series,index为行业/板块名称
"""
# 基准总收益率
r_b = (benchmark_weights * benchmark_returns).sum()
# 配置效应
allocation = (portfolio_weights - benchmark_weights) * \
(benchmark_returns - r_b)
# 选股效应
selection = benchmark_weights * \
(portfolio_returns - benchmark_returns)
# 交互效应
interaction = (portfolio_weights - benchmark_weights) * \
(portfolio_returns - benchmark_returns)
# 汇总
result = pd.DataFrame({
'配置效应': allocation,
'选股效应': selection,
'交互效应': interaction,
'合计': allocation + selection + interaction
})
result.loc['总计'] = result.sum()
return result
这段代码我用了很多次。有一次在项目中,我发现交互效应特别大,正负都有。后来一查,原来是某个行业权重调整的时点跟股票调仓没对齐。嗯,这种坑我踩过,所以提醒你:数据的时间对齐非常重要。
1.4 结果解读:别只看数字
假设我们跑出来这样一张表:
| 行业 | 配置效应 | 选股效应 | 交互效应 | 合计 |
|---|---|---|---|---|
| 银行 | 0.12% | 0.05% | 0.02% | 0.19% |
| 科技 | -0.08% | 0.15% | -0.03% | 0.04% |
| 消费 | 0.03% | -0.02% | 0.01% | 0.02% |
| 总计 | 0.07% | 0.18% | 0.00% | 0.25% |
怎么读?
- 配置效应0.07%:说明行业配置整体上贡献了正收益。但你看科技是负的,说明超配科技其实拖了后腿。
- 选股效应0.18%:这是大头。说明基金经理选股能力不错,尤其在科技板块,选股贡献了0.15%。
- 交互效应0.00%:几乎为零。说明配置和选股之间没有明显的协同或抵消。
你想想看,如果交互效应很大,比如-0.10%,那意味着什么?意味着你虽然选了好股票,但因为你配的权重不对,反而把收益抵消了一部分。这种情况我见过,通常是基金经理在调仓时,权重调整滞后于选股决策。
我的习惯:每次跑完归因,先看总计是否等于超额收益。如果不相等,99%是数据问题。剩下1%是模型用错了。
1.5 一张图看懂单期Brinson
下面这张SVG图,把整个流程串起来了。从输入到输出,每一步都清晰。
这张图我建议你保存下来。每次做归因前,对着图检查一遍输入数据,能省很多debug的时间。
1.6 避坑指南
最后,分享几个我踩过的坑:
- 权重没归一化:组合权重和基准权重各自加起来必须等于1(或100%)。差一点都会导致归因结果偏差。
- 收益没对齐:组合收益和基准收益必须是同一时间区间的。我曾经遇到过用日收益对周权重的情况,结果交互效应大得离谱。
- 行业分类不一致:组合和基准用的行业分类标准必须一样。一个用申万一级,一个用GICS,那算出来的东西没法看。
特别提醒:单期Brinson只适用于一个时间点。如果你想看多期累计,需要用多期归因方法。那个我们后面会讲。
好了,单期Brinson归因就这些。代码不长,逻辑也不复杂。但它是整个业绩归因体系的基石。把这个搞透,后面的多期、多因子、风险归因,你上手会快很多。
下一章,咱们聊聊多期Brinson——怎么把每天的归因结果累加起来,又不丢失信息。
公众号:蓝海数据掘金营,微信deep3321