使用 time.sleep 避免 yfinance 的限制

问题描述

这里的大新手。我正在使用 pandas_datareader 和 yfinance 创建一个包含许多股票的 excel 工作簿,但最近我收到越来越多的“无法读取符号”错误,因为这些股票确实仍然存在。通常我可以再次运行代码,它会工作,但问题似乎慢慢变得更糟。我听说它暗示可能 yahoo 不喜欢一次收到那么多请求,也许 time.sleep 方法可能是解决方案。

但是我已经足够初学者了,我只是不知道如何编写该代码。下面是我的代码;我想要完全相同的东西,只是延迟,我猜在每只股票之间。

import pandas_datareader as web
from datetime import datetime
import pandas as pd

start = datetime(2020,9,1)
end = datetime(2021,12,31)
stock = [ 'ACHC','ACIW',[many more stocks listed here cut for simplicity],'TECH','SAM']
 


df = web.DataReader(stock,'yahoo',start,end)
df.to_excel(f'excelfilename.xlsx')

提前致谢

解决方法

我也试过运行你的代码。我不知道为什么,但它给了我一个错误,所以我安装了雅虎财经库并修复了代码。我创建了一个空数据框并将每只股票添加到其中。

import pandas_datareader.data as web
from datetime import datetime
import pandas as pd
import yfinance as yf

start = datetime(2020,9,1)
end = datetime(2021,12,31)
stocks= ['ACHC','ACIW','TECH','SAM']

dfs = pd.DataFrame()
for stock in stocks:
    print(stock)
    df = yf.download(stock,start,end)
    df['stock'] = stock
    dfs = dfs.append(df,ignore_index=True)
dfs.to_excel(f'excelfilename.xlsx')

dfs.head()
打开 关闭 调整关闭 音量 stock
0 31.13 31.42 30.6 30.91 30.91 385700 ACHC
1 29.73 30.99 29.73 30.57 30.57 226500 ACHC
2 30.76 31.2 30.41 31.12 31.12 379300 ACHC
3 31.15 31.5 29.92 30.18 30.18 411200 ACHC
4 30.7 30.82 29.2 29.81 29.81 459500 ACHC

编辑: 如果要按股票水平排列它们,请在列表中一次获取一个股票,并通过删除不必要的列来更改层次索引的级别。然后将分层索引名称转换为一行并重命名列。之后,对列重新排序。

df = yf.download(stocks,end)
df.drop(['Adj Close',],axis=1,inplace=True)
df = df.swaplevel(1,axis=1)
df.columns = ["_".join(a) for a in df.columns.to_flat_index()]
df.sort_index(axis=1,inplace=True)
日期 ACHC_Close ACHC_High ACHC_Low ACHC_Open ACHC_Volume
2020-08-31 00:00:00 30.91 31.42 30.6 31.13 385700
2020-09-01 00:00:00 30.57 30.99 29.73 29.73 226500
2020-09-02 00:00:00 31.12 31.2 30.41 30.76 379300
2020-09-03 00:00:00 30.18 31.5 29.92 31.15 411200
2020-09-04 00:00:00 29.81 30.82 29.2 30.7 459500