3. 固定收益基础概念

在进入 OpenGamma Strata 的定价与风险计算之前,必须先建立一套统一的“语言”。固定收益的很多计算分歧,并不是模型错误,而是对债券、利率、收益率曲线、计息方式、应计利息、净价与全价、现金流结构的定义理解不一致。本节把这些概念串成一条主线:债券是现金流的载体,利率是折现的尺度,收益率曲线是尺度的集合,计息方式决定现金流的大小与时间,应计利息与净价/全价决定交易与记账口径,现金流结构决定风险暴露的形状。

一、核心原理:债券是一组带条件的现金流

债券的本质不是“一张凭证”,而是一份合约:发行人在约定日期支付利息与本金,投资者以当前价格买入未来现金流。Strata 中几乎所有债券对象最终都会落到 CashFlow 序列上,定价就是把这些现金流按合适的折现因子贴现并加总。

  • 本金(Notional/Principal):到期偿还的基准金额,也是利息计算的基数。
  • 票息(Coupon):按票面利率与计息方式定期支付,可能是固定、浮动或零息。
  • 期限(Tenor/Maturity):从起息日到到期日的时间跨度,决定现金流的数量与分布。
  • 嵌入条款:可赎回、可回售、摊销、递增票息等,会改变现金流的金额或时间。

利率则是“时间价值的价格”。即期利率用于单期折现,远期利率用于连接两个未来时点,收益率曲线把不同期限的利率组织成可插值、可外推的函数。Strata 使用 Curve 与 CurveGroup 管理这些曲线,定价时通过 rates 提供折现与预测。

二、方法流程:从合约到风险数字

在 Strata 中处理一只债券,通常遵循以下流程:

  1. 构建债券合约:确定名义本金、票息、计息日、到期日与计息基准。
  2. 生成现金流:按计息方式展开每期票息与本金,得到带日期的现金流列表。
  3. 准备曲线:构建折现曲线与预测曲线,必要时按币种与日历调整。
  4. 计算净价/全价:先算全价(PV),再减去应计利息得到净价。
  5. 计算风险:对曲线关键点做扰动,得到 PV01、久期、凸性等指标。

下面是一段 Strata 风格的伪代码,展示如何把债券、曲线与定价结果串起来:

// 构建固定票息债券
Bond bond = Bond.builder()
    .currency(USD)
    .notional(1_000_000)
    .coupon(0.04)              // 年票息 4%
    .dayCount(DayCounts.ACT_ACT)
    .startDate(LocalDate.of(2024, 1, 15))
    .maturityDate(LocalDate.of(2029, 1, 15))
    .frequency(Frequency.P6M)
    .build();

// 生成现金流
List<CashFlow> flows = bond.getCashFlows();

// 使用曲线组定价
double dirtyPrice = bond.presentValue(valuationDate, curveGroup);
double accrued    = bond.accruedInterest(valuationDate);
double cleanPrice = dirtyPrice - accrued;
提示:Strata 中“价格”通常指全价(dirty price),净价(clean price)需要显式减去应计利息。交易报价习惯用净价,风险计算则更关注全价对曲线的敏感度。

三、关键概念对照:计息、应计与净价/全价

计息方式决定每期利息金额。常见基准包括 ACT/ACT、ACT/360、30/360 等,不同基准在相同票面利率下会产生不同的实际利息。应计利息是“从上个付息日到结算日”已经产生但尚未支付的利息,它把全价拆成净价与应计两部分。

概念 定义 在 Strata 中的体现 常见误区
票面利率 合约约定的年化利率 Bond 的 coupon 字段 把票面利率当成到期收益率
计息基准 天数与年数的换算规则 DayCounts 枚举 忽略基准导致利息差几天
应计利息 已产生未支付的利息 accruedInterest() 用净价直接做风险敏感度
净价 全价减应计利息 cleanPrice 与全价混用导致报价错误
全价 未来现金流现值之和 presentValue() 忽略结算日与起息日差异
收益率曲线 期限与利率的函数关系 Curve / CurveGroup 用单一 YTM 代替整条曲线

四、案例与场景:一只 5 年期债券的现金流与风险

假设一只 5 年期、票面 4%、每半年付息、ACT/ACT 的美元债券,名义本金 100 万。它的现金流结构是:前 9 期每期支付 2 万票息,第 10 期支付 2 万票息加 100 万本金。若结算日恰好在两个付息日之间,应计利息按实际天数比例计算,净价会低于全价。

当收益率曲线整体上移 1 个基点时,全价下降的金额就是 PV01。由于现金流分布在前端与后端,短端现金流对短端曲线更敏感,长端现金流对长端曲线更敏感。Strata 的 PV01 与 BucketedPV01 正是把这种敏感度按曲线节点拆开,帮助识别风险来源。

注意:零息债券没有票息现金流,只有到期一次还本付息,其久期接近到期期限;而高票息债券的现金流更靠前,久期通常更短。不要用“期限越长风险越大”一概而论。

五、误区复盘与检查清单

  • 误区一:把票面利率当收益率。票面利率决定现金流大小,收益率决定折现尺度,两者只有在平价发行时才相等。
  • 误区二:忽略计息基准。ACT/360 与 30/360 在相同利率下利息不同,跨市场比较时必须统一。
  • 误区三:净价与全价混用。报价用净价,风险与结算用全价,混用会导致盈亏归因错误。
  • 误区四:用单点收益率代替曲线。现金流分布在多个期限,必须用曲线做分期限折现。
  • 误区五:忽略现金流结构。摊销、可赎回等条款会改变现金流时间与金额,进而改变风险暴露。

建议在每次定价前做一次快速检查:币种与日历是否正确、计息基准是否匹配、结算日与起息日是否一致、曲线是否包含足够节点、净价/全价口径是否明确。把这些基础概念固化到 Strata 的对象与参数中,后续的 PV01、久期与情景分析才有可靠的地基。

债券现金流结构与收益率曲线折现 t0 t5 2万 2万 2万 2万 2万 2万 2万 2万 2万 102万 短端利率 长端利率 按曲线折现 票息现金流 本金+末期票息 收益率曲线