Giter Club home page Giter Club logo

zipline's Introduction

image

zipline-live

pypi badge version status travis status appveyor status Apache License

使用文档已经迁移到gitbook上,请戳 这里

cn-zipline-live 是一个支持实盘的股票回测框架,是基于 zipline-live 的二次开发,以支持国内市场。 zipline-live 是基于 zipline 二次开发的回测框架,使用盈透证券(ib)的实盘接口。

zipline 是美国 Quantopian 公司开源的量化交易回测引擎,它使用 Python 语言开发, 部分代码使用 cython 融合了部分c语言代码。 Quantopian 在它的网站上的回测系统就是基于 zipline 的, 经过生产环境的长期使用,已经比完善,并且在持续的改进中。

zipline 的基本使用方法在 https://www.quantopian.com/tutorials/getting-started/ ,对于zipline的深度解析,可以看大神 rainx 写的 文档 ,本项目中的大部分依赖项目也都是rainx开发的项目

cn-zipline-live主要分为三个模块,回测,实盘以及研究,其中研究模块正处于初步开发中,功能尙待完善。

数据源

cn-zipline-live 的历史k线以及除息除权数据来自通达信,数据接口来自项目github 项目 tdx

安装

pip install cn-zipline-live

实盘

  1. 配置:

准备好配置文件zipline/gens/example_config.json, 以及trader.dll

  1. 运行:

情况1: : win32 python:将配置文件以及dll放入策略所在目录,修改配置文件名(默认应为config.json,见live_strategy),然后运行live_strategy。

情况2:

  其它环境(win64 python或者linux python):将配置文件、dll以及tdx_client.exe(文件过大无法上传到git,见QQ群文件)放到同一目录,并运行tdx_client.exe,然后在live_strategy中修改相应的uri,运行live_strategy。

使用

cn-zipline-live与zipline大同小异,具体使用方法请参考zipline 官方文档

一、ingest数据:

zipline ingest -b tdx -a assets.csv --minute False --start 20170901 --overwrite True

-a assets.csv 指定需要 ingest 的代码列表,缺省ingest 4000+只所有股票,耗时长达3、4小时,通过 -a tests/ETF.csv 只ingest ETF基金数据,一方面可以节省时间达到快速测试的目的。 另一方面可以通过这种方法ingest非股票数据,例如etf基金。

--minute False 是否ingest分钟数据

--start 20170901 数据开始日期,默认为1991年

--overwrite True 由于分钟数据获取速度较慢,默认start至今超过3年的话,只拿3年数据,日线数据依然以start为准,overwrite为True时,强制拿从start开始 至今的分钟数据

二、编写策略以及运行策略:

请参考目录: zipline/examples

问题

如有任何问题,欢迎大家提交 issue ,反馈bug,以及提出改进建议。

zipline's People

Contributors

abhijeetkalyan avatar analicia avatar bartosh avatar benmccann avatar buinvest avatar captainkanuk avatar dalejung avatar dmichalowicz avatar ehebert avatar fawce avatar freddiev4 avatar jaysonalbert avatar jbredeche avatar jfkirk avatar jikamens avatar jlowin avatar kglowinski avatar llllllllll avatar mjhanninen avatar nathanwolfe avatar pbharrin avatar rday avatar richafrank avatar sdiehl avatar ssanderson avatar stewartdouglas avatar thewassermann avatar tibkiss avatar twiecki avatar warren-oneill avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

zipline's Issues

