Colab构建0DTE期权隐含波动率曲面遇DataFrame属性错误
0DTE期权隐含波动率曲面开发中的AttributeError问题
问题背景
在Colab环境开发0DTE期权交易用的Python隐含波动率曲面,已成功导入yfinance、pandas、numpy,但运行代码时触发AttributeError错误。
报错信息
AttributeError Traceback (most recent call last) <ipython-input-31-494e77cf0df4> in <module> ----> 1 options = option_chains("ES") 2 3 puts = [options["optionType"] == "put"] 4 5 # print the expirations 1 frames /usr/local/lib/python3.7/dist-packages/pandas/core/generic.py in __getattr__(self, name) 5485 ): 5486 return self[name] -> 5487 return object.__getattribute__(self, name) 5488 5489 def __setattr__(self, name: str, value) -> None: AttributeError: 'DataFrame' object has no attribute 'expiration'
相关代码
options = option_chains("SPY") puts = [options["optionType"] == "put"] # print the expirations set(puts.expiration) # select an expiration to plot puts_at_expiry = puts[puts["expiration"] == "2022-12-2 23:59:59"] # filter out low vols filtered_puts_at_expiry = puts_at_expiry[puts_at_expiry.impliedVolatility >= 0.001] # set the strike as the index so pandas plots nicely filtered_puts_at_expiry[["strike","impliedVolatility"]].set_index("strike").plot(title="Implied Volatility Skew", figsize=(7, 4))
已执行操作
- 安装yfinance:
!pip install yfinance - 导入pandas_datareader:
from pandas_datareader import data as pdr
问题原因及修复方案
核心问题1:筛选语法错误
代码中puts = [options["optionType"] == "put"]使用了方括号[],得到的是包含布尔Series的列表,而非筛选后的DataFrame。列表没有expiration属性,因此调用puts.expiration会触发错误。
修复:
将筛选代码改为布尔索引直接筛选DataFrame:
puts = options[options["optionType"] == "put"]
核心问题2:yfinance期权链调用方式错误
yfinance中没有直接的option_chains()全局函数,需要通过Ticker对象调用相关方法:
import yfinance as yf # 实例化Ticker对象 ticker = yf.Ticker("SPY") # 获取所有到期日列表 exp_dates = ticker.options # 遍历到期日获取对应期权链 for exp in exp_dates: opt_chain = ticker.option_chain(exp) # 获取put期权数据 puts = opt_chain.puts # 后续处理逻辑 set(puts["expiration"]) # ...其他代码
修正后的完整示例代码
import yfinance as yf import pandas as pd import numpy as np # 获取SPY期权数据 ticker = yf.Ticker("SPY") # 选择目标到期日(可从ticker.options中查看所有到期日) target_exp = "2022-12-02" opt_chain = ticker.option_chain(target_exp) puts = opt_chain.puts # 打印到期日集合 print(set(puts["expiration"])) # 筛选指定到期日的put期权(如果需要精确匹配时间) puts_at_expiry = puts[puts["expiration"] == "2022-12-02 23:59:59"] # 过滤低隐含波动率数据 filtered_puts_at_expiry = puts_at_expiry[puts_at_expiry["impliedVolatility"] >= 0.001] # 绘制隐含波动率偏度图 filtered_puts_at_expiry[["strike", "impliedVolatility"]].set_index("strike").plot(title="Implied Volatility Skew", figsize=(7, 4))
内容的提问来源于stack exchange,提问作者JW Greene
相关产品推荐
相关产品推荐

