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

基于ib_insync与盈透数据重建过期期权定价的方案可行性问询

方案可行性与优化建议

你的方案具备基础可行性,核心思路是通过标的历史数据+隐含波动率,借助Black-Scholes模型还原过期期权定价,方向是成立的,但在细节严谨性和回测准确性上还有不少可优化空间,以下是具体分析:

一、遗漏的关键要点

  • 隐含波动率的匹配偏差:你使用标的整体的OPTION_IMPLIED_VOLATILITY数据,但实际中不同行权价、到期日的期权存在波动率微笑/偏斜,盈透返回的标的隐含波动率通常是平值期权的数值,用它计算非平值期权价格会产生误差。
  • 固定无风险利率的不合理性:你直接用0.03作为无风险利率,但不同时间段的市场利率波动极大(比如2022年加息周期利率远高于3%),固定利率会导致定价偏差,需匹配对应时段的无风险利率(如美国短期国债收益率)。
  • 到期时间精度问题:期权到期时间通常是到期日美国东部时间16:00,而非自然日0点,你的hourCount函数直接按日期相减,会导致剩余时间计算误差,尤其是到期前的关键时段。
  • 数据对齐风险:historicalData和impVolData可能存在时间索引错位(比如某时段有股价数据但无隐含波动率),直接按列计算会出现NaN或错误匹配。
  • 股息因素缺失:BSM默认假设无股息,但AAPL等标的有分红,未加入股息率会导致看涨期权定价偏高。

二、更优实现方式建议

1. 优化Black-Scholes模型,加入股息率

import numpy as np
from scipy.stats import norm

def black_scholes(stock_price, strike_price, vol, time, rate, div_rate=0, right="Call"):
    d1 = (np.log(stock_price/strike_price) + (rate - div_rate + 0.5 * vol**2) * time) / (vol * np.sqrt(time))
    d2 = d1 - vol * np.sqrt(time)
    if right.upper()[0] == "C":
        price = stock_price * np.exp(-div_rate * time) * norm.cdf(d1) - strike_price * np.exp(-rate * time) * norm.cdf(d2)
    else:
        price = strike_price * np.exp(-rate * time) * norm.cdf(-d2) - stock_price * np.exp(-div_rate * time) * norm.cdf(-d1)
    return round(price, 2)

2. 直接获取目标期权合约的隐含波动率

避免用标的整体波动率,精准获取对应行权价、到期日的期权隐含波动率:

from ib_insync import Option

def get_option_imp_vol(symbol, expiry, strike, right):
    contract = Option(symbol, expiry, strike, right, 'SMART', 'USD')
    ib.qualifyContracts(contract)
    bars = ib.reqHistoricalData(
        contract,
        endDateTime='',
        durationStr='2 Y',
        barSizeSetting='1 Hour',
        whatToShow='OPTION_IMPLIED_VOLATILITY',
        useRTH=True,
        formatDate=1
    )
    ib.sleep(5)
    df = util.df(bars)
    df.set_index('date', inplace=True)
    return df

3. 精准计算剩余到期时间

import datetime as dt
import pandas as pd

def calculate_maturity(df, expiry_date_str):
    # 期权到期时间为美国东部时间16:00,转换为UTC(盈透数据通常为UTC时区)
    expiry_dt = dt.datetime.strptime(expiry_date_str, "%Y-%m-%d") + dt.timedelta(hours=16)
    expiry_dt = expiry_dt.astimezone(dt.timezone.utc)
    # 确保数据索引为UTC时间
    df.index = pd.to_datetime(df.index).tz_localize('UTC')
    # 计算剩余时间(单位:年)
    df['maturity'] = (expiry_dt - df.index).total_seconds() / (365 * 24 * 3600)
    # 过滤到期后的数据
    df = df[df['maturity'] > 0]
    return df

4. 数据对齐与动态无风险利率

  • 数据对齐:用pd.merge按时间索引合并股价、隐含波动率数据,只保留共同时段的有效数据:
    merged_data = pd.merge(historicalData, impVolData, left_index=True, right_index=True, suffixes=('_stock', '_vol'))
    
  • 无风险利率:通过yfinance等工具获取对应时段的美国短期国债收益率,匹配到每个时间点的计算中。

5. 回测验证

计算出的期权价格可与盈透提供的过期期权历史成交价(通过reqHistoricalData获取期权合约的ADJUSTED_LAST数据)对比,验证模型准确性。

内容的提问来源于stack exchange,提问作者Pascal Ob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:20:35