仿聚宽模拟交易系统之一

博主: Simon Lin 创建于: May 29, 2020 更新于: May 29, 2020
分类: stock
标签: finance stock

仿聚宽模拟交易系统之一

要实现一套可以模拟交易用来回测交易策略,以验证策略有效性,系统的必要性还挺高的。网上有形形色色的交易系统,傻瓜式的,让你选取几个指标,然后计算一通给你个结果的。也有扔出几个技术指标给你,就当系统卖的。作为量化程序员来说,我还是比较喜欢聚宽的一套模拟交易系统。它给予了程序员充分的自由设定,高度模拟了时间轴,价格系统,分红系统等,用编程的方式去操纵股票。唯一我觉得不好的地方呢,就是没开源……。这是程序员的执念吧。毕竟人家也是要活下去的,听说最近聚宽连模拟策略商城都关了,不想免费提供算力给程序员了。考虑了一下,那我就完全脱离聚宽的限制,自己实现一个简单的模拟交易系统呗。

知己知彼

关于聚宽的模拟交易,以前简单写过一个用法。从用法的角度来解构一下,模拟交易系统的组成。

  1. 数据源

要能获取到股票交易的数据。这个数据最基本的包含当前有哪些股票在交易,股票的交易日设定,每个股票的交易价格,成交量。中级一点的数据包含年报,季报,股票基本信息如股本,基本情况数据。龙虎榜,主力资金流情况

  1. 时间轴框架

想象一下一个模拟交易,我先需要设定模拟交易的开始结束时间,然后初始化数据,接着开始跑算力。
从2020-5-24日开始模拟,结束时间是2020-5-29日。
2020-05-24日是休息日,跳过。
2020-5-28日早上9点,跑交易前的策略。
2020-05-28日9点30分,策略决定买入100股招商银行。
2020-05-28日下午15点的时候,计算当日的收益
2020-05-29日下午14点,卖出招商银行
2020-05-28日下午15点的时候,计算当日的收益
2020-05-29日下午15点的时候。跑完模拟,对一段时间做个总结报表
模拟交易完成。
模拟交易的一个运行框架是一个时间触发的策略计算系统。策略应可以在交易的任何时间触发执行,然后再进行交易行为。

  1. 存储系统

模拟交易可能会按真正的现实时间轴来进行,今天是5月29日,今天跑模拟,只能算到5月最后一个交易日,当你看到这个文档的时候,可能已经过去好多天了,那么当6月1日的时候,模拟交易应可继续5月29日的结果继续。所以这么看来,每天的模拟交易都应该缓存一堆数据,如当前买了哪些股票,当前资金多少等。到下一个交易日模拟的时候,要重新提取出来。

  1. 数据输出能力

模拟交易的中间过程要输出,结果也要输出,当然最好就是能图形化输出结果,详细日志输出过程。优先级没有这么高。不过,画一下资金的收益率曲线和沪深300的对比,饼图显示购买股票的构成等,对这套系统的可用性是决定性的。客户爸爸喜欢啥,我们就搞啥,没有用户的系统都是渣渣。

  1. 其他

说是一个简单系统,不过细节还有很多。例如要不要引入税费,分红时资金变动和股票数量变动,要不要模拟交易量的问题,假设振华重工当天只成交了1000万,你模拟的时候,一下就买了1个亿,现实中绝对会立马涨停的,这是一个交易量影响价格的问题。

问题的解答

  1. 数据源

数据从哪来?

对于如何获取股票数据,每个做量化的兄弟都应有自己的方案,其实这对于量化人员来说不是一个问题,因为早就解决过了,如果没有,根本就不能做量化。
现有的股票数据Api很多。就拿聚宽来说,jqdata就提供了python的方式来获取数据。另外如米框,优矿等量化交易平台,也都提供了相关的方法。对于我来说,选择的核心就是是不是方便搞到本地来。在网上查了,免费的平台还有baostock和tushare。对于日常的每日交易数据,我觉得可以本地搞,5分钟级或者1分钟级的交易价格数据数据量实在太大,用普通的关系型数据库存储不方便,我并不推荐本地存储(当然我也没有去实现),初步的想法是要实时从数据源去拉。

数据质量问题?

不要觉得能拉到数据就可以了,我就碰到过,拉下来数据,有缺失的,有不对的。在挑数据源的时候要慎重。
数据质量的另外一个方面是各家给的一些2次加工数据不通用的。例子一:经典例子就是行业分类,特别是概念分类。你去比较几个股票软件就知道了,一个5G概念股,没有一个绝对的划分。那么只能挑一个你自己喜欢的数据源咯。例子二:还有是主力资金流向这个数据,基本的数据都是从证交所提供的level2数据里加工来的,可是每家的分类标准都不同,怎样算超大单,怎样算大单,怎样算小单,就这个我到各个网站上去找,好几家都没找到标准。例子三:
数据还有一个时间概念,例如某个公司的行业并不是永远不变的,所以行业数据要按时间线变化,这个事情处理起来其实也非常的复杂。

根本性的解决?

很多数据那些Api平台是没有的,只能自己去收集,写python嘛这个就有个好处就是很容易自己去爬取。毕竟股票数据网站很多,都可以提供相关的数据,要啥都有。自己去爬下来,整理,要啥有啥,不香吗?唯一问题就是慢。我可怜的小mac air,每天去爬数据,一个龙虎榜还快些,一个主力资金流向从东方财富去获取,大概需要个把小时。不敢太快,怕被反爬啊。爬虫这里多说一句,能用json的api去爬的,绝不用页面去爬。

这里说一下我现实的选择,每日交易数据从baostock去获取,其他部分从东方财富网和同花顺去爬取,存本地mysql数据库。

  1. 时间轴

花时间考虑了一下,这个时间轴控制用了一个观察者模式来实现,而观察的事件就是时间的变动。用一个简单循环模拟每分钟,每分钟的事件去检查是否到观察者设定的触发时间了,触发到了就执行对应的方法。再加上初始化,存储的部分,一个基本的结构就成型了。

  1. 存储系统

沿用之前股票数据分析的存储。基本的数据源都在mysql里,部分模拟交易数据也可以进库,临时性的东西直接用文件存,一个pandas的to_csv,to_excel解决问题。

  1. 数据输出能力

对于程序员来说,这块只是工作量的问题。

  1. 其他

能省就省吧,没打算大搞卖钱,哈哈哈哈哈

小结

那么,我们就准备开干吧,下期先解决时间轴框架的问题。


打赏 支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者