Python yfinance - 拉取多个代码的期权链和每个代码的所有到期日

Python yfinance - Pulling option chains for multiple tickers and all expirations per ticker

我正在尝试使用 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)