从盈透证券获取过期期权合约定价



我希望重建过期期权定价与ib_insync库和Interactive Brokers可用数据的帮助。因为IB提供OPTION_IMPLIED_VOLATILITY作为reqHistoricalData的输出,所以我正在考虑以这种方式进行:

  • 函数从Black-Scholes模型推断到期期权合约价格:
def black_scholes(stock_price,strike_price,vol,time,rate,right="Call"):
d1 = (np.log(stock_price/strike_price) + (rate + 0.5* vol**2)*time)/(vol*np.sqrt(time))
d2 = (np.log(stock_price/strike_price) + (rate - 0.5* vol**2)*time)/(vol*np.sqrt(time))
nd1 = norm.cdf(d1)
nd2 = norm.cdf(d2)
n_d1 = norm.cdf(-1*d1)
n_d2 = norm.cdf(-1*d2)
if right.capitalize()[0] == "C":
return round((stock_price*nd1) - (strike_price*np.exp(-1*rate*time)*nd2),2)
else:
return round((strike_price*np.exp(-1*rate*time)*n_d2) - (stock_price*n_d1),2)
  • 使用合约假设我在代码的其他地方打开了一个有效的ib连接来检索数据
def get_stock_history(symbol,whattoshow_string):
contract = Stock(symbol, 'SMART', 'USD')
ib.reqMarketDataType(2)
bars = ib.reqHistoricalData(
contract,
endDateTime='',
durationStr='2 Y',
barSizeSetting='1 Hour',
whatToShow=whattoshow_string,
useRTH=True,
formatDate=1)
ib.sleep(5)
df = util.df(bars)
df['date'] = pd.to_datetime(df['date'] ).dt.date
return df
  • 我也有一个方便的函数来计算成熟度在BSM基于每小时的时间衰减:
def hourCount(DF, expiry):
DF["maturity"] = ((dt.datetime.strptime(expiry, "%Y-%m-%d") - pd.to_datetime(DF.index))/pd.Timedelta(hours=1))/(365*24)
  • 我可以得到如下数据假设我有一个截止日期和罢工从其他地方我希望回测:
strike = 148
expiration_date = '2022-12-02'
symbol = 'AAPL'
historicalData = get_stock_history(symbol,'ADJUSTED_LAST')
impVolData = get_stock_history(symbol,'OPTION_IMPLIED_VOLATILITY')

option_price_call = pd.DataFrame(columns=["open","high","low","close"])
option_price_put = pd.DataFrame(columns=["open","high","low","close"])
hourCount(historicalData, expiration_date)
hourCount(impVolData, expiration_date)
historicalData = historicalData [(historicalData["maturity"] > 0)]
impVolData = impVolData[(impVolData["maturity"] > 0)]
for column in ["open","high","low","close"]:
option_price_call[column] = black_scholes(historicalData[column], strike, impVolData[column], historicalData["maturity"], 0.03,right="Call")
option_price_put[column] = black_scholes(historicalData[column], strike, impVolData[column], historicalData["maturity"], 0.03,right="Put")

这是重建/回测到期期权合约定价的好方法吗?还是我在这里忽略了什么?也许有更聪明的方法来完成这个操作?

提前感谢您的建议!(y)


不幸的是,IBKR并没有按照其API文档中关于历史数据限制的说明保留过期的选项数据。

从:https://interactivebrokers.github.io/tws-api/historical_limitations.html

不可用历史数据

API不提供加权移动平均线或布林带等研究和指标。VWAP可用。列出的其他历史数据限制是所有交易平台的一般限制:

  • 尺寸小于等于30秒的大于6个月的棒材
  • 过期期货数据,从期货开始算起超过两年过期日期。
  • 过期期权、FOPs、权证和结构性产品。
  • 期权、FOPs、权证和结构化的日内(EOD)数据产品。
  • 过期远期价差数据
  • 不再交易的证券数据。
  • 组合的本地历史数据。中不存储历史数据IB数据库单独为组合。在TWS中组合历史数据或者API是来自腿的数据之和。
  • 转移到新交易所的证券的历史数据将通常在搬家之前无法获得。

最新更新