zipline自制data bundles
Databundle
zipline 缺省提供了一些行情的data bundle , 可以通过 zipline bundles
查看
其中 quandl
数据源是从 https://www.quandl.com/ 网站的WIKI dataset获取数据的,不过通过该api数据较慢,因为逐批获取之后还要处理后才放到本地。quantopian-quandl
一份备份数据,相当于将处理后的数据打包之后提供,下载下来解压到 ~/.zipline/data
目录,所以相对较快,如果有研究美国股市的量化交易,可以使用这些数据源,还有yahoo数据源,它的好处是可以自己定制要抓取的数据集,如果你只需要配置好然后通过 ipline.data.bundles.register
进行注册即可。
如果列位想引入国内的数据源进行回测,那么恐怕要下点功夫啦,下面可以给出如下几种方案:
- 不ingest数据源,直接在构建
TradingAlgorithm
的时候引入如从csv
或者数据库
里读取出来的pd.Dataframe
信息作为DataPortal
的datasource
(当然最终会转化为pd.Panel
) - 自己定制
data bundle
,然后ingest
如果你要测试的数据集比较小,股票数量也比较少,那么第一种方案是比较方便的,如果需要大量的数据,还是自己写data bundle 比较方便(并且貌似使用Dataframe也很难处理有 split或者dividend的股票)
那么如何编写一个新的bundle的扩展呢?
其实比较简单,自己实现一个ingest
函数即可
该ingest
函数的参数如下:
ingest(environ, asset_db_writer, minute_bar_writer, daily_bar_writer, adjustment_writer, calendar, start_session, end_session, cache, show_progress, output_dir)
其中这个函数是被environ
回调的,所以参数列表无法自己指定,下面简单介绍一下几个参数的作用
参数 | 作用 |
---|---|
environ | 代表环境变量的一映射,如果你需要一些额外的参数引入,可以在这里通过环境变量指定,如quandl 的API key |
asset_db_writer | AssetDBWriter 的实例,通过它的write函数可以把一个证券(如股票)的基础信息,主要是码表,名称,起止日期等信息写入到数据库中,并且为每个证券分配一个sid作为唯一标识,这个sid在系统的其它地方也会成为股票的主要索引方式。默认保存在sqlite数据库中 |
daily_bar_writer | 写入每日的行情信息 BcolzDailyBarWriter 的实例,通过调用write方法写入股票的开高低收和成交量等信息(OHLCV),这里的信息也需要使用sid与基本信息进行关联。默认使用bcolz的格式保存 |
minute_bar_writer | 写入每分钟行情的... |
adjustment_writer | 处理一些拆分,合并,送股,分红等事件的信息。默认使用sqlite数据库保存 |
calendar | 你当前使用的交易日历 ,数据的获取是以交易日历作为索引的,也就是说,如果你的交易日历里那一天存在,可是你无法读取行情数据,很有可能会出现错误,所以calendar 和你的行情信息 的匹配是很关键的 |
start_session/end_session | 获取数据的起止日期 |
cache | dataframe_cache 的实例,你可以使用它来缓存在获取过程中的原始信息,在多次ingest的时候起到加速的作用 |
show_progress | 一个布尔值,是否显示ingest的过程,如果你的获取数据时间较长,可以判断show_progress变量来显示进度。 |
output_dir | data bundle的输出目录,如果你的data bundle 是类似 quantopian-quandl 这种通过下载远程已经写好的数据源,并且解压到本地的,可以直接使用这个变量获取最终解压目录 |
一般来说,获取一个行情的数据源,主要需要三方面的信息
- 使用
asset_db_writer
获取基础信息 - 使用
daily_bar_writer
/minute_bar_writer
写入行情信息 - 使用
adjustment_writer
写入split, dividend信息。
话说这里坑不少,我建议多看看官方的例子,大部分都要讲数据处理为pd.Dataframe的结构再进行的。另外我自己也写了一些简单的demo,可以参考:
https://github.com/rainx/zipline_cn_databundle
里面代码比较凌乱,有很多无用代码,主要参考一下squant_source
模块
https://github.com/rainx/zipline_cn_databundle/blob/master/zipline_cn_databundle/squant_source.py
不过代码里用到了我自己写的一个squant包,是一个私有数据包,因为应用了很多内部数据,不便公开,所以大家恐怕无法直接使用。主要是asset和adjuestment的部分,对于行情,我使用的是通达信的客户端的本地数据(木有windows , 从别的机器拷贝的 T_T),大家应该可以直接使用,参考里面的TdxReader
(https://github.com/rainx/zipline_cn_databundle/blob/master/zipline_cn_databundle/tdx/reader.py)
Bcolz
zipline的本地行情是写入到bcolz
的格式的,它是底层使用Blosc
库的基于列的数据库,至于为什么使用基于列的数据库,应该是与行情信息的特质有关,因为行情信息可以通过TradingCalendar和Bcolz的元信息进行索引,并且以时间顺序排列,而且是相同的类型,所以非常适合类似数组结构的存储方式,加之以Blosc的变态级别的压缩解压算法(使用CPU L1/L2缓存进行压缩/解压,平均速度超过了memcpy
调用),所以对时间和空间上都可以做到比较优化的状态。
内部的索引结构大概抽象为:
zipline自制data bundles的更多相关文章
- Zipline Data Bundles
Data Bundles A data bundle is a collection of pricing data, adjustment data, and an asset database. ...
- hook mono实现Assembly.Load从指定路径读取文件
mono-unity github: https://github.com/Unity-Technologies/mono/blob/unity-staging/mono/metadata/assem ...
- Flutter 2.2 更新详解
Flutter 2.2 版已正式发布!要获取新版本,您只需切换到 stable 渠道并更新目前安装的 Flutter,或前往 flutter.cn/docs/get-started 从头开始安装. 虽 ...
- zipline目录结构
下面列出了zipline主要的目录和文件结构和它的说明 ├── ci - 持续集成相关 ├── conda - 生成conda 包相关 ├── docs - 文档 │ ├── notebooks - ...
- [Unity3D]自制UnityForAndroid二维码扫描插件
一周左右终于将二维码生成和扫描功能给实现了,终于能舒缓一口气了,从一开始的疑惑为啥不同的扫码客户端为啥扫出来的效果不同?通用的扫描器扫出来就是一个下载APK,自制的扫描器扫出来是想要的有效信息,然后分 ...
- Using Script and Style Bundles【翻译】
遇到个MVC4中的bundles的问题,问了别人,由于不熟悉MVC4,始终问不到点子上,所以自己就翻译了下资料,搞明白了这个VS显示正常IIS显示异常的小问题,申明我翻译的很烂,不过共享出来或许会帮到 ...
- 自制C#版3DS文件的解析器并用SharpGL显示3DS模型
自制C#版3DS文件的解析器并用SharpGL显示3DS模型 我已经重写了3ds解析器,详情在此(http://www.cnblogs.com/bitzhuwei/p/CSharpGL-2-parse ...
- 自制操作系统(七) 加快中断处理,和加入FIFO缓冲区
参考书籍<30天自制操作系统>.<自己动手写操作系统> 2016-05-26.2016-07-09 主要是加快中断处理,和加入FIFO缓冲区. 因为之前是将打印字符的代码放在了 ...
- pack、unpack自制二进制“数据库”
引言 pack.unpack函数,如果没有接触过socket,这个可能会比较陌生,这两个函数在socket交互的作用是组包,将数据装进一个二进制字符串,和对二进制字符串中的数据进行解包,这个里面有好多 ...
随机推荐
- filebeat+kafka失败
filebeat端配置 #----------------------------- Kafka output -------------------------------- output.kafk ...
- 实例37foreach遍历数组
package test; import java.util.List; import java.util.ArrayList; import java.util.Scanner; /** * @au ...
- Unix系统编程()malloc和free的实现
尽管malloc和free所提供的内存分配接口比之brk和sbrk要容易许多,但在使用时仍然容易犯下各种编程错误. 理解malloc和free的实现,将使我们洞悉产生这些错误的原因以及如何才能避免此类 ...
- Python之美[从菜鸟到高手]--NotImplemented小析
今天写代码时无意碰到NotImplemented,我一愣.难道是NotImplementedError的胞弟,所以略微研究了一下. NotImplemented故名思议.就是"未实现&quo ...
- Unity5 AssetBundle打包加载及服务器加载
Assetbundle为资源包不是资源 打包1:通过脚本指定打包 AssetBundleBuild ab = new AssetBundleBuild ...
- vim 编辑器使用技巧
看着李立鹏熟练的使用vim,哥心里痒痒的,也来试试! vim pkf.txt i 插入编辑 esc -> :x //退出保存 f8 ->//进入多窗口模式 以下是其他命令: 命令历史 以: ...
- 【BZOJ】2005: [Noi2010]能量采集(欧拉函数+分块)
http://www.lydsy.com/JudgeOnline/problem.php?id=2005 首先和某题一样应该一样可以看出每个点所在的线上有gcd(x,y)-1个点挡着了自己... 那么 ...
- WebService远程调用(命令行调用)
远程调用webservice 方法, 通过wsdl命令,生成webservice 对应asmx 文件的对应类(cs文件),然后将此cs文件引用到当前项目中,项目其他地方需要调用webservice方法 ...
- php 快速读取文件夹下文件列表
在读取某个文件夹下的内容的时候 以前是使用 opendir readdir结合while循环过滤 . ..当前文件夹和父文件夹来操作的. 代码如下: 然后偶然发现了有scandir函数 可以扫描文件夹 ...
- The type org.springframework.dao.DataAccessException cannot be resolved. It is indirectly referenced from required .class files
使用spring框架提供的JDBC模板操作数据库时,提示错误 解决方案:导入事务管理jar包spring-tx-4.2.4.RELEASE.jar