run_algorithm () завершается ошибкой, поскольку не может получить данные из источника inte rnet (403 запрещено) - PullRequest
0 голосов
/ 09 января 2020

Я пытался следовать zipline Быстрый старт :

from zipline.api import order_target, record, symbol

def initialize(context):
    context.i = 0
    context.asset = symbol('AAPL')


def handle_data(context, data):
    # Skip first 300 days to get full windows
    context.i += 1
    if context.i < 300:
        return

    # Compute averages
    # data.history() has to be called with the same params
    # from above and returns a pandas dataframe.
    short_mavg = data.history(context.asset, 'price', bar_count=100, frequency="1d").mean()
    long_mavg = data.history(context.asset, 'price', bar_count=300, frequency="1d").mean()

    # Trading logic
    if short_mavg > long_mavg:
        # order_target orders as many shares as needed to
        # achieve the desired number of shares.
        order_target(context.asset, 100)
    elif short_mavg < long_mavg:
        order_target(context.asset, 0)

    # Save values for later inspection
    record(AAPL=data.current(context.asset, 'price'),
           short_mavg=short_mavg,
           long_mavg=long_mavg)

Но это не удается:

$ zipline run -f dual_moving_average.py --start 2014-1-1 --end 2018-1-1 -o dma.pickle
[2020-01-06 20:31:38.548002] INFO: Loader: Cache at /home/jupyter/.zipline/data/SPY_benchmark.csv does not have data from 2014-01-02 00:00:00+00:00 to 2017-12-29 00:00:00+00:00.

[2020-01-06 20:31:38.548265] INFO: Loader: Downloading benchmark data for 'SPY' from 2013-12-31 00:00:00+00:00 to 2017-12-29 00:00:00+00:00
Traceback (most recent call last):
  File "/home/jupyter/env/bin/zipline", line 8, in <module>
    sys.exit(main())
  File "/home/jupyter/env/lib/python3.5/site-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/home/jupyter/env/lib/python3.5/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/home/jupyter/env/lib/python3.5/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/jupyter/env/lib/python3.5/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/jupyter/env/lib/python3.5/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/home/jupyter/env/lib/python3.5/site-packages/zipline/__main__.py", line 107, in _
    return f(*args, **kwargs)
  File "/home/jupyter/env/lib/python3.5/site-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/home/jupyter/env/lib/python3.5/site-packages/zipline/__main__.py", line 276, in run
    blotter=blotter,
  File "/home/jupyter/env/lib/python3.5/site-packages/zipline/utils/run_algo.py", line 159, in _run
    trading_days=trading_calendar.schedule[start:end].index,
  File "/home/jupyter/env/lib/python3.5/site-packages/zipline/finance/trading.py", line 103, in __init__
    self.bm_symbol,
  File "/home/jupyter/env/lib/python3.5/site-packages/zipline/data/loader.py", line 149, in load_market_data
    environ,
  File "/home/jupyter/env/lib/python3.5/site-packages/zipline/data/loader.py", line 216, in ensure_benchmark_data
    data = get_benchmark_returns(symbol)
  File "/home/jupyter/env/lib/python3.5/site-packages/zipline/data/benchmarks.py", line 35, in get_benchmark_returns
    data = r.json()
  File "/home/jupyter/env/lib/python3.5/site-packages/requests/models.py", line 897, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.5/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Я понял, что это потому, что он пытается получить некоторые данные из api.iextrading.com/1.0/stock/..., но эта конечная точка в настоящее время возвращает 403 Forbidden и ставит под угрозу zipline, то есть:

requests.get('https://api.iextrading.com/1.0/stock/{}/chart/5y'.format('AAPL'))

Я, вероятно, могу извлечь те же данные из других источников inte rnet ... Какой формат ожидает zipline?

1 Ответ

1 голос
/ 09 января 2020

Эта проблема связана с изменением торгового API IEX, для которого теперь требуется API-ключ (счет) для его запроса. Я надеюсь, что это будет исправлено и уточнено в документации в будущем, и что получение данных из внешних API будет намного проще.

На данный момент у вас есть два варианта:

1. Измените код теста:

/home/jupyter/env/lib/python3.5/site-packages/zipline/data/benchmarks.py

Измените определение get_benchmark_returns

...
import os 
...
def get_benchmark_returns(symbol):
     The data is provided by IEX (https://iextrading.com/), and we can
     get up to 5 years worth of data.
     """
    IEX_TOKEN = os.environ.setdefault("IEX_PUBLIC_TOKEN", "YOUR_API_KEY") 
    r = requests.get('https://cloud.iexapis.com/stable/stock/{}/chart/5y?token={}'.format(symbol, IEX_TOKEN))

    data = r.json()

    df = pd.DataFrame(data)
    ...

Если вы хотите sh изменить IEX_PUBLIC_TOKEN, вы можете установить эту переменную env как обычно сделано для Квандла.

Это говорит о том, что способ управления данными эталонного теста может быть улучшен:

  • Он должен быть похож на прием данных по умолчанию (zipline ingest ...).
  • Следует сохранить старые данные и извлечь только недостающие. Вы увидите, что каждый день система будет снова загружать все контрольные данные из IEX вместо новых ежедневных данных для .SPX.

2. Удалите эталонный тест, установив его в ноль (пожалуйста, отметьте здесь )

Сравнение эталонного алгоритма вашего торгового алгоритма важно, поскольку оно полезно для оценки производительности алгоритма, поэтому я не рекомендую устанавливать это к нулю.

Также обратите внимание, что комплект по умолчанию от quandl больше не поддерживается (данные ограничены апрелем 2018 года).

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

Спасибо

...