BackTrader 中文文档(十七)(1)https://developer.aliyun.com/article/1505384
策略的额外奖金
第一个 datetime
,属于策略的那个时间,总是在另一个时区,实际上是 UTC
。也随着此版本 1.9.42.116
这可以被同步。下面的参数已添加到 Cerebro
中(在实例化期间或使用 cerebro.run
时使用)
- ``tz`` (default: ``None``) Adds a global timezone for strategies. The argument ``tz`` can be - ``None``: in this case the datetime displayed by strategies will be in UTC, which has been always the standard behavior - ``pytz`` instance. It will be used as such to convert UTC times to the chosen timezone - ``string``. Instantiating a ``pytz`` instance will be attempted. - ``integer``. Use, for the strategy, the same timezone as the corresponding ``data`` in the ``self.datas`` iterable (``0`` would use the timezone from ``data0``)
它也支持 cerebro.addtz
方法:
def addtz(self, tz): ''' This can also be done with the parameter ``tz`` Adds a global timezone for strategies. The argument ``tz`` can be - ``None``: in this case the datetime displayed by strategies will be in UTC, which has been always the standard behavior - ``pytz`` instance. It will be used as such to convert UTC times to the chosen timezone - ``string``. Instantiating a ``pytz`` instance will be attempted. - ``integer``. Use, for the strategy, the same timezone as the corresponding ``data`` in the ``self.datas`` iterable (``0`` would use the timezone from ``data0``) '''
重复上次的日内示例运行,并使用 0
作为 tz
(与 data0
的时区同步),以下是关注相同日期和时间的输出:
$ ./tcal-intra.py --owncal --cerebro tz=0 ... Strategy len 6838 datetime 2016-11-25 13:00:00 Data0 len 6838 datetime 2016-11-25 13:00:00 Data1 len 15 datetime 2016-11-23 16:00:00 Strategy len 6839 datetime 2016-11-25 13:01:00 Data0 len 6839 datetime 2016-11-25 13:01:00 Data1 len 16 datetime 2016-11-25 13:01:00 Strategy len 6840 datetime 2016-11-28 09:31:00 Data0 len 6840 datetime 2016-11-28 09:31:00 Data1 len 16 datetime 2016-11-25 13:01:00 Strategy len 6841 datetime 2016-11-28 09:32:00 Data0 len 6841 datetime 2016-11-28 09:32:00 Data1 len 16 datetime 2016-11-25 13:01:00 ...
时间戳现在是时区对齐的。
示例用法(tcal.py)
$ ./tcal.py --help usage: tcal.py [-h] [--data0 DATA0] [--offline] [--fromdate FROMDATE] [--todate TODATE] [--cerebro kwargs] [--broker kwargs] [--sizer kwargs] [--strat kwargs] [--plot [kwargs]] [--pandascal PANDASCAL | --owncal] [--timeframe {Weeks,Months,Years}] Trading Calendar Sample optional arguments: -h, --help show this help message and exit --data0 DATA0 Data to read in (default: YHOO) --offline Read from disk with same name as ticker (default: False) --fromdate FROMDATE Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: 2016-01-01) --todate TODATE Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: 2016-12-31) --cerebro kwargs kwargs in key=value format (default: ) --broker kwargs kwargs in key=value format (default: ) --sizer kwargs kwargs in key=value format (default: ) --strat kwargs kwargs in key=value format (default: ) --plot [kwargs] kwargs in key=value format (default: ) --pandascal PANDASCAL Name of trading calendar to use (default: ) --owncal Apply custom NYSE 2016 calendar (default: False) --timeframe {Weeks,Months,Years} Timeframe to resample to (default: Weeks)
示例用法(tcal-intra.py)
$ ./tcal-intra.py --help usage: tcal-intra.py [-h] [--data0 DATA0] [--fromdate FROMDATE] [--todate TODATE] [--cerebro kwargs] [--broker kwargs] [--sizer kwargs] [--strat kwargs] [--plot [kwargs]] [--pandascal PANDASCAL | --owncal] [--timeframe {Days}] Trading Calendar Sample optional arguments: -h, --help show this help message and exit --data0 DATA0 Data to read in (default: yhoo-2016-11.csv) --fromdate FROMDATE Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: 2016-01-01) --todate TODATE Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: 2016-12-31) --cerebro kwargs kwargs in key=value format (default: ) --broker kwargs kwargs in key=value format (default: ) --sizer kwargs kwargs in key=value format (default: ) --strat kwargs kwargs in key=value format (default: ) --plot [kwargs] kwargs in key=value format (default: ) --pandascal PANDASCAL Name of trading calendar to use (default: ) --owncal Apply custom NYSE 2016 calendar (default: False) --timeframe {Days} Timeframe to resample to (default: Days)
示例代码(tcal.py)
from __future__ import (absolute_import, division, print_function, unicode_literals) import argparse import datetime import backtrader as bt class NYSE_2016(bt.TradingCalendar): params = dict( holidays=[ datetime.date(2016, 1, 1), datetime.date(2016, 1, 18), datetime.date(2016, 2, 15), datetime.date(2016, 3, 25), datetime.date(2016, 5, 30), datetime.date(2016, 7, 4), datetime.date(2016, 9, 5), datetime.date(2016, 11, 24), datetime.date(2016, 12, 26), ] ) class St(bt.Strategy): params = dict( ) def __init__(self): pass def start(self): self.t0 = datetime.datetime.utcnow() def stop(self): t1 = datetime.datetime.utcnow() print('Duration:', t1 - self.t0) def prenext(self): self.next() def next(self): print('Strategy len {} datetime {}'.format( len(self), self.datetime.date()), end=' ') print('Data0 len {} datetime {}'.format( len(self.data0), self.data0.datetime.date()), end=' ') if len(self.data1): print('Data1 len {} datetime {}'.format( len(self.data1), self.data1.datetime.date())) else: print() def runstrat(args=None): args = parse_args(args) cerebro = bt.Cerebro() # Data feed kwargs kwargs = dict() # Parse from/to-date dtfmt, tmfmt = '%Y-%m-%d', 'T%H:%M:%S' for a, d in ((getattr(args, x), x) for x in ['fromdate', 'todate']): if a: strpfmt = dtfmt + tmfmt * ('T' in a) kwargs[d] = datetime.datetime.strptime(a, strpfmt) YahooData = bt.feeds.YahooFinanceData if args.offline: YahooData = bt.feeds.YahooFinanceCSVData # change to read file # Data feed data0 = YahooData(dataname=args.data0, **kwargs) cerebro.adddata(data0) d1 = cerebro.resampledata(data0, timeframe=getattr(bt.TimeFrame, args.timeframe)) d1.plotinfo.plotmaster = data0 d1.plotinfo.sameaxis = True if args.pandascal: cerebro.addcalendar(args.pandascal) elif args.owncal: cerebro.addcalendar(NYSE_2016) # Broker cerebro.broker = bt.brokers.BackBroker(**eval('dict(' + args.broker + ')')) # Sizer cerebro.addsizer(bt.sizers.FixedSize, **eval('dict(' + args.sizer + ')')) # Strategy cerebro.addstrategy(St, **eval('dict(' + args.strat + ')')) # Execute cerebro.run(**eval('dict(' + args.cerebro + ')')) if args.plot: # Plot if requested to cerebro.plot(**eval('dict(' + args.plot + ')')) def parse_args(pargs=None): parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=( 'Trading Calendar Sample' ) ) parser.add_argument('--data0', default='YHOO', required=False, help='Data to read in') parser.add_argument('--offline', required=False, action='store_true', help='Read from disk with same name as ticker') # Defaults for dates parser.add_argument('--fromdate', required=False, default='2016-01-01', help='Date[time] in YYYY-MM-DD[THH:MM:SS] format') parser.add_argument('--todate', required=False, default='2016-12-31', help='Date[time] in YYYY-MM-DD[THH:MM:SS] format') parser.add_argument('--cerebro', required=False, default='', metavar='kwargs', help='kwargs in key=value format') parser.add_argument('--broker', required=False, default='', metavar='kwargs', help='kwargs in key=value format') parser.add_argument('--sizer', required=False, default='', metavar='kwargs', help='kwargs in key=value format') parser.add_argument('--strat', required=False, default='', metavar='kwargs', help='kwargs in key=value format') parser.add_argument('--plot', required=False, default='', nargs='?', const='{}', metavar='kwargs', help='kwargs in key=value format') pgroup = parser.add_mutually_exclusive_group(required=False) pgroup.add_argument('--pandascal', required=False, action='store', default='', help='Name of trading calendar to use') pgroup.add_argument('--owncal', required=False, action='store_true', help='Apply custom NYSE 2016 calendar') parser.add_argument('--timeframe', required=False, action='store', default='Weeks', choices=['Weeks', 'Months', 'Years'], help='Timeframe to resample to') return parser.parse_args(pargs) if __name__ == '__main__': runstrat()
示例代码(tcal-intra.py)
from __future__ import (absolute_import, division, print_function, unicode_literals) import argparse import datetime import backtrader as bt class NYSE_2016(bt.TradingCalendar): params = dict( holidays=[ datetime.date(2016, 1, 1), datetime.date(2016, 1, 18), datetime.date(2016, 2, 15), datetime.date(2016, 3, 25), datetime.date(2016, 5, 30), datetime.date(2016, 7, 4), datetime.date(2016, 9, 5), datetime.date(2016, 11, 24), datetime.date(2016, 12, 26), ], earlydays=[ (datetime.date(2016, 11, 25), datetime.time(9, 30), datetime.time(13, 1)) ], open=datetime.time(9, 30), close=datetime.time(16, 0), ) class St(bt.Strategy): params = dict( ) def __init__(self): pass def prenext(self): self.next() def next(self): print('Strategy len {} datetime {}'.format( len(self), self.datetime.datetime()), end=' ') print('Data0 len {} datetime {}'.format( len(self.data0), self.data0.datetime.datetime()), end=' ') if len(self.data1): print('Data1 len {} datetime {}'.format( len(self.data1), self.data1.datetime.datetime())) else: print() def runstrat(args=None): args = parse_args(args) cerebro = bt.Cerebro() # Data feed kwargs # kwargs = dict(tz='US/Eastern') # import pytz # tz = tzinput = pytz.timezone('Europe/Berlin') tzinput = 'Europe/Berlin' # tz = tzinput tz = 'US/Eastern' kwargs = dict(tzinput=tzinput, tz=tz) # Parse from/to-date dtfmt, tmfmt = '%Y-%m-%d', 'T%H:%M:%S' for a, d in ((getattr(args, x), x) for x in ['fromdate', 'todate']): if a: strpfmt = dtfmt + tmfmt * ('T' in a) kwargs[d] = datetime.datetime.strptime(a, strpfmt) # Data feed data0 = bt.feeds.BacktraderCSVData(dataname=args.data0, **kwargs) cerebro.adddata(data0) d1 = cerebro.resampledata(data0, timeframe=getattr(bt.TimeFrame, args.timeframe)) # d1.plotinfo.plotmaster = data0 # d1.plotinfo.sameaxis = False if args.pandascal: cerebro.addcalendar(args.pandascal) elif args.owncal: cerebro.addcalendar(NYSE_2016()) # or NYSE_2016() to pass an instance # Broker cerebro.broker = bt.brokers.BackBroker(**eval('dict(' + args.broker + ')')) # Sizer cerebro.addsizer(bt.sizers.FixedSize, **eval('dict(' + args.sizer + ')')) # Strategy cerebro.addstrategy(St, **eval('dict(' + args.strat + ')')) # Execute cerebro.run(**eval('dict(' + args.cerebro + ')')) if args.plot: # Plot if requested to cerebro.plot(**eval('dict(' + args.plot + ')')) def parse_args(pargs=None): parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=( 'Trading Calendar Sample' ) ) parser.add_argument('--data0', default='yhoo-2016-11.csv', required=False, help='Data to read in') # Defaults for dates parser.add_argument('--fromdate', required=False, default='2016-01-01', help='Date[time] in YYYY-MM-DD[THH:MM:SS] format') parser.add_argument('--todate', required=False, default='2016-12-31', help='Date[time] in YYYY-MM-DD[THH:MM:SS] format') parser.add_argument('--cerebro', required=False, default='', metavar='kwargs', help='kwargs in key=value format') parser.add_argument('--broker', required=False, default='', metavar='kwargs', help='kwargs in key=value format') parser.add_argument('--sizer', required=False, default='', metavar='kwargs', help='kwargs in key=value format') parser.add_argument('--strat', required=False, default='', metavar='kwargs', help='kwargs in key=value format') parser.add_argument('--plot', required=False, default='', nargs='?', const='{}', metavar='kwargs', help='kwargs in key=value format') pgroup = parser.add_mutually_exclusive_group(required=False) pgroup.add_argument('--pandascal', required=False, action='store', default='', help='Name of trading calendar to use') pgroup.add_argument('--owncal', required=False, action='store_true', help='Apply custom NYSE 2016 calendar') parser.add_argument('--timeframe', required=False, action='store', default='Days', choices=['Days'], help='Timeframe to resample to') return parser.parse_args(pargs) if __name__ == '__main__': runstrat()
多个示例
原文:
www.backtrader.com/blog/posts/2017-04-09-multi-example/multi-example/
一些社区中的主题似乎是如何跟踪订单,特别是当有多个数据源在运行时,以及包括多个订单共同工作的情况,如bracket orders的情况
下面的脚本试图作为示例,允许用户:
- 使用 3 个数据源
- 选择使用
- 当
usebracket=False
时,只包含类型为Market
的单个buy订单
- 或
- 设置bracket订单(
usebracket=True
- 在这种情况下,可以指定如何创建bracket set
- 当
rawbracket=True
时,发出 3 个订单(1 个父级+2 个子级) - 当
rawbracket=False
时调用buy_bracket
- 主要bracket订单在
valid
天后具有到期时间(默认为10
) - 当
weekday
与为每个数据源定义的enter
值匹配时,将进入(或至少尝试进入)一个仓位,默认为[1, 3, 4]
- 将退出一个开放的仓位
- 在
holding
期后正常close
。期间为每个数据源分别定义,参数hold
默认为[7, 10, 15]
- 如果存在bracket订单的
stop
方被触发,则会触发bracket订单的取消(这将自动取消另一方)
- 或者如果使用brackets,则在执行
stop
(限制损失)或limit
(获利)方之一时(系统将自动取消另一方)
- 订单保留在
dict
中,使用data
作为键- 包含每个
data
条目的订单的list
,这些订单对每个data
都是打开的
- 一旦订单已发出,管理就在
notify_order
中完成
此外:
- 使用
TestSizer
,它将为buy
和sell
订单返回不同的值作为测试
因为只有long操作被启动,所以只返回buy
大小,并且输出日志中不包含sell
大小的痕迹。
创建丰富的操作、持仓和订单管理日志,以帮助理解发生了什么。
让我们看一个带有usebracket=True
和rawbracket=True
默认值的示例执行(为了简化图表,将删除音量):
$ ./mult-values.py --plot volume=False 2001-01-02 d0 Position 0 2001-01-02 Data d0 OType buy Sizing to 1 2001-01-02 d0 Main 1 Stp 2 Lmt 3 2001-01-02 d1 Position 0 2001-01-02 d2 Position 0 2001-01-03 d0 Order 1 Status Accepted 2001-01-03 d0 Order 2 Status Accepted 2001-01-03 d0 Order 3 Status Accepted 2001-01-03 d0 Order 1 Status Completed -- No longer alive main Ref 2001-01-03 d0 Position 1 2001-01-03 d1 Position 0 2001-01-03 d2 Position 0 2001-01-04 d0 Order 3 Status Completed -- No longer alive limit Ref 2001-01-04 d0 Order 2 Status Canceled -- No longer alive stop Ref ... ... ... 2006-12-27 d0 Order 2036 Status Accepted 2006-12-27 d0 Order 2037 Status Accepted 2006-12-27 d0 Order 2038 Status Accepted 2006-12-27 d0 Position 0 2006-12-27 d1 Position 0 2006-12-27 d2 Position 0 2006-12-28 d0 Position 0 2006-12-28 d1 Position 0 2006-12-28 d2 Position 0 2006-12-29 d0 Position 0 2006-12-29 d1 Position 0 2006-12-29 d2 Position 0
第二个执行设置rawbracket=False
$ ./mult-values.py --plot volume=False --strat rawbracket=False
这将输出完全相同的结果,这次使用了buy_bracket
。
最后禁用括号使用:
./mult-values.py --strat usebracket=False --plot volume=False
结论
这应该作为订单管理的良好示例,具有多个数据源和订单集。
示例用法
$ ./mult-values.py --help usage: mult-values.py [-h] [--data0 DATA0] [--data1 DATA1] [--data2 DATA2] [--fromdate FROMDATE] [--todate TODATE] [--cerebro kwargs] [--broker kwargs] [--sizer kwargs] [--strat kwargs] [--plot [kwargs]] Multiple Values and Brackets optional arguments: -h, --help show this help message and exit --data0 DATA0 Data0 to read in (default: ../../datas/nvda-1999-2014.txt) --data1 DATA1 Data1 to read in (default: ../../datas/yhoo-1996-2014.txt) --data2 DATA2 Data1 to read in (default: ../../datas/orcl-1995-2014.txt) --fromdate FROMDATE Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: 2001-01-01) --todate TODATE Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: 2007-01-01) --cerebro kwargs kwargs in key=value format (default: ) --broker kwargs kwargs in key=value format (default: ) --sizer kwargs kwargs in key=value format (default: ) --strat kwargs kwargs in key=value format (default: ) --plot [kwargs] kwargs in key=value format (default: )
BackTrader 中文文档(十七)(3)https://developer.aliyun.com/article/1505387