VNPY应用入门/进行量化策略回测02(不谈理论,只谈应用)


(sonyzh) #1

喜欢周五写写笔记啊。。。。。。

上次讲到策略初始化,开始读取了第一根5Min Bar。
回到strategyKingKelter.py中的onFiveBar函数:

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘639’%20height='350’>)

在每根Bar数据开始计算之前,如果遇到之前有没有成交的订单,都直接取消掉,这块跟你自己的策略如何设置有关系,可以进行修改。
接下来初始化

在ctaTemplate.py中找到ArrayManager()函数,我们可以看到这个是个K线管理工具

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘357’%20height='316’>)

储存最近的100个bar值,这个你可以自己定义内存长度,另外有最高、最低价等序列,方便回测计算。(你想储存的任何序列值都可以在这里定义)

  • am.updateBar(bar)

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘637’%20height='471’>)

如果还没有存储够100个Bar值就不更新,如果超过size = 100,那么就把最初的Bar移除,把新的bar加入进来。

  • if not am.inited:
    return

在am初始化前不做下面执行,这里的话回顾上我们上篇笔记,其实还在策略初始话init阶段,如果初始化数据超过了am的初始化数据量,程序会继续向下执行,但是并不会产生交易,因为在下单环节,还会识别现在是不是trading状态,这个马上会讲到。这个时候我们回到strategyKingKeltner.py的onInit都执行完毕后,再回到上一层runBacktesting函数里,继续执行。

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘477’%20height='212’>)

这个时候我们的策略初始化就完成了,接着我们将strategy,trading 设置为True,接着执行onStart()函数

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘657’%20height='144’>)

这里默认没有什么内容,如果你想在策略启动前做些什么策略动作,可以在这里添加。

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘486’%20height='241’>)

接着开始回放数据,进行真正的策略交易阶段。dbCursor就是上篇笔记中我们记录的从数据库中取出交易数据代码。继续执行func(data), func = self.newBar.

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘525’%20height='298’>)

self.crossLimitOrder()就是会在每个新的bar推送过来的时候,先去模拟撮合限价单,这里可以写自己的想要的撮合成交条件。

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘821’%20height='346’>)

先根据是bar数据还是tick数据定义出撮合成交的价格(buycrossprice,sellcrossprice等)

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘714’%20height='420’>)

遍历限价单字典中所有的限价单,如果发生了成交,那么新建一个trade类对象

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘537’%20height='369’>)

如果发生了成交,那么记录下交易价格(trade.price)和现在的策略持仓(strategy.pos),将成交对象(trade)添加进入trade列表(tradeDict),之后我们会用trade列表来计算策略表现

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘533’%20height='359’>)

如果这个限价单成交了,那么就从限价单列表里删除它。

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘499’%20height='98’>)

接着我们回到ctaBacktesting.py里面的runbacktesting函数,接着撮合停止单,然后执行self.strategy.onBar(bar),就跟我们开始初始化策略时执行的路径一样了:

onBar -> bg.updateBar(bar) -> self.onXminBar(self.xminBar) (这里调用KK策略的onFiveBar)

本篇文章就写到这里,下一篇写发送Order和最后策略收益等测算的代码逻辑。