zvtvz / zvt

modular quant framework.
https://zvt.readthedocs.io/en/latest/
MIT License
3.13k stars 856 forks source link

关于对回测的抽象 #109

Closed weiguang-zz closed 3 years ago

weiguang-zz commented 3 years ago

非常欣赏你对数据的抽象部分,非常赞,我本人对抽象也非常感兴趣,想就你对于回测的抽象跟你探讨下,从readme中看到的你对于回测的抽象是: 在某时间点,找到符合条件的标的,对其进行买卖,看其表现。 这种抽象有如下几种局限性:

  1. 不能感知到某些非时间事件,比如订单成交,这类事件在实盘的时候是很重要的。
  2. 没有对时间事件进行建模,比如如果我的策略是想在收盘后5分钟执行某个操作,而不同交易标的的收盘时间是不一样的。我的策略代码就需要进行各种判断
  3. 为了让你的回测引擎能够适配尽量多的策略,你需要是将时间事件的频率设置得足够低,比如按秒级别,这会导致性能损失,且如果策略是需要感知到tick级别的数据时,即使秒级别的时间也是不能满足的。

鉴于此: 我觉得对于回测的抽象应该是: 当发生某个事件时(这个事件可以是时间事件、tick事件、订单事件、账户事件),对账户的投资组合进行调整,看其表现

foolcage commented 3 years ago

@weiguang-zz 整个回测其实是轮询的方式,时间间隔可以足够低,即IntervalLevel的设置,可以支持tick 1.订单其实也是时间事件,因为一切的事件驱动,本质还是“轮询”,做过嵌入式驱动的“看门狗”都知道。 目前流行的事件驱动不过是把那一层屏蔽了。

2.收盘后5分钟执行操作,可以在on_trading_close之后设置一个timer来做。 大部分跟时间相关的操作都可以在on_xxx的回调里面来自定义。

3.嗯,级别越低,各方面要求越高,目前zvt定位是分钟级别的。

你的抽象很棒!可以通过扩展相应的回调函数来满足你的要求。 纯事件驱动最主要的问题是做多级别同步时很麻烦,而"区间套"之类的策略用轮询的方式会比较自然。 这跟个人的交易理念有关,相比精度,交易延时,个人更看重“全市场”的大局。

weiguang-zz commented 3 years ago

关于第二个问题,我其实是想说用户期待一个更简单的方式来处理时间事件,虽然你提供的分钟级别的回调能满足要求,但是用户需要在回调逻辑中进行各种判断。可以参考zipline的回测引擎,它提供对时间事件的建模,比如用户的策略如果想在收盘前5分钟做一些事情,只需要这么做 algo.schedule_function(func, date=every_day(), time=market_close(offset=5))

foolcage commented 3 years ago

Thanks,不错。“某个时间点用户自定义函数“” 可以提供插入接口。 目前最原始的就是on_timestamp里面自由发挥了。 类似的常用的通用一些的功能,可以抽象出专门的插入接口,欢迎多提意见,一起完善。

weiguang-zz commented 3 years ago

不客气,加油加油