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

Это не обязательно должно происходить с первым тикером в списке, и не совсем понятно, что вызывает ошибку, но обычно чем длиннее список тикеров, тем больше несоответствий с датами истечения срока действия. - Любая помощь приветствуется.


person jgavarrete    schedule 17.03.2021    source источник
comment
Очевидно, это не весь код, поскольку вы не показываете, что такое tk.options. Это действительно объект Tk?   -  person user1558604    schedule 18.03.2021
comment
(точка) options является частью библиотеки yfinance и извлекает даты истечения срока действия опционов по тикеру. Например, учитывая tk = yf.Ticker ('AAPL') - ›tk.options предоставит мне кортеж с датами истечения срока действия опционов Apple.   -  person jgavarrete    schedule 18.03.2021
comment
Ой, извини. Пропустил. Не уверен, в чем проблема   -  person user1558604    schedule 18.03.2021


Ответы (1)


Я не могу найти ничего плохого в вашем коде - похоже, что данные с этой конечной точки меняются, поэтому вы получаете разные результаты от каждого запроса.

Однако я могу предложить альтернативное решение (оно немного быстрее и намного проще в реализации). Это пакет под названием 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)
person putty    schedule 19.03.2021