从雅虎财经python一次下载多只股票
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/49705047/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Downloading mutliple stocks at once from yahoo finance python
提问by ScharcoMolten
I have a question about the function of yahoo finance using the pandas data reader. I'm using for months now a list with stock tickers and execute it in the following lines:
我有一个关于使用熊猫数据阅读器的雅虎财经功能的问题。我已经使用了几个月的股票行情列表并在以下几行中执行它:
import pandas_datareader as pdr
import datetime
stocks = ["stock1","stock2",....]
start = datetime.datetime(2012,5,31)
end = datetime.datetime(2018,3,1)
f = pdr.DataReader(stocks, 'yahoo',start,end)
Since yesterday i get the error "IndexError: list index out of range", which appears only if I try to get multiple stocks.
从昨天开始,我收到错误“IndexError: list index out of range”,只有在我尝试获取多只股票时才会出现。
Has anything changed in recent days which I have to consider or do you have a better solution for my problem?
最近几天有什么变化需要我考虑,或者您对我的问题有更好的解决方案吗?
采纳答案by abccd
If you read through Pandas DataReader's documentation, they issued an immediate depreciation on multiple data source API's, one of which is Yahoo! Finance.
如果您通读 Pandas DataReader 的文档,他们会立即对多个数据源 API 进行折旧,其中之一是 Yahoo! 金融。
v0.6.0 (January 24, 2018)
Immediate deprecation of Yahoo!, Google Optionsand Quotesand EDGAR. The end points behind these APIs have radically changed and the existing readers require complete rewrites. In the case of most Yahoo!data the endpoints have been removed. PDR would like to restore these features, and pull requests are welcome.
v0.6.0(2018 年 1 月 24 日)
立即弃用雅虎!、谷歌期权和报价以及EDGAR。这些 API 背后的端点已经发生了根本性的变化,现有的读者需要完全重写。在大多数雅虎的情况下!已删除端点的数据。PDR 想恢复这些功能,欢迎请求请求。
This could be the culprit to why you been getting IndexError
's (or any other normally none-existant errors).
这可能是导致您收到IndexError
's (或任何其他通常不存在的错误)的罪魁祸首。
However, there is another Python package whose goal is to fix the support for Yahoo! Finance for Pandas DataReader, you can find that package here:
但是,还有另一个 Python 包,其目标是修复对 Yahoo! 的支持。Pandas DataReader 的财务,您可以在此处找到该软件包:
https://pypi.python.org/pypi/fix-yahoo-finance
https://pypi.python.org/pypi/fix-yahoo-finance
According to their documentation:
根据他们的文档:
Yahoo! financehas decommissioned their historical data API, causing many programs that relied on it to stop working.
fix-yahoo-financeoffers a temporary fix to the problem by scraping the data from Yahoo! financeusing and return a Pandas DataFrame/Panel in the same format as pandas_datareader's
get_data_yahoo()
.By basically “hiHymaning”
pandas_datareader.data.get_data_yahoo()
method, fix-yahoo-finance's implantation is easy and only requires to importfix_yahoo_finance
into your code.
雅虎!Finance已经停用了他们的历史数据 API,导致许多依赖它的程序停止工作。
fix-yahoo-finance通过从Yahoo!抓取数据来临时解决该问题。资金使用和相同的格式返回一个数据帧的熊猫/面板pandas_datareader的
get_data_yahoo()
。通过基本上“劫持”的
pandas_datareader.data.get_data_yahoo()
方法,fix-yahoo-finance的植入很容易,只需要导入fix_yahoo_finance
到您的代码中即可。
All you need to add is this:
您只需要添加以下内容:
from pandas_datareader import data as pdr
import fix_yahoo_finance as yf
yf.pdr_override()
stocks = ["stock1","stock2", ...]
start = datetime.datetime(2012,5,31)
end = datetime.datetime(2018,3,1)
f = pdr.get_data_yahoo(stocks, start=start, end=end)
Or even without the need of Pandas DataReader:
或者甚至不需要 Pandas DataReader:
import fix_yahoo_finance as yf
stocks = ["stock1","stock2", ...]
start = datetime.datetime(2012,5,31)
end = datetime.datetime(2018,3,1)
data = yf.download(stocks, start=start, end=end)
回答by alt777
You can use the new Python YahooFinancials module with pandas to do this. YahooFinancials is well built and gets it's data by hashing out the datastore object present in each Yahoo Finance Web page, so it's fast and doesn't rely on the old discontinued api nor a web driver like a scraper does. Data is returned as JSON and you can pull as many stocks as you want at once by passing in a list of stock/index tickers to initialize the YahooFinancials Class with.
您可以使用带有 Pandas 的新 Python YahooFinancials 模块来执行此操作。YahooFinancials 构建良好,通过散列存在于每个 Yahoo Finance 网页中的数据存储对象来获取其数据,因此它速度很快,并且不依赖于旧的已停产的 api 或像刮板那样的网络驱动程序。数据以 JSON 形式返回,您可以通过传入股票/指数行情列表来初始化 YahooFinancials 类,从而一次提取任意数量的股票。
$ pip install yahoofinancials
$ pip 安装雅虎财经
Usage Example:
用法示例:
from yahoofinancials import YahooFinancials
import pandas as pd
# Select Tickers and stock history dates
ticker = 'AAPL'
ticker2 = 'MSFT'
ticker3 = 'INTC'
index = '^NDX'
freq = 'daily'
start_date = '2012-10-01'
end_date = '2017-10-01'
# Function to clean data extracts
def clean_stock_data(stock_data_list):
new_list = []
for rec in stock_data_list:
if 'type' not in rec.keys():
new_list.append(rec)
return new_list
# Construct yahoo financials objects for data extraction
aapl_financials = YahooFinancials(ticker)
mfst_financials = YahooFinancials(ticker2)
intl_financials = YahooFinancials(ticker3)
index_financials = YahooFinancials(index)
# Clean returned stock history data and remove dividend events from price history
daily_aapl_data = clean_stock_data(aapl_financials
.get_historical_stock_data(start_date, end_date, freq)[ticker]['prices'])
daily_msft_data = clean_stock_data(mfst_financials
.get_historical_stock_data(start_date, end_date, freq)[ticker2]['prices'])
daily_intl_data = clean_stock_data(intl_financials
.get_historical_stock_data(start_date, end_date, freq)[ticker3]['prices'])
daily_index_data = index_financials.get_historical_stock_data(start_date, end_date, freq)[index]['prices']
stock_hist_data_list = [{'NDX': daily_index_data}, {'AAPL': daily_aapl_data}, {'MSFT': daily_msft_data},
{'INTL': daily_intl_data}]
# Function to construct data frame based on a stock and it's market index
def build_data_frame(data_list1, data_list2, data_list3, data_list4):
data_dict = {}
i = 0
for list_item in data_list2:
if 'type' not in list_item.keys():
data_dict.update({list_item['formatted_date']: {'NDX': data_list1[i]['close'], 'AAPL': list_item['close'],
'MSFT': data_list3[i]['close'],
'INTL': data_list4[i]['close']}})
i += 1
tseries = pd.to_datetime(list(data_dict.keys()))
df = pd.DataFrame(data=list(data_dict.values()), index=tseries,
columns=['NDX', 'AAPL', 'MSFT', 'INTL']).sort_index()
return df
Multiple stocks data at once example (returns list of JSON objects for each ticker):
一次多个股票数据示例(返回每个股票代码的 JSON 对象列表):
from yahoofinancials import YahooFinancials
tech_stocks = ['AAPL', 'MSFT', 'INTC']
bank_stocks = ['WFC', 'BAC', 'C']
yahoo_financials_tech = YahooFinancials(tech_stocks)
yahoo_financials_banks = YahooFinancials(bank_stocks)
tech_cash_flow_data_an = yahoo_financials_tech.get_financial_stmts('annual', 'cash')
bank_cash_flow_data_an = yahoo_financials_banks.get_financial_stmts('annual', 'cash')
banks_net_ebit = yahoo_financials_banks.get_ebit()
tech_stock_price_data = tech_cash_flow_data.get_stock_price_data()
daily_bank_stock_prices = yahoo_financials_banks.get_historical_stock_data('2008-09-15', '2017-09-15', 'daily')
JSON Output Example:
JSON 输出示例:
Code:
代码:
yahoo_financials = YahooFinancials('WFC')
print(yahoo_financials.get_historical_stock_data("2017-09-10", "2017-10-10", "monthly"))
JSON Return:
JSON 返回:
{
"WFC": {
"prices": [
{
"volume": 260271600,
"formatted_date": "2017-09-30",
"high": 55.77000045776367,
"adjclose": 54.91999816894531,
"low": 52.84000015258789,
"date": 1506830400,
"close": 54.91999816894531,
"open": 55.15999984741211
}
],
"eventsData": [],
"firstTradeDate": {
"date": 76233600,
"formatted_date": "1972-06-01"
},
"isPending": false,
"timeZone": {
"gmtOffset": -14400
},
"id": "1mo15050196001507611600"
}
}
回答by Gerry
yahoo_finance is no longer able to use since Yahoo has changed the format, fix_yahoo_finance is good enough to download data. However to parse you'll need other libraries, here's the simple working example:
yahoo_finance 不再能够使用,因为雅虎已经更改了格式,fix_yahoo_finance 足以下载数据。但是要解析您需要其他库,这是一个简单的工作示例:
import numpy as np #python library for scientific computing
import pandas as pd #python library for data manipulation and analysis
import matplotlib.pyplot as plt #python library for charting
import fix_yahoo_finance as yf #python library to scrap data from yahoo finance
from pandas_datareader import data as pdr #extract data from internet sources into pandas data frame
yf.pdr_override()
data = pdr.get_data_yahoo(‘^DJI', start=”2006–01–01")
data2 = pdr.get_data_yahoo(“MSFT”, start=”2006–01–01")
data3 = pdr.get_data_yahoo(“AAPL”, start=”2006–01–01")
data4 = pdr.get_data_yahoo(“BB.TO”, start=”2006–01–01")
ax = (data[‘Close'] / data[‘Close'].iloc[0] * 100).plot(figsize=(15, 6))
(data2[‘Close'] / data2[‘Close'].iloc[0] * 100).plot(ax=ax, figsize=(15,6))
(data3[‘Close'] / data3[‘Close'].iloc[0] * 100).plot(ax=ax, figsize=(15,6))
(data4[‘Close'] / data5[‘Close'].iloc[0] * 100).plot(ax=ax, figsize=(15,6))
plt.legend([‘Dow Jones', ‘Microsoft', ‘Apple', ‘Blackberry'], loc='upper left')
plt.show()
for the explanation of the code you can visit at https://medium.com/@gerrysabar/charting-stocks-price-from-yahoo-finance-using-fix-yahoo-finance-library-6b690cac5447
有关代码的说明,您可以访问https://medium.com/@gerrysabar/charting-stocks-price-from-yahoo-finance-using-fix-yahoo-finance-library-6b690cac5447
回答by Bibeesh Y S
Try this simple code
试试这个简单的代码
watchlist=["stock1","stock2".......]
closing_price=pd.DataFrame()
symbols=[]
for i in watchlist:
Result=wb.DataReader(i,start='05-1-20', end='05-20-20',data_source='yahoo')
closing_price=closing_price.append(Result)
symbols.append(i)
print("Generating Closing price for",i)
closing_price["SYMBOL"]=symbols
print("closing_price"