如何在Pandas期权链DataFrame中按到期日批量填充目标IV值
按到期日分组填充最接近标的价格行权价的隐含波动率到目标列
嘿,我来帮你搞定这个自动填充的问题!你的需求很明确:针对每个到期日系列,找到与标的价格(undPrice)最接近的行权价(strike),把对应的隐含波动率(IV_model)填充到该系列所有行的desired_outcome列中。下面是具体的实现思路和完整代码:
实现思路
- 还原数值格式:因为你把
IV_model转成了百分比字符串,先转回到浮点数方便后续计算,最后再转回去。 - 分组处理:按
expiration字段分组,对每个组执行以下操作:- 计算每个行权价与标的价格的绝对差值
- 找到差值最小的行,提取对应的
IV_model值 - 将这个值赋值给该组所有行的
desired_outcome
- 格式转换:把填充后的
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
相关产品推荐
相关产品推荐

