AgentSkillsCN

bond-spreads

采用Bloomberg YAS平价的固定收益债券利差计算。支持美元/欧元/英镑市场的Z利差、I利差、G利差、ASW(资产互换利差)以及OAS(期权调整利差)。在以下场景中使用此功能:(1) 计算任意债券利差指标;(2) 构建收益率曲线的自举法;(3) 实施利差求解器;(4) 处理后LIBOR曲线(SOFR/SONIA/€STR);(5) 债券定价分析;(6) 比较不同方法下的利差;(7) 实现与Bloomberg YAS等效的功能。

SKILL.md
--- frontmatter
name: bond-spreads
description: "Fixed income bond spread calculations with Bloomberg YAS parity. Implements Z-Spread, I-Spread, G-Spread, ASW (Asset Swap Spread), and OAS (Option-Adjusted Spread) for USD/EUR/GBP markets. Use when: (1) Calculating any bond spread measure, (2) Building yield curve bootstrapping, (3) Implementing spread solvers, (4) Working with post-LIBOR curves (SOFR/SONIA/€STR), (5) Bond pricing analytics, (6) Comparing spreads across methodologies, (7) Implementing Bloomberg YAS-equivalent functionality."

Bond Spread Calculations

Implements five spread methodologies for fixed income analytics with Bloomberg YAS parity and data-source neutral architecture.

Spread Hierarchy (Simplest → Most Complex)

SpreadWhat It MeasuresComplexityCurve Required
G-SpreadYield over interpolated government bondLowGov't par curve
I-SpreadYield over interpolated swap rateLowSwap par curve
Z-SpreadConstant spread over zero curve matching dirty priceMediumZero/spot curve
ASWSpread in swap market termsMediumZero + forward curves
OASSpread after removing embedded option valueHighZero + vol surface

Typical ordering: OAS ≤ Z-Spread ≈ ASW < I-Spread < G-Spread for investment-grade bonds.

Quick Reference

Z-Spread (Primary Spread)

Solve for constant Z where:

code
P_dirty = Σ [CF_i / (1 + (s_i + Z)/2)^(2×t_i)]  // Semi-annual
P_dirty = Σ [CF_i × exp(-(s_i + Z) × t_i)]       // Continuous

Solver: Brent's method (recommended) or Newton-Raphson

  • Tolerance: 1e-8 (~0.001 bp)
  • Bounds: [-0.10, 1.00]
  • Initial guess: YTM - benchmark_YTM

I-Spread / G-Spread

code
I-Spread = Bond_YTM - Interpolated_Swap_Rate(maturity)
G-Spread = Bond_YTM - Interpolated_Govt_Yield(maturity)

ISDA interpolation: Linear on calendar days between bracketing tenors.

ASW (Par-Par Convention - Bloomberg Default)

code
ASW = (PV_bond_coupons_at_swap_rates - P_dirty) / PV01_annuity

OAS

Requires Hull-White model with trinomial tree or Monte Carlo. See references/spreads.md.

Currency Conventions (Post-LIBOR)

CurrencyRFRDay CountSpotFixed Freq
USDSOFRACT/360T+2Annual
EUR€STRACT/360T+2Annual
GBPSONIAACT/365FT+0Annual

Government benchmarks: USD=Treasuries, EUR=Bunds, GBP=Gilts

Implementation Checklist

  1. Curve infrastructure - Zero rates, discount factors, forward rates, par rates with interpolation
  2. Day count functions - ACT/360, ACT/365F, ACT/ACT ICMA, 30/360
  3. Root-finding solver - Brent's method with fallback to bisection
  4. Cash flow generation - Handle settlement, ex-dividend, accrued interest

Detailed References

Rust Data Structures

rust
pub trait YieldCurve {
    fn zero_rate(&self, t: f64) -> f64;
    fn discount_factor(&self, t: f64) -> f64;
    fn forward_rate(&self, t1: f64, t2: f64) -> f64;
    fn par_rate(&self, tenor: f64) -> f64;
}

pub struct BondSpreadResult {
    pub z_spread: Option<f64>,
    pub i_spread: Option<f64>,
    pub g_spread: Option<f64>,
    pub asw_par: Option<f64>,
    pub asw_market: Option<f64>,
    pub oas: Option<f64>,
}

pub enum DayCount { Act360, Act365Fixed, ActActICMA, ActActISDA, Thirty360, ThirtyE360 }
pub enum Compounding { Simple, Annual, SemiAnnual, Quarterly, Continuous }
pub enum InterpolationMethod { Linear, LogLinear, CubicSpline, MonotoneConvex }

Validation Targets

  • Roundtrip: Input swap rates must reprice exactly (< 1e-10)
  • Bloomberg parity: Z-spread within ±0.05 bp, OAS within ±0.5 bp
  • Arbitrage-free: Positive forwards, monotonic discount factors