2. 利率产品基础
在OpenGamma Strata中做风险计量,第一步不是写代码,而是把产品的现金流结构想清楚。Strata的定价与风险引擎本质上是在时间轴上对一组已知或可预测的现金流进行折现、敏感度计算和情景重估。固定利率债券、浮动利率债券、利率互换、远期利率协议、利率期货与利率期权,这六类工具虽然形态不同,但都可以还原为"谁在什么时间向谁支付多少金额"的现金流序列。理解这一点,后续的Curve、Pricing、Sensitivity模块才有落脚点。
核心原理:现金流三要素与折现框架
任何利率产品的现金流都可以用三个要素描述:时间(支付日与计息区间)、金额(本金、利率、计息天数)、方向(收或付)。Strata用Payment、NotionalExchange、ResolvedSwapLeg等对象承载这些信息。定价时,引擎将每笔现金流乘以对应期限的折现因子,再按方向求和,得到现值。
固定利率债券的现金流是确定的:票息按固定利率与计息期计算,到期还本。浮动利率债券的票息则依赖每个重置日的参考利率(如SOFR、EURIBOR),未来票息在定价时用远期曲线估计。利率互换可以看作固定债券与浮动债券的组合,净额结算后只剩利差现金流。远期利率协议是单期互换的极端简化,只在结算日支付一次利差。利率期货是交易所标准化的远期合约,每日盯市产生保证金现金流。利率期权则是在未来某时点选择是否执行的权利,其现金流具有条件性。
方法流程:从产品定义到现金流解析
在Strata中,处理任何利率产品的标准流程如下:
- 构建产品对象:使用
FixedCouponBond、Swap、Fra等类描述合约条款,包括名义本金、期限、利率、计息基准。 - 解析为现金流:调用
resolve()方法,将产品展开为ResolvedSwapLeg或Payment列表,每个对象包含支付日、金额、方向。 - 关联市场数据:将现金流映射到对应的折现曲线与远期曲线,Strata通过
RatesProvider统一管理。 - 计算现值与风险:使用
PresentValue、PV01、BucketedSensitivity等计算器得到结果。
以一笔5年期固定利率债券为例,Strata解析后会得到10笔半年付票息和1笔到期本金。若改为浮动利率债券,票息金额在解析时仍为占位符,实际金额在定价时由远期曲线动态填充。利率互换则解析为两条腿:固定腿与浮动腿,净额结算后风险敞口集中在利差变动。
案例场景:用Strata解析一笔互换
假设我们有一笔3年期、名义本金1000万、固定利率3%、季度付息的利率互换。在Strata中可这样构建并解析:
SwapLeg fixedLeg = SwapLeg.builder()
.payReceive(PayReceive.PAY)
.accrualFrequency(Frequency.P3M)
.accrualBusinessDayAdjustment(BusinessDayAdjustment.of(MODIFIED_FOLLOWING, HOLIDAYS))
.build();
Swap swap = Swap.of(fixedLeg, floatingLeg);
ResolvedSwap resolved = swap.resolve(REF_DATA);
for (ResolvedSwapLeg leg : resolved.getLegs()) {
for (SwapPaymentEvent event : leg.getPaymentEvents()) {
System.out.println(event.getPaymentDate() + " " + event.getAmount());
}
}
输出会显示每季度的固定票息与浮动票息(浮动部分为估计值),以及到期日的名义本金交换(若设置)。通过观察这些现金流,可以快速判断产品的久期集中在哪里、哪些期限的曲线变动影响最大。
resolve()是连接产品定义与风险计算的关键步骤。未解析的产品对象无法直接参与定价,必须先展开为现金流。
误区与复盘:常见理解偏差
| 常见误区 | 正确理解 | Strata中的体现 |
|---|---|---|
| 浮动利率债券的未来票息是未知的,无法定价 | 用远期曲线估计未来参考利率,仍可定价 | RatesProvider提供远期曲线,解析时动态填充 |
| 利率互换的现金流等于固定债券减浮动债券 | 净额结算后只剩利差,但风险敞口仍需分腿分析 | ResolvedSwapLeg保留两条腿,敏感度可分别计算 |
| 远期利率协议与利率期货的现金流结构相同 | FRA在结算日一次性支付,期货每日盯市 | Strata中FRA用Fra,期货用Future,现金流模式不同 |
| 利率期权的现金流是线性的 | 期权具有条件性,现金流取决于行权判断 | Strata用Swaption、CapFloor建模,需波动率曲面 |
DayCount对象精确处理。
复盘时建议养成习惯:每构建一个产品,先用resolve()打印全部现金流,核对支付日、金额、方向是否符合合约条款。这一步能提前发现计息基准、节假日调整、名义本金交换等配置错误,避免后续风险计算结果出现系统性偏差。六类产品的现金流结构虽然形态各异,但都遵循"时间—金额—方向"的统一框架,掌握这一框架后,Strata的定价与风险模块就只是在这个框架上叠加折现与敏感度计算。