Home >  > VN.PY 2.0学习记录一(如何回测)

VN.PY 2.0学习记录一(如何回测)

1

蜗牛博客VNPY学习记录:
VN.PY 2.0学习记录一(如何回测)
VN.PY 2.0学习记录二(策略开发)
Vn.py学习记录三(米筐教程)
VN.PY 2.0学习记录四(多线程、多进程)
Vn.py学习记录五–交易时间段及Widgets
Vn.py学习记录六(无界面模拟盘)
Vn.py学习记录七(V2.0.5版本)
Vnpy学习记录八(R-Breaker及pickle)
Vn.py学习记录九(事件驱动引擎)
VN.PY学习记录十(源码概述)
VNPY学习记录11(微信+Vscode)
VNPY学习记录12(父子进程、回调函数)
VNPY学习记录13(部署到云服务器,实现自动交易)

一、通过getdata.py获取回测数据
现在VNPY与米筐合作,可以非常方便地获得相关数据。

1.填写下载账号
这里又有一个坑,首先说明一下,下载了VN.PY的安装文件,解压缩之后,会有一个VNPY的文件夹,然后执行了安装程序之后,会在C:\ProgramData\VNConda\Lib\site-packages\下面也生成一个VNPY的文件夹。

我之前说过,写策略需要在C:\ProgramData\VNConda\Lib\site-packages\vnpy\app\cta_strategy\strategies这个文件夹下面建立,不然根本无法加载。然后今天打算测试回测的时候,因为记得之前看教程说需要在一个文件中输入ricqquant的账号与密码,所以我一个劲地在C:\ProgramData\VNConda\Lib\site-packages\vnpy\这个文件夹下面找文件,找了一通没有找到。后来竟然在F:\vnpy\vnpy-2.0.2\tests\backtesting\这里面找到了,要修改的其实就是getdata.py文件!

打开getdata.py文件,填写账号与密码。

注意:
填写代码时要注意大小写,比如螺纹钢要写“RB88.SHFE”才能下载到数据,用rb88.SHFE就不行。

2.获取数据

执行getdata.py文件,然后“咚"的一声,又掉坑里了。出现如下的错误提示:

rqdatac.share.errors.AuthenticationFailed: authentication failed.

不知是因为现在是五一假期非交易时间段,还是账号的原因,反正就是取不到数。

Updated on Jul.06 2019:

1.这里经后来确认,是由于我输错了账号、密码的原因。米筐的账号、密码是make.bat里面的那个,不是注册网站的那个。

2.这个getdata文件随便放哪儿都可以。

只要填写了正确的RQdata账号与密码,那么就可以取到数据了:

取到的数据是直接写入到了sqlite数据库,比如我设定的是取20190501-20190601的数据,这里就已经取到了。

导入的数据在哪儿呢?
默认生成的databased.db文件在当前运行目录下的.vntrader下,我的是在c盘user目录下的.vntrader里面。可以使用SQLiteSPY查看:

二、自己写代码获取数据
其实这一部分完全是自己最开始使用的时候,无法通过getdata.py文件获取数据折腾出来的,当作自己的笔记放这儿吧,大家如果是通过其他途径获的数据,可以将这个作为参考如何导入数据。

(一)安装jupyter
安装好VN.py2.0.2之后,jupyter是用不了的,需要用下面的命令重新安装。

pip install jupyter

(二)试用ricequant

1.RQDatac

pip install --extra-index-url https://rquser:ricequant99@py.ricequant.com/simple/ rqdatac

2.配置License
直接执行ricequant提供的make.bat文件即可,然后重启CMD窗口。

3.取tick数据
新建quant.py文件,代码如下:

import rqdatac as rq
from rqdatac import *
rq.init()

rq.get_price('000001.XSHE','2018-3-23','2018-3-23','tick')

成果展示:

4.取股票数据

import rqdatac as rq
import pandas as pd
from rqdatac import *
rq.init()

data = rq.get_price('平安银行','2018-3-23','2018-4-23')
df = pd.DataFrame(data)
df.to_csv('pingan.csv')

成果展示:

备注:
默认取一天的数据,如果要取一分钟的数据则用:

data = rq.get_price('平安银行','2018-3-23','2018-3-28','1m')

函数的详细用法看这里:
https://www.ricequant.com/doc/rqdata-institutional#research-API-get_price

5.获取1分钟数据

import rqdatac as rq
import pandas as pd
from rqdatac import *
rq.init()

FIELDS = ["open", "high", "low", "close", "volume"]

data = rq.get_price(
    "IF88",
    frequency="1m",
    fields=FIELDS,
    start_date='20190101',
    end_date='20190630'
)

df = pd.DataFrame(data)
df.to_csv('cf88new.csv')

(三)载入CSV文件
1.按下面的格式整理一份CSV文件,

2.导入数据:
执行VNPY的“功能————CSV导入”功能。

这里又有一个小坑,VN.PY默认的表头信息是“Open,High,Low,Close”这样第一个字母大写的形式,而从ricequant导出的数据是“open,high,low,close”这样第一个不是大写的,当我第一次运行的时候,明明所有字段都错了,却只提示我“volume”这个字段出错,结果我就在那里找呀找呀,找了半天没找到到底哪里出错了,后来才发现是这个字段首字母大小写的问题。

3.导入成功:

备注:
上面整理数据的那一步其实可以省略,设定好字段后,程序会自动识别。
另外,第二次导入数据之后,会在第一次的数据后面添加数据。

4.查看数据

三、策略回测
(一)回测方法一
使用vnpy的UI界面进行回测,这个简单,就不说了。
(二)自己写代码回测
新建一个q2.py文件用于回测,比如我的就放在C:\Users\Administrator\下面。
写回测代码:

from vnpy.app.cta_strategy.backtesting import BacktestingEngine
from vnpy.app.cta_strategy.strategies.boll_channel_strategy import BollChannelStrategy
from datetime import datetime

engine = BacktestingEngine()
engine.set_parameters(
	vt_symbol = "000001.SZSE",
	interval ="d",
	start = datetime(2018,3,23),
	end = datetime(2018,4,23),
	rate = 0,
	slippage = 0,
	size = 300,
	pricetick = 0.2,
	capital = 1_000_000,
	)

engine.add_strategy(BollChannelStrategy,{})
engine.load_data()
engine.run_backtesting()
df = engine.calculate_result()
engine.calculate_statistics()
engine.show_chart()

执行q2.py成果展示:

四、解决问题
上面的回测虽然运行成功,可是没有任何成交数据。到底是什么原因呢?代码问题?数据导入的时候的格式问题?还是其他的问题。

后来通过测试发现是数据量的问题,我用来测试的数据量太少了,后来将测试的1分钟数据期间改为2个月,终于好了。
成果展示:

图形展示:

用两个月数据大致测试了一下各个策略的年化收益率:
AtrRsiStrategy 16.88%

BollChannelStrategy 21.75%

DoubleMaStrategy -222.75%

DualThrustStrategy 48.12%

KingKeltnerStrategy 报错

MultiSignalStrategy -279%

MultiTimeframeStrategy 18.27%

TestStrategy 报错

TurtleSignalStrategy 134.98

看一个IF88.CFFEX从2016,1,1到2019,7,1的策略,有的年份很赚, 有的年份还会亏钱:

暧昧帖

本文暂无标签
Comment (0)
Trackback (1)

发表评论

*

*