7. 双线性插值:在行权价和期限两个维度上进行插值
说实话,做波动率曲面这行,最头疼的就是数据稀疏问题。你拿到的期权报价,行权价就那么几个,期限也就那么几条。但实际交易中,客户要的可能是任意行权价、任意期限的波动率。怎么办?
嗯,双线性插值就是解决这个问题的经典方法。它不复杂,但很实用。我个人习惯把它当作曲面构建的「入门级武器」——虽然不够华丽,但绝对靠谱。
什么是双线性插值?
说白了,就是在两个方向上分别做线性插值。你想想看,我们有一个网格:横轴是行权价,纵轴是期限。每个格子四个角上都有已知的波动率值。现在要算格子内部任意一点的波动率,那就先在一个方向插值,再在另一个方向插值。
举个例子。假设我们已知以下四个点的波动率:
| 行权价 K1 | 行权价 K2 | |
|---|---|---|
| 期限 T1 | σ11 | σ12 |
| 期限 T2 | σ21 | σ22 |
现在要算行权价 K、期限 T 处的波动率 σ(K, T)。
第一步:在期限 T1 上,对行权价做线性插值:
σ(K, T1) = σ11 + (σ12 - σ11) * (K - K1) / (K2 - K1)
第二步:在期限 T2 上,同样对行权价做线性插值:
σ(K, T2) = σ21 + (σ22 - σ21) * (K - K1) / (K2 - K1)
第三步:在行权价 K 处,对期限做线性插值:
σ(K, T) = σ(K, T1) + (σ(K, T2) - σ(K, T1)) * (T - T1) / (T2 - T1)
你看,三步搞定。这就是双线性插值的全部逻辑。
为什么用双线性插值?
我在项目中遇到过不少情况,数据点少得可怜。比如某个外汇期权市场,只有 3 个行权价和 4 个期限。用样条插值?数据不够,容易过拟合。用克里金?太复杂,没必要。双线性插值反而最稳。
它的优点很明显:
- 计算快——就几个乘法和加法,毫秒级出结果
- 保证单调性——不会出现奇怪的震荡
- 容易理解——交易员也能看懂你在干什么
但也要注意它的局限。双线性插值只保证连续,不保证光滑。什么意思?就是曲面在网格边界处会有「折痕」,导数不连续。对于某些需要 Greeks 计算的场景,这可能是个问题。
代码实现
下面是我常用的双线性插值实现。代码不长,但很实用。
import numpy as np
def bilinear_interp(K, T, K_grid, T_grid, sigma_grid):
"""
双线性插值计算波动率
参数:
K: 目标行权价
T: 目标期限
K_grid: 行权价网格点 (1D array)
T_grid: 期限网格点 (1D array)
sigma_grid: 波动率网格 (2D array, shape: len(T_grid) x len(K_grid))
返回:
插值后的波动率
"""
# 找到 K 所在的网格区间
i = np.searchsorted(K_grid, K) - 1
i = max(0, min(i, len(K_grid) - 2))
# 找到 T 所在的网格区间
j = np.searchsorted(T_grid, T) - 1
j = max(0, min(j, len(T_grid) - 2))
# 四个角点的波动率
sigma_11 = sigma_grid[j, i]
sigma_12 = sigma_grid[j, i+1]
sigma_21 = sigma_grid[j+1, i]
sigma_22 = sigma_grid[j+1, i+1]
# 行权价方向插值
if K_grid[i+1] != K_grid[i]:
t_K = (K - K_grid[i]) / (K_grid[i+1] - K_grid[i])
else:
t_K = 0.0
sigma_T1 = sigma_11 + (sigma_12 - sigma_11) * t_K
sigma_T2 = sigma_21 + (sigma_22 - sigma_21) * t_K
# 期限方向插值
if T_grid[j+1] != T_grid[j]:
t_T = (T - T_grid[j]) / (T_grid[j+1] - T_grid[j])
else:
t_T = 0.0
sigma = sigma_T1 + (sigma_T2 - sigma_T1) * t_T
return sigma
双线性插值的知识结构
下面这张图帮你理清双线性插值的核心逻辑:
实际应用中的注意事项
双线性插值虽然简单,但用起来有几个坑要避开。
- 网格要单调——行权价和期限必须严格递增,否则插值结果会乱套
- 避免外推——如果目标点落在网格外面,双线性插值会变成「单线性」甚至「常数」,结果可能不合理
- 数据质量——输入数据如果有异常值,插值结果会直接继承这些异常
📌 我的建议: 双线性插值最适合做「快速原型」和「数据预览」。当你需要快速看一眼曲面长什么样,或者给交易员一个初步报价时,它非常高效。但如果是做正式的风险管理或定价,我建议至少用双三次样条或者更高级的方法。
好了,双线性插值就讲到这里。它不复杂,但很实用。你想想看,很多时候我们不需要花里胡哨的算法,一个简单可靠的方法反而能解决 80% 的问题。下一节我们会聊更光滑的插值方法,但双线性插值这个基础,值得你牢牢掌握。
公众号:蓝海资料掘金营,微信deep3321