You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Scipy.interpolate.splev外推补全Python/Pandas缺失数据的问题

解决期权波动率外推问题:splev用法与interp1d失效原因

我来帮你搞定这个期权MidVol外推的问题——先讲怎么用scipy.splev实现你要的外推计算,再聊聊为啥interp1d的结果会偏差这么大。

一、用splev实现缺失行权价的MidVol外推

你已经用splrep生成了样条拟合参数,接下来直接把缺失的行权价传给splev就行,关键是要设置ext=0来开启外推功能。给你完整的代码示例:

import scipy.interpolate as spi

# 假设你的原始数据存储在df中,索引是行权价,'MidVol'是波动率列
# 生成B样条拟合参数(k=5是5阶样条,s=6是平滑因子,可根据数据调整)
ipo = spi.splrep(df.index, df['MidVol'], k=5, s=6)

# 定义需要补全的缺失行权价
missing_strikes = [20000, 22000, 24000, 26000, 28000, 30000]

# 执行外推计算:ext=0表示使用样条端点的导数进行外推
extrapolated_midvols = spi.splev(missing_strikes, ipo, ext=0)

# 转成你需要的列表格式
extrap_list = extrapolated_midvols.tolist()

这里要注意几个细节:

  • splrepk参数是样条的阶数,5阶样条比三次样条(k=3)更平滑,适合拟合波动率曲面的趋势;
  • s是平滑因子,数值越大,拟合曲线越平滑(会牺牲一点对原始数据的贴合度),你可以根据实际数据调整这个值,找到平衡;
  • ext=0是外推的核心设置:它告诉splev,当输入的行权价超出原始数据范围时,用样条在边界处的导数向外延伸计算,而不是默认返回边界的MidVol值(ext=1)或者直接报错(ext=2)。

二、为什么interp1d的外推结果不符合预期?

你用interp1d(kind='cubic', fill_value='extrapolate')得到的结果偏差大,主要有三个原因:

1. 三次样条的外推天生不可控

三次样条插值的核心是让曲线在相邻点之间平滑过渡,但它的外推逻辑只是简单延伸边界处的曲线形态。如果你的原始数据最高行权价远低于30000,三次样条在边界处的导数可能完全不符合波动率曲面在极端行权价的实际趋势,导致外推值快速发散或者偏离合理范围。

2. 没有考虑波动率曲面的固有特性

期权的波动率曲面(波动率微笑/偏斜)在深度虚值或实值行权价处,通常会呈现出缓慢上升或稳定的趋势,而interp1d的外推是纯数学层面的,没有结合金融数据的规律。它不会约束外推值在合理的波动率范围内,自然会出现离谱的结果。

3. 缺乏平滑约束

interp1d的三次插值是“过拟合”式的——它会严格穿过所有原始数据点,当原始数据有噪声时,边界处的导数会被噪声影响,进一步放大外推的偏差。而你用的splreps平滑因子,可以过滤噪声,让拟合曲线更贴合波动率的整体趋势。

如果想要更专业的波动率拟合,还可以考虑专门的金融模型(比如SABR模型),不过用带平滑约束的B样条已经能解决大部分常规外推需求了。

内容的提问来源于stack exchange,提问作者top bantz

火山引擎 最新活动