使用 time.sleep 避免 yfinance 的限制

Avoiding the limits of yfinance with time.sleep

这里是大新手。我正在使用 pandas_datareader 和 yfinance 创建一个包含许多股票的 excel 工作簿,但最近我收到越来越多的“无法读取符号”错误,这些错误肯定仍然存在。通常我只需再次 运行 代码就可以了,但问题似乎在慢慢恶化。我听说它暗示也许雅虎不喜欢一次收到那么多请求,也许 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')

提前致谢

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

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()
Open High Low Close Adj Close Volume 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, start, end)
df.drop(['Adj Close',], axis=1, inplace=True)
df = df.swaplevel(1, 0, axis=1)
df.columns = ["_".join(a) for a in df.columns.to_flat_index()]
df.sort_index(axis=1, inplace=True)
Date 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