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

加载数据周期:日K线
数据库:sqlite
今天偶然发现的,自己写的脚本回测和官方图形化引擎的回测结果有出入,加载的是从2015年1月5日至今的数据。细查发现官方回测引擎加载的数据少了不少天数,例如2015年2月4日的日K线数据就没有加载。最后定位到下方的源码:

# vnpy/app/cta_backtester/ui/widget.py BacktesterManager start_backtesting()
start = self.start_date_edit.date().toPyDate()
end = self.end_date_edit.date().toPyDate()

官方回测引擎的load_data()方法是按30天为周期加载数据的,而2015年2月4日刚好是2015年1月5日开始的第30天,在边界值上。这里是将图形化界面了日期编辑栏转换为Python的datetime.date类型。不知道为什么导致了漏数据。我将其修改为

# vnpy/app/cta_backtester/ui/widget.py BacktesterManager start_backtesting()
start = self.start_date_edit.dateTime().toPyDateTime()
end = self.end_date_edit.dateTime().toPyDateTime()

转换为datetime.datetime类型,官方图形化回测引擎加载的数据量就和自己的脚本一致了,2015年2月4日的K线也能看到了。不清楚其它数据周期会不会存在这个问题。

Administrator
avatar
加入于:
帖子: 4646
声望: 266

啊,请在Github开个Issue吧,我们安排同事来处理

Member
avatar
加入于:
帖子: 2104
声望: 139
  1. 请问你的日线数据是几点开始的呢?
    如果有漏数据的情况,可能是日线数据时间戳导致的。在backtesting.py下的load_data函数,会直接读取输入的start和end,然后30天30天的读取。举个例子,如果你的数据是21:00:00开始,那么如果上一个end是2015.2.4:00:00:00,下一个时间段的start则会是2015.2.5:00:00:00。那么,如果你的数据是00:00:00开始应该就不会漏掉,而如果你的数据是2015.2.4:21:00:00,它又大于上一个end,小于下一个start,那么就会被漏掉。因为load_data是输入start/end/interval...去取数据的,所以是无法预知你日K线的开始时间的。
    解决这个问题有几个方法,一是通过传入之前把日线统一调到0点开始。二是用jupyter跑,把start和end写清楚(不仅是日期,把开始时间也写上),这样就不会漏了。
    description
    但是这样和图形界面不统一,因为图形界面默认就是输入日期。三是直接改造load_data,这样两边都统一,但是不推荐。

  2. 我试了你的代码,在我这里是无法解决漏数据的问题的。我试着用原来的代码,jupyter和图形界面load的数据量是一样多的。如果你load的不一样,通过附上的方法解决了,能否附上截图看一下呢?
    description

description

Member
加入于:
帖子: 11
声望: 2

用Python的交易员 wrote:

啊,请在Github开个Issue吧,我们安排同事来处理

已提交issue。

Member
加入于:
帖子: 11
声望: 2

xiaohe wrote:

  1. 请问你的日线数据是几点开始的呢?

我在github上提交了issue,具体重现方式可以查看issue上的描述。很奇怪的就是日数据的时间都是00:00的,只要把时间的类型从datetime.date变为datetime.datetime就正常了。

Member
加入于:
帖子: 11
声望: 2

用Python的交易员 wrote:

啊,请在Github开个Issue吧,我们安排同事来处理

https://github.com/vnpy/vnpy/issues/2738

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

沪公网安备 31011502017034号