主要是练习日线数据按月操作和使用多组数据以及设置固定手续费,添加了22支股票的日线数据
数据从2018年5月才完整(最小周期),所以2018年5月才开操作
代码输出的日期是每月最后一个交易日,但实际买入是以每月第一个交易日的开盘价购买
之前看过一篇文章可以修改输出日期的格式,但忘记了,以后再填这个坑,不会影响回测结果
本文代码练习是关键,策略亏盈并无意义
策略逻辑:
1 2 3 |
- 每月第一个交易日从股票池(22支)随机选择一支,以开盘价购买1手。 - 只买不卖,当作存钱 |
策略理解:
1 2 3 4 5 |
- 是真正意义的随机,每次回测结果都不一样 - 每次只买入1手,所以手续费设置成5元 - 从现有的数据看亏赚都不多 - 逻辑上什么都没考虑,每条bar就买入 |
关键代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<em># 自定义手续费类</em> class MyCommission(bt.CommInfoBase): params = ( ('stocklike', True), <em># 指定为期货模式</em> ('commtype', bt.CommInfoBase.COMM_PERC), <em># 使用百分比费用模式</em> ('percabs', True), <em># commission 不以 % 为单位</em> ('stamp_duty', 0.001),) <em># 印花税默认为 0.1%</em> <em># 自定义费用计算公式</em> def _getcommission(self, size, price, pseudoexec): if size > 0: <em># 买入时,只考虑佣金</em> comm = abs(size) * price * self.p.commission if comm < 5: return 5 else: return comm elif size < 0: <em># 卖出时,同时考虑佣金和印花税</em> comm = abs(size) * price * (self.p.commission + self.p.stamp_duty) if comm < 5: return 5 else: return comm return else: return 0 <em># 将日线数据按月采样</em> cerebro.resampledata(data, timeframe=bt.TimeFrame.Months, name=stock) <em># 需要注意自定义手续费类后要添加手续费的方法也要改</em> cerebro.broker.addcommissioninfo(mycomm) |
近期评论