第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图,把整个流程串起来了。从输入到输出,每一步都清晰。

组合权重 w_p 各行业/板块 基准权重 w_b 各行业/板块 组合收益 r_p 各行业/板块 基准收益 r_b 各行业/板块 Brinson 分解公式 配置效应 = (w_p - w_b) × (r_b - R_b) 选股效应 = w_b × (r_p - r_b) 交互效应 = (w_p - w_b) × (r_p - r_b) 输出:各行业三效应 + 总计 配置效应 + 选股效应 + 交互效应 = 超额收益 单期Brinson归因流程图

这张图我建议你保存下来。每次做归因前,对着图检查一遍输入数据,能省很多debug的时间。

1.6 避坑指南

最后,分享几个我踩过的坑:

  • 权重没归一化:组合权重和基准权重各自加起来必须等于1(或100%)。差一点都会导致归因结果偏差。
  • 收益没对齐:组合收益和基准收益必须是同一时间区间的。我曾经遇到过用日收益对周权重的情况,结果交互效应大得离谱。
  • 行业分类不一致:组合和基准用的行业分类标准必须一样。一个用申万一级,一个用GICS,那算出来的东西没法看。

特别提醒:单期Brinson只适用于一个时间点。如果你想看多期累计,需要用多期归因方法。那个我们后面会讲。

好了,单期Brinson归因就这些。代码不长,逻辑也不复杂。但它是整个业绩归因体系的基石。把这个搞透,后面的多期、多因子、风险归因,你上手会快很多。

下一章,咱们聊聊多期Brinson——怎么把每天的归因结果累加起来,又不丢失信息。


公众号:蓝海数据掘金营,微信deep3321