2016-07-19 5 views
9

BITTE BEACHTEN SIE: Diese Frage wurde erfolgreich beantwortet ptrj unten. Ich habe auch eine Blog-Post auf meinem Blog über meine Erfahrungen mit Zipline geschrieben, die Sie hier finden können: https://financialzipline.wordpress.comZipline: Verwenden von Pandas-Datenreader zum Einspeisen von Google Finanzen Datenrahmen für nicht-US-basierte Finanzmärkte


Ich bin mit Sitz in Südafrika und ich versuche südafrikanische Aktien in einen Datenrahmen zu laden, so dass es zipline mit Aktienkursinformationen füttert. Sagen wir, ich bin auf der Suche auf Adcorp Holdings Limited als an der JSE (Johannesburg Stock Exchange) notiert:

Google Finance gibt mir die historischen Preisinfo:

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

Yahoo Finanzen hat keine Informationen über das Unternehmen.

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

Typing im folgenden Code innerhalb ipython Notebook bekommt mir den Datenrahmen für die Informationen von Google Finance:

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

Wenn ich f angezeigt, ich sehe, dass die Informationen tatsächlich entsprechen die Info off als auch Google Finance:

enter image description here

Dies ist Preis genau von Google Finanzen, Sie können sehen, dass die Informationen für den 2016-07-18 auf der Google Finance Website genau zu meinem Dataframe passt.

enter image description here

Aber ich bin nicht sicher, wie diese Datenrahmen zu laden, so dass es durch Zipline als Datenpaket verwendet werden kann.

Wenn Sie das Beispiel für buyapple.py betrachten, können Sie sehen, dass es nur die Daten von Apple Shares (APPL) aus dem aufgenommenen Datenbündel quantopian-quandl abruft. Die Herausforderung besteht hier darin, APPL durch JSE:ADR zu ersetzen, so dass es 10 JSE:ADR Freigaben pro Tag als von dem Datenframe anstelle des Datenbündels quantopian-quandl gefüttert und es in einem Diagramm plotten wird.

Weiß jemand, wie man das macht? Es gibt fast keine Beispiele im Netz, die mit diesem beschäftigt ...

Dies ist der buyapple.py Code wie in Zipline dem Beispiel Ordner geliefert:

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:

Ich sah der Code für die Aufnahme der Daten von Yahoo Finance und änderte sie ein wenig, um Google Finance-Daten zu übernehmen. Der Code für die Yahoo Finance finden Sie hier: http://www.zipline.io/_modules/zipline/data/bundles/yahoo.html.

Dies ist mein Code für die Aufnahme von Google Finanzen - leider funktioniert es nicht. Kann mir jemand, der fließender Python spricht, helfen?:

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

Können Sie genauer sein, was nicht funktioniert? Fahren Sie fort wie in diesem [doc] (http://www.zipline.io/bundles.html)? Welche Art von Fehler bekommen Sie? – ptrj

Antwort

9

folgte ich Tutorials auf http://www.zipline.io/ und ich habe es mit den folgenden Schritten arbeitet:

  1. eine Einnahme Funktion für Google-Aktien vorbereiten.

    Der gleiche Code, den Sie mit den folgenden Änderungen eingefügt (yahoo.py auf Datei-basiert):

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

    Ich nannte die Datei google.py und kopiert es zipline/data/bundle des Zipline Installationsverzeichnis in das Unterverzeichnis. (Es kann überall auf dem Python-Pfad platziert werden. Oder Sie können zipline/data/bundle/__init__.py ändern zu können, um es auf die gleiche Weise wie yahoo_equities nennen.)

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

    Fügen Sie die folgenden Zeilen .zipline/extension.py Datei im Home-Verzeichnis - das Home-Verzeichnis ist Ihr Benutzerverzeichnis unter Windows (C: \ Users \ Ihr Benutzername). Der .zipline-Ordner ist ein versteckter Ordner. Sie müssen die Dateien einblenden, um sie zu sehen.

    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), 
    ) 
    

    Und

    zipline ingest -b my-google-equities-bundle 
    
  3. Testlauf (wie in http://www.zipline.io/beginner-tutorial.html)

    Ich habe ein Beispiel-Datei zipline/examples/buyapple.py (das gleiche Sie geklebt), beide Vorkommen von Symbol ersetzt 'AAPL' mit 'JSE:ADR', umbenannt zu buyadcorp.py und lief

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

    Das Ergebnis stimmte mit den direkt von Google Finance heruntergeladenen Daten überein.

+0

Danke - ich war unterwegs und konnte nicht früher zu Ihnen zurück. Ich werde es ausprobieren und Ihnen das Ergebnis mitteilen. – Simon