LOADING
1299 字
6 分钟
bt_04信号模式之BOLL带

公式代码#

BOLL:MA(CLOSE,N);
UB:BOLL+2*STD(CLOSE,N);
LB:BOLL-2*STD(CLOSE,N);

BOLL线:短线上下布林中,开口突破就大变
 经过长时间的总结发现,布林线中长期看来是一种优秀的趋势指标,当布林线由收口转至开口时,表示股价结束盘整,即将产生剧烈波动,而股价的突破方向,标志着未来趋势的运动方向。也即,股价向上突破阻力线,则是一轮上升趋势,反之,将是下跌趋势。同时。平均线与阻力线(或支撑线)构成的上行(楚游)通道对于把握股价的中长期走势 有着强烈的指示作用。

信号策略研发#

趋势(区间突破)#

实例#

del02
交易思路:
点1:突破下轨,表示行情走差,做空。 点2:向上突破中轨,说明走差行情结束,平空。
点3:向上突破上轨,说明行情走强,做多。
点4:向下突破中轨,说明行情走弱,平多。

抽象化和信号表达式#

del01
上图中,中线是mid中间线,曲线是close收盘价。
图中红色为多(1),蓝色为空(-1),采用蓝色代替绿色,考虑到部分人红绿色盲。

信号表达式:

open_signal= if(close> top,1,if(close<bot,-1,0))
exit_signal_long=close>mid
exit_signal_short=close>mid

这个案例中为何是亏损的:高买低卖,因为这个case图示是震荡市。

bt代码#

# boll带,突破boll上界1,突破下界-1,否则0
class BollBands_broketopbot101(bt.Indicator):
lines = ('signal','top','bot','show') # 声明 signal 线,交易信号放在 signal line 上
params = dict(period=20)
plotinfo = dict(subplot=False)
def __init__(self):
self.lines.top = bt.indicators.BollingerBands(self.datas[0], period=self.p.period).top
self.lines.bot = bt.indicators.BollingerBands(self.datas[0], period=self.p.period).bot
self.lines.signal=bt.If(self.datas[0].close>self.lines.top,1,bt.If(self.datas[0].close<self.lines.bot,-1,0))
self.lines.show = self.l.signal*0.1*self.datas[0].close[0]+self.datas[0].close[0]
# boll带,中线上部:>0,中线下部:<0
class BollBands_mid11(bt.Indicator):
lines = ('signal','mid','show') # 声明 signal 线,交易信号放在 signal line 上
params = dict(period=20)
plotinfo = dict(subplot=False)
def __init__(self):
self.lines.mid = bt.indicators.BollingerBands(self.datas[0], period=self.p.period).mid
self.lines.signal =self.data-self.lines.mid
# self.lines.date0=self.data
self.lines.show= bt.If(self.l.signal>0,1, -1)*0.1*self.datas[0].close[0]+self.datas[0].close[0]

可视化和正确性验证#

测试命令:

开仓信号测试:python ./signal_template.py --plot --market_type longshort --open_signal BollBands_broketopbot101 --fromdate 2022-01-10 --todate 2023-01-01
平仓信号测试:python ./signal_template.py --plot --market_type longshort --open_signal BollBands_mid11 --fromdate 2022-01-10 --todate 2023-01-01
开平仓信号测试:python ./signal_template.py --plot --market_type longshort --open_signal BollBands_broketopbot101 --exit_signal_long BollBands_mid11 --exit_signal_short BollBands_mid11 --fromdate 2022-01-10 --todate 2023-01-01

开仓信号测试
del01
可见:
当close高于boll.top时,信号signal为1。
当close低于boll.bot时,信号signal为-1。
符合本意。

平仓信号测试:
del01
可见:close位于均线上时,为做多,反之,做空。符合本意。

开平仓信号测试
del02
开仓信号:主图
平仓信号:下部辅图

波动(区间震荡)#

实例#

del02
交易思路:
点1:向下突破上轨,表示上涨行情即将回归,做空。
点2:向下突破中轨,说明行情回归结束,平空。
点3:向上突破下轨,说明下跌行情即将回归,做多。
点4:向下突破中轨,说明行情回归结束,平多。

抽象化和信号表达式#

del01
上图中,横向是mid中线,上下是close收盘价

信号表达式:

open_signal_tmp01= bt.min(crossover(close,top),0)# 将-1,0,1转为-1,0.也就是只保留死叉那部分信号(丢弃金叉信号)
open_signal_tmp02= bt.max(crossover(close,bot),0)# 将-1,0,1转为-1,0.也就是只保留金叉那部分信号(丢弃死叉信号)
open_signal=open_signal_tmp01+open_signal_tmp02
exit_signal_long=mid-close
exit_signal_short=mid-close

