我正在尝试使用 yfinance 从股票代码列表中提取每只股票的期权链以及每个股票代码的所有可用到期日。
所以我的代码应该循环每个股票代码,获取到期日期,循环每个日期,获取期权链,然后跳转到下一个股票代码并重复。
下面的代码有时工作正常,但并非总是如此,特别是当我添加代码时,似乎变量在每个循环上重新分配? - 例如,当到达 RKT 时,RKT 的到期日期与其实际到期日期完全不同。它可能发生在第一个代码上或接近尾声,或随机发生,但总会有一些代码到期时间错误,尤其是随着列表的增长。
这是我第一次尝试,并尝试使用类似的示例进行调试,但没有任何效果,或者我没有正确应用它们。
import yfinance as yf
import pandas as pd
yf.pdr_override()
stocklist =['DIS','GM','HD','BABA','AAPL','APPS','PLTR','EXPR','MARA','BABA','SPCE','GME','RIOT','BB','RKT','HD','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
En 错误示例:如果我按原样运行代码,它看起来运行良好,我得到了 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','BABA','SPCE','GME','RIOT','BB','RKT','HD','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', 'APPS', 'BABA', 'BB', 'DIS', 'EXPR', 'GM', 'GME', 'HD', 'MARA',
'NIO', 'PLTR', 'RIOT', 'RKT', 'SPCE'],
dtype='object', name='symbol')
df.shape
(22360, 14)
上次我检查 yfinance 输出是按字母顺序排列的,请尝试对您的股票列表进行排序,然后再次运行它,看看添加 TSLA 后是否有任何变化。