持续行动1期 44/100,“AI技术应用于量化投资研资”之可转债投资。
让我们一起“持续行动”10期,也就是1000天看看有什么效果。
第一期主要围绕量化投资的基础设施,包括数据存储,查询,因子计算,回测系统等,切入点是“可转债”。我们不是搞学术研究,调调参之类的,而是应用实战!就是要求做到按这个思考,你敢拿真金白银去市场上交易。
原定要开始继续讲回测系统,但今天要插入一个新主题:Arctic,基于mongo的高性能时间序列。这是一个朋友给我留言的,我看了下还不错。
昨天我们说用qlib做时间序列的基础设施(其实是不得已),qlib的数据库更新需要通过存成csv这样一个环节,增量很不方便,而且毕竟它不是真正的数据,对于一个查询确实不太方便。但直接基于mongo做因子计算性能太差了。
01 Arctic 北极
一个做量化的公司给出的评测结果:DophinDB排第一,然后就是Arctic。
https://github.com/man-group/arctic
文档地址:https://arctic.readthedocs.io/en/latest/
时间序列和交易数据的高性能存储,可以说有点为量化量身定制的意味。
而且背后的存储就是mongo,这个对我们来说,引入的成本小很多。
Arctic背后的公司是一家英国的资产管理公司。
其实我一直比较倾向这种做交易的公司开源的组件,真是为量化而生!最直接的就是pandas,另外还有一个流计算框架叫faust,有机会也要介绍给大家。
02 Hello Arctic
官方给出的安装命令如下,国内可能会由于github不稳定不成功。
pip install git+https://github.com/man-group/arctic.git
我直接下载源码包,后使用python setup.py install进行安装。
02 三种存储引擎
Arctic内置三种存储引擎:VersionStore,TickStore和ChunkStore。
ChunkStore就是按Chunk(块)来存、取dataframe,主要是对读做的优化,可以写入很大的数据集。
这里有一个关键技术,就是把“行存”变“列存”了,大家知识,现代很多分析型数据库都是列存,因为读取速度可以非常快。
Arctic似乎不支持mongo的auth机制。
mongo未开启密码认证的话,连接特别简单
from arctic import CHUNK_STORE, Arctic a = Arctic('localhost') a.initialize_library('mychunkstore', lib_type=CHUNK_STORE) lib = a['mychunkstore']
然后我们初始化一个复合index的dataframe
写入mongo:
数据库里与我们传统使用mongo看到的不一样:
write和read是直接写入一个df和读出一个df,write是直接覆盖。
这里比较好理解,也挺有用,其实我们从tushare读回来的数据就是一个dataframe,我们做好_id的预处理后,使用insert_many插入到批量写入到mongo里,自动跳过_id冲突的数据。
mongo原生读写都不快,写其实还好,我们是离线计算。
按日期范围读取数据:
按列子集读取数据:
按data_range读取行子集,columns读取列子集,相当于读出一个子dataframe。
追加与更新:
append就是每天追加一个dataframe——这个我暂时未想到使用场景。
而update会更新相应的date对应的行,如果是新增了列,那就新增一个列。
update功能很有用,update是若date已经存在就更新,若不存在就新增,无论是行,还是列。尤其是列这个,大家知道,行存数据库,当历史数据很大时,要新增一列是比较麻烦的,你要逐行去update,而列存的话,直接加上一列就好了。这个特征在量化里太重要了,比如4000支股票,我要加一列财务指标,我只需要对应好key, update就好了。
VersionStore存储一份数据的多个版本。
TickStore用于存储海量的交易tick数据,高频交易中用的较多。
目前看,ChunkStore在日频交易中较有用。
我们daily quotes数据可以写入 bond_daily 的chunk_store里,可快速按天和列读取指定数据。
后面评测下使用qlib和arctic读出全部的转债数据,并计算指标哪个更快——若是差不多或者arctic完胜,那么qlib的数据库就没有使用之必要,而且甚至qlib就没有使用之必要!
年化17.5%,十年8倍的“双低”转债策略:从零实现量化回测系统之三
飞狐,科技公司CTO,用AI技术做量化投资;以投资视角观历史,解时事;专注个人成长与财富自由。