4、Campisi模型基础:债券归因的独特逻辑、久期归因、利差归因、择时归因

聊到债券归因,很多人第一反应就是「算久期、算凸性」。嗯,这没错,但不够。

股票归因可以靠Barra模型,拆行业、拆风格因子。债券呢?债券的收益来源跟股票完全不一样。你想想看,债券的收益大头其实来自票息和利率变动,而不是什么「成长因子」或「价值因子」。

Campisi模型,就是专门为债券量身定做的归因框架。我个人习惯把它叫做「债券归因的教科书式解法」。今天我们就把它拆开揉碎了讲清楚。

核心观点:Campisi模型将债券超额收益拆解为久期归因利差归因择时归因三部分。它解决了「债券收益到底从哪来」这个根本问题。
Campisi 债券归因模型 久期归因 利差归因 择时归因 利率曲线平移 久期配置偏差 凸性贡献 信用利差变动 行业/评级偏移 个券选择 期限结构择时 信用择时 久期择时 总超额收益 = 久期归因 + 利差归因 + 择时归因

4.1 债券归因的独特逻辑

股票归因和债券归因,底层逻辑完全不同。

股票收益主要来自价格变动,而价格变动又来自公司基本面、市场情绪、行业轮动这些。债券呢?债券有明确的票息,有到期日,有信用评级。它的收益来源更「结构化」。

Campisi模型抓住了这个本质。它把债券的超额收益拆成三块:

  • 久期归因:你赌对了利率方向吗?
  • 利差归因:你选对了信用债吗?
  • 择时归因:你踩对了买卖时点吗?

说白了,Campisi模型就是问三个问题:「利率变了吗?」「信用利差变了吗?」「你操作对了吗?」

我的经验:刚开始做债券归因时,我总想把股票那套因子模型直接搬过来用。结果发现完全不对路。债券的因子结构更简单,但数据质量要求更高——尤其是信用利差数据,一不小心就「脏」了。

4.2 久期归因:利率变动的「放大器」

久期归因,是Campisi模型里最基础、也最直观的一块。

它的逻辑很简单:如果基准利率变了,你的组合因为久期配置不同,会比基准多赚或少赚多少?

公式长这样:

久期归因 = (组合久期 - 基准久期) × (-基准利率变动)

举个例子:

  • 组合久期 5.0,基准久期 4.0
  • 基准利率下降 0.5%
  • 久期归因 = (5.0 - 4.0) × (-(-0.5%)) = 1.0 × 0.5% = 0.5%

这意味着,因为你的组合比基准「更长久期」,在利率下行时,你多赚了0.5%。

注意:久期归因假设利率曲线是平行移动的。现实中利率曲线经常「扭曲」——短端涨、长端跌。这时候久期归因就不够用了,需要引入关键利率久期凸性调整

我曾经踩过一个坑:2019年某次归因分析,久期归因显示组合跑赢基准0.3%,但实际超额收益是负的。后来发现,问题出在凸性上——利率波动太大,久期近似失效了。从那以后,我每次做久期归因都会顺手算一下凸性贡献。

4.3 利差归因:信用债的「超额密码」

利差归因,说白了就是回答一个问题:你选的信用债,到底有没有给你带来超额收益?

利差归因可以进一步拆成两块:

  1. 信用利差变动归因:整个信用债市场利差变了,你因为配置了信用债,多赚或少赚了多少。
  2. 个券选择归因:在同类信用债里,你选的个券表现比同类好还是差。

公式上:

利差归因 = 组合信用利差暴露 × (-信用利差变动) + 个券选择残差

你想想看,如果整个市场信用利差收窄了50bp,你组合里信用债配得比基准多,那你就赚了。但如果你的个券踩雷了,信用利差反而走阔,那这部分收益就会被吃掉。

实战要点:利差归因对数据频率很敏感。我建议用日频利差数据做归因,周频或月频会丢失很多细节。尤其是信用事件爆发时,一天之内利差可以跳几十个bp。

4.4 择时归因:你的「操作」值多少钱?

择时归因,是Campisi模型里最「性感」的一块。它衡量的是:你在不同时间点上的操作,到底创造了多少价值?

择时归因通常包含三个维度:

择时类型 含义 典型场景
久期择时 主动调整组合久期,赌利率方向 预期降息,拉长久期
期限结构择时 在利率曲线不同期限上做配置 做陡曲线:买短卖长
信用择时 主动调整信用债仓位 经济复苏期,加仓高收益债

择时归因的计算,核心是「持仓变动 × 后续收益」的逻辑。你上个月加仓了长久期债,这个月利率果然下了,那这部分收益就算作你的择时能力。

我的习惯:做择时归因时,我会把时间窗口切成「决策期」和「持有期」。比如每月调仓一次,那就把一个月切成两半——前半段是决策期,后半段是持有期。这样能更干净地分离出择时贡献。

4.5 一个完整的Campisi归因案例

光讲理论不过瘾,我们看个实际案例。

假设某债券组合,月度超额收益为1.2%。基准是国债指数。我们跑一下Campisi归因:

# 伪代码示例:Campisi归因计算
def campisi_attribution(portfolio, benchmark, rate_change, spread_change):
    # 久期归因
    dur_attr = (portfolio.duration - benchmark.duration) * (-rate_change)
    
    # 利差归因
    spread_attr = portfolio.credit_spread_exposure * (-spread_change)
    
    # 择时归因(简化版)
    timing_attr = portfolio.timing_score * 0.01  # 假设择时评分
    
    total_excess = dur_attr + spread_attr + timing_attr
    return total_excess

# 假设数据
result = campisi_attribution(
    portfolio={'duration': 4.5, 'credit_spread_exposure': 0.3, 'timing_score': 0.8},
    benchmark={'duration': 3.8},
    rate_change=-0.4,   # 利率下行40bp
    spread_change=-0.2  # 信用利差收窄20bp
)

print(f"久期归因: {0.28:.2%}")
print(f"利差归因: {0.06:.2%}")
print(f"择时归因: {0.80:.2%}")
print(f"总超额收益: {1.14:.2%}")

结果解读:

  • 久期归因贡献了0.28%——因为组合久期比基准长,利率下行受益
  • 利差归因贡献了0.06%——信用利差收窄,组合有信用债暴露
  • 择时归因贡献了0.80%——基金经理的主动操作创造了主要价值
注意:实际归因中,择时归因往往和久期归因、利差归因有交叉。比如你加仓信用债,既影响了利差归因,也影响了择时归因。处理这种「交叉效应」时,我建议用顺序归因法——先算久期,再算利差,最后算择时,把交叉项归到最后一个因子。

4.6 避坑指南

做Campisi归因这几年,我踩过不少坑。挑几个典型的说说:

  • 数据不同频:我曾经用日频的利率数据和周频的持仓数据做归因,结果对不上。后来统一用日频,问题解决。
  • 忽略凸性:利率波动大的时候,久期归因误差很大。建议加上凸性调整项。
  • 利差数据「脏」:信用利差数据来源不同,结果可能差很多。我习惯用同一家数据商的利差曲线,保持一致性。
  • 择时归因过度拟合:择时归因很容易「做出」漂亮数字。要小心——真正的择时能力需要长期验证,一个月的数据说明不了什么。

嗯,Campisi模型的内容就这些。它不复杂,但很实用。你只要把久期、利差、择时这三块拆清楚,债券归因的基本功就算打牢了。

一句话总结:Campisi模型就是债券归因的「三原色」——久期归因管利率方向,利差归因管信用选择,择时归因管操作时机。三色合一,才能画出完整的超额收益图景。

公众号:蓝海资料掘金营,微信deep3321