Pandas DataReader work-around for Google finance



我每天都会为大型股票和ETF赢得历史数据。Quandl对美国股票的免费覆盖范围很好,但是它们没有ETF的历史数据,因此我将Google API用作Quandl的备份。

最近的Google财务"翻新"并没有给我带来不错的选择,因此我试图将Brad Solomon的作品(感谢Brad,下面的Brad,下面的链接)应用于符号的 list 。考虑到他正在创建URL,假设没有循环的情况就不可能。欢迎任何聪明的想法。

相关的问题:pandas_datareader for Google不起作用?

谢谢。

在引擎盖下,pandas-datareader正在通过您通过的每个符号循环并使HTTP请求一个一个。

这是在基类中执行此功能的功能,与Google和Yahoo相关的类从中继承:base._DailyBaseReader._dl_mult_symbols

魔术是将它们附加到列表中,然后汇总到PANDAS Panel

我会注意到,面板已弃用,您可以在具有多索引的数据框架中获得相同的功能,该结构在技术上是2二维,但在实践中复制了更高的维度。

所以,这是您可以做的,下面可以做的。请注意,我跳过了软件包本身中嵌入的许多功能,例如解析字符串日期为dateTime。

import datetime
from io import StringIO
import requests
from pandas.io.common import urlencode
import pandas as pd
BASE = 'http://finance.google.com/finance/historical'

def get_params(sym, start, end):
    params = {
        'q': sym,
        'startdate': start.strftime('%Y/%m/%d'),
        'enddate': end.strftime('%Y/%m/%d'),
        'output': "csv"
    }
    return params

def build_url(sym, start, end):
    params = get_params(sym, start, end)
    return BASE + '?' + urlencode(params)

def get_one_data(sym, start=None, end=None):
    if not start:
        start = datetime.datetime(2010, 1, 1)
    if not end:
        end = datetime.datetime.today()
    url = build_url(sym, start, end)
    data = requests.get(url).text
    return pd.read_csv(StringIO(data), index_col='Date',
                       parse_dates=True).sort_index()

def get_multiple(sym, start=None, end=None, return_type='Panel'):
    if isinstance(sym, str):
        return get_one_data(sym, start=start, end=end)
    elif isinstance(sym, (list, tuple, set)):
        res = {}
        for s in sym:
            res[s] = get_one_data(s, start, end)
        # The actual module also implements a 'passed' and 'failed'
        #     check here and also using chunking to get around
        #     data retreival limits (I believe)
    if return_type.lower() == 'panel':
        return pd.Panel(res).swapaxes('items', 'minor')
    elif return_type.lower() == 'mi':  # MultiIndex DataFrame
        return pd.concat((res), axis=1)

一个例子:

syms = ['AAPL', 'GE']
data = get_multiple(syms, return_type='mi')
# Here's how you would filter down to Close prices
#   on MultiIndex columns
data.xs('Close', axis=1, level=1) 
              AAPL     GE
Date                     
2010-01-04   30.57  15.45
2010-01-05   30.63  15.53
2010-01-06   30.14  15.45
2010-01-07   30.08  16.25
2010-01-08   30.28  16.60
...

最新更新