量化交易学习(四十一)backtrader文档——日期时间管理
今天这篇是backtrader文档的学习笔记。主要介绍了日期时间管理。
官方文档链接:https://www.backtrader.com/docu/timemgmt/
日期时间管理
在1.5.0版本之前,backtrader使用直接的时间管理方法,因为数据源计算的任何日期时间都只是按表面值使用。
这对于任何用户输入参数都是一样的,比如可以给任何数据源的fromdate
(或sessionstart
)参数。
对于可以直接用于回测的固定数据源,该方法很好。很容易假设输入日期时间在进入系统之前就已经得到处理。
但在 1.5.0 版本之后,支持实时数据源,这迫使我们考虑日期时间管理。如果以下情况始终为真,则不需要此类管理:
-
纽约的一位交易员交易 ES-Mini。两者都使用相同的
US/Eastern
时区 -
柏林的一名交易员正在交易 DAX 期货。在这种情况下,两者都使用相同的CET(或Europe/Berling)时区。
上面的情况下直接输入输出日期时间方法是可行的,因为交易者(例如在柏林)总是可以执行如下操作:
1 | class Strategy(bt.Strategy): |
当柏林的同一交易者决定交易 ES-Mini
时,直接的日期管理方法的问题就显现出来了。因为夏令时的更改发生在一年中的不同时间点,这会导致一年中的几周时差不同步。以下代码并不总是有效:
1 | class Strategy(bt.Strategy): |
处理时区
为了解决上述情况并仍然与直接输入输出时间方法兼容,backtrader为最终用户提供以下功能
Datetime Input
-
默认情况下,平台不会处理数据源提供的日期时间
-
最终用户可以通过以下方式覆盖输入的日期时间:
- 向数据源提供
tzinput
参数。这必须是与接口兼容的datetime.tzinfo
对象。用户很可能会提供一个pytz.timezone
实例
- 向数据源提供
这样处理后,
backtrader
内部使用的时间被认为是UTC-like
格式的,即:-
如果数据源已经以
UTC
格式存储 -
经过
tzinput
转换 -
这不是真的UTC,但它是用户的参考,因此称为
UTC-like
-
Datetime output
-
如果数据源可以自动确定输出的时区,则这将是默认值
这在实时数据源的情况下是有意义的,尤其是在类似于在柏林(
CET
时区)的交易者使用US/Eastern
时区进行交易的情况下。因为交易者总是能获得正确的时间,并且在上面的示例中,开盘时间保持恒定为
09:30 US/Eastern
,而不是在一年中的大部分时间为15:30 CET
,但有时候在16:30 CET
,有时候在14:30 CET
。 -
如果无法确定时区,则输出将是在输入(UTC-like)时确定的
-
最终用户可以覆盖并指定实际输出的时区
- 向数据源提供
tz
参数。这必须是与datetime.tzinfo
接口兼容的对象。用户很可能会提供一个pytz.timezone
实例
- 向数据源提供
注意:
来自用户的输入例如参数fromdate
或sessionstart
期望与实际的tz
同步,无论是由数据源自动计算、由用户提供还是保留为默认值(None
,这意味着日期时间的直接输入输出)
考虑到所有这些,让我们回想一下柏林交易员,在US/Eastern
时区交易的例子:
1 | import pytz |
对于可以自动确定输出时区的数据源:
1 | import bt |
甚至比上面的工作还要少。
显然,在上面的示例中,MyFeed
和MyFeedAuto
只是虚拟名称。
这一篇就到这里啦。欢迎大家点赞、转发、私信。还没有关注我的朋友可以关注 江达小记