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

交易思路:
点1:突破下轨,表示行情走差,做空。
点2:向上突破中轨,说明走差行情结束,平空。
点3:向上突破上轨,说明行情走强,做多。
点4:向下突破中轨,说明行情走弱,平多。
抽象化和信号表达式

上图中,中线是mid中间线,曲线是close收盘价。
图中红色为多(1),蓝色为空(-1),采用蓝色代替绿色,考虑到部分人红绿色盲。
信号表达式:
open_signal= if(close> top,1,if(close<bot,-1,0))exit_signal_long=close>midexit_signal_short=close>mid这个案例中为何是亏损的:高买低卖,因为这个case图示是震荡市。
bt代码
# boll带,突破boll上界1,突破下界-1,否则0class 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,中线下部:<0class 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开仓信号测试

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

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

开仓信号:主图
平仓信号:下部辅图
波动(区间震荡)
实例

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

上图中,横向是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_tmp02exit_signal_long=mid-closeexit_signal_short=mid-closebt代码
# boll带,均值回归策略,死叉top,-1,金叉bot,1class 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结果
开仓信号测试:

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

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

开仓信号:辅图
平仓信号:主图
回测
趋势(区间突破)
多头模式
标的<002466天齐锂业>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%

多空模式
标的<002466天齐锂业>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
回测结果:5w ->6.5W,收益率30%
波动(区间震荡)
多头模式
标的<300760迈瑞医疗>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%

多空模式
标的<300760迈瑞医疗>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%

部分信息可能已经过时