2016-07-19 15 views
9

LÜTFEN DİKKAT: Bu soru, aşağıdaki sorulara başarıyla yanıtlanmıştır: ptrj below. https://financialzipline.wordpress.comZipline: ABD merkezli olmayan finans piyasaları için Google Finance veri ağacında beslemek üzere pandas-datareader kullanarak


Ben Güney Afrika'da bulunan ve ben bu yüzden bir dataframe içine Güney Afrikalı hisselerini yüklemeye çalışıyorum: Ben de burada bulabilirsiniz zeplinle ile benim deneyimleri hakkında bloguma bir blog yazısı yazdım pay fiyat bilgisi ile zipline besleyecektir. JSE (Johannesburg Borsası'nda) yer alan şekliyle ı AdCorp Holdings Limited bakıyorum diyelim:

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

Yahoo Finans:

Google Finans bana tarihsel fiyat bilgisi verir şirket hakkında herhangi bir bilgi bulunmamaktadır. Ben f gösterilecek olursa

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

, ben bilgiler aslında bilgi karşılık geldiğini bakın: ipython Notebook Aşağıdaki kodda

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

Yazma Google Finans'tan bilgi için bana dataframe alır hem Google Finans dışı:

enter image description here

budur Google Finans’ın tam olarak fiyatı, Google Finans web sitesinde 2016-07-18’den alınan bilgileri tam olarak veri ağımla eşleştiğini görebilirsiniz.

enter image description here

Ancak, bir veri paketi olarak zeplinle tarafından kullanılabilir, böylece bu dataframe yüklemek nasıl emin değilim.

buyapple.py için verilen örneğe bakarsanız, yalnızca Apple paylaşımlarının verilerini (APPL) quantopian-quandl yutulmuş veri paketinden aldığını görebilirsiniz. Buradaki zorluk, APPL'un JSE:ADR ile değiştirilmesidir, böylece veri paketi quantopian-quandl yerine dataframe'den beslenen bir günde 10 JSE:ADR paylaşımını sipariş eder ve grafik üzerinde çizdirir.

Bunu nasıl yapacağını bilen var mı?

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

DÜZENLEME:

baktım bu ilgilenen net neredeyse hiç örnekler vardır ...

Bu

zeplinle en örnek klasöründe sağlanan olarak buyapple.py kodudur Verileri Yahoo Finance'den almanın kodu ve Google Finans verilerinde görünmesi için biraz değiştirildi. Yahoo Finance'in kodu şu adreste bulunabilir: http://www.zipline.io/_modules/zipline/data/bundles/yahoo.html.

Bu, Google Finans'ı almamın kodudur - ne yazık ki çalışmıyor. Python'da daha akıcı olan biri bana yardımcı olabilir mi?:

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

Neyin çalışmadığı konusunda daha spesifik olabilir misiniz? Bu [doc] 'de (http://www.zipline.io/bundles.html) devam ediyor musunuz? Ne tür bir hata yapıyorsunuz? – ptrj

cevap

9

Ben http://www.zipline.io/ öğreticiler takip ettim ve aşağıdaki adımlarla işe yaptı:

  1. google tahviller için bir yutma fonksiyonunu hazırlayın.

    yapıştırdığınız aynı kod şu değişiklikler (dosyanın yahoo.py göre):

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

    Ben dosyayı google.py adlandırılır ve zipline yüklemek dizin içinde zipline/data/bundle alt dizinine kopyaladı. (Piton yolunda herhangi bir yere yerleştirilebilir. Yoksa yahoo_equities olarak bunu aynı şekilde arama yapabilmek için zipline/data/bundle/__init__.py değiştirebilirsiniz.)

  2. Ingest .zipline/extension.py dosyaya aşağıdaki satırları ekleyin

    (http://www.zipline.io/bundles.html bakınız) ana dizinde - ana dizin Windows'ta Kullanıcı dizindir (C: \ Kullanıcılar \ kullanıcı adınız). .zipline klasörü gizli bir klasördür, görmek için dosyaları göstermeniz gerekir.

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

    Ve buna bir örnektir zipline/examples/buyapple.py (yapıştırdığınız aynı), 'JSE:ADR' ile sembol 'AAPL' her iki tekrarlarını yerini dosyasını, yeniden adlandırılan aldı

    (http://www.zipline.io/beginner-tutorial.html olduğu gibi)

    zipline ingest -b my-google-equities-bundle 
    
  3. Testi çalıştırmak buyadcorp.py'a ve

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

    Sonuç, doğrudan Google Finans’tan indirilen verilerle tutarlıydı.

+0

Teşekkür ederim - seyahat ediyordum ve size daha erken dönemedim. Bunu deneyeceğim ve sonucu size bildireceğim. – Simon

İlgili konular