做网站赚几百万,成都易锐互动科技有限公司,平面设计图网站有哪些?,长春精神文明建设网站Backtrader 文档学习-Target Orders
第五部分 ipython 代码中#xff0c;有详细解释持仓价值Value的计算#xff0c;算是彩蛋。
1. 概述
sizer不能决定操作是买还是卖#xff0c;意味着需要一个新的概念#xff0c;通过增加小智能层可以决定买卖#xff0c;即通过持仓份…Backtrader 文档学习-Target Orders
第五部分 ipython 代码中有详细解释持仓价值Value的计算算是彩蛋。
1. 概述
sizer不能决定操作是买还是卖意味着需要一个新的概念通过增加小智能层可以决定买卖即通过持仓份额可以决定买卖操作。 这就是策略中order_target_xxx方法族的作用。受zipline的方法的启发提供了简单指定最终target的机会target实现:
size 特定资产组合中的股票、合同数量value 投资组合中资产的货币单位价值percent 投资组合中资产价值的百分比来自当前投资组合
在这种情况下关键是指定最终target该方法决定操作是买入还是卖出。同样的逻辑适用于3种方法。order_target_size参数设置 如果目标大于头寸则发出买入指令差值为目标-头寸大小 Pos: 0, target: 7 - buy(size7 - 0) - buy(size7)Pos: 3, target: 7 - buy(size7 - 3) - buy(size4)Pos: -3, target: 7 - buy(size7 - -3) - buy(size10)Pos: -3, target: -2 - buy(size-2 - -3) - buy(size1) 如果目标小于头寸则根据头寸大小-目标的差额发出卖出指令 Pos: 0, target: -7 - sell(size0 - -7) - sell(size7)Pos: 3, target: -7 - sell(size3 - -7) - sell(size10)Pos: -3, target: -7 - sell(size-3 - -7) - sell(size4)Pos: 3, target: 2 - sell(size3 - 2) - sell(size1) 当使用order_target_value确定价值时投资组合中资产的当前价值和头寸规模都将被考虑在内以决定最终的基础操作理由是: 如果头寸规模为负空头目标价值必须大于当前价值这意味着卖出更多 按这个逻辑操作 If target value and size 0 - buyIf target value and size 0 - sellIf target value and size 0 - sellIf target value and size 0 - buy order_target_percent 的逻辑与order_target_value的逻辑相同。考虑投资组合的当前总价值来确定资产的目标价值 。
2. 示例
示例中的逻辑相当简单只是为了测试效果规则如下
在奇数月份1月、3月……order_target_value day * 1000模拟了一个不断增加的target 。在偶数月份2月、4月……order_target_value 31 - day 模拟了一个递减的target 。
1order_target_size
0001 - 2005-01-03 - Position Size: 00 - Value 1000000.00
0001 - 2005-01-03 - Order Target Size: 03
0002 - 2005-01-04 - Position Size: 03 - Value 999994.39
0002 - 2005-01-04 - Order Target Size: 04
0003 - 2005-01-05 - Position Size: 04 - Value 999992.48
0003 - 2005-01-05 - Order Target Size: 05
0004 - 2005-01-06 - Position Size: 05 - Value 999988.79
0004 - 2005-01-06 - Order Target Size: 06
0005 - 2005-01-07 - Position Size: 06 - Value 999991.41
0005 - 2005-01-07 - Order Target Size: 07
0006 - 2005-01-10 - Position Size: 07 - Value 999993.89
0006 - 2005-01-10 - Order Target Size: 10
0007 - 2005-01-11 - Position Size: 10 - Value 999987.32
0007 - 2005-01-11 - Order Target Size: 11
0008 - 2005-01-12 - Position Size: 11 - Value 999992.38
0008 - 2005-01-12 - Order Target Size: 12
0009 - 2005-01-13 - Position Size: 12 - Value 999982.68
... ...
0021 - 2005-02-01 - Position Size: 31 - Value 999954.68
0021 - 2005-02-01 - Order Target Size: 30
0022 - 2005-02-02 - Position Size: 30 - Value 999979.65
0022 - 2005-02-02 - Order Target Size: 29
0023 - 2005-02-03 - Position Size: 29 - Value 999966.33
0023 - 2005-02-03 - Order Target Size: 28
0024 - 2005-02-04 - Position Size: 28 - Value 999963.99
0024 - 2005-02-04 - Order Target Size: 27
0025 - 2005-02-07 - Position Size: 27 - Value 999949.19
0025 - 2005-02-07 - Order Target Size: 24
0026 - 2005-02-08 - Position Size: 24 - Value 999947.061月份该target 从第一个交易日3日开始仓位3并不断增加。位置大小最初从0移动到3然后以1为增量。 1月结束最后一个订单目标是31。 当进入2月1日时头寸规模此时新的target被要求为30并随着头寸的减少而递减1。
2 order_target_value
0001 - 2005-01-03 - Position Size: 00 - Value 1000000.00
0001 - 2005-01-03 - Order Target Size: 03
0002 - 2005-01-04 - Position Size: 03 - Value 999994.39
0002 - 2005-01-04 - Order Target Size: 04
0003 - 2005-01-05 - Position Size: 04 - Value 999992.48
0003 - 2005-01-05 - Order Target Size: 05
0004 - 2005-01-06 - Position Size: 05 - Value 999988.79
0004 - 2005-01-06 - Order Target Size: 06
0005 - 2005-01-07 - Position Size: 06 - Value 999991.41
0005 - 2005-01-07 - Order Target Size: 07
0006 - 2005-01-10 - Position Size: 07 - Value 999993.89
0006 - 2005-01-10 - Order Target Size: 10
0007 - 2005-01-11 - Position Size: 10 - Value 999987.32
... ...
0020 - 2005-01-31 - Position Size: 28 - Value 999968.70
0020 - 2005-01-31 - Order Target Size: 31
0021 - 2005-02-01 - Position Size: 31 - Value 999954.68
0021 - 2005-02-01 - Order Target Size: 30
0022 - 2005-02-02 - Position Size: 30 - Value 999979.65
0022 - 2005-02-02 - Order Target Size: 29
0023 - 2005-02-03 - Position Size: 29 - Value 999966.33
0023 - 2005-02-03 - Order Target Size: 28
0024 - 2005-02-04 - Position Size: 28 - Value 999963.99
0024 - 2005-02-04 - Order Target Size: 27
0025 - 2005-02-07 - Position Size: 27 - Value 999949.19
0025 - 2005-02-07 - Order Target Size: 243order_target_percent
0001 - 2005-01-03 - Position Size: 00 - Value 1000000.00
0001 - 2005-01-03 - data percent 0.00
0001 - 2005-01-03 - Order Target Percent: 0.03
0002 - 2005-01-04 - Position Size: 785 - Value 998532.05
0002 - 2005-01-04 - data percent 0.03
0002 - 2005-01-04 - Order Target Percent: 0.04
0003 - 2005-01-05 - Position Size: 1091 - Value 998007.44
0003 - 2005-01-05 - data percent 0.04
0003 - 2005-01-05 - Order Target Percent: 0.05
0004 - 2005-01-06 - Position Size: 1381 - Value 996985.64
0004 - 2005-01-06 - data percent 0.05
0004 - 2005-01-06 - Order Target Percent: 0.06
0005 - 2005-01-07 - Position Size: 1688 - Value 997708.36
0005 - 2005-01-07 - data percent 0.06
0005 - 2005-01-07 - Order Target Percent: 0.07
0006 - 2005-01-10 - Position Size: 1942 - Value 998397.32
0006 - 2005-01-10 - data percent 0.07
0006 - 2005-01-10 - Order Target Percent: 0.10
... ...
0020 - 2005-01-31 - Position Size: 7985 - Value 991966.28
0020 - 2005-01-31 - data percent 0.28
0020 - 2005-01-31 - Order Target Percent: 0.31
0021 - 2005-02-01 - Position Size: 8733 - Value 988008.94
0021 - 2005-02-01 - data percent 0.31
0021 - 2005-02-01 - Order Target Percent: 0.30
0022 - 2005-02-02 - Position Size: 8530 - Value 995005.45
0022 - 2005-02-02 - data percent 0.30
0022 - 2005-02-02 - Order Target Percent: 0.29
0023 - 2005-02-03 - Position Size: 8120 - Value 991240.75
0023 - 2005-02-03 - data percent 0.29
0023 - 2005-02-03 - Order Target Percent: 0.28
0024 - 2005-02-04 - Position Size: 7910 - Value 990607.25
0024 - 2005-02-04 - data percent 0.283. 代码
from __future__ import (absolute_import, division, print_function,unicode_literals)import argparse
from datetime import datetimeimport backtrader as btclass TheStrategy(bt.Strategy):This strategy is loosely based on some of the examples from the VanK. Tharp book: *Trade Your Way To Financial Freedom*. The logic:- Enter the market if:- The MACD.macd line crosses the MACD.signal line to the upside- The Simple Moving Average has a negative direction in the last xperiods (actual value below value x periods ago)- Set a stop price x times the ATR value away from the close- If in the market:- Check if the current close has gone below the stop price. If yes,exit.- If not, update the stop price if the new stop price would be higherthan the currentparams ((use_target_size, False),(use_target_value, False),(use_target_percent, False),)def notify_order(self, order):if order.status order.Completed:passif not order.alive():self.order None # indicate no order is pendingdef start(self):self.order None # sentinel to avoid operrations on pending orderdef next(self):dt self.data.datetime.date()portfolio_value self.broker.get_value()print(%04d - %s - Position Size: %02d - Value %.2f %(len(self), dt.isoformat(), self.position.size, portfolio_value))data_value self.broker.get_value([self.data])if self.p.use_target_value:print(%04d - %s - data value %.2f %(len(self), dt.isoformat(), data_value))elif self.p.use_target_percent:port_perc data_value / portfolio_valueprint(%04d - %s - data percent %.2f %(len(self), dt.isoformat(), port_perc))if self.order:return # pending order executionsize dt.dayif (dt.month % 2) 0:size 31 - sizeif self.p.use_target_size:target sizeprint(%04d - %s - Order Target Size: %02d %(len(self), dt.isoformat(), size))self.order self.order_target_size(targetsize)elif self.p.use_target_value:value size * 1000print(%04d - %s - Order Target Value: %.2f %(len(self), dt.isoformat(), value))self.order self.order_target_value(targetvalue)elif self.p.use_target_percent:percent size / 100.0print(%04d - %s - Order Target Percent: %.2f %(len(self), dt.isoformat(), percent))self.order self.order_target_percent(targetpercent)def runstrat(argsNone):args parse_args(args)cerebro bt.Cerebro()cerebro.broker.setcash(args.cash)dkwargs dict()if args.fromdate is not None:dkwargs[fromdate] datetime.strptime(args.fromdate, %Y-%m-%d)if args.todate is not None:dkwargs[todate] datetime.strptime(args.todate, %Y-%m-%d)# datadata bt.feeds.YahooFinanceCSVData(datanameargs.data, **dkwargs)cerebro.adddata(data)# strategycerebro.addstrategy(TheStrategy,use_target_sizeargs.target_size,use_target_valueargs.target_value,use_target_percentargs.target_percent)cerebro.run()if args.plot:pkwargs dict(stylebar)if args.plot is not True: # evals to True but is not Truenpkwargs eval(dict( args.plot )) # args were passedpkwargs.update(npkwargs)cerebro.plot(**pkwargs)def parse_args(pargsNone):parser argparse.ArgumentParser(formatter_classargparse.ArgumentDefaultsHelpFormatter,descriptionSample for Order Target)parser.add_argument(--data, requiredFalse,default./datas/yhoo-1996-2015.txt,helpSpecific data to be read in)parser.add_argument(--fromdate, requiredFalse,default2005-01-01,helpStarting date in YYYY-MM-DD format)parser.add_argument(--todate, requiredFalse,default2006-12-31,helpEnding date in YYYY-MM-DD format)parser.add_argument(--cash, requiredFalse, actionstore,typefloat, default1000000,helpEnding date in YYYY-MM-DD format)pgroup parser.add_mutually_exclusive_group(requiredTrue)pgroup.add_argument(--target-size, requiredFalse, actionstore_true,help(Use order_target_size))pgroup.add_argument(--target-value, requiredFalse, actionstore_true,help(Use order_target_value))pgroup.add_argument(--target-percent, requiredFalse,actionstore_true,help(Use order_target_percent))# Plot optionsparser.add_argument(--plot, -p, nargs?, requiredFalse,metavarkwargs, constTrue,help(Plot the read data applying any kwargs passed\n\nFor example:\n\n --plot stylecandle (to plot candles)\n))if pargs is not None:return parser.parse_args(pargs)return parser.parse_args()if __name__ __main__:runstrat()4. Help
python ./order_target.py --help
usage: order_target.py [-h] [--data DATA] [--fromdate FROMDATE][--todate TODATE] [--cash CASH](--target-size | --target-value | --target-percent)[--plot [kwargs]]Sample for Order Targetoptional arguments:-h, --help show this help message and exit--data DATA Specific data to be read in (default:./datas/yhoo-1996-2015.txt)--fromdate FROMDATE Starting date in YYYY-MM-DD format (default:2005-01-01)--todate TODATE Ending date in YYYY-MM-DD format (default: 2006-12-31)--cash CASH Ending date in YYYY-MM-DD format (default: 1000000)--target-size Use order_target_size (default: False)--target-value Use order_target_value (default: False)--target-percent Use order_target_percent (default: False)--plot [kwargs], -p [kwargs]Plot the read data applying any kwargs passed Forexample: --plot stylecandle (to plot candles)(default: None)5.ipython代码
只加载3个月的数据增加了说明
from __future__ import (absolute_import, division, print_function,unicode_literals)from datetime import datetimeimport backtrader as bt%matplotlib inlineclass TheStrategy(bt.Strategy):This strategy is loosely based on some of the examples from the VanK. Tharp book: *Trade Your Way To Financial Freedom*. The logic:- Enter the market if:- The MACD.macd line crosses the MACD.signal line to the upside- The Simple Moving Average has a negative direction in the last xperiods (actual value below value x periods ago)- Set a stop price x times the ATR value away from the close- If in the market:- Check if the current close has gone below the stop price. If yes,exit.- If not, update the stop price if the new stop price would be higherthan the currentparams ((use_target_size, False),(use_target_value, False),(use_target_percent, False),)def notify_order(self, order):if order.status order.Completed:pass# 没有挂起的order order置空if not order.alive():self.order None # indicate no order is pendingdef start(self):# 避免有挂起order未处理置空 self.order None # sentinel to avoid operrations on pending orderdef next(self):# 当前data的日期去时分秒dt self.data.datetime.date()# 投资组合货币价值 如何计算出来的portfolio_value self.broker.get_value()# 处理data长度 日期 仓位 组合价值# self.p.use_target_size 默认打印position size# 按 target_size 交易print(%04d - %s - Position Size: %02d - Value %.2f %(len(self), dt.isoformat(), self.position.size, portfolio_value))# get_value 带参数用当前的收盘价计算持仓价值# data_value self.data.close[0] * self.position.sizedata_value self.broker.get_value([self.data])print(datavalue: %.2f, open:%.2f, close:%.2f,close-open:%.2f % (data_value,self.data.open[0],self.data.close[0],self.data.close[0]-self.data.open[0]))# 按 target_value 交易if self.p.use_target_value:print(%04d - %s - data value %.2f %(len(self), dt.isoformat(), data_value))# 按 target_percent 交易elif self.p.use_target_percent:port_perc data_value / portfolio_valueprint(%04d - %s - data percent %.2f %(len(self), dt.isoformat(), port_perc))# 如果有挂起订单 不做后续处理一个订单处理完再开始下一个订单if self.order:return # pending order execution# 仓位设置为日期的天size dt.day# 如果是偶数月if (dt.month % 2) 0:# 仓位递减交易size 31 - size# target_size 模式if self.p.use_target_size:target sizeprint(%04d - %s - Order Target Size: %02d %(len(self), dt.isoformat(), size))self.order self.order_target_size(targetsize)# target_value 模式elif self.p.use_target_value:value size * 1000print(%04d - %s - Order Target Value: %.2f %(len(self), dt.isoformat(), value))self.order self.order_target_value(targetvalue)# target_percent 模式elif self.p.use_target_percent:percent size / 100.0print(%04d - %s - Order Target Percent: %.2f %(len(self), dt.isoformat(), percent))self.order self.order_target_percent(targetpercent)def runstrat(argsNone):# define parameterparam_fromdate 2005-01-01param_todate 2005-03-31param_data ./datas/yhoo-1996-2015.txtparam_cash 100000# set target parameter param_target_size Trueparam_target_value Falseparam_target_percent False# set plot param_plot Truecerebro bt.Cerebro()cerebro.broker.setcash(param_cash)# 数据加载参数字典dkwargs dict()if param_fromdate is not None:dkwargs[fromdate] datetime.strptime(param_fromdate, %Y-%m-%d)if param_todate is not None:dkwargs[todate] datetime.strptime(param_todate, %Y-%m-%d)# datadata bt.feeds.YahooFinanceCSVData(datanameparam_data, **dkwargs)cerebro.adddata(data)# strategycerebro.addstrategy(TheStrategy,use_target_sizeparam_target_size,use_target_valueparam_target_value,use_target_percentparam_target_percent)cerebro.run()if param_plot:# 绘图参数字典pkwargs dict(stylebar)if param_plot is not True: # evals to True but is not Truenpkwargs eval(dict( param_plot )) # args were passedpkwargs.update(npkwargs)cerebro.plot(iplotFalse,**pkwargs)if __name__ __main__:runstrat()1order_target_size
输出结果
0001 - 2005-01-03 - Position Size: 00 - Value 100000.00
datavalue: 0.00, open:38.36, close:38.18,close-open:-0.18
0001 - 2005-01-03 - Order Target Size: 03
0002 - 2005-01-04 - Position Size: 03 - Value 99994.39
datavalue: 109.74, open:38.45, close:36.58,close-open:-1.87
0002 - 2005-01-04 - Order Target Size: 04
0003 - 2005-01-05 - Position Size: 04 - Value 99992.48
datavalue: 144.52, open:36.69, close:36.13,close-open:-0.56
0003 - 2005-01-05 - Order Target Size: 05
0004 - 2005-01-06 - Position Size: 05 - Value 99988.79
datavalue: 177.15, open:36.32, close:35.43,close-open:-0.89
0004 - 2005-01-06 - Order Target Size: 06
0005 - 2005-01-07 - Position Size: 06 - Value 99991.41
datavalue: 215.76, open:35.99, close:35.96,close-open:-0.03
0005 - 2005-01-07 - Order Target Size: 07
0006 - 2005-01-10 - Position Size: 07 - Value 99993.89
datavalue: 254.24, open:36.00, close:36.32,close-open:0.32
0006 - 2005-01-10 - Order Target Size: 10
0007 - 2005-01-11 - Position Size: 10 - Value 99987.32
datavalue: 356.60, open:36.31, close:35.66,close-open:-0.65
0007 - 2005-01-11 - Order Target Size: 11
0008 - 2005-01-12 - Position Size: 11 - Value 99992.38
datavalue: 397.54, open:35.88, close:36.14,close-open:0.26
0008 - 2005-01-12 - Order Target Size: 12
0009 - 2005-01-13 - Position Size: 12 - Value 99982.68
datavalue: 423.96, open:36.12, close:35.33,close-open:-0.79
0009 - 2005-01-13 - Order Target Size: 13
0010 - 2005-01-14 - Position Size: 13 - Value 99999.96
datavalue: 477.10, open:35.86, close:36.70,close-open:0.84
0010 - 2005-01-14 - Order Target Size: 14
0011 - 2005-01-18 - Position Size: 14 - Value 100006.28
datavalue: 520.52, open:37.10, close:37.18,close-open:0.08
0011 - 2005-01-18 - Order Target Size: 18
0012 - 2005-01-19 - Position Size: 18 - Value 99989.54
datavalue: 656.10, open:38.08, close:36.45,close-open:-1.63
0012 - 2005-01-19 - Order Target Size: 19
0013 - 2005-01-20 - Position Size: 19 - Value 99977.87
datavalue: 679.82, open:35.39, close:35.78,close-open:0.39
0013 - 2005-01-20 - Order Target Size: 20
0014 - 2005-01-21 - Position Size: 20 - Value 99967.98
datavalue: 706.00, open:36.07, close:35.30,close-open:-0.77
0014 - 2005-01-21 - Order Target Size: 21
0015 - 2005-01-24 - Position Size: 21 - Value 99939.03
datavalue: 712.53, open:35.48, close:33.93,close-open:-1.55
0015 - 2005-01-24 - Order Target Size: 24
0016 - 2005-01-25 - Position Size: 24 - Value 99939.81
datavalue: 816.96, open:34.55, close:34.04,close-open:-0.51
0016 - 2005-01-25 - Order Target Size: 25
0017 - 2005-01-26 - Position Size: 25 - Value 99974.89
datavalue: 886.75, open:34.71, close:35.47,close-open:0.76
0017 - 2005-01-26 - Order Target Size: 26
0018 - 2005-01-27 - Position Size: 26 - Value 99955.74
datavalue: 902.98, open:35.38, close:34.73,close-open:-0.65
0018 - 2005-01-27 - Order Target Size: 27
0019 - 2005-01-28 - Position Size: 27 - Value 99952.60
datavalue: 934.74, open:34.90, close:34.62,close-open:-0.28
0019 - 2005-01-28 - Order Target Size: 28
0020 - 2005-01-31 - Position Size: 28 - Value 99968.70
datavalue: 985.88, open:35.04, close:35.21,close-open:0.17
0020 - 2005-01-31 - Order Target Size: 31
0021 - 2005-02-01 - Position Size: 31 - Value 99954.68
datavalue: 1077.25, open:35.13, close:34.75,close-open:-0.38
0021 - 2005-02-01 - Order Target Size: 30
0022 - 2005-02-02 - Position Size: 30 - Value 99979.65
datavalue: 1066.20, open:36.02, close:35.54,close-open:-0.48
0022 - 2005-02-02 - Order Target Size: 29
0023 - 2005-02-03 - Position Size: 29 - Value 99966.33
datavalue: 1017.61, open:35.27, close:35.09,close-open:-0.18
0023 - 2005-02-03 - Order Target Size: 28
0024 - 2005-02-04 - Position Size: 28 - Value 99963.99
datavalue: 980.56, open:34.71, close:35.02,close-open:0.31
0024 - 2005-02-04 - Order Target Size: 27分析Value 看value如何计算出来的 每个人都有疑问 增加了一行过程计算数据 datavalue: 109.74, open:38.45, close:36.58,close-open:-1.87 经过一下午研究在Excel中拼凑计算终于和BT数据一致了 Excel模拟计算下载