2015-03-27 6 views
1

Я пытаюсь выяснить, как использовать мои собственные файлы данных csv (первоначально из Yahoo finance), которые будут использоваться в Zipline. Я знаю, что вам нужно загрузить файл csv в кадр данных pandas. Но я не могу остановить Zipline от загрузки данных из Yahoo.Zipline - csv file

Мой формат CSV файл:

Date, Open, High, Low, Close, Volume, AdjClose 

Мой algofile:

from zipline.api import order, record, symbol 
import pandas as pd 

data = pd.read_csv('AAPL.csv') 

def initialize(context): 
    pass 

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

Моя командной строки для создания файла рассол:

run_algo.py -f E:\..\Main.py --start 2011-1-1 --end 2015-1-1 -o buyapple_out.pickle 

выход Командная строка:

[2015-03-27 10:18:20.809959] WARNING: Loader: No benchmark data found for date range. 
start_date=2015-03-27 00:00:00+00:00, end_date=2015-03-27 10:18:19.973911, url=http://ichart.finance.yahoo.com/table.csv?a=2&s=%5EGSPC&b=27&e=27&d=2&g 
=d&f=2015&c=2015 
[2015-03-27 10:20:05.811965] INFO: Performance: Simulated 504 trading days out of 504. 
[2015-03-27 10:20:05.811965] INFO: Performance: first open: 2013-01-02 14:31:00+00:00 
[2015-03-27 10:20:05.811965] INFO: Performance: last close: 2014-12-31 21:00:00+00:00 

Мой файл рассола создан правильно. Но, похоже, он все еще использует yahoo вместо моего csv, потому что вывод командной строки говорит о финансировании yahoo. На Zipline отсутствует документация о том, как это сделать, кроме «загрузить csv в dataframe». Что еще?

Большое спасибо.

+0

[Zipline является своего рода торговой библиотеки] (https://github.com/quantopian/zipline) –

+0

Не уверен, что если вы задаете вопрос или сделать заявление. Но да, да. – darkpool

ответ

2

Я считаю, что ваша проблема заключается в том, как вы используете данные, а не в том, как вы ее читаете. Вот пример стратегии, использующей полосы Боллинджера.

import pandas as pd 
import locale 
import matplotlib.pyplot as plt 
from zipline.algorithm import TradingAlgorithm 
import zipline.finance.trading as trading 
from zipline.utils.factory import load_from_yahoo 
from datetime import datetime, date 
from pytz import timezone 
import pytz 
from dateutil.tz import tzutc 
from dateutil.parser import parse 
from zipline.finance.slippage import FixedSlippage 
from zipline.finance.commission import PerShare, PerTrade 


central = timezone('US/Central') 
HOLDTIME = 5 
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 
COMMISSION=0.005 

def date_utc(s): 
    return parse(s, tzinfos=tzutc) 


class BollingerBands(TradingAlgorithm): 

    def initialize(self): 
     self.invested  = False 

     self.trade_size=1000 
     self.long = False 
     self.short = False 
     self.closed = False 
     self.trading_day_counter = 0 
     self.pct_stop = 0.025 
     self.long_stop_price = 0.0 
     self.short_stop_price=0.0 
     self.target=0.05 
     commission_cost = self.trade_size * COMMISSION 
     self.set_slippage(FixedSlippage(spread=0.10)) 
     self.set_commission(PerTrade(cost=commission_cost)) 

    def handle_data(self, data): 


     if data['Close'].price >= data['upper'].price and not self.invested: 
      self.order('Close', self.trade_size) 
      self.long_stop_price = data['Open'].price - data['Open'].price * float(self.pct_stop) 
      self.short_stop_price = data['Open'].price + data['Open'].price * float(self.target) 
      self.long = True 
      self.closed=False 
      self.invested = True 
      self.trading_day_counter = 0 
     if data['Close'].price <= data['lower'].price and not self.invested: 
      self.short_stop_price = data['Open'].price + data['Open'].price * float(self.pct_stop) 
      self.long_stop_price = data['Open'].price - data['Open'].price * float(self.target) 
      self.order('Close', -self.trade_size) 
      self.short = True 
      self.closed=False 
      self.invested = True 
      self.trading_day_counter = 0 
     if self.invested and (data['Close'].price <= self.long_stop_price or data['Close'].price >= self.short_stop_price): #or self.trading_day_counter == HOLDTIME): 

      if self.long: 
       self.order('Close', -self.trade_size) 
      if self.short: 
       self.order('Close', self.trade_size) 

      self.closed=True 
      self.long=False 
      self.short=False 
      self.invested=False 


     self.trading_day_counter = self.trading_day_counter +1 
     self.record(Close=data['Close'].price, 
        upper=data['upper'].price, 
        lower=data['lower'].price, 
        long=self.long, 
        short=self.short, 
        holdtime=self.trading_day_counter, 
        closed_position=self.closed, 
        shares=self.trade_size) 


if __name__ == '__main__': 
    df=pd.read_csv('SPY.csv') # contains Date, Open, High, Low, Close, Volume 


    df['avg'] = pd.rolling_mean(df['Close'], 21) 
    df['std'] = pd.rolling_std(df['Close'], 21) 
    df['upper'] = df['avg'] + 2 * df['std'] 
    df['lower'] = df['avg'] - 2 * df['std'] 
    df = df.dropna() 

    # # # # init Strat Class 
    Strategy = BollingerBands() 
    # #print df 

    # # # # # # Run Strategy 
    results = Strategy.run(df) 
    results['algorithm_returns'] = (1 + results.returns).cumprod() 


    results.to_csv('output.csv') 
    print results['algorithm_returns'].tail(1)[0]*100 
+0

Я использовал приведенный выше код, чтобы использовать в алгоритме собственный источник данных. Источник данных содержит дату, открыть, высокий, \t низкий, \t близко, \t шт. Однако я получаю ан ошибке: поднять ValueError ("Missing активов для идентификаторов:% S" % отсутствует) ValueError: Недостающие средства для идентификаторов: [ 'Open', 'High', 'Low', «Close ',' Volume ',' avg ',' std ',' upper ',' lower '] Как я могу это решить? благодаря – DreX