什么是回测平台?
最简单来说,写好了一个策略,从一个txt中读取了数据,放到策略中,得到了一个最后的收益,这个程序就是一个回测平台,用回测平台来概括虽然有些过,但是这就是一个回测平台的雏形。
升级——需求增加
当最后的统计结果不仅需要收益,还需要统计交易次数、开多开空次数、盈亏比、平均盈利、平均亏损、夏普比率等等这些指标,最后的结果还需要加上可视化的控件的时候,就需要再添加些东西了。
升级——标准化
现在,从读取数据到运行策略再得到最后的结果已经可以跑通了,但是当又写了一个又一个策略后,发现这些策略之间有很多公共的部分,如设置时间窗口、求MA、求RSI等等,每次都需要复制粘贴这部分代码,就造成了代码的冗余性,所以这些常用的模块就可以都抽出来,最为一个公共的模块——Technical(随便起得名字),下次再编写策略时,用到什么直接调用就可以了。
接着,下一个问题,我读取的数据不是txt而是csv或者是数据库中的数据呢,所以还需要规定一个对数据的规范,类似:
FutureData{
0 string marketDM # 市场代码
1 string instrumentID # 合约代码
2 string date # 时间 exg:2017-8-1 11:30:00
3 double Open
4 double High
5 double Low
6 double Close
7 double volume
8 double buyprice
9 double sellprice
}
虽然每个文件或者数据库中的数据类型不同,但是基本用于回测的信息应该都包含了,所以每个这样的数据单元就可以作为一个封装了,起个名字叫——Bar,这个Bar的对象就具有了以上的属性。
有了数据后进行回测时还有一个重要的问题,那就是要考虑模型的鲁棒性,所谓鲁棒性的衡量可以通过设置滑点、提高手续费等来对风险进行一个把控。因此还需要一个这样的Risk来作为手续费和滑点等的封装。
然后类似的,再对仓位Position做一个封装,包括统计持有多仓还是空仓,持仓价格等等。
最后,对策略Strategy再进行一个抽象,设置一个策略的父类,每个策略代码部分公共的模块如开仓平仓、配置初始化等设置一个父类方法,通过让子类继承来实现。
总结
之所以要自己搭建回测平台而不用现有的框架,一方面便于理解,另一方面可以任由自己yy,需要设计什么模块什么功能自己来决定,所以一个至关重要的问题,就是写代码前一定要对需求搞清楚了,还有就是保留好一些重要的接口方便以后对程序的扩展。
后面的细节部分想好了再写。