mcpField
P
performance-attribution

performance-attribution

github.com/joellewis数据与数据库218676 次安装15 周前更新
代码仓库

关于 performance-attribution

用于分析投资组合业绩归因的参考技能和 Python 模块,涵盖股票、因子、固定收益、货币及多期方法,并提供示例和结果验证。

主要功能

  1. 01Brinson-Fachler 股票归因
  2. 02Carino 多期链接
  3. 03因子收益分解
  4. 04固定收益与货币归因
  5. 05可运行示例与结果验证

适用场景

  1. 01拆解主动收益的配置与选股效果
  2. 02比较组合收益与因子暴露
  3. 03分析债券和货币收益来源

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/joellewis/finance_skills --skill performance-attribution

安装后在 Claude Code 中输入/performance-attribution确认已加载。

附带文件scripts/performance_attribution.py

详细介绍

绩效归因

核心概念

Brinson-Fachler 归因(单期)

经典的股票归因模型将主动收益(投资组合收益减去基准收益)分解为三种效应:

  • 配置效应: 相对于基准超配或低配行业所带来的增值
    • A_i = (w_p,i - w_b,i) × (R_b,i - R_b)
    • 超配表现优于整体基准的行业可获得奖励
  • 选股效应: 在各行业内挑选更优证券所带来的增值
    • S_i = w_b,i × (R_p,i - R_b,i)
    • 无论权重如何,只要表现优于行业基准即可获得奖励
  • 交互效应: 同时超配并取得超额表现(或反之)所产生的综合效应
    • I_i = (w_p,i - w_b,i) × (R_p,i - R_b,i)
    • 反映超配某行业并在该行业内选出更优证券所带来的共同收益
  • 主动收益总额: R_p - R_b = Σ A_i + Σ S_i + Σ I_i

其中:w_p,i = 投资组合中行业 i 的权重,w_b,i = 基准中行业 i 的权重,R_p,i = 投资组合中行业 i 的收益,R_b,i = 基准中行业 i 的收益,R_b = 基准总收益。

多期归因

单期归因不会跨期复利。需要使用几何链接方法:

  • Carino 方法: 应用平滑因子,使算术效应复利后得到正确的几何总收益
  • Menchero 方法: 使用对数方法,实现更平滑的分解
  • GRAP(几何收益归因程序): 将算术效应转换为几何等效值
  • 核心原则:链接后的归因效应之和必须等于整个期间的几何主动收益
基于因子的归因

将收益分解为对系统性风险因子的敞口:

  • 模型: R_p = Σ β_k × F_k + α
    • β_k = 投资组合对因子 k 的敞口(载荷)
    • F_k = 因子 k 在该期间的收益
    • α = 无法由因子解释的残余收益(真正的 alpha)
  • 常见因子: 市场(MKT)、规模(SMB)、价值(HML)、动量(UMD)、质量(QMJ)、低波动率(BAB)
  • 因子贡献: 每个因子的 β_k × F_k
  • 主动因子贡献: (β_p,k - β_b,k) × F_k
  • 所选模型(Fama-French 3 因子、Carhart 4 因子、Fama-French 5 因子、Barra、Axioma)会影响结果
固定收益归因

将债券投资组合收益分解为各个来源:

  • 收益率回报(收入): 期间内累计的票息收入(收益率 × 时间)
  • 滚降回报: 债券沿收益率曲线向到期日滚动时的价格升值
  • 曲线变动回报: 收益率曲线平行及非平行移动的影响
    • 久期效应:-D × Δy(平行移动)
    • 曲线形变:关键利率久期贡献
  • 利差变动回报: 信用利差变动的影响:-spread_duration × Δspread
  • 信用/违约回报: 违约或信用事件造成的损失
  • 残差: 未解释的收益(凸性效应、模型误差)
货币归因

对于国际投资组合,收益可分解为:

  • 本地收益: 资产以本币计价的收益
  • 货币收益: 汇率变动带来的收益/损失
  • 交叉乘积: 本地收益与货币收益之间的交互作用
  • 总收益(基准货币): R_base ≈ R_local + R_currency + R_local × R_currency
  • 对冲收益: 本地收益 + 对冲成本(远期升水/贴水)
  • 主动货币决策的归因:实际货币敞口与基准货币敞口的对比
基于持仓与基于收益的归因
  • 基于持仓: 使用投资组合的实际持仓;精确度更高,但需要每个评估时点的详细持仓数据
  • 基于收益(风格分析): 将投资组合收益对一组风格指数进行回归(例如 Sharpe 风格分析);精确度较低,但只需收益序列
  • 基于交易: 精确度最高;通过使用实际交易记录,考虑期间内的交易

关键公式

公式表达式用途
配置效应(行业 i)A_i = (w_p,i - w_b,i) × (R_b,i - R_b)行业权重决策
选股效应(行业 i)S_i = w_b,i × (R_p,i - R_b,i)在行业内选择证券
交互效应(行业 i)I_i = (w_p,i - w_b,i) × (R_p,i - R_b,i)配置与选股的联合效应
总主动收益R_p - R_b = Σ(A_i + S_i + I_i)所有效应之和等于主动收益
因子收益贡献C_k = β_k × F_k因子 k 敞口带来的收益
久期效应ΔP/P ≈ -D × Δy收益率变动导致的债券价格变化
货币收益R_fx = (S_end - S_start) / S_start汇率影响

