бэктест с локальными данными в zipline

Я использую zipline для тестирования локальных данных, но это кажется неудачным.
from datetime import datetime import pytz import pandas as pd

from zipline.algorithm import TradingAlgorithm


import zipline.utils.factory as factory


class BuyApple(TradingAlgorithm):

    def handle_data(self, data):
        self.order('AAPL', 1)


if __name__ == '__main__':


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



    simple_algo = BuyApple()

    results = simple_algo.run(data)

выше мой код. Когда я запускаю этот скрипт, я получил сообщение:

[2015-04-03 01:41:53.712035] WARNING: Loader: No benchmark data found for date range.
start_date=2015-04-03 00:00:00+00:00, end_date=2015-04-03 01:41:53.632300, url=http://ichart.finance.yahoo.com/table.csv?a=3&c=2015&b=3&e=3&d=3&g=d&f=2015&s=%5EGSPC
Traceback (most recent call last):
  File "bollinger.py", line 31, in <module>
    results = simple_algo.run(data)
  File "/home/xinzhou/.local/lib/python2.7/site-packages/zipline-0.7.0-py2.7.egg/zipline/algorithm.py", line 372, in run
    source = DataFrameSource(source)
  File "/home/xinzhou/.local/lib/python2.7/site-packages/zipline-0.7.0-py2.7.egg/zipline/sources/data_frame_source.py", line 42, in __init__
    assert isinstance(data.index, pd.tseries.index.DatetimeIndex)
AssertionError

Затем я меняю свой код на следующий:

from datetime import datetime
import pytz
import pandas as pd

from zipline.algorithm import TradingAlgorithm


import zipline.utils.factory as factory


class BuyApple(TradingAlgorithm):

    def handle_data(self, data):
        self.order('AAPL', 1)


if __name__ == '__main__':
    start = datetime(2000, 1, 9, 14, 30, 0, 0, pytz.utc)

    end = datetime(2001, 1, 10, 21, 0, 0, 0, pytz.utc)

    data = pd.read_csv('AAPL.csv', parse_dates=True, index_col=0)

    sim_params = factory.create_simulation_parameters(
       start=start, end=end, capital_base=10000)
    sim_params.data_frequency = '1d'
    sim_params.emission_rate = '1d'

    simple_algo = BuyApple()

    results = simple_algo.run(data)

В

assert isinstance(data.index, pd.tseries.index.DatetimeIndex)
AssertionError

ушел. Но в моем терминале остается это сообщение:

[2015-04-03 01:44:28.141657] WARNING: Loader: No benchmark data found for date range.
start_date=2015-04-03 00:00:00+00:00, end_date=2015-04-03 01:44:28.028243, url=http://ichart.finance.yahoo.com/table.csv?a=3&c=2015&b=3&e=3&d=3&g=d&f=2015&s=%5EGSPC

Как решить эту проблему? Спасибо.


person epx    schedule 03.04.2015    source источник


Ответы (2)


Следующий код мне подходит. Это версия учебного примера «Мой первый алгоритм» (http://www.zipline.io/tutorial/). Данные должны быть в возрастающем порядке по дате. Запустите как обычную программу на Python (python yourfilename.py):

import pytz
from datetime import datetime

from zipline.algorithm import TradingAlgorithm
from zipline.api import order, record, symbol

import pandas as pd

# Load data manually csv
#Date,Open,High,Low,Close,Volume,Adj Close
#1984-09-07,26.5,26.87,26.25,26.5,2981600,3.02
#...
parse = lambda x: pytz.utc.localize(datetime.strptime(x, '%Y-%m-%d'))
data=pd.read_csv('aapl.csv', parse_dates=['Date'], index_col=0,date_parser=parse)

# Define algorithm
def initialize(context):
    pass

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

# Create algorithm object passing in initialize and
# handle_data functions
algo_obj = TradingAlgorithm(initialize=initialize, 
                            handle_data=handle_data)

# Run algorithm
perf_manual = algo_obj.run(data)

# Print
perf_manual.to_csv('output.csv'
person areyesce    schedule 28.07.2015

person    schedule
comment
Добро пожаловать в SO. Как правило, вы хотите дать более подробный ответ, чем две строчки кода. Вы можете объяснить, почему это решает проблему? - person Teepeemm; 08.05.2015
comment
isinstance (data.index, pd.tseries.index.DatetimeIndex) - это тип пропущенного совпадения. при изменении типа data.index появится еще одна ошибка. Это неправильный часовой пояс. Итак, вторая строка предназначена для редактирования часового пояса. - person liffey; 08.05.2015
comment
Лучше всего отредактировать свой ответ, чтобы он сказал: ваша первая попытка вызывает ошибку утверждения, потому что (что-то) имеет несоответствующий тип. У вашей второй попытки все еще есть проблема (что-то). Чтобы исправить несовпадающий тип, вы хотите добавить строку (первую строку). Но при этом по-прежнему будет проблема с неправильным часовым поясом, поэтому вы захотите добавить строку (вторая строка). (Я должен признать, что я не знаю pandas или zipline, поэтому я только догадываюсь, как это будет отформатировано. - person Teepeemm; 08.05.2015
comment
@Teepeemm Ты умен. - person liffey; 10.05.2015
comment
Спасибо за комплимент. Но моя цель здесь - помочь вам понять, как работает SO. Я также хотел бы, чтобы ваш первый SO-ответ получил положительные голоса, которых, я думаю, он заслуживает, а не отрицательные голоса, которых он в настоящее время может заслужить. Я думаю, что 4 человека, проголосовавшие за мой первоначальный комментарий, также могут согласиться. - person Teepeemm; 10.05.2015