如何使用yahoo_fin获取所有平值(ATM)期权合约?
用yahoo_fin识别平值(ATM)期权合约的方法
方法一:通过行权价与标的股价匹配
标的股价很少会刚好等于期权行权价,所以我们可以找最接近当前标的价格的行权价对应的期权合约,具体步骤如下:
- 获取标的当前实时价格
- 拉取看涨/看跌期权的全部合约数据
- 计算每个行权价与当前股价的差值绝对值,筛选出差值最小的行权价对应的合约(同一行权价可能对应多个到期日,也可以指定到期日缩小范围)
代码示例:
from yahoo_fin import options as ops from yahoo_fin import stock_info as si import pandas as pd # 标的代码 ticker = "aapl" # 获取当前标的实时价格 current_price = si.get_live_price(ticker) # 获取所有看涨期权合约(可传入expiration_date指定到期日) calls_df = ops.get_calls(ticker) # 获取所有看跌期权合约 puts_df = ops.get_puts(ticker) # 筛选看涨平值期权:找与当前价格差值最小的行权价 calls_df["price_diff"] = abs(calls_df["Strike"] - current_price) atm_call_row = calls_df[calls_df["price_diff"] == calls_df["price_diff"].min()] # 筛选看跌平值期权 puts_df["price_diff"] = abs(puts_df["Strike"] - current_price) atm_put_row = puts_df[puts_df["price_diff"] == puts_df["price_diff"].min()] # 合并平值看涨和看跌期权 atm_options = pd.concat([atm_call_row, atm_put_row]) print(atm_options)
方法二:通过Delta指标筛选
平值期权的核心特性是Delta值:看涨期权Delta接近0.5,看跌期权Delta接近-0.5。我们可以设置合理阈值(比如0.45-0.55区间的看涨期权、-0.55到-0.45区间的看跌期权)来筛选近似平值的合约。
代码示例:
from yahoo_fin import options as ops import pandas as pd ticker = "aapl" # 获取期权合约数据 calls_df = ops.get_calls(ticker) puts_df = ops.get_puts(ticker) # 转换Delta列为数值类型(yahoo_fin返回的Delta可能带正负号前缀) calls_df["Delta"] = calls_df["Delta"].astype(float) puts_df["Delta"] = puts_df["Delta"].astype(float) # 筛选看涨平值期权 atm_calls = calls_df[(calls_df["Delta"] >= 0.45) & (calls_df["Delta"] <= 0.55)] # 筛选看跌平值期权 atm_puts = puts_df[(puts_df["Delta"] >= -0.55) & (puts_df["Delta"] <= -0.45)] # 合并结果 atm_options = pd.concat([atm_calls, atm_puts]) print(atm_options)
可行性说明
这两种方法都完全可行:
- 行权价法逻辑简单、计算快,适合快速定位「名义上的平值期权」,但如果标的价格波动快,需要重新获取价格校准
- Delta法更贴合期权的实际对冲属性,能筛选出真正具备平值期权特性的合约,但要注意yahoo_fin返回的Delta值基于当前市场数据,可能受流动性、到期时间等因素影响,阈值可根据需求灵活调整
内容的提问来源于stack exchange,提问作者Angel Ortiz
相关产品推荐
相关产品推荐

