如果我不清楚,请原谅我,因为我是新来的。
尝试使用以下代码从雅虎财经提取数据和股票行情。从 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
[]
不确定为什么没有发现错误。我在本地尝试过,也遇到同样的问题。似乎是 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