You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas期权链DataFrame中按到期日批量填充目标IV值

按到期日分组填充最接近标的价格行权价的隐含波动率到目标列

嘿,我来帮你搞定这个自动填充的问题!你的需求很明确:针对每个到期日系列,找到与标的价格(undPrice)最接近的行权价(strike),把对应的隐含波动率(IV_model)填充到该系列所有行的desired_outcome列中。下面是具体的实现思路和完整代码:

实现思路

  1. 还原数值格式:因为你把IV_model转成了百分比字符串,先转回到浮点数方便后续计算,最后再转回去。
  2. 分组处理:按expiration字段分组,对每个组执行以下操作:
    • 计算每个行权价与标的价格的绝对差值
    • 找到差值最小的行,提取对应的IV_model值
    • 将这个值赋值给该组所有行的desired_outcome
  3. 格式转换:把填充后的desired_outcome再转回百分比字符串格式,和原数据保持一致。

完整代码

import pandas as pd

undPrice = 202
df = pd.DataFrame(columns=['expiration', 'strike', 'undPrice', 'IV_model', 'desired_outcome'])
df['expiration'] = ['2019-08-15', '2019-08-15', '2019-08-15', '2019-08-15', '2019-08-15', '2019-08-15', '2019-08-15', '2019-08-15', '2019-09-15', '2019-09-15', '2019-09-15', '2019-09-15', '2019-09-15', '2019-09-15', '2019-09-15', '2019-09-15', '2019-09-15', '2019-09-15', '2019-10-15', '2019-10-15', '2019-10-15', '2019-10-15', '2019-10-15', '2019-10-15', '2019-10-15', '2019-10-15', '2019-10-15', '2019-10-15']
df['expiration'] = df['expiration'].apply(lambda x: pd.to_datetime(str(x), utc=True,format='%Y-%m-%d'))
df['strike'] = [170, 175, 180, 185, 190, 195, 200, 205, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205]
df['undPrice'] = [undPrice] * len(df)
df['IV_model'] = [0.28, 0.27, 0.26, 0.25, 0.24, 0.23, 0.22, 0.21, 0.35, 0.34, 0.33, 0.32, 0.31, 0.30, 0.29, 0.28, 0.27, 0.26, 0.42, 0.41, 0.40, 0.39, 0.38, 0.37, 0.36, 0.35, 0.34, 0.33]

# 先保留IV_model的原始数值用于计算(避免字符串格式干扰)
df['IV_model_num'] = df['IV_model']

# 定义分组填充的函数
def fill_desired_outcome(group):
    # 计算每个行权价与标的价格的绝对差
    group['abs_diff'] = abs(group['strike'] - group['undPrice'].iloc[0])
    # 找到差值最小的行对应的IV值
    target_iv = group.loc[group['abs_diff'].idxmin(), 'IV_model_num']
    # 填充当前组所有行的desired_outcome
    group['desired_outcome'] = target_iv
    return group

# 按到期日分组应用填充逻辑
df = df.groupby('expiration', group_keys=False).apply(fill_desired_outcome)

# 把IV_model和desired_outcome转成百分比字符串格式
df['IV_model'] = df['IV_model'].map('{:.2%}'.format)
df['desired_outcome'] = df['desired_outcome'].map('{:.2%}'.format)

# 删除临时辅助列
df = df.drop(columns=['IV_model_num', 'abs_diff'])

print(df)

代码说明

  • 辅助列IV_model_num:原代码把IV_model转成了百分比字符串,无法直接参与数值计算,所以先保留原始浮点数值用于后续操作。
  • 分组函数fill_desired_outcome:对每个到期日组,通过计算行权价与标的价格的绝对差,定位到最接近的行权价对应的IV值,再统一填充整组的desired_outcome。
  • 格式还原:最后把IV_model和desired_outcome转回百分比字符串,和你手动填充的结果完全一致。

运行这段代码后,你会得到和手动填充一模一样的desired_outcome列,完全实现自动化处理!

内容的提问来源于stack exchange,提问作者Floris van K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:22:14