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₁)。连续复利与单利口径不同,换算时必须统一。
二、方法流程:从市场报价到可冲击曲线
构建一条可用于压力测试的曲线,通常遵循以下流程:
- 采集市场报价:货币市场利率、利率互换报价、国债收益率等。
- 确定关键期限点:根据币种与业务需要,选取 1M 至 30Y 的锚点。
- 自举法(Bootstrap)求解即期利率:从短端开始,逐段剥离,得到各期限即期利率。
- 计算贴现因子与远期利率:作为估值与情景分析的输入。
- 插值生成连续曲线:常用线性、对数线性、三次样条等。
- 施加情景冲击:在关键期限点上加减基点,再重新插值。
下面是一段简化的 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。冲击后:
| 关键期限 | 冲击前即期利率 | 冲击幅度 | 冲击后即期利率 | 冲击后贴现因子 |
|---|---|---|---|---|
| 1Y | 2.40% | 0 bp | 2.40% | 0.97629 |
| 2Y | 2.60% | +20 bp | 2.80% | 0.94557 |
| 5Y | 2.90% | +50 bp | 3.40% | 0.84366 |
| 10Y | 3.10% | +80 bp | 3.90% | 0.67692 |
可以看到,冲击后 5Y 贴现因子从约 0.865 降至 0.844,债券价格相应下跌。若只冲击收益率而不重算贴现因子,估值结果会失真。这就是“曲线冲击必须落到贴现因子”的原因。
四、误区/复盘:常见陷阱与检查清单
误区一:混用单利与连续复利。 市场报价常为单利,而估值模型多用连续复利。不换算直接代入,短端误差可达数 bp,长端放大更明显。
误区二:只冲击收益率,不重算贴现因子。 压力测试的最终落点是估值,贴现因子必须随曲线同步更新。
复盘清单:
- 关键期限点是否覆盖组合的主要现金流期限?
- 插值方法是否与风险系统一致?
- 远期利率是否出现负值或异常跳变?
- 冲击后曲线是否仍满足无套利关系?
- 贴现因子与即期利率的口径是否统一?