bt代码#

# boll带,均值回归策略,死叉top,-1,金叉bot,1
class BollBands_crosstopbot101(bt.Indicator):
lines = ('signal','top','bot','show') # 声明 signal 线,交易信号放在 signal line 上
params = dict(period=20)
plotinfo = dict(subplot=True)
def __init__(self):
self.lines.top = bt.indicators.BollingerBands(self.datas[0], period=self.p.period).top
self.lines.bot = bt.indicators.BollingerBands(self.datas[0], period=self.p.period).bot
open_signal_tmp01 = bt.Min(bt.ind.CrossOver(self.datas[0].close, self.lines.top), 0)
open_signal_tmp02 = bt.Max(bt.ind.CrossOver(self.datas[0].close, self.lines.bot), 0)
open_signal = open_signal_tmp01 + open_signal_tmp02
self.lines.signal =open_signal
# self.lines.date0=self.data
self.lines.show= self.l.signal*0.1*self.datas[0].close[0]+self.datas[0].close[0]
class BollBands_blowmid11(bt.Indicator):
lines = ('signal','mid','show') # 声明 signal 线,交易信号放在 signal line 上
params = dict(period=20)
plotinfo = dict(subplot=False)
def __init__(self):
self.lines.mid = bt.indicators.BollingerBands(self.datas[0], period=self.p.period).mid
self.lines.signal =self.lines.mid-self.datas[0].close
self.lines.show= bt.If(self.l.signal>0,1,-1)*0.1*self.datas[0].close[0]+self.datas[0].close[0]

可视化和正确性验证#

命令

开仓信号测试:python ./signal_template.py --plot --market_type longshort --open_signal BollBands_crosstopbot101 --fromdate 2022-01-10 --todate 2023-01-01
平仓信号测试:python ./signal_template.py --plot --market_type longshort --open_signal BollBands_blowmid11 --fromdate 2022-01-10 --todate 2023-01-01
开仓平仓结合测试:
python ./signal_template.py --plot --market_type longshort --open_signal BollBands_crosstopbot101 --exit_signal_long BollBands_blowmid11 --exit_signal_short BollBands_blowmid11 --fromdate 2022-01-10 --todate 2023-01-01

结果
开仓信号测试: del01

可见:
a,信号正确,close靠近top时,频繁发出-1信号,说明频繁死叉top。close靠近bot时,频繁发出1信号,说明频繁金叉bot。符合逻辑 b,信号对应仓位正确,信号-1是开空仓,信号1时多仓,符合逻辑。

平仓信号测试: del02

可见:当close位于mid上方时,信号提示空仓(用来平多),下方提示多仓(用来平空仓),符合预期。

开仓平仓结合测试:
del02
开仓信号:辅图
平仓信号:主图

回测#

趋势(区间突破)#

多头模式#

标的<002466天齐锂业>
时间:20220110-20230101
信号参数:boll周期10
回测命令:

python ./signal_template.py --plot --market_type longonly --open_signal BollBands_broketopbot101 --exit_signal_long BollBands_mid11 --fromdate 2022-01-10 --todate 2023-01-01 --stock_id 002466.XSHE

回测结果:5w ->6.8W,收益率36%
del02

多空模式#

标的<002466天齐锂业>
时间:20220110-20230101
信号参数:boll周期15
回测命令:

python ./signal_template.py --plot --market_type longshort --open_signal BollBands_broketopbot101 --exit_signal_long BollBands_mid11 --exit_signal_short BollBands_mid11 --fromdate 2022-01-10 --todate 2023-01-01 --stock_id 002466.XSHE

del02
回测结果:5w ->6.5W,收益率30%

波动(区间震荡)#

多头模式#

标的<300760迈瑞医疗>
时间:20220110-20230101
信号参数:2信号boll周期均为10

python ./signal_template.py --plot --market_type longonly --open_signal BollBands_crosstopbot101 --exit_signal_long BollBands_blowmid11 --fromdate 2022-01-10 --todate 2023-01-01 --stock_id 300760.XSHE

结果:5w->6w,收益率20%
del02

多空模式#

标的<300760迈瑞医疗>
时间:20220110-20230101
信号参数:2信号boll周期均为10

python ./signal_template.py --plot --market_type longshort --open_signal BollBands_crosstopbot101 --exit_signal_long BollBands_blowmid11 --exit_signal_short BollBands_blowmid11 --fromdate 2022-01-10 --todate 2023-01-01 --stock_id 300760.XSHE

结果:5w->7w,收益率40%
del02

bt_04信号模式之BOLL带
/posts/quant/962ccdd6/
作者
思想的巨人
发布于
2023-06-08
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时