2. 利率基础

在利率情景冲击与曲线压力测试中,所有后续的估值、风险计量与情景推演,都建立在一套统一的利率语言之上。这套语言的核心,就是收益率曲线及其派生的即期利率、远期利率、贴现因子与关键期限点。理解它们之间的换算关系,是避免“曲线错位”“贴现口径不一致”等基础性错误的前提。

一、核心原理:一条曲线,四种表达

收益率曲线描述的是“利率—期限”之间的对应关系。但在实际业务中,同一条曲线会以不同形式出现,它们本质上是同一信息的等价表达:

  • 即期利率(Spot Rate):从今天起算、期限为 t 的零息利率,记为 z(t)。它是贴现的“直接依据”。
  • 远期利率(Forward Rate):隐含在即期曲线中、未来某段区间的利率,记为 f(t₁, t₂)。它反映市场对未来利率路径的预期。
  • 贴现因子(Discount Factor):未来 1 元在今天的价值,记为 DF(t)。它与即期利率互为倒数关系。
  • 关键期限点(Key Tenors):曲线上的锚点,如 1M、3M、6M、1Y、2Y、5Y、10Y、30Y,是插值与冲击的最小单位。

四者关系可用一句话概括:即期利率决定贴现因子,贴现因子隐含远期利率,关键期限点定义曲线的骨架。压力测试中,冲击通常施加在关键期限点上,再通过插值传导到整条曲线。

核心恒等式:DF(t) = exp(−z(t) × t);远期利率 f(t₁,t₂) = [z(t₂)×t₂ − z(t₁)×t₁] / (t₂ − t₁)。连续复利与单利口径不同,换算时必须统一。

二、方法流程:从市场报价到可冲击曲线

构建一条可用于压力测试的曲线,通常遵循以下流程:

  1. 采集市场报价:货币市场利率、利率互换报价、国债收益率等。
  2. 确定关键期限点:根据币种与业务需要,选取 1M 至 30Y 的锚点。
  3. 自举法(Bootstrap)求解即期利率:从短端开始,逐段剥离,得到各期限即期利率。
  4. 计算贴现因子与远期利率:作为估值与情景分析的输入。
  5. 插值生成连续曲线:常用线性、对数线性、三次样条等。
  6. 施加情景冲击:在关键期限点上加减基点,再重新插值。

下面是一段简化的 Python 示例,展示即期利率、贴现因子与远期利率的换算:

import numpy as np

# 关键期限点(年)与即期利率(连续复利)
tenors = np.array([0.25, 0.5, 1.0, 2.0, 5.0, 10.0])
spot = np.array([0.0210, 0.0225, 0.0240, 0.0260, 0.0290, 0.0310])

# 贴现因子
df = np.exp(-spot * tenors)

# 1Y 到 2Y 的远期利率
f_1y_2y = (spot[3]*tenors[3] - spot[2]*tenors[2]) / (tenors[3] - tenors[2])

print("贴现因子:", np.round(df, 6))
print("1Y-2Y 远期利率:", round(f_1y_2y, 6))

运行结果会显示各期限贴现因子与远期利率。注意:若市场报价为单利,需先转换为连续复利,否则贴现因子会出现系统性偏差。

三、案例/场景:一次曲线冲击的传导

假设某组合持有 5 年期固定利率债券,当前 5Y 即期利率为 2.90%。压力情景为“曲线陡峭化”:短端不变,5Y 上行 50bp,10Y 上行 80bp。冲击后:

关键期限 冲击前即期利率 冲击幅度 冲击后即期利率 冲击后贴现因子
1Y2.40%0 bp2.40%0.97629
2Y2.60%+20 bp2.80%0.94557
5Y2.90%+50 bp3.40%0.84366
10Y3.10%+80 bp3.90%0.67692

可以看到,冲击后 5Y 贴现因子从约 0.865 降至 0.844,债券价格相应下跌。若只冲击收益率而不重算贴现因子,估值结果会失真。这就是“曲线冲击必须落到贴现因子”的原因。

收益率曲线:冲击前 vs 冲击后 期限 利率 1Y 2Y 5Y 10Y 冲击前 冲击后 +50bp +80bp

四、误区/复盘:常见陷阱与检查清单

误区一:混用单利与连续复利。 市场报价常为单利,而估值模型多用连续复利。不换算直接代入,短端误差可达数 bp,长端放大更明显。
误区二:只冲击收益率,不重算贴现因子。 压力测试的最终落点是估值,贴现因子必须随曲线同步更新。
复盘清单:
  • 关键期限点是否覆盖组合的主要现金流期限?
  • 插值方法是否与风险系统一致?
  • 远期利率是否出现负值或异常跳变?
  • 冲击后曲线是否仍满足无套利关系?
  • 贴现因子与即期利率的口径是否统一?