Python 在大熊猫中跨稀疏栅格插值
我有一个数字网格(期权波动率,见下图),其中在网格末端的条目很少(即非常稀疏)。我想使用整个网格的数据,即二维插值方法,对该网格进行插值\填充。我看过一些例子(例如),但我不熟悉scipy和numpy API,看起来他们正在做一些与实际插值无关的绘图工作 明确地说,我目前正在将此数据存储在熊猫数据帧中,索引为Python 在大熊猫中跨稀疏栅格插值,python,pandas,numpy,scipy,quantitative-finance,Python,Pandas,Numpy,Scipy,Quantitative Finance,我有一个数字网格(期权波动率,见下图),其中在网格末端的条目很少(即非常稀疏)。我想使用整个网格的数据,即二维插值方法,对该网格进行插值\填充。我看过一些例子(例如),但我不熟悉scipy和numpy API,看起来他们正在做一些与实际插值无关的绘图工作 明确地说,我目前正在将此数据存储在熊猫数据帧中,索引为OPT_EXPIRE_DT和OPT_stroke_PX,并希望最后使用另一个熊猫数据帧,但我可以根据需要转换为其他数据类型 谢谢你的帮助 下面是一个例子。让我们先创建一些缺少值的数据帧: N
OPT_EXPIRE_DT
和OPT_stroke_PX
,并希望最后使用另一个熊猫数据帧,但我可以根据需要转换为其他数据类型
谢谢你的帮助
下面是一个例子。让我们先创建一些缺少值的数据帧:
N = 5
df = pd.DataFrame(np.empty((N, N)))
df.iloc[:] = np.nan
df.iloc[:2] = 1
df.iloc[-2:] = 2
df
输出:
0 1 2 3 4
0 1.0 1.0 1.0 1.0 1.0
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN
4 2.0 2.0 2.0 2.0 2.0
0 1 2 3 4
0 1.00 1.00 1.00 1.00 1.00
1 1.25 1.25 1.25 1.25 1.25
2 1.50 1.50 1.50 1.50 1.50
3 1.75 1.75 1.75 1.75 1.75
4 2.00 2.00 2.00 2.00 2.00
然后我们可以使用griddata
插值:
# create meshgrid
x, y = np.mgrid[0:N, 0:N]
# find indices of non-missing values
ix_notna = df.notna().values
# interpolate
z_interpolated = interpolate.griddata(
(x[ix_notna], y[ix_notna]),
df.values[ix_notna],
(x, y),
method='linear')
# griddata returns numpy array, so we convert it back to DataFrame
df_interpolated = pd.DataFrame(z_interpolated)
df_interpolated
输出:
0 1 2 3 4
0 1.0 1.0 1.0 1.0 1.0
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN
4 2.0 2.0 2.0 2.0 2.0
0 1 2 3 4
0 1.00 1.00 1.00 1.00 1.00
1 1.25 1.25 1.25 1.25 1.25
2 1.50 1.50 1.50 1.50 1.50
3 1.75 1.75 1.75 1.75 1.75
4 2.00 2.00 2.00 2.00 2.00
我们可以目视检查它是否按预期工作:
fig, ax = plt.subplots(1, 2)
ax[0].imshow(df.values)
ax[0].set_title('original')
ax[1].imshow(df_interpolated.values)
ax[1].set_title('interpolated')
输出:
0 1 2 3 4
0 1.0 1.0 1.0 1.0 1.0
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN
4 2.0 2.0 2.0 2.0 2.0
0 1 2 3 4
0 1.00 1.00 1.00 1.00 1.00
1 1.25 1.25 1.25 1.25 1.25
2 1.50 1.50 1.50 1.50 1.50
3 1.75 1.75 1.75 1.75 1.75
4 2.00 2.00 2.00 2.00 2.00
所以,我认为您需要做的是转换成numpy数组并返回,这应该相当简单。下面的代码通过线性插值计算简单数组的NaN项的值。输出数组变成np.array([[1,2,3],[2,3,4],[5,5.5,6]])
嘿,注意填写遗漏的价格或隐含的波动率。有很多方法可以通过期权市场从双方手中转移资金,因此存在一些“奇怪”的合同和价格。我也会在谷歌上搜索微笑和傻笑选项,阅读预期的IV曲线,并在插入数据时考虑这些。请不要发布代码、数据或回溯的图像。将其复制并粘贴为文本,然后将其格式化为代码(选择它并键入
ctrl-k
)。。。你的问题是什么?当您尝试一些您发现的方法时,它们是否产生了看起来正确的解释值?