第四章:互换合约定价——从利率到信用的进阶之路
说实话,互换合约在衍生品里是个很有意思的存在。它不像期权那样有复杂的非线性特征,也不像期货那样标准化到让人乏味。互换的本质,说白了就是「交换现金流」——你付固定,我收浮动;你付美元,我付欧元。就这么简单。
但我得提醒你,简单不等于容易。我在做利率互换定价的时候,曾经因为一个浮息端的重置日期搞错了,导致整个估值表对不上账。嗯,从那以后我对互换的现金流日期就格外敏感。
4.1 互换合约的定义与特征
互换合约,英文叫Swap,是交易双方约定在未来一段时间内,交换一系列现金流的协议。最常见的两种:利率互换和货币互换。
核心特征其实就三条:
- 场外交易:不像期货在交易所,互换是OTC的,条款可以定制
- 双边合约:只涉及两个对手方,信用风险是实打实的
- 现金流交换:不是一次性交割,而是按约定频率多次交换
你想想看,为什么企业要做互换?无非是管理风险或者降低成本。比如一家公司发了浮动利率债,但担心利率上升,那就做一个收浮动付固定的互换,把浮动风险锁死。
关键点:互换的定价核心在于「净现值=0」——签订时双方都不需要支付费用,因为两边的现金流现值相等。
4.2 利率互换定价
利率互换(IRS)是最基础的互换品种。固定端和浮动端,两边的估值逻辑完全不同。
4.2.1 固定端估值
固定端其实很简单。你有一系列固定的现金流,比如每半年付一次,利率3%。那估值就是把这些现金流用合适的折现因子折回来。
公式长这样:
PV_fixed = Σ (C × τ_i × DF_i)
其中C是固定利率,τ_i是计息期限,DF_i是折现因子。
我个人习惯用OIS曲线来折现,因为现在主流的抵押品都是美元,OIS更能反映无风险利率。以前用Libor折现的时代已经过去了。
4.2.2 浮动端估值
浮动端就有意思了。浮动利率在重置日之前是未知的,但我们可以用远期利率来预测。
核心逻辑:
PV_float = Σ (F_i × τ_i × DF_i)
F_i是从当前到下一个重置日的远期利率。
这里有个坑,我踩过。浮动端的现金流其实可以简化——在重置日,浮动端的现值等于面值。为什么呢?因为浮动利率债券在付息日之后会回归面值。所以浮动端的估值可以简化为:
PV_float = (1 + F_1 × τ_1) × DF_1 - DF_n
嗯,这个技巧能省不少计算量。
实战技巧:我在做IRS估值时,通常先算固定端,再算浮动端,最后相减得到互换价值。如果价值为正,说明你持有的是赚钱的头寸。
4.2.3 完整定价示例
来看一个Python实现。假设我们有一个5年期利率互换,固定利率2.5%,每半年交换一次。
import numpy as np
def irs_pricing(notional, fixed_rate, tenors, discount_factors, forward_rates):
"""
利率互换定价
notional: 名义本金
fixed_rate: 固定利率
tenors: 计息期限数组(年化)
discount_factors: 折现因子数组
forward_rates: 远期利率数组
"""
# 固定端
pv_fixed = sum(fixed_rate * t * df for t, df in zip(tenors, discount_factors))
# 浮动端
pv_float = sum(f * t * df for f, t, df in zip(forward_rates, tenors, discount_factors))
swap_value = notional * (pv_float - pv_fixed)
return swap_value
# 示例数据
notional = 1000000
fixed_rate = 0.025
tenors = [0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]
discount_factors = [0.99, 0.98, 0.97, 0.96, 0.95, 0.94, 0.93, 0.92, 0.91, 0.90]
forward_rates = [0.02, 0.022, 0.024, 0.025, 0.026, 0.027, 0.028, 0.029, 0.03, 0.031]
value = irs_pricing(notional, fixed_rate, tenors, discount_factors, forward_rates)
print(f"互换价值: ${value:.2f}")
注意:实际生产中,折现因子和远期利率要从市场曲线中插值得到,不能像我这样硬编码。我曾经因为插值方法选错,导致估值偏差了0.5个基点——听起来不大,但乘以几亿的本金,就是几十万的差异。
4.3 货币互换定价
货币互换比利率互换多了一层——汇率风险。你不仅要考虑两边的利率,还要考虑本金的交换。
货币互换的结构:
- 期初交换本金(比如美元换欧元)
- 期间交换利息(美元付固定,欧元付浮动)
- 期末换回本金
定价逻辑:把两边的现金流分别用各自的折现曲线折现,然后按即期汇率换算成同一货币。
def ccs_pricing(notional_usd, notional_eur, fx_rate,
usd_fixed_rate, eur_float_rates,
tenors, usd_df, eur_df):
"""
货币互换定价(美元收固定,欧元付浮动)
"""
# 美元固定端
pv_usd = sum(usd_fixed_rate * t * df for t, df in zip(tenors, usd_df))
pv_usd += 1 * usd_df[-1] # 期末本金
# 欧元浮动端
pv_eur = sum(f * t * df for f, t, df in zip(eur_float_rates, tenors, eur_df))
pv_eur += 1 * eur_df[-1] # 期末本金
# 换算成美元
pv_eur_usd = pv_eur * fx_rate
swap_value = notional_usd * pv_usd - notional_eur * pv_eur_usd
return swap_value
我个人觉得货币互换最麻烦的是汇率处理。你想想看,如果汇率波动大,即使利率算得再准,价值也可能大幅偏离。我在做跨境互换时,通常会在模型里加一个汇率情景分析。
4.4 信用违约互换(CDS)简介
CDS本质上是一种保险——你付保费,我承担违约风险。定价逻辑和利率互换有点像,但多了一个「违约概率」的维度。
CDS的现金流:
- 买方定期支付保费(固定端)
- 如果参考实体违约,卖方支付赔偿(或有端)
定价公式:
PV_premium = Σ (S × τ_i × DF_i × SurvivalProb_i)
PV_contingent = (1 - Recovery) × Σ (DF_i × (SurvivalProb_{i-1} - SurvivalProb_i))
其中S是保费率,Recovery是回收率,SurvivalProb是生存概率。
核心思想:CDS定价就是让保费端的现值等于赔偿端的现值。这个等式解出来的S就是「公平保费」。
我记得刚做CDS时,最头疼的是违约概率的估计。市场上有CDS报价,但那是隐含的违约概率,和实际违约概率是两码事。后来我学会了用「风险中性定价」的思路——用市场数据反推,而不是自己预测违约概率。
知识体系总览
下面这张图是我自己整理的互换定价知识框架,你可以对照着看:
这张图把三种互换的核心要素都列出来了。你看,IRS的核心是折现因子和远期利率,CCS多了汇率,CDS则引入了违约概率。但万变不离其宗——都是现金流折现的逻辑。
我的建议:刚开始学互换定价,先吃透IRS。IRS搞明白了,CCS和CDS就是加料版本。我在带新人时,都是让他们先手算一个简单的IRS,再用代码验证。纸上得来终觉浅,绝知此事要躬行。
公众号:蓝海资料掘金营,微信deep3321