equity_pricing_loader.py 的 load_adjusted_array 函数出错

 76         raw_arrays = self.raw_price_loader.load_raw_arrays(

---> 77 colnames,
78 start_date,
79 end_date,

的结果是272 ×3040
---> 82 adjustments = self.adjustments_loader.load_adjustments(
83 colnames,
84 dates,
之后运行到 for c, c_raw, c_adjs in zip(columns, raw_arrays, adjustments):
时 c_adjs对应的矩阵是279 × 3040
不匹配,于是报错 ValueError: Mask shape (279, 3040) != data shape (272, 3040).

读取数据的时限为 2017-1-1 到2017-10-30 , 用的bundle是tdx注入的

实盘

实盘的讨论issues

欢迎大家踊跃发言,提供意见

1. 接口


目前实盘采用trade.dll接口,本项目不提供dll,请自行百度/谷歌,如需技术支持,请联系434588628

2. 具体实现


  1. zipline-live:
    zipline-live 项目扩展了zipline,使用国外的ib broker接口来进行实盘对接,所以cn_zipline修改zipline-live,通过trade.dll来实现实盘对接。

  2. dll的局限:
    由于trade.dll只有win32版本,并且dll本身只支持c/c++语言,由于我之前已经写了一个python混编的接口调用trade.dll,所以目前打算直接使用这个混编接口,这也就限定了python的环境必须是win32。

    由于cn_zipline的初衷是一个如zipline一样的跨平台回测以及实盘框架,而trade.dll的win32版本要求python只能是win32版本。为脱离win32的束缚,采用python的zerorpc进行解耦。

    使用时,先运行一个win32版本的rpc服务器端,然后在任意环境下运行cn_zipline,通过rpc请求进行交易。

3.总结:


三种方案:

  1. windows python2.7 32 bit 环境,直接使用cn_zipline
  2. windows pyhton2.7 32 bit 的trade.dll rpc服务器端, cn_zipline可以使用任意python环境。
  3. python rpc的替代解决方案:TdxTradeServer项目提供了一个交易服务器,使用的也是trade.dll,是直接用c++开发的,相对于python混编之后的rpc来讲,性能应该会好一点,因为配置起来有点麻烦,所以我并没有采用这个。

关于分支

  1. bug修复推相应分支,哪个分支的bug推哪个(包含master)
  2. 大功能的增加,新建相应的独立分支,例如asyncio版本接口,就新建asyncio分支。
  3. 小功能的增加或者修改, 推dev分支。
  4. dev分支累计较多功能且稳定后,合并到master分支。大功能独立分支稳定后,合并到master分支。

日期报错

使用tdx数据bundle
回测示例的buy hold策略
买入 000001
起始日为2012-1-1

报如下错误

AttributeError: 'NoneType' object has no attribute 'index'

Debug跟了下,好像是1-16日的交易日历时间为 1-16 0.0 Nat NaT
这是数据导入出了问题,还是这个版本的交易日历有问题,还是那天停牌而系统处理失当,还是其他问题?
buy1.zip
附件为完整代码

跟踪时 到 tradesimulation.py 这个文件时
查看 [dt for dt,action in self.clock] 的结果为
[Timestamp('2012-01-04 00:00:00+0000', tz='UTC'), Timestamp('2012-01-04 13:45:00+0000', tz='UTC'), Timestamp('2012-01-04 21:00:00+0000', tz='UTC'), Timestamp('2012-01-04 21:00:00+0000', tz='UTC'), Timestamp('2012-01-05 00:00:00+0000', tz='UTC')。。。Timestamp('2012-01-16 00:00:00+0000', tz='UTC'), NaT, Timestamp('2012-01-16 13:45:00+0000', tz='UTC'), NaT, Timestamp('2012-01-17 00:00:00+0000', tz='UTC'), Timestamp('2012-01-17 13:45:00+0000', tz='UTC'), Timestamp('2012-01-17 21:00:00+0000', tz='UTC'), Timestamp('2012-01-17 21:00:00+0000', tz='UTC'),

又跟踪了下
在 zipline/algorithm.py(531)_create_clock()
529 """
530 trading_o_and_c = self.trading_calendar.schedule.ix[
531 self.sim_params.sessions]
--> 532 market_closes = trading_o_and_c['market_close']

这传出的close时间就已经有NAT值了,这个值是何用意?
2012-01-13 00:00:00+00:00 2012-01-13 21:00:00
2012-01-16 00:00:00+00:00 NaT
2012-01-17 00:00:00+00:00 2012-01-17 21:00:00

2012-02-17 00:00:00+00:00 2012-02-17 21:00:00
2012-02-20 00:00:00+00:00 NaT
2012-02-21 00:00:00+00:00 2012-02-21 21:00:00

常见问题汇总

问题1:
config.json中dll路径配置正确,却报错无法找到指定模块

解决方案:
可能因缺少trade.dll的依赖dll未安装,使用depends程序查看trade.dll的依赖,并安装缺失dll。例如,题主win7运行正常,win10因缺少mfc120.dll而报错。安装ms visual c++ 2013 redistributable之后解决。

zipline ingest error.

version: 1.0.0.16, python3.5
----command:
zipline ingest -b tdx --start 20090101 --overwrite False --minute False

----error message:
File "d:\toolset\anaconda3\envs\py35\lib\site-packages\zipline\data\bundles\tdx_bundle.py", line 52, in fetch_single_equity
df = engine.get_security_bars(symbol, freq, start, end)
File "d:\toolset\anaconda3\envs\py35\lib\site-packages\tdx\engine.py", line 228, in get_security_bars
['year', 'month', 'day', 'hour', 'minute'], axis=1)
File "d:\toolset\anaconda3\envs\py35\lib\site-packages\pandas\core\generic.py", line 1877, in drop
new_axis = axis.drop(labels, errors=errors)
File "d:\toolset\anaconda3\envs\py35\lib\site-packages\pandas\indexes\base.py", line 3051, in drop
labels[mask])
ValueError: labels ['year' 'month' 'day' 'hour' 'minute'] not contained in axis

ingest 报错问题

当ingest 数据时提示sid错误,具体描述如下:

  • Operating System: mac osx
  • Python Version: python 3.5

(zipline_chn_py3.5) bogon:zipline administrator$ zipline ingest -b tdx --minute False --start 20170601
Merging daily equity files: [####################################] 100% 600680 [2017-07-10 05:31:36.981322] WARNING: engine: no k line data for 601869
[2017-07-10 05:31:36.995383] WARNING: engine: no k line data for 603713
Merging daily equity files: [####################################] 100%
/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/zipline/data/us_equity_pricing.py:958: FutureWarning: Conversion of the second argument of issubdtype from float to np.floating is deprecated. In future, it will be treated as np.float64 == np.dtype(float).type.
if not issubdtype(actual, expected):
[2017-07-10 05:33:29.916303] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2017-07-21T00:00:00.000000000'), 'sid': 1, 'amount': 0.15800000429153443}
[2017-07-10 05:33:29.916535] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2017-08-29T00:00:00.000000000'), 'sid': 2, 'amount': 0.7900000095367432}
[2017-07-10 05:33:29.916940] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2018-06-22T00:00:00.000000000'), 'sid': 6, 'amount': 0.1809999942779541}
[2017-07-10 05:33:29.917154] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2018-06-07T00:00:00.000000000'), 'sid': 8, 'amount': 0.05}
[2017-07-10 05:33:29.917301] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2017-08-16T00:00:00.000000000'), 'sid': 9, 'amount': 0.020000000298023225}
[2017-07-10 05:33:29.917461] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2018-06-29T00:00:00.000000000'), 'sid': 11, 'amount': 0.3}
[2017-07-10 05:33:29.917619] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2017-07-19T00:00:00.000000000'), 'sid': 12, 'amount': 0.1}
[2017-07-10 05:33:29.917783] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2018-06-27T00:00:00.000000000'), 'sid': 12, 'amount': 0.05}
[2017-07-10 05:33:29.917957] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2018-06-22T00:00:00.000000000'), 'sid': 14, 'amount': 0.010000000149011612}
[2017-07-10 05:33:29.918090] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2018-06-06T00:00:00.000000000'), 'sid': 16, 'amount': 0.16200000047683716}
[2017-07-10 05:33:29.918221] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2017-07-14T00:00:00.000000000'), 'sid': 18, 'amount': 0.06000000238418579}
[2017-07-10 05:33:29.918403] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2018-06-28T00:00:00.000000000'), 'sid': 21, 'amount': 0.05}
[2017-07-10 05:33:29.918534] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2017-08-01T00:00:00.000000000'), 'sid': 22, 'amount': 0.4960000038146973}
[2017-07-10 05:33:29.918662] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2018-05-23T00:00:00.000000000'), 'sid': 22, 'amount': 1.31899995803833}
[2017-07-10 05:33:29.918795] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2017-08-15T00:00:00.000000000'), 'sid': 23, 'amount': 0.04000000059604645}
[2017-07-10 05:33:29.918976] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2018-06-22T00:00:00.000000000'), 'sid': 27, 'amount': 0.0800000011920929}
[2017-07-10 05:33:29.919131] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2018-06-13T00:00:00.000000000'), 'sid': 28, 'amount': 0.3}
[2017-07-10 05:33:29.919308] WARNING: UsEquityPricing: Couldn't compute ratio for dividend {'ex_date': numpy.datetime64('2018-07-10T00:00:00.000000000'), 'sid': 31, 'amount': 0.0550000011920929}
Traceback (most recent call last):
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/bin/zipline", line 11, in
sys.exit(main())
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/click/core.py", line 722, in call
return self.main(*args, **kwargs)
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/click/core.py", line 697, in main
rv = self.invoke(ctx)
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/click/core.py", line 1066, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/click/core.py", line 895, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/click/core.py", line 535, in invoke
return callback(*args, **kwargs)
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/zipline/main.py", line 440, in ingest
writer=writer
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/zipline/data/bundles/core.py", line 503, in ingest
pth.data_path([name, timestr], environ=environ),
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/zipline/data/bundles/tdx_bundle.py", line 326, in tdx_bundle
shares=shares
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/zipline/data/us_equity_pricing.py", line 1239, in write
self.write_dividend_data(dividends, stock_dividends)
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/zipline/data/us_equity_pricing.py", line 1149, in write_dividend_data
dividend_ratios = self.calc_dividend_ratios(dividends)
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/zipline/data/us_equity_pricing.py", line 1072, in calc_dividend_ratios
sid, prev_close_date, 'close')
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/zipline/data/us_equity_pricing.py", line 766, in get_value
ix = self.sid_day_index(sid, dt)
File "/Users/administrator/Application/anaconda3/envs/zipline_chn_py3.5/lib/python3.5/site-packages/zipline/data/us_equity_pricing.py", line 734, in sid_day_index
offset = day_loc - self._calendar_offsets[sid]
KeyError: 34

增量更新

首先数据有几部分:

  1. 1分钟k线
  2. 日K线
  3. 6大表,报表基本面数据
  4. 除息除权,股票基本信息, 股本数据

基本情况如下:

  1. 1分钟k线,每只股票一个bcolz存放,可以增量
  2. 日线数据是一个bcolz表放所有的股票日线数据,一个个股票按照顺序存放,没办法增量
  3. 6大表基本面数据,sqlite可以增量
    4 没必要增量,很快,

基本面

我想在zipline中加入基本面选股的初衷是,ricequant本身提供了基本面数据,国外的量化发展比较成熟,Quantopian的zipline也可以通过一些付费的接口直接获取基本面数据。

目前的话,打算用tushare的基本面数据。但是有人说tushare的基本面数据不准确不太敢用。

但是如果通过wind等付费渠道获取数据的话,一方面wind的接口不是很好用,我目前还没有找到季报发布日期这个数据的获取方式。其它渠道的话,我也不是很清楚。

并且,付费渠道就需要维护一份数据供大家下载,而且要时常更新,十分的不方便。最好的方式还是通过接口集成到平台上。

不知道你们有什么好主意。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.