vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 42
声望: 0

description

vnpy 回测引擎 BacktestingEngine 方法 run_backtesting() 中有一段代码,是在回测真正开始之前,处理以指标数据的,以 data 为入参,让 self.callback处理,断点之后看到,它绑定了回测策略的 on_bar() 函数,也就是说会把数据传回给 策略的on_bar() 函数。

description

但是 self.callback 只是在引擎初始化函数里被定义了一下(None)其他找不到跟策略的 on_bar() 函数绑定的地方。

我对回调函数不熟,只知道最基本的用法,希望大拿们指点。多谢。

Administrator
avatar
加入于:
帖子: 4122
声望: 229

在load_bar函数里有绑定

Member
avatar
加入于:
帖子: 42
声望: 0

多谢群主,找到绑定的地方了。

再请教个问题,还是这个函数里,对于发出市场数据事件驱动策略运行来说,可以在循环内 反复执行 self.callback(data),就是

        for ix, data in enumerate(self.history_data):
                 ......
                self.callback(data)
                ......

```.

也可以像下边的循环一样
    for data in self.history_data[ix:]:
            func(data)
             ......

```

在 run_backtesting() 中两个方法都用了,前者用于处理预载入数据,后者用于正式的回测。感觉好像没什么区别,最后都是回调策略的 on_bar() 函数,感觉不把历史数据拆成两段跑也没事,而且统一用同一个方法推data驱动策略运行也都可以。

群主能否说一说当时是如何考虑的,我也好加深对代码的理解,多谢。

Member
avatar
加入于:
帖子: 733
声望: 35
  1. 历史数据拆两段应该是为了初始化。初始化和正式回测是分开的,在初始化的时候trading状态是false,初始化成功才能把trading状态变为True。
  2. 初始化完成之后用func可能是前面有一个tick和bar的判断吧
Member
avatar
加入于:
帖子: 42
声望: 0

了解了,多谢

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3