2

我使用 Docker 安装了 Zipline 和 Jupyter: https ://github.com/quantopian/zipline/blob/master/Dockerfile

我现在正在尝试在 Jupyter 下运行以下 Zipline 代码

%%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)**

这是错误的图片: 在此处输入图像描述

同样,这发生在我尝试运行程序时。

问题可能是什么?任何帮助,提示或建议都〜非常〜感谢!

TIA

附录: 我也试过这个: https ://docs.google.com/document/d/1mvZO_JDirbJNXJfM0bTS9uMipHE5cfSGFj0sUpJIcsw/edit?usp=sharing

4

3 回答 3

12

我知道这个问题已经解决了,但是我尝试了他们在 github 问题上提供的内容,但它对我没有帮助,所以我决定展示我是如何解决我的问题的。也许它会帮助你。

问题出在 zipline 的 benchmark.py 文件(和其他几个文件)中,它试图从 iex 获取数据并失败,因为它们的功能发生了变化。

我将向您展示我为运行示例代码所做的工作:

(我假设您已经安装了 zipline 并运行了苹果购买示例代码)

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 页面关于该问题的答案。这里 shlomikushchi 将数据源从 iex 切换到 pandas,yahoo。

2.接下来,打开文件:loaders.py,也在zipline的某处:

那里有一行调用函数:(在代码中查找)

数据 = get_benchmark_returns(符号

将其更改为:

 data = get_benchmark_returns(symbol,first_date, last_date)

3.打开 trading.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

于 2019-11-01T14:53:13.317 回答
0

另一个解决方案——在 Github 问题中提到——是从 IEX 注册一个免费的 API 令牌,并将其插入到你的 zipline 模块的benchmark.py文件中。将 request.get 行更改为:

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

需要是一个字符串,所以用“”引号将你的键括起来

于 2020-04-09T06:41:35.627 回答
0

第 3 步应该是:

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

end_session = pd.Timestamp(end_session).tz_convert('UTC')
于 2020-02-27T17:55:49.407 回答