vn.py是一套基于Python的开源量化交易系统开发框架,于2015年1月正式发布,在开源社区5年持续不断的贡献下一步步成长为全功能量化交易平台,目前国内外金融机构用户已经超过300家,包括:私募基金、证券自营和资管、期货资管和子公司、高校研究机构、自营交易公司、交易所、Token Fund等。
vnpy 也开始支持一些主流的数字货币交易所 ,所以也开始研究一下vnpy怎么使用
历史数据导入数据库:
这里我用的是mongodb,vnpy1.9版本貌似只支持mongodb,在2.0版本中可以使用其他的数据库。vnpy回测的时候是从数据库里面读取数据,所以直接读取.csv文件是没有办法的。所以,想要回测数据必须先把手里的 .csv 文件上传到数据库里边,数据格式如下。
上图是我们手中的历史数据,下图是已经转好格式的数据库中的数据。
转入数据库代码:
# encoding: UTF-8
import tempfile
import unittest
from vnpy.app.csv_loader import CsvLoaderEngine
from vnpy.trader.constant import Exchange, Interval
import pandas as pd
#预处理
def pre_proc(f):
df = pd.read_csv(f,encoding='gbk')
df['Datetime'] = df['Date'] +" "+ df['Time'] #合并日期与时间
del(df['Date']) # 把原来的日期时间 删除
del(df['Time'])
df.to_csv('rb0000_1min_x.csv',encoding='gbk',index=None)
engine = CsvLoaderEngine(None, None)
f = open('rb0000_1min_x.csv', 'r')
f.seek(0)
engine.load_by_handle(
f,
symbol="rb0000",
exchange=Exchange.SHFE,
interval=Interval.MINUTE,
datetime_head="Datetime",
open_head="Open",
close_head="Close",
low_head="Low",
high_head="High",
volume_head="TotalVolume",
datetime_format="%Y-%m-%d %H:%M:%S",
)
print('存入成功')
if __name__ == '__main__':
pre_proc('IF0000_1min.csv')
代码是直接从examp文件夹copy 过来,设置即可运行
# vn.trader模块
from datetime import datetime
from vnpy.app.cta_backtester.engine import BacktestingEngine
from vnpy.app.cta_backtester.engine import OptimizationSetting
from vnpy.app.cta_strategy.strategies.atr_rsi_strategy import AtrRsiStrategy
def main():
# 创建一个回测引擎
engine = BacktestingEngine()
engine.set_parameters(
vt_symbol ='rb0000.SHFE',
interval='1m',
start= datetime(2010, 1, 1),
rate=0.003,
slippage=0.2,
size=300,
pricetick=0.2,
capital= 1_000_000,
end= datetime(2015, 1, 1),
)
engine.add_strategy(AtrRsiStrategy,{})
engine.load_data()
engine.run_backtesting()
df = engine.calculate_result()
engine.calculate_statistics()
engine.show_chart()
setting = OptimizationSetting()
setting.set_target("sharpe_ratio")
setting.add_parameter("atr_length", 3, 39, 1)
setting.add_parameter("atr_ma_length", 10, 30, 1)
engine.run_ga_optimization(setting)
if __name__ == '__main__':
main()