如何用Python获取到期前30天特定行权价的期权历史价格
解决yfinance获取指定到期日/行权价的期权历史价格问题
原代码核心问题
yf.download不支持直接获取期权历史数据,也没有expiration_date参数,该接口仅用于股票/指数行情下载- 行权参数
strike="at-the-money"是无效值,必须传入具体行权价数值(比如140) - 函数调用与定义不匹配:调用时未传递
strike和option_type参数,导致筛选逻辑失效
正确实现方案
要获取历史日期T时,距离到期日还有30天、行权价为X的期权价格,需分两步:
- 找到到期日为
T+30天的对应行权价期权合约 - 获取该合约在日期T的历史行情数据
以下是可运行的代码实现:
import yfinance as yf import datetime as dt def get_option_price_at_t_minus_30(ticker_symbol, target_strike, target_date, option_type="call"): # 计算到期日:目标日期 + 30天 expiration_date = target_date + dt.timedelta(days=30) exp_str = expiration_date.strftime("%Y-%m-%d") # 初始化标的Ticker对象 ticker = yf.Ticker(ticker_symbol) # 获取指定到期日的期权链 try: opt_chain = ticker.option_chain(exp_str) except Exception as e: print(f"获取到期日{exp_str}的期权链失败: {str(e)}") return None # 筛选对应类型的期权合约 contracts = opt_chain.calls if option_type == "call" else opt_chain.puts target_contract = contracts[contracts["strike"] == target_strike] if target_contract.empty: print(f"到期日{exp_str}无行权价{target_strike}的{option_type}期权") return None # 获取目标合约的历史数据(取target_date当天的行情) contract_symbol = target_contract["contractSymbol"].iloc[0] contract_ticker = yf.Ticker(contract_symbol) hist_data = contract_ticker.history(start=target_date, end=target_date + dt.timedelta(days=1)) if hist_data.empty: print(f"合约{contract_symbol}在{target_date.strftime('%Y-%m-%d')}无历史数据") return None # 返回当天收盘价(回测中常用收盘价作为当日价格) return hist_data["Close"].iloc[0] # 示例调用 if __name__ == "__main__": # 目标日期:我们要获取期权价格的那天 target_date = dt.datetime(2023, 9, 20) # 获取AAPL在该日期、距离到期日30天、行权价140的看涨期权价格 option_price = get_option_price_at_t_minus_30("AAPL", 140, target_date, "call") print(f"期权价格: {option_price}")
注意事项
- yfinance的期权链数据仅能获取当前及未来的到期合约,较久的历史到期合约可能无法获取(受限于雅虎财经数据源)
- 若回测需要大量历史期权数据,建议考虑专业期权数据服务
- 历史合约行情数据可能存在缺失,需做好异常处理逻辑
内容的提问来源于stack exchange,提问作者Hello
相关产品推荐
相关产品推荐

