Python:yfinance 无法处理异常

问题描述 投票:0回答:1

如果我不清楚,请原谅我,因为我是新来的。

尝试使用以下代码从雅虎财经提取数据和股票行情。从 yfinance 提取时,我想通过添加到名为“stocks_not_downloaded”的空列表来跟踪每个无法下载的股票(无论是由于股票被摘牌还是其他原因)。为此,我使用了 try / except 块,以便如果股票下载失败,它将附加到stocks_not_downloaded 列表中。

运行代码时,股票会下载,当出现异常时,它会显示“1 下载失败: ['Ticker']:异常('%ticker%:找不到时区,符号可能已被除名')”

但是

A)它无法打印(“无法获取数据:”,股票代码),我已经将其设置为...... B)当运行stocks_not_downloaded_list时,它返回“[]” - 一个空列表

尽管输出了上述消息,但似乎无法将错误识别为正常异常。我读到 yfinance 可能有一些奇怪的地方,但我无法弄清楚。

我将发布代码和输出。预先感谢。

我正在使用这个数据集(https://onedrive.live.com/?authkey=%21ANM0er8uwPV%2DmRg&id=3B0309A579EBD636%2113144&cid=3B0309A579EBD636)-不确定它的草图是否链接到onedrive,但如果你想要其他格式。

代码

#Imports
import numpy as np
import pandas as pd
from pandas_datareader import data as web
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
%matplotlib inline

import datetime as dt
import mplfinance as mpf

import time

import os
from os import listdir
from os.path import isfile, join
import yfinance as yf
yf.pdr_override()
stocks_not_downloaded = []
missing_stocks = []


#Saves Stock Data to CSV
def save_to_csv_from_yahoo(folder, ticker, syear, smonth, sday, eyear, emonth, eday):
        start = dt.datetime(syear, smonth, sday)
        end = dt.datetime(eyear, emonth, eday)
         
        try:
            print("Get Data for :", ticker)
            df = web.DataReader(ticker, start, end)["Adj Close"]
            time.sleep(10)
            df.to_csv(folder + ticker + ".csv")
        
        except Exception as ex:
            stocks_not_downloaded.append(ticker)
            print("Could not Get Data for:", ticker)

#Returns a Named Column Data from CSV
def get_column_from_csv(file, col_name):
        try:
            df = pd.read_csv(file)
        except FileNotFoundError:
            print("File Does Not Exist")
        else:
            return df[col_name]
    
#Defines tickers and folder
tickers = get_column_from_csv("C:/Users/15189/Documents/Python_For_Finance/Wilshire-5000-Stocks.csv","Ticker")
    
folder = "/Users/15189/Documents/Python_For_Finance/Stock_List/"
    
for x in range(20):
        save_to_csv_from_yahoo(folder, tickers[x], 2017, 1, 1, 2021, 8, 19)
    
print("Finished")
stocks_not_downloaded

如你所见,我正在使用:

        try:
            print("Get Data for :", ticker)
            df = web.DataReader(ticker, start, end)["Adj Close"]
            time.sleep(10)
            df.to_csv(folder + ticker + ".csv")
        
        except Exception as ex:
            stocks_not_downloaded.append(ticker)
            print("Could not Get Data for:", ticker)

但是跑步时:

for x in range(20):
        save_to_csv_from_yahoo(folder, tickers[x], 2017, 1, 1, 2021, 8, 19)
    
print("Finished")
stocks_not_downloaded

我得到以下输出,末尾带有“[]” - 未下载的股票的空列表,并且没有“无法获取数据:”消息。我真的很感激任何见解

输出:

Get Data for : A
[*********************100%%**********************]  1 of 1 completed
Get Data for : AA
[*********************100%%**********************]  1 of 1 completed
Get Data for : AAL
[*********************100%%**********************]  1 of 1 completed
Get Data for : AAME
[*********************100%%**********************]  1 of 1 completed
Get Data for : AAN
[*********************100%%**********************]  1 of 1 completed
Get Data for : AAOI
[*********************100%%**********************]  1 of 1 completed
Get Data for : AAON
[*********************100%%**********************]  1 of 1 completed
Get Data for : AAP
[*********************100%%**********************]  1 of 1 completed
Get Data for : AAPL
[*********************100%%**********************]  1 of 1 completed
Get Data for : AAT
[*********************100%%**********************]  1 of 1 completed
Get Data for : AAWW
[*********************100%%**********************]  1 of 1 completed

1 Failed download:
['AAWW']: Exception('%ticker%: No timezone found, symbol may be delisted')

Get Data for : AAXN
[*********************100%%**********************]  1 of 1 completed

1 Failed download:
['AAXN']: Exception('%ticker%: No timezone found, symbol may be delisted')

Get Data for : ABBV
[*********************100%%**********************]  1 of 1 completed
Get Data for : ABC
[*********************100%%**********************]  1 of 1 completed
Get Data for : ABCB
[*********************100%%**********************]  1 of 1 completed
Get Data for : ABEO
[*********************100%%**********************]  1 of 1 completed
Get Data for : ABG
[*********************100%%**********************]  1 of 1 completed
Get Data for : ABIO
[*********************100%%**********************]  1 of 1 completed
Get Data for : ABM
[*********************100%%**********************]  1 of 1 completed
Get Data for : ABMD
[*********************100%%**********************]  1 of 1 completed
Finished
[]
python pandas numpy datareader yfinance
1个回答
0
投票

不确定为什么没有发现错误。我在本地尝试过,也遇到同样的问题。似乎是 pandas_datareader 处理引发错误的方式。

您可以做的一个选择是检查 Adj Close 是否为空:

try:
    print("Get Data for :", ticker)
    df = web.DataReader(ticker, start, end)["Adj Close"]
    if df.empty:
        print("No Data for :", ticker)
        stocks_not_downloaded.append(ticker)
        pass
    time.sleep(10)
    df.to_csv(folder + ticker + ".csv")

看起来 pandas-datareader 也内置了一个雅虎阅读器。可能值得一试:https://pandas-datareader.readthedocs.io/en/latest/readers/yahoo.html

© www.soinside.com 2019 - 2024. All rights reserved.