首页 > 解决方案 > Python yfinance - 为多个代码和每个代码的所有到期时间拉取期权链

问题描述

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

错误示例:如果我按原样运行代码,它似乎运行良好,我得到了 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

它不必发生在列表中的第一个代码上,也不确定是什么触发了错误,但通常代码列表越长,与到期日期的不一致就越多。- 任何帮助表示赞赏。

标签: pythonloopsnestedscopingyfinance

解决方案


我找不到您的代码有任何问题 - 似乎来自该端点的数据正在发生变化,这就是您从每个请求中获得不同结果的原因。

不过,我可以提供一个替代解决方案(它更快,更容易实现)。这是一个名为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)

推荐阅读