run_algorithm() 失败,因为它无法从互联网源获取数据(403 禁止访问)
run_algorithm() fails because it cannot fetch data from the internet source (403 Forbidden)
我试着关注 zipline
的 Quickstart:
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/...
获取一些数据,但该端点当前 returns 403 Forbidden
并危及 zipline
,即:
requests.get('https://api.iextrading.com/1.0/stock/{}/chart/5y'.format('AAPL'))
我可能可以从其他 Internet 资源中提取相同的数据...zipline
需要什么格式?
此问题是由于 IEX 交易 api 发生变化,现在需要 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)
...
如果您想修改 IEX_PUBLIC_TOKEN,您可以像通常为 Quandl 所做的那样在外部设置此环境变量。
也就是说,可以改进基准数据的管理方式:
- 它应该类似于默认数据摄取(zipline ingest ...)。
- 它应该保留旧数据并只检索丢失的数据。您会看到系统每天都会再次从 IEX 下载所有基准数据,而不是 .SPX 的新每日数据。
2。通过将基准设置为零来删除基准(请检查 here)
交易算法的基准比较很重要,因为它有助于评估算法的性能,因此我不建议将其设置为零。
另请注意,不再支持来自 quandl 的默认捆绑包(数据仅限于 2018 年 4 月)。
如果您遇到任何问题,请告诉我,
谢谢
我试着关注 zipline
的 Quickstart:
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/...
获取一些数据,但该端点当前 returns 403 Forbidden
并危及 zipline
,即:
requests.get('https://api.iextrading.com/1.0/stock/{}/chart/5y'.format('AAPL'))
我可能可以从其他 Internet 资源中提取相同的数据...zipline
需要什么格式?
此问题是由于 IEX 交易 api 发生变化,现在需要 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)
...
如果您想修改 IEX_PUBLIC_TOKEN,您可以像通常为 Quandl 所做的那样在外部设置此环境变量。
也就是说,可以改进基准数据的管理方式:
- 它应该类似于默认数据摄取(zipline ingest ...)。
- 它应该保留旧数据并只检索丢失的数据。您会看到系统每天都会再次从 IEX 下载所有基准数据,而不是 .SPX 的新每日数据。
2。通过将基准设置为零来删除基准(请检查 here)
交易算法的基准比较很重要,因为它有助于评估算法的性能,因此我不建议将其设置为零。
另请注意,不再支持来自 quandl 的默认捆绑包(数据仅限于 2018 年 4 月)。
如果您遇到任何问题,请告诉我,
谢谢