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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:05:20