QuantLib教程:如何用3M期货构建收益率曲线(支持三次样条)
用3M Euribor期货构建三次样条收益率曲线的Python实现
以下是基于你已有日期向量(对应3M Euribor期货的远期起息日)和期货价格向量的实现步骤,核心是先将期货价格转换为隐含远期利率,再用三次样条拟合生成连续收益率曲线:
1. 依赖库导入
需要用到数据处理和插值工具:
import pandas as pd import numpy as np from scipy.interpolate import CubicSpline from datetime import date from dateutil.relativedelta import relativedelta
2. 数据预处理
假设你已有的dates是期货对应的远期起息日(3M Euribor期货通常对应季度交割日:3/6/9/12月的第三个周三),futures_prices是对应期货的报价:
2.1 转换隐含远期利率
3M Euribor期货的隐含3个月远期利率计算公式为:
# 转换为小数形式的收益率(如期货价格99.5对应0.5%的年化利率) forward_rates = (100 - np.array(futures_prices)) / 100
2.2 计算远期期限(年化)
以估值日为基准,计算每个远期利率对应的到期日(起息日+3个月),再转换为年化期限(采用Euribor的Actual/360日计数惯例):
# 定义估值日,可替换为你实际的计算日期 valuation_date = date.today() # 计算每个期货的远期到期日(起息日+3个月) maturity_dates = [d + relativedelta(months=3) for d in dates] # 转换为年化期限(天/360) tenors = np.array([(maturity - valuation_date).days / 360 for maturity in maturity_dates])
2.3 数据校验
确保期限和收益率按时间顺序排列(样条插值要求x值单调递增):
# 按期限排序 sorted_indices = np.argsort(tenors) sorted_tenors = tenors[sorted_indices] sorted_rates = forward_rates[sorted_indices]
3. 三次样条拟合收益率曲线
使用自然三次样条(边界二阶导数为0,符合收益率曲线两端平缓的特性)进行拟合:
# 初始化三次样条模型,bc_type='natural'表示自然样条 cs = CubicSpline(sorted_tenors, sorted_rates, bc_type='natural')
4. 生成连续收益率曲线
你可以生成任意期限的收益率,比如从0到最长期限的连续序列:
# 生成需要插值的期限点(例如0到5年,步长0.1年) target_tenors = np.linspace(0, sorted_tenors[-1], 50) # 插值得到对应收益率 interpolated_rates = cs(target_tenors) # 转换为DataFrame方便查看 yield_curve = pd.DataFrame({ 'Tenor (Years)': target_tenors, 'Yield (%)': interpolated_rates * 100 })
关键注意事项
- 日计数惯例:Euribor采用Actual/360,所以计算年化期限时用天数除以360,而非365
- 边界条件:如果你的曲线需要更贴合短端或长端的市场特性,可调整
bc_type参数(如bc_type='clamped'指定两端一阶导数) - 数据质量:确保期货价格无异常值,日期序列无重复或乱序情况
内容的提问来源于stack exchange,提问作者Afonso Batista
相关产品推荐
相关产品推荐

