Python量化交易学习笔记(量化交易学习笔记(20))——保护点卖出策略保护点卖出策略
本文主要记录保护点卖出策略,给买入的股票设立保护点,随着股票收盘价的提升,保护点不断提高,股价一旦跌破保护点,即卖出股票。
示例的买入条件为,5日线金叉60日线,且股价进行小幅回踩(较金叉日收盘价下跌1%)。卖出条件为,股价跌破保护点。保护点首先设置为买入当天收盘价减去一个资金回撤值
(率),示例把回撤率设置为5%。后续如果股票的收盘价上升,则用新的收盘价更新保护点,如果股票的收盘价下跌,则保留原有保护点。回测初始资金100000元,单笔操作单位
1000股,佣金千分之一,回测时间自2018年1月1日至2020年3月20日。
策略核心代码位于策略类的next方法中:
def next(self):
# 无场内资产
if not self.position:
# 未提交买单
if None == self.order:
# 金叉到达了买点
if self.buy_con:
# 计算订单有效期时间,如果超过有效期,股价仍未回踩,则放弃下买入订单
valid = self.data.datetime.date(0)
if self.p.buy_valid_date:
valid = valid + datetime.timedelta(days=self.p.buy_valid_date)
# 计算回踩后的买入价格
price = self.datas[0].close[0] * (1.0 - self.p.buy_limit_percent)
print('Buy order created: {}: close: {} / limit price: {} / valid: {}'.format(
self.datetime.date(), self.datas[0].close[0], price, valid) )
# 用有效时间及回踩买点提交买入订单
self.order = self.buy(exectype = bt.Order.Limit, price = price, valid = valid)
#o = self.buy()
print('*' * 50)
elif self.order is None:
# 提交stoptrail订单
self.order = self.sell(exectype=self.p.stoptype,
trailamount=self.p.trailamount,
trailpercent=self.p.trailpercent)
在买入时,程序中使用了backtrader的Limit类型订单,在Limit订单创建时,会设置一个price及有效日期valid,如果到达日期valid后,股价还没有匹配上price,订单就会被取消。匹配
price包括两种情况:
如果开盘价低于price,那么订单就会用开盘价被立即执行
如果开盘价高于price,但是当日最低价低于price,那么订单将会以price的价格被执行
从Limit订单的描述可以看出,正好符合我们所说的股价回踩买入规则。
在卖出时,程序使用了backtrader的StopTrail订单,回撤可以用回撤值(trailamount)或者回撤率(trailpercent)来表示,这里我们选择用5%的回撤率来做回测。StopTrail将按下面
的逻辑进行工作:
使用当日收盘价作为price值
price按照回撤率回撤计算后的价格,被作为触发价格(trigger price),即我们所说的保护点。比如price=100,trailpercent=5%,那么trigger price=100*(1-5%)=95
代理在下一根K线迭代计算时,会计算是否达到trigger price
如果达到trigger price,卖单将被执行
如果没有达到trigger price,那么trigger price将用当前的收盘价按照之前选定的回撤率进行重新计算
如果股价上涨,那么trigger price将会被更新为新的trigger price
如果估计不变或者下跌,那么trigger price不更新
从StopLimit订单的描述可以看出,保护点会随之股价的上升不断更新,不断提高,一旦股价跌破保护点,就会进行卖出,这样可以有效的保护我们的利润。同时可以看到,即使股价
一直下跌,StopLimit订单也可以有效止损。
回测000001后的最终资产为102017.97元。
回测000002后的最终资产为103236.59元。
评论1
最新资源