Python中基于现货价格按到期日获取最接近的ask合约键值对
问题描述
给定以下期权卖盘数据:
ask = { 'C-BTC-23500-020123': {'best_ask': '5.2'}, 'C-BTC-23550-020123': {'best_ask': '5.1'}, 'C-BTC-21000-030123': {'best_ask': '5.22'}, 'C-BTC-21200-030123': {'best_ask': '5.23'}, 'C-BTC-23000-060123': {'best_ask': '5.25'}, 'C-BTC-24000-060123': {'best_ask': '5.26'}, 'C-BTC-23100-130123': {'best_ask': '5.27'}, 'C-BTC-23150-130123': {'best_ask': '5.28'}, 'C-BTC-22000-200123': {'best_ask': '5.205'}, 'C-BTC-24000-090223': {'best_ask': '5.256'}, 'C-BTC-14500-270123': {'best_ask': '228.66'} }
现货价格 spot_price = 23031,到期日列表:
dates = ['020123', '030123', '060123', '130123', '200123', '270123', '240223']
需求:对每个到期日,找出ask中对应到期日、行权价最接近spot_price的键值对。
示例:针对到期日020123,对应的合约为:
'C-BTC-23500-020123': {'best_ask': '5.2'}, 'C-BTC-23550-020123': {'best_ask': '5.1'}
其中行权价最接近23031的是C-BTC-23500-020123: {'best_ask': '5.2'}。
之前尝试用round方法实现,但因不同到期日的取整规则不同导致失效,需要可行的Python解决方案。
解决方案
核心思路是按到期日分组合约,再对每组合约计算行权价与现货价的差值绝对值,筛选出差值最小的合约,无需依赖统一取整规则,直接比较数值距离。
代码实现如下:
spot_price = 23031 dates = ['020123', '030123', '060123', '130123', '200123', '270123', '240223'] ask = { 'C-BTC-23500-020123': {'best_ask': '5.2'}, 'C-BTC-23550-020123': {'best_ask': '5.1'}, 'C-BTC-21000-030123': {'best_ask': '5.22'}, 'C-BTC-21200-030123': {'best_ask': '5.23'}, 'C-BTC-23000-060123': {'best_ask': '5.25'}, 'C-BTC-24000-060123': {'best_ask': '5.26'}, 'C-BTC-23100-130123': {'best_ask': '5.27'}, 'C-BTC-23150-130123': {'best_ask': '5.28'}, 'C-BTC-22000-200123': {'best_ask': '5.205'}, 'C-BTC-24000-090223': {'best_ask': '5.256'}, 'C-BTC-14500-270123': {'best_ask': '228.66'} } # 1. 按到期日分组合约 contracts_by_date = {} for contract_key, data in ask.items(): # 拆分合约键,提取到期日和行权价 _, _, strike_str, expiry_date = contract_key.split('-') strike_price = int(strike_str) # 初始化分组 if expiry_date not in contracts_by_date: contracts_by_date[expiry_date] = [] contracts_by_date[expiry_date].append((contract_key, strike_price, data)) # 2. 遍历每个目标到期日,找最接近的合约 result = {} for date in dates: if date not in contracts_by_date: result[date] = None # 无对应合约时标记为None continue # 计算每个合约行权价与现货价的差值绝对值,按差值排序 sorted_contracts = sorted( contracts_by_date[date], key=lambda x: abs(x[1] - spot_price) ) # 取差值最小的第一个合约 closest_contract_key, _, closest_data = sorted_contracts[0] result[date] = {closest_contract_key: closest_data} # 打印结果 for date, contract in result.items(): print(f"到期日 {date} 的最接近合约:") print(contract)
代码说明
- 分组合约:拆分每个合约的键,提取到期日和行权价,把同到期日的合约归为一组,方便后续处理。
- 筛选最接近合约:对每组合约,用
abs(strike_price - spot_price)计算行权价与现货价的距离,按距离从小到大排序后取第一个元素,就是最接近的合约。 - 兼容无合约情况:如果某个到期日在
ask中没有对应合约,结果会标记为None,避免报错。
运行结果示例:
到期日 020123 的最接近合约: {'C-BTC-23500-020123': {'best_ask': '5.2'}} 到期日 030123 的最接近合约: {'C-BTC-21200-030123': {'best_ask': '5.23'}} 到期日 060123 的最接近合约: {'C-BTC-23000-060123': {'best_ask': '5.25'}} 到期日 130123 的最接近合约: {'C-BTC-23100-130123': {'best_ask': '5.27'}} 到期日 200123 的最接近合约: {'C-BTC-22000-200123': {'best_ask': '5.205'}} 到期日 270123 的最接近合约: {'C-BTC-14500-270123': {'best_ask': '228.66'}} 到期日 240223 的最接近合约: None
内容的提问来源于stack exchange,提问作者Madan
相关产品推荐
相关产品推荐

