在发布1.5.0之前,backtrader使用直接的时间管理方法,因为数据源计算的任何日期时间都只是按面值使用。

对于任何用户输入也是如此,例如可以提供给任何数据源参数 fromdate(或)sessionstart

考虑到直接控制用于回测的冻结数据源,这种方法很好。很容易假设输入的日期时间在进入系统之前就已经处理好了。

但是在 1.5.0 中,支持实时 数据源,这迫使考虑日期时间管理如果以下情况始终为真,则不需要此类管理:

  • 纽约的一位交易员交易 ES-Mini。两者 US/Eastern(或其中一个别名)的时区
  • 柏林的一位交易员交易 DAX 期货。在这种情况下,CET (或Europe/Berling)时区都适用

上面的直接输入-输出日期时间方法会起作用,因为例如柏林的交易者总是可以做这样的事情:

class Strategy(bt.Strategy):

    def next(self):

        # The DAX future opens at 08:00 CET
        if self.data.datetime.time() < datetime.time(8, 30):
            # don't operate until the market has been running 30 minutes
            return  #

当柏林的同一位交易员决定交易ES-Mini. 因为从DST到 DST 的更改发生在一年中的不同时间点,这导致时差在一年中的几周内不同步。以下内容并不总是有效:

class Strategy(bt.Strategy):

    def next(self):

        # The SPX opens at 09:30 US/Eastern all year long
        # This is most of the year 15:30 CET
        # But it is sometimes 16:30 CET or 14:30 CET if a DST switch on-off
        # has happened in the USA and not in Europe

        # That's why the code below is unreliable

        if self.data.datetime.time() < datetime.time(16, 0):
            # don't operate until the market has been running 30 minutes
            return  #

时区操作

为了解决上述情况并仍然与直接输入输出时间方法兼容,backtrader为最终用户提供以下

日期时间输入

  • 默认情况下,平台不会触及数据源提供的日期时间
    • 最终用户可以通过以下方式覆盖此输入:
    • tzinput数据源提供参数。这必须是与datetime.tzinfo接口兼容的对象。用户很可能会提供一个pytz.timezone实例

    有了这个决定,内部使用的时间backtrader被认为是UTC-like格式,即:

    • 如果数据源已经以UTC格式存储
    • 通过转换后tzinput
    • 这不是真的UTC,但它是用户的参考,因此 UTC-like

日期时间输出

  • 如果数据馈送可以自动确定输出的时区,这将是默认值

    这在实时提要的情况下是有意义的,尤其是在柏林(CET时区)的交易员使用时区交易产品的用例中US/Eastern

    因为交易者总是得到正确的时间,在上面的例子中, 开盘时间保持不变09:30 US/Eastern,而不是 15:30 CET一年中的大部分时间,但有时16:30 CET有时 14:30 CET

  • 如果无法确定,则输出将是在输入(UTC-like)时间内确定的任何内容
  • 最终用户可以覆盖并确定输出的实际时区
    • tz为数据源提供参数。这必须是与datetime.tzinfo接口兼容的对象。用户很可能会提供一个pytz.timezone实例

考虑到所有这些,让我们回想一下柏林交易员的交易 US/Eastern

import pytz

import bt

data = bt.feeds.MyFeed('ES-Mini', tz=pytz.timezone('US/Eastern'))

class Strategy(bt.Strategy):

    def next(self):

        # This will work all year round.
        # The data source will return in the frame of the 'US/Eastern' time
        # zone and the user is quoting '10:00' as reference time
        # Because in the 'US/Eastern' timezone the SPX index always starts
        # trading at 09:30, this will always work

        if self.data.datetime.time() < datetime.time(10, 0):
            # don't operate until the market has been running 30 minutes
            return  #

对于可以自动确定输出时区的数据源

import bt

data = bt.feeds.MyFeedAutoTZ('ES-Mini')

class Strategy(bt.Strategy):

    def next(self):

        # This will work all year round.
        # The data source will return in the frame of the 'US/Eastern' time
        # zone and the user is quoting '10:00' as reference time
        # Because in the 'US/Eastern' timezone the SPX index always starts
        # trading at 09:30, this will always work

        if self.data.datetime.time() < datetime.time(10, 0):
            # don't operate until the market has been running 30 minutes
            return  #

甚至比上面的工作更少。

显然MyFeedMyFeedAuto在上面的示例中只是虚拟名称。

评论被关闭。