示例详解

示例 1:Brinson-Fachler 股票归因

已知: 一个由两个行业(科技和医疗保健)组成的投资组合。投资组合:科技占 35%(收益率为 15%),医疗保健占 65%(收益率为 8%)。基准:科技占 25%(收益率为 12%),医疗保健占 75%(收益率为 6%)。基准总收益率:0.25×12% + 0.75×6% = 7.5%。 计算: 各行业的配置、选股和交互效应,以及总主动收益。 解答:

  1. 投资组合总收益率: 0.35×15% + 0.65×8% = 5.25% + 5.20% = 10.45%。
  2. 总主动收益: 10.45% - 7.50% = 2.95%。
  3. 科技配置效应: (0.35 - 0.25) × (12% - 7.5%) = 0.10 × 4.5% = +0.45%(超配了一个表现优于基准的行业)。
  4. 科技选股效应: 0.25 × (15% - 12%) = 0.25 × 3% = +0.75%(科技行业的选股表现优于科技基准)。
  5. 科技交互效应: (0.35 - 0.25) × (15% - 12%) = 0.10 × 3% = +0.30%(超配且表现优异)。
  6. 医疗保健配置效应: (0.65 - 0.75) × (6% - 7.5%) = -0.10 × -1.5% = +0.15%(低配了一个表现落后于基准的行业)。
  7. 医疗保健选股效应: 0.75 × (8% - 6%) = 0.75 × 2% = +1.50%(医疗保健行业的选股表现优于医疗保健基准)。
  8. 医疗保健交互效应: (0.65 - 0.75) × (8% - 6%) = -0.10 × 2% = -0.20%(低配但表现优异——交互效应为负)。
  9. 合计: 配置 = 0.45 + 0.15 = 0.60%。选股 = 0.75 + 1.50 = 2.25%。交互 = 0.30 + (-0.20) = 0.10%。总和 = 0.60 + 2.25 + 0.10 = 2.95% ✓。
示例 2:基于因子的归因

已知: 某基金的因子载荷为:β_mkt = 1.1、β_smb = 0.3、β_hml = -0.2。期间内:MKT = 5%、SMB = 2%、HML = -1%。无风险利率 = 1%。基金超额收益 = 7%。 计算: 因子贡献和 alpha。 解答:

  1. 市场贡献: 1.1 × 5% = 5.50%。
  2. 规模(SMB)贡献: 0.3 × 2% = 0.60%。
  3. 价值(HML)贡献: -0.2 × (-1%) = +0.20%。
  4. 因子解释的总收益: 5.50 + 0.60 + 0.20 = 6.30%。
  5. Alpha(残差): 7.00% - 6.30% = +0.70%。
  6. 解读: 基金 7% 的超额收益主要由高于市场的 beta(5.5%)和小盘股倾向(0.6%)解释。由于价值因子表现落后,负向价值载荷带来了正贡献(+0.2%)。计入所有因子后,基金经理创造了 0.70% 的真实 alpha。

常见陷阱

  • 交互效应难以解读——有些归因模型会将其纳入配置效应或选择效应,从而显著改变报告结果
  • 多期归因需要进行几何链接——简单的算术归因无法正确复合,残差会随时间不断增大
  • 基于收益的归因(风格分析)可能无法反映实际持仓,尤其对于频繁交易或风格发生变化的管理人
  • 因子归因结果高度依赖所选因子模型——不同模型会得出不同的 alpha 估值
  • 国际投资组合常常忽略货币归因,导致表面上的投资能力被掩盖或夸大
  • 管理人评估中的幸存者偏差:只分析仍在运营的基金,从而高估平均投资能力
  • 比较基准时混淆费前收益和费后收益
  • 使用与投资组合投资范围不匹配的不适当基准

交叉引用

  • investment-policy(wealth-management 插件):IPS 中的基准选择会直接影响绩效归因分析
  • tax-efficiency(wealth-management 插件):税后归因需要根据税务影响调整收益
  • savings-goals(wealth-management 插件):归因有助于评估投资策略是否有望实现目标
  • liquidity-management(wealth-management 插件):流动性储备造成的现金拖累会影响投资组合层面的归因
  • client-review-prep(advisory-practice 插件):归因分析的重点结果是客户回顾会议中的关键讨论内容
  • tax-loss-harvesting(wealth-management 插件):应单独跟踪并归因 TLH 带来的税务 alpha

运行脚本

使用 uv run scripts/performance_attribution.py 运行(PEP 723 标头会自动解析 numpy),也可以先运行 pip install numpy scipy,再使用 python3 scripts/performance_attribution.py。直接运行会打印三个演示:示例 1 中的 Brinson-Fachler 归因、基于已设定随机种子的合成数据进行的 OLS 因子归因,以及 Carino 多期链接。使用 --verify 可断言输出与此技能的示例数字一致(通过时退出代码为 0);使用 --help 可查看类的概览。该文件主要用于作为模块导入(例如,from performance_attribution import BrinsonFachler)。

评论

支持 Markdown