主题切换
12.3 利率互换与互换期权
利率互换(IRS)的定价基础
利率互换(Interest Rate Swap, IRS)是最重要、流动性最好的利率衍生品。一个标准的固定-浮动利率互换涉及两方:
- 固定端:支付(或收取)固定利率
乘以名义本金 - 浮动端:收取(或支付)浮动利率(通常参考 LIBOR/SOFR/Shibor)
名词解释:互换利率(Swap Rate)
使互换的固定端现值等于浮动端现值的固定利率,即互换的"公平价格"。互换利率是构建收益率曲线的重要输入。
从定价角度看,互换可以分解为一个固定利率债券的多头和一个浮动利率债券的空头(或相反):
$$V_{\text{swap}} = V_{\text{fixed}} - V_{\text{float}}$$
浮动利率债券在每个支付日重置后价值就等于面值(如果浮动利率等于折现率),因此浮动端的现值近似等于名义本金:
此处有展示代码展开 ▼
python
import numpy as np
def irs_pricing(notional, fixed_rate, float_spread, payment_dates,
discount_factors, float_rates, is_payer=True):
"""
利率互换定价
notional: 名义本金
fixed_rate: 固定端利率
float_spread: 浮动端利差
payment_dates: 支付日列表(年化)
discount_factors: 对应的折现因子
float_rates: 各期的浮动参考利率(远期利率)
is_payer: True=支付固定收取浮动; False=收取固定支付浮动
"""
dt = np.diff([0] + list(payment_dates))
# 固定端现值
fixed_pv = 0
for i, (t, df) in enumerate(zip(payment_dates, discount_factors)):
fixed_pv += notional * fixed_rate * dt[i] * df
# 浮动端现值
float_pv = 0
for i, (t, df, fwd) in enumerate(zip(payment_dates, discount_factors, float_rates)):
float_pv += notional * (fwd + float_spread) * dt[i] * df
sign = -1 if is_payer else 1
swap_value = sign * (float_pv - fixed_pv)
return swap_value, fixed_pv, float_pv点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `irs_pricing`(利率互换定价)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
互换曲线构建
互换曲线构建的核心是bootstrap:从市场报价的互换利率出发,逐期提取隐含的折现因子和远期利率。
此处有展示代码展开 ▼
python
def build_swap_curve(market_swap_rates, maturities, interpolation='linear'):
"""
从市场互换利率构建互换曲线
market_swap_rates: 不同期限的互换利率报价
maturities: 对应的期限(年)
返回:折现因子曲线
"""
n = len(maturities)
discount_factors = np.zeros(n)
for i in range(n):
T = maturities[i]
swap_rate = market_swap_rates[i]
dt = 0.5 # 假设半年付息一次
n_periods = int(T / dt)
# 对已知的折现因子进行插值
if i == 0:
# 第一个点:假设只有一个支付期
discount_factors[i] = 1.0 / (1.0 + swap_rate * T)
else:
# bootstrap: 从市场互换利率反推
pv_fixed_known = 0
for j in range(1, n_periods):
t_j = j * dt
# 插值得到该期限的折现因子
if t_j < maturities[i-1]:
df_j = np.interp(t_j, maturities[:i], discount_factors[:i])
else:
df_j = discount_factors[i-1]
pv_fixed_known += swap_rate * dt * df_j
# 最后一期现金流的折现因子
discount_factors[i] = (1.0 - swap_rate * dt * pv_fixed_known) \
/ (1.0 + swap_rate * dt)
return maturities, discount_factors点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `build_swap_curve`(从市场互换利率构建互换曲线)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
互换期权(Swaption)
互换期权给予持有者在未来某个日期以约定固定利率进入一个利率互换的权利。主要有两种:
- 支付方互换期权(Payer Swaption):权利方有权支付固定利率、收取浮动利率,相当于对利率的看涨期权
- 收取方互换期权(Receiver Swaption):权利方有权收取固定利率、支付浮动利率,相当于对利率的看跌期权
Black's Model 定价
互换期权的标准定价模型是 Black (1976) 模型,将远期互换利率视为对数正态分布:
$$\begin{aligned} C_{\text{payer}} &= A \cdot \left[ F \cdot \Phi(d_1) - K \cdot \Phi(d_2) \right] \\ C_{\text{receiver}} &= A \cdot \left[ K \cdot \Phi(-d_2) - F \cdot \Phi(-d_1) \right] \end{aligned}$$
其中:
$$d_{1,2} = \frac{\ln(F/K) \pm \frac{1}{2}\sigma^2 T}{\sigma\sqrt{T}}$$
$$A = \sum_{i=1}^n \tau_i \cdot P(0, T_i)$$
此处有展示代码展开 ▼
python
from scipy.stats import norm
def black_swaption(forward_swap_rate, strike, annuity, T, sigma, swaption_type='payer'):
"""
Black's model 互换期权定价
forward_swap_rate: 远期互换利率 F
strike: 行权利率 K
annuity: 年金因子 A(现值基点)
T: 期权到期时间(年)
sigma: 互换利率的波动率
"""
if T <= 0:
payoff = max(0, forward_swap_rate - strike) if swaption_type == 'payer' \
else max(0, strike - forward_swap_rate)
return payoff * annuity
d1 = (np.log(forward_swap_rate / strike) + 0.5 * sigma**2 * T) / (sigma * np.sqrt(T))
d2 = d1 - sigma * np.sqrt(T)
if swaption_type == 'payer':
price = annuity * (forward_swap_rate * norm.cdf(d1) - strike * norm.cdf(d2))
else:
price = annuity * (strike * norm.cdf(-d2) - forward_swap_rate * norm.cdf(-d1))
return price
# 示例:1Y-into-5Y Payer Swaption
forward_swap = 0.035 # 1年后开始的5年期远期互换利率
strike = 0.035 # ATM
annuity = 4.5 # 5年期年金的现值基点(近似)
T_option = 1.0 # 1年后期权到期
vol = 0.20 # 20% 波动率
price = black_swaption(forward_swap, strike, annuity, T_option, vol, 'payer')
print(f"Payer Swaption 价格 (bps): {price * 10000:.2f}")点击展开可浏览运行结果
Payer Swaption 价格 (bps): 125.46
收益率曲线风险的全面对冲
单纯对收益率曲线的平行移动进行对冲(如使用久期)是远远不够的。一个完整的利率风险对冲框架应包括:
对冲的三层架构
- 第一层 — DV01 对冲:消除方向性利率暴露,是所有对冲策略的基础
- 第二层 — 曲线斜率对冲:使用不同期限的互换或国债期货,对冲收益率曲线变陡或变平的风险
- 第三层 — 波动率对冲:通过互换期权管理波动率维度的风险(Vega 风险)
此处有展示代码展开 ▼
python
def comprehensive_hedge(portfolio, hedge_instruments, scenarios):
"""
全面利率风险对冲
portfolio: 被对冲组合的希腊字母 {DV01_bucket: value}
hedge_instruments: 可用的对冲工具 [{'name': ..., 'dv01': ..., 'vega': ...}]
scenarios: 考虑的风险情景
"""
# 构建希腊字母矩阵
n_hedge = len(hedge_instruments)
n_risks = len(scenarios)
# 风险矩阵:每行是一种对冲工具对不同情景的敏感度
risk_matrix = np.zeros((n_risks, n_hedge))
portfolio_risk = np.zeros(n_risks)
for j, inst in enumerate(hedge_instruments):
for i, scenario in enumerate(scenarios):
risk_matrix[i, j] = scenario['impact'](inst)
for i, scenario in enumerate(scenarios):
portfolio_risk[i] = -scenario['impact_on_portfolio'](portfolio)
# 最小二乘求解对冲比例
weights = np.linalg.lstsq(risk_matrix, portfolio_risk, rcond=None)[0]
return dict(zip([h['name'] for h in hedge_instruments], weights))点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `comprehensive_hedge`(全面利率风险对冲)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
实战要点:在实际交易中,利率互换的定价还需要考虑多种技术细节:计息基准(如Actual/360 vs 30/360)、支付频率的不匹配、交叉货币互换的基差、以及LIBOR向RFR(Risk-Free Rate,如SOFR)转型带来的曲线构建方式变化。特别是后LIBOR时代,OIS曲线和LIBOR曲线的双曲线构建已成为历史,新的单一曲线方法论正在成为市场标准。