问题描述
我正在尝试使用 yfinance 从股票代码列表中提取每只股票的期权链以及每个股票代码的所有可用到期日。
所以我的代码应该遍历每个股票代码,获取到期日期,遍历每个日期,获取选项链,然后跳转到下一个股票代码并重复。
下面的代码有时可以正常工作,但并非总是如此,尤其是当我添加代码时,似乎每个循环都会重新分配变量? - 例如,当它到达 RKT 时,RKT 的到期日期与其实际到期日期完全不同。它可能发生在第一个股票代码或最后,或随机发生,但总会有一些股票代码的到期时间错误,尤其是随着列表的增长。
这是我第一次尝试并尝试使用类似的示例进行调试,但没有任何效果或我没有正确应用它们。
import yfinance as yf
import pandas as pd
yf.pdr_override()
stocklist =['dis','GM','HD','BABA','AAPL','APPS','pltR','EXPR','Mara','SPCE','GME','RIOT','BB','RKT','NIO']
optionsX = pd.DataFrame()
for x in stocklist:
print(x)
tk = yf.Ticker(x)
exps = tk.options #expiration dates
try:
for e in exps:
print(e)
opt = tk.option_chain(e)
opt = pd.DataFrame().append(opt.calls).append(opt.puts)
opt['expirationDate'] = e
opt['Symbol'] = x
optionsX = optionsX.append(opt,ignore_index=True)
except:
pass
optionsX
错误示例:如果我按原样运行代码,它似乎运行良好,我为 dis 得到了这个:
dis
2021-03-19
2021-03-26
2021-04-01
2021-04-09
2021-04-16
2021-04-23
...
但是如果我尝试在列表中添加另一个代码,例如 TSLA,我现在会为 dis 获取此信息:
dis
2021-03-19
2021-04-16
2021-06-18
2022-01-21
2022-06-17
2023-01-20
列表中的第一个股票代码不一定会发生这种情况,也不确定是什么触发了错误,但通常股票代码列表越长,与到期日期的不一致就越多。 - 任何帮助表示赞赏。
解决方法
我没有发现您的代码有任何问题 - 来自该端点的数据似乎正在发生变化,这就是您从每个请求中获得不同结果的原因。
不过我可以提供一个替代解决方案(它更快,更容易实现)。这是一个名为 yahooquery 的包。免责声明:我是该包的作者。
from yahooquery import Ticker
stocklist =['DIS','GM','HD','BABA','AAPL','APPS','PLTR','EXPR','MARA','SPCE','GME','RIOT','BB','RKT','NIO']
t = Ticker(stocklist,asynchronous=True)
df = t.option_chain
df.columns
Index(['contractSymbol','strike','currency','lastPrice','change','percentChange','volume','openInterest','bid','ask','contractSize','lastTradeDate','impliedVolatility','inTheMoney'],dtype='object')
df.index.unique(level=0)
Index(['AAPL','DIS','NIO','SPCE'],dtype='object',name='symbol')
df.shape
(22360,14)