原生的backtrader并不支持tick数据的回测,论坛里面也有一些使用者讨论如何用backtrader回测tick数据,其实,最近也一直有在思考这个问题,这篇文章就分享下,如何做。在开始之前,先分析下,这么做的一些缺点。
高频回测的测不准原理
对于中低频的趋势交易策略,如果交易量不是很大的话,单个交易策略对市场的影响微乎其微,可以只考虑市场什么情况,在这种情况下,考虑交易成本之后,回测有一定的可靠性。
高频的交易,本身可能对这个市场就有很大的影响,自身的行为就可能导致市场行为发生改变,使用历史数据回测,即使不考虑交易成本,也很难得到准确的结果。听说,很多高频策略都是直接上模拟盘,小仓位测试,到实盘。高频策略主要是靠理论支撑的,主要是以速度制胜,回测可能没有那么重要。
上面是一个没有做过高频策略的quant的一家之言,也可能不准确哈,仅供参考。
用python去回测tick数据的不足
backtrader是基于python的量化交易框架,python作为一门解释性语言,相对于C++等编译性语言,运行速度会慢上好多。而tick数据本身数据量就比较多,导致python写的量化框架,回测tick数据的时候,都需要耗时比较多。
backtrader本身机制比较完善,里面的order等,自带了丰富的信息,会导致在运行的过程中,内存会不断增大,如果回测的tick数据比较多,几十个G的内存很有可能不够。
总结一下,使用python本身速度比较慢,使用backtrader会额外消耗内存,导致,用backtrader回测大量的tick数据,是一个又慢又占内存的事,是一个事半功倍的努力。
为什么还要用backtrader来回测tick数据
不会c++等语言是一个限制
如果是专门做高频的策略的话,建议就换个平台吧。不要用backtrader了,即使用backtrader,实盘的时候也得改平台。用python去做高频,如果你有一颗慈善的心,愿意捐钱的话,当我没说。
没找到其他更好的python框架
python语言很容易学,有很多基于python的量化框架。但是,到目前为止,还没有找到,或者没有注意到,有哪家是能够支持tick数据的回测的。
backtrader本身有很大的优势
backtrader的优势,就不需要我一遍遍去强调了。
如何用backtrader来回测期货的tick数据
因为backtrader对数据提供了很好的扩展功能,对于高开低收成交量持仓量等之外的数据,可以很容易添加进来。具体的扩展数据的案例,可以参考本文。
如果要改造tick数据,应该怎么做呢?
1. 期货的tick数据,都包含哪些内容?
这是我用一个软件采集的期货的tick数据,包含了下面的字段:
localtime (本机写入TICK的时间),
InstrumentID (合约名),
TradingDay (交易日),
ActionDay (业务日期),
UpdateTime (时间),
UpdateMillisec(时间毫秒),
LastPrice (最新价),
Volume(成交量) ,
HighestPrice (最高价),
LowestPrice(最低价) ,
OpenPrice(开盘价) ,
ClosePrice(收盘价),
AveragePrice(均价),
AskPrice1(申卖价一),
AskVolume1(申卖量一),
BidPrice1(申买价一),
BidVolume1(申买量一),
UpperLimitPrice(涨停板价)
LowerLimitPrice(跌停板价)
OpenInterest(持仓量),
Turnover(成交金额),
PreClosePrice (昨收盘),
PreOpenInterest (昨持仓),
PreSettlementPrice (上次结算价),
2. backtrader在回测的时候需要传入的数据
backtrader传入数据的时候,一般都是需要使用到open\high\low\close这四个价格,为了符合回测的逻辑,让最新价等于open\high\low\close,并且可以额外添加几个列,比如AskVolume1(卖量一),BidVolume1(买量一)。
这样做有一个缺陷:使用限价单的时候,其实并不能知道能不能成交。比如价格6元的买订单,最新价在5.9元的时候,是会成交的,但是并不能知道最新价在6.00的时候会不会成交。这是一个缺陷。
如果想要避免这个,就需要开发逐tick回测的模式。
目前这个只是基于bar进行的改造,是对现实的一个逼近。理论上是存在更好的回测方法的。
处理原始数据,生成backtrader需要的数据
import pandas as pdimport numpy as npdata = pd.read_csv("c:/result/rb2105.csv")data['datetime']=pd.to_datetime([str(x)+" "+str(y)+"."+str(z) for x,y,z in zip(data['ActionDay'], data["UpdateTime"],data['UpdateMillisec'])])data['open'] = data['LastPrice']data['close'] = data['LastPrice']data['high'] = data['LastPrice']data['low'] = data['LastPrice']data['volume'] = data['Volume']data= data[['datetime','open','high','low','close','volume','AskPrice1','AskVolume1','BidPrice1','BidVolume1']]data.to_csv("rb2105.csv",index=False)3. 使用backtrader回测期货tick数据的一个小案例
注:这个策略是toy strategy,仅仅是为了测试tick数据随手编写的,大家可以根据自己的需要,改进相关的策略逻辑。
相关的策略代码可以在原文中找到。
————————————————
版权声明:本文为CSDN博主「云金杞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:60、【backtrader期货测策】如何用backtrader回测期货tick数据?_云金杞-CSDN博客