有限的期权链信息 python

limited options chains information python

我正在尝试检索超过 800 个代码(例如 AAPL、IBM、JPM)的一些期权链信息(期权链的第一个到期日),但是当我 运行 下面的代码似乎为了只检索 119 个值,我尝试捕获错误,但我仍然没有获得所有值。这可能是什么原因?

import yfinance as yf
import pandas as pd
from datetime import date
from yahoo_fin import stock_info as si
import statistics
import requests,time
from bs4 import BeautifulSoup
import pandas_datareader.data as web


url = "https://finviz.com/screener.ashx?v=111&f=cap_large"
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36','accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'}
tickers = []

while True:
    r = requests.get(url, headers=headers)
    html = BeautifulSoup(r.text, "html.parser")

    for a in html.select('table[bgcolor="#d3d3d3"] a.screener-link-primary'):
        tickers.append(a.text)

    if html.select_one('.tab-link:-soup-contains("next")'):
        url = "https://finviz.com/"+html.select_one('.tab-link:-soup-contains("next")')['href']
    else:
        break
    time.sleep(1)

opts = []

try:
    for i in tickers:
        opts.append(yf.Ticker(i).options[0])
    
except:
    opts.append("Error")

我 运行 你的代码的 scraper 部分得到了一个包含 813 个股票代码的列表,然后直接把这个列表放在脚本中这样我就不用每次调试时都去抓取了。

我还将行 yf.Ticker(i).options[0] 分解为单独的部分,这样我就可以分辨出它的哪一部分产生了异常。通过像这样在一行中放置一堆独立的东西,你会让调试变得更加困难。

你也只是在做 except:,它明确地丢弃了错误消息,这意味着我不知道它是什么。我还让它明确地告诉我哪些代码出错了,如果遇到错误就继续将代码添加到列表中。

您的代码只会循环直到遇到错误,在这种情况下,字符串“Error”将被添加到列表 opts,然后程序就会结束,因为您没有捕捉到循环内的错误,然后继续下一个项目。这意味着它只会在第一个错误处停止,因此您的列表中没有很多项目。

在索引 116 处的项目之后遇到第一个错误,这解释了为什么您的列表中只有该数量的项目。

这是我的测试代码的样子(代码列表被截断):

import yfinance as yf

#I actually have all tickers in the list,
#I just removed a big chunk from the middle for example purposes
tickers = ['A', 'AA', 'AAL', 'AAP', 'ABB', 'ABC', 'ZM', 'ZNH', 'ZS', 'ZTO', 'ZTS']

opts = []

for i in range(len(tickers)):
    ticker = tickers[i]
    try:
        ticker_obj = yf.Ticker(ticker)
    except Exception as e:
        print('cannot create yf.Ticker object', i, ticker, e)
        continue
    try:
        ticker_obj_options = ticker_obj.options
    except Exception as e:
        print('cannot get options', i, ticker, e)
        continue
    try:
        first_option = ticker_obj_options[0]
    except Exception as e:
        print('cannot get first option', i, ticker, e)
        continue
    opts.append(first_option)

print(opts)

这段代码的输出是:

cannot get first option 116 BTO tuple index out of range
cannot get first option 141 CEA tuple index out of range
cannot get first option 286 FERG tuple index out of range
cannot get first option 373 IHG tuple index out of range
cannot get first option 392 IX tuple index out of range
cannot get first option 397 JHX tuple index out of range
cannot get first option 525 NVR tuple index out of range
cannot get first option 600 RELX tuple index out of range
cannot get first option 637 SHG tuple index out of range
cannot get first option 676 SUZ tuple index out of range
cannot get first option 701 TLK tuple index out of range
cannot get first option 767 WBK tuple index out of range

意思是,对于那些股票代码,yf.Ticker 对象有一个空的 options 元组。至于为什么,我不懂金融这样的东西,所以你要找出为什么雅虎金融没有这些符号的选项。也许他们应该在他们的 options 中有项目,也许他们不应该,但我不知道。