日期时间管理 – backtrader中文教程
在发布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
为最终用户提供以下
日期时间输入
- 默认情况下,平台不会触及数据源提供的日期时间
有了这个决定,内部使用的时间
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 #
甚至比上面的工作更少。
显然MyFeed
,MyFeedAuto
在上面的示例中只是虚拟名称。
评论被关闭。