Вы можете попробовать пакет под названием yahooquery . Кадр данных возвращается в результате аналогичного вызова.
from yahooquery import Ticker
# Your symbollist from above
symbollist = [...]
tickers = Ticker(symbollist, asynchronous=True)
# Get historical pricing data
# Other arguments include start, end, and interval
df = tickers.history(period='ytd')
Если все символы, переданные в конструктор, являются действительными, то тип данных, возвращаемых из оператора выше, будет кадром данных. Если есть недопустимые символы, результатом будет словарь. Тем не менее, вы все равно можете создать фрейм данных следующим образом:
if isinstance(df, dict):
[df[symbol].insert(0, "symbol", symbol) for symbol in symbollist if isinstance(df[symbol], pd.DataFrame)]
df = pd.concat([df[symbol] for symbol in symbollist if isinstance(df[symbol], pd.DataFrame)])
или вы можете убедиться, что у вас есть действительные символы до вызова метода истории, что вы можете сделать с помощью следующего:
valid_tickers = tickers.validation
valid_tickers
- это словарь, содержащий каждый символ в качестве ключа и логическое значение в качестве его значения. Затем просто переназначьте свойство символики списку допустимых тикеров:
tickers.symbols = [k for k, v in valid_tickers.items() if v]
Затем вызовите метод истории:
df = tickers.history(period='ytd')