文章目录
- 写在前面
- 获取数据
- csv数据导入
- 历史回测
- 写在后面
- REF
写在前面
策略研发之后,为了检测我们策略的效果,不可能一上来就接入实盘,所以需要的就是通过历史数据对我们的策略进行检验,也就是历史回测。vn.py也有推出历史回测的教程,是通过内置的RQdata进行的,也就是说需要购买RQdata的服务,通过RQdata下载的数据会自动添加到.vntrader下面的SQlite数据库中。除此之外,vn.py还有一种回测方式,就是通过手动导入csv到SQlite数据库中,这种方式就需要你自己有提供数据服务的服务器或者本地用于回测的csv数据。因为在vn.py的源码中,默认是通过RQdata获取数据,如果没有成功,就从数据库中查询。
第一种方法由于需要购买数据服务,虽然需要花钱,但是这是最好的方式了,因为RQdata与vn.py正好契合,不仅可以提供历史回测的数据还可以在实盘阶段为策略进行初始化操作,所以有条件的还是购买这个比较合适。RQdata在vn.py的配置官方教程中已经推出,下面以本地csv进行历史回测进行演示和总结整理。
获取数据
数据获取按照上一篇文中以新浪财经API获取数据为例。在获取到数据之后,我们需要将得到的数据保存为csv格式数据,以代码中RB1910的1h线为例:
from urllib import request
import json
import pandas as pddef get_data(id):url_60m = 'http://stock2.finance.sina.com.cn/futures/api/json.php/IndexService.getInnerFuturesMiniKLine60m?symbol='url = url_60m + idreq = request.Request(url)rsp = request.urlopen(req)res = rsp.read()res_json = json.loads(res)bar_list = []res_json.reverse()for line in res_json:bar = {}bar['Datetime'] = line[0]bar['Open'] = float(line[1])bar['High'] = float(line[2])bar['Low'] = float(line[3])bar['Close'] = float(line[4])bar['Volume'] = int(line[5])bar_list.append(bar)df = pd.DataFrame(data=bar_list)print(df)df.to_csv('./data.csv', index=None)if __name__ == '__main__':get_data('rb1910')
这里需要注意的是,在生成的csv的columns的名字必须按照上面的形式进行创建,因为vn.py在csv导入时是按照这些名称进行解析的。
csv数据导入
在得到csv数据之后,我们打开VN Station,选择csv载入模块。
历史回测
输入成功导入之后,打开CTA回测模块,填入相关信息然后开始回测:
得到回测结果:
上面四个图的意义为别是:
- 子图1:资金变化曲线,笔直向下说明稳定亏损
- 子图2:最大回撤曲线,越来越大说明策略亏损越来越多
- 子图3:每日盈亏统计,红绿分布平均,但绿色密度更大(亏损)
- 子图4:盈亏的概率分布图,尖峰在0轴左侧(中位数日期发生亏损)
除了基本的收益走势,每一笔的成交记录、每日盈亏以及K线图都可以进行查看。
回测的另一方面也是为了让我们找到合适的参数,所以对参数进行优化也是必要的。vn.py中也为我们提供了参数优化的模块:
通过多进程优化可以得到优化的结果:
通过参数优化,我们可以得到最优的参数组合,通过这个最优参数组合再进行回测可以得到更好的结果:
写在后面
不得不说,vn.py无论是数据的下载或者本地csv的load,还是回测的可视化效果,还有参数优化,作为一个专注于量化实盘的框架已经做的很不错了。如果习惯于其他的回测框架,如pybacktest、zipline,也可以选择它们作为回测框架+vn.py实盘框架,回测当然可以选择多个框架进行测试,这样也可以得到更高的鲁棒性。不过话说回来,vn.py在回测方面也做得这么贴心和周到,确实很不容易。
REF
vn.py官方教程