Получение JSONDecodeError: Ожидаемое значение: строка 1, столбец 1 (char 0) с Python + Zipline + Docker + Jupyter

Я установил Zipline и Jupyter с помощью Docker: https://github.com/quantopian/zipline/blob/master/Dockerfile

Сейчас я пытаюсь запустить следующий код Zipline под Jupyter.

%%zipline --bundle quantopian-quantl --start 2008-1-1 --end 2012-1-1 -o strat.pickle

from zipline.api import symbol, order, record

def initialize(context):
    pass

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

Сообщение об ошибке, которое я получаю:

**JSONDecodeError: Expecting value: line 1 column 1 (char 0)**

Вот изображение ошибки: введите здесь описание изображения

Опять же, это происходит, когда я пытаюсь запустить программу.

В чем может быть проблема? Любая помощь, подсказки или советы ~очень~ ценятся!

ТИА

Дополнение: я также пробовал это: https://docs.google.com/document/d/1mvZO_JDirbJNXJfM0bTS9uMipHE5cfSGFj0sUpJIcsw/edit?usp=sharing


person Casey Harrils    schedule 09.07.2019    source источник
comment
Что было бы интересно, так это строка в вашем коде, которая вызывает проблему. В любом случае, эта ошибка означает, что вы пытаетесь декодировать пустой json, часто вызванный несуществующим файлом (или, точнее, текущим рабочим каталогом, который отличается от того, что ожидает пользователь/разработчик).   -  person Serge Ballesta    schedule 09.07.2019
comment
@SergeBallesta - спасибо за ответ. Я использовал Docker для Zipline (см. описание выше), это как-то связано? Спасибо!   -  person Casey Harrils    schedule 09.07.2019
comment
Извините, но я не использую ни Docker, ни Zipline. Сообщение об ошибке является подсказкой для пустого файла, но я понятия не имею о причине.   -  person Serge Ballesta    schedule 09.07.2019
comment
Следуя приведенной здесь информации, проблема была решена: github.com/quantopian/zipline/issues/2480 был опубликован ОП как ответ только по ссылке.   -  person Trenton McKinney    schedule 01.11.2019


Ответы (3)


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

Проблема заключается в файле Benchmark.py (и некоторых других) zipline, где он пытается получить данные из iex и терпит неудачу, потому что их функция изменилась.

Я покажу вам, что я сделал, чтобы запустить пример кода:

(Я предполагаю, что вы уже установили zipline и запускаете Apple, покупая пример кода)

1.benchmark.py: загляните в папку zipline на вашем компьютере (то, что вы скачали или установили pip/conda). Открой Benchmark.py (найди его первым) и отредактируй его, изменив там весь код на этот:

import numpy as np
import pandas as pd
import pandas_datareader.data as pd_reader
def get_benchmark_returns(symbol, first_date, last_date):
    data = pd_reader.DataReader(
        symbol,
        'yahoo',
        first_date,
        last_date
    )

    data = data['Close']

    data[pd.Timestamp('2008-12-15')] = np.nan
    data[pd.Timestamp('2009-08-11')] = np.nan
    data[pd.Timestamp('2012-02-02')] = np.nan

    data = data.fillna(method='ffill')

    return data.sort_index().tz_localize('UTC').pct_change(1).iloc[1:]

этот код был взят из ответа shlomikushchi страницы github о проблеме. Вот шломикущи переключили источник данных с iex на pandas, yahoo.

2.Далее открываем файл: loaders.py, тоже где-то в зиплайне:

там есть строка, в которой вызывают функцию: (ищите это в коде)

данные = get_benchmark_returns (символ

изменить его на:

 data = get_benchmark_returns(symbol,first_date, last_date)

3.open trade.py, тоже где-то в папке zipline, после этой строчки:

class SimulationParameters(object):
def __init__(self, start_session, end_session,
             trading_calendar,
             capital_base=DEFAULT_CAPITAL_BASE,
             emission_rate='daily',
             data_frequency='daily',
             arena='backtest'):

введите эти строки:

start_session = pd.Timestamp(start_session).tz_localize(tz='US/Central')
    end_session = pd.Timestamp(end_session).tz_localize(tz='US/Central')

теперь он должен работать, когда вы запускаете код здесь:

https://www.zipline.io/beginner-tutorial.html

person daniel zarakhovsky    schedule 01.11.2019
comment
За исключением 3. это ответ. Не делай 3.!! - person chhenning; 15.11.2019
comment
Я думаю, что файл benchmarks.py, а не benchmark.py (grep не нашел последнего). - person hubbs5; 21.01.2020
comment
Имена файлов и файлы могли измениться со временем, но для меня сработали 3 шага вместе, если это работает на более раннем этапе, поздравляю. - person daniel zarakhovsky; 06.08.2020

Шаг 3 должен быть:

start_session = pd.Timestamp(start_session).tz_convert('UTC')

end_session = pd.Timestamp(end_session).tz_convert('UTC')
person user12974908    schedule 27.02.2020

Другое решение, упомянутое в вопросе Github, заключается в том, чтобы подписаться на бесплатный токен API от IEX и вставить его в файл benchmark.py вашего модуля zipline. Измените строку request.get на это:

r= requests.get( "https://cloud.iexapis.com/stable/stock/{}/chart/5y?chartCloseOnly=True&token={}".format(symbol, IEX_API_KEY) )

Должен быть строкой, поэтому заключите ключ в кавычки " "

person dxgarnish    schedule 09.04.2020