2016-07-19 2 views
9

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: Этот вопрос был успешно ответил ptrj ниже. Кроме того, я написал сообщение в блоге на своем блоге о своем опыте с Zipline, которые вы можете найти здесь: https://financialzipline.wordpress.comZipline: использование pandas-datareader для подачи в Google Finance данных для финансовых рынков, не связанных с США


Я основана в Южной Африке, и я пытаюсь загрузить южноафриканских акций в dataframe так что он будет кормить zipline информацией о ценах на акции. Скажем, я смотрю на AdCorp Holdings Limited, как указано на JSE (фондовой бирже Йоханнесбурга):

Google Finance дает мне историческую информацию цена:

https://www.google.com/finance/historical?q=JSE%3AADR&ei=5G6OV4ibBIi8UcP-nfgB

Yahoo Finance информация отсутствует на сайте.

https://finance.yahoo.com/quote/adcorp?ltr=1

Typing в следующем коде в IPython Notebook получает мне dataframe для информации от Google Финансы:

start = datetime.datetime(2016,7,1) 
end = datetime.datetime(2016,7,18)  
f = web.DataReader('JSE:ADR', 'google',start,end) 

Если я показываю п, я вижу, что информация на самом деле соответствует информации от Google финансов, а также:

enter image description here

Это цена точно от Google Finance, вы можете видеть, что информация для 2016-07-18 на веб-сайте Google Finance соответствует именно моему фреймворку.

enter image description here

Однако, я не знаю, как загрузить этот dataframe, так что он может быть использован Zipline как пучок данных.

Если вы посмотрите на пример, приведенный для buyapple.py, вы можете увидеть, что он просто извлекает данные о яблочных акциях (APPL) из просочившегося пакета данных quantopian-quandl. Задача здесь состоит в том, чтобы заменить APPL на JSE:ADR так, чтобы он заказывал 10 JSE:ADR акций в день, которые поступали из блока данных вместо набора данных quantopian-quandl и отображали его на графике.

Кто-нибудь знает, как это сделать? Есть почти нет примеров в сети, которая имеет дело с этим ...

Это buyapple.py код, поступающие в примере папке Zipline в:

from zipline.api import order, record, symbol 


def initialize(context): 
    pass 


def handle_data(context, data): 
    order(symbol('AAPL'), 10) 
    record(AAPL=data.current(symbol('AAPL'), 'price')) 


# Note: this function can be removed if running 
# this algorithm on quantopian.com 
def analyze(context=None, results=None): 
    import matplotlib.pyplot as plt 
    # Plot the portfolio and asset data. 
    ax1 = plt.subplot(211) 
    results.portfolio_value.plot(ax=ax1) 
    ax1.set_ylabel('Portfolio value (USD)') 
    ax2 = plt.subplot(212, sharex=ax1) 
    results.AAPL.plot(ax=ax2) 
    ax2.set_ylabel('AAPL price (USD)') 

    # Show the plot. 
    plt.gcf().set_size_inches(18, 8) 
    plt.show() 


def _test_args(): 
    """Extra arguments to use when zipline's automated tests run this example. 
    """ 
    import pandas as pd 

    return { 
     'start': pd.Timestamp('2014-01-01', tz='utc'), 
     'end': pd.Timestamp('2014-11-01', tz='utc'), 
    } 

EDIT:

Я посмотрел на код для приема данных из Yahoo Finance и немного изменил его, чтобы заставить его использовать данные Google Finance. Код для Yahoo Finance можно найти здесь: http://www.zipline.io/_modules/zipline/data/bundles/yahoo.html.

Это мой код для глотания Google Finance - к сожалению, он не работает. Может ли кто-нибудь более свободно говорить на питоне?:

import os 

import numpy as np 
import pandas as pd 
from pandas_datareader.data import DataReader 
import requests 

from zipline.utils.cli import maybe_show_progress 


def _cachpath(symbol, type_): 
    return '-'.join((symbol.replace(os.path.sep, '_'), type_)) 


def google_equities(symbols, start=None, end=None): 
    """Create a data bundle ingest function from a set of symbols loaded from 
    yahoo. 

    Parameters 
    ---------- 
    symbols : iterable[str] 
     The ticker symbols to load data for. 
    start : datetime, optional 
     The start date to query for. By default this pulls the full history 
     for the calendar. 
    end : datetime, optional 
     The end date to query for. By default this pulls the full history 
     for the calendar. 

    Returns 
    ------- 
    ingest : callable 
     The bundle ingest function for the given set of symbols. 

    Examples 
    -------- 
    This code should be added to ~/.zipline/extension.py 

    .. code-block:: python 

     from zipline.data.bundles import yahoo_equities, register 

     symbols = (
      'AAPL', 
      'IBM', 
      'MSFT', 
     ) 
     register('my_bundle', yahoo_equities(symbols)) 

    Notes 
    ----- 
    The sids for each symbol will be the index into the symbols sequence. 
    """ 
    # strict this in memory so that we can reiterate over it 
    symbols = tuple(symbols) 

    def ingest(environ, 
       asset_db_writer, 
       minute_bar_writer, # unused 
       daily_bar_writer, 
       adjustment_writer, 
       calendar, 
       cache, 
       show_progress, 
       output_dir, 
       # pass these as defaults to make them 'nonlocal' in py2 
       start=start, 
       end=end): 
     if start is None: 
      start = calendar[0] 
     if end is None: 
      end = None 

     metadata = pd.DataFrame(np.empty(len(symbols), dtype=[ 
      ('start_date', 'datetime64[ns]'), 
      ('end_date', 'datetime64[ns]'), 
      ('auto_close_date', 'datetime64[ns]'), 
      ('symbol', 'object'), 
     ])) 

     def _pricing_iter(): 
      sid = 0 
      with maybe_show_progress(
        symbols, 
        show_progress, 
        label='Downloading Google pricing data: ') as it, \ 
        requests.Session() as session: 
       for symbol in it: 
        path = _cachpath(symbol, 'ohlcv') 
        try: 
         df = cache[path] 
        except KeyError: 
         df = cache[path] = DataReader(
          symbol, 
          'google', 
          start, 
          end, 
          session=session, 
         ).sort_index() 

        # the start date is the date of the first trade and 
        # the end date is the date of the last trade 
        start_date = df.index[0] 
        end_date = df.index[-1] 
        # The auto_close date is the day after the last trade. 
        ac_date = end_date + pd.Timedelta(days=1) 
        metadata.iloc[sid] = start_date, end_date, ac_date, symbol 

        df.rename(
         columns={ 
          'Open': 'open', 
          'High': 'high', 
          'Low': 'low', 
          'Close': 'close', 
          'Volume': 'volume', 
         }, 
         inplace=True, 
        ) 
        yield sid, df 
        sid += 1 

     daily_bar_writer.write(_pricing_iter(), show_progress=True) 

     symbol_map = pd.Series(metadata.symbol.index, metadata.symbol) 
     asset_db_writer.write(equities=metadata) 

     adjustment_writer.write(splits=pd.DataFrame(), dividends=pd.DataFrame()) 
     # adjustments = [] 
     # with maybe_show_progress(
     #   symbols, 
     #   show_progress, 
     #   label='Downloading Google adjustment data: ') as it, \ 
     #   requests.Session() as session: 
     #  for symbol in it: 
     #   path = _cachpath(symbol, 'adjustment') 
     #   try: 
     #    df = cache[path] 
     #   except KeyError: 
     #    df = cache[path] = DataReader(
     #     symbol, 
     #     'google-actions', 
     #     start, 
     #     end, 
     #     session=session, 
     #   ).sort_index() 

     #   df['sid'] = symbol_map[symbol] 
     #   adjustments.append(df) 

     # adj_df = pd.concat(adjustments) 
     # adj_df.index.name = 'date' 
     # adj_df.reset_index(inplace=True) 

     # splits = adj_df[adj_df.action == 'SPLIT'] 
     # splits = splits.rename(
     #  columns={'value': 'ratio', 'date': 'effective_date'}, 
     #) 
     # splits.drop('action', axis=1, inplace=True) 

     # dividends = adj_df[adj_df.action == 'DIVIDEND'] 
     # dividends = dividends.rename(
     #  columns={'value': 'amount', 'date': 'ex_date'}, 
     #) 
     # dividends.drop('action', axis=1, inplace=True) 
     # # we do not have this data in the yahoo dataset 
     # dividends['record_date'] = pd.NaT 
     # dividends['declared_date'] = pd.NaT 
     # dividends['pay_date'] = pd.NaT 

     # adjustment_writer.write(splits=splits, dividends=dividends) 

    return ingest 
+0

Не могли бы вы уточнить, что не работает? Продолжаете ли вы в этом [doc] (http://www.zipline.io/bundles.html)? Какая ошибка вы получаете? – ptrj

ответ

9

Я следовал за учебники по http://www.zipline.io/, и я сделал его работу со следующими шагами:

  1. Подготовка функции заглатывания для Google акции.

    Тот же самый код, который вы вставили (на основе файла yahoo.py) со следующими изменениями:

    # Replace line 
    # adjustment_writer.write(splits=pd.DataFrame(), dividends=pd.DataFrame()) 
    # with line 
    adjustment_writer.write() 
    

    Я назвал этот файл google.py и скопировать его в подкаталог zipline/data/bundle из Zipline установки каталога. (Он может быть размещен в любом месте на пути питона. Или вы можете изменить zipline/data/bundle/__init__.py, чтобы быть в состоянии назвать его таким же образом, как yahoo_equities.)

  2. Ingest (см http://www.zipline.io/bundles.html)

    Добавьте следующие строки в файл .zipline/extension.py в домашнем каталоге - домашний каталог - это ваш каталог пользователя в Windows (C: \ Users \ ваше имя пользователя). Папка .zipline - скрытая папка, вам нужно будет отобразить файлы, чтобы увидеть их.

    from zipline.data.bundles import register 
    
    from zipline.data.bundles.google import google_equities 
    
    equities2 = { 
        'JSE:ADR', 
    } 
    
    register(
        'my-google-equities-bundle', # name this whatever you like 
        google_equities(equities2), 
    ) 
    

    И запустить

    zipline ingest -b my-google-equities-bundle 
    
  3. Test (как в http://www.zipline.io/beginner-tutorial.html)

    Я взял пример файла zipline/examples/buyapple.py (тот же вставили), заменил оба вхождений символа 'AAPL' с 'JSE:ADR', переименованный до buyadcorp.py и бежит

    python -m zipline run -f buyadcorp.py --bundle my-google-equities-bundle --start 2000-1-1 --end 2014-1-1 
    

    Результат соответствовал данным, загружаемым непосредственно из Google Finance.

+0

Спасибо, я путешествовал и не мог вернуться к вам раньше. Я попробую и дам вам знать результат. – Simon