Bollinger带动量突破策略是一种典型的利用Bollinger带指标识别股票价值的量化交易策略。该策略运用Bollinger带的上轨和下轨来判断股票是否被高估或低估,并结合股票价格的移动平均线来发出交易信号。当价格突破上轨时,认为股票被低估,形成买入信号;当价格跌破下轨时,认为股票被高估,形成卖出信号。
Bollinger带是由中轨线、上轨线和下轨线组成。中轨线是n天的简单移动平均线;上下轨线分别是中轨线上下两个标准差的位置。当股价接近上轨时被认为股价被高估,接近下轨时被认为股价被低估。
该策略首先计算20天的股价中轨线、上轨线和下轨线。然后判断股价是否高于或低于中轨线,如果高于中轨线则为买入信号,低于中轨线则为卖出信号。同时,如果股价上穿上轨线,作为平仓信号,股价下穿下轨线,作为平仓信号。
这种策略最大的优势是利用Bollinger带判断股价的高低估,避免了盲目交易的问题。当股价被高估时,策略会发出卖出信号;当股价被低估时,策略会发出买入信号。这样可以有效过滤掉一些噪音,进入的交易信号质量较高。
另外,该策略加入了移动平均线作为辅助判断指标。股价实际突破移动平均线,也是较强的趋势信号。结合Bollinger带的高低估判断,可以使策略信号更加准确。
该策略最大的风险在于Bollinger带指标本身。当股票价格出现异常波动时,Bollinger带的范围也会随之改变。这时就可能出现股票价格明显被高估或低估,但是并未触及Bollinger带的上下轨。从而导致策略无法给出交易信号的问题。
另外,如果仅仅依赖技术指标,而没有考虑股票基本面信息,也会存在一定的风险。比如说盈利下滑但股价被低估的股票,或者业绩高速增长但股价偏高的个股。这些情况下,策略信号可能与股票实际价值存在一定偏差。
这种策略可以从以下几个方面进行优化:
增加止损机制。当股票价格与买入价格相比发生一定比例的下跌时,强制止损退出。这可以有效控制策略的最大损失。
结合股票基本面与技术指标。加入如PE,PB等基本面指标的判断规则,避免买入实际上已经高估的股票。
动态调整参数。使Bollinger带的周期长度、标准差倍数等参数根据不同股票波动率进行动态调整。这可以使Bollinger带更好地适应个股的价格波动。
Bollinger带动量突破策略通过辅助判断指标发出交易信号,避免了盲目交易的风险,可以有效过滤噪音信号。同时也存在一定局限,无法完全避免异常波动的影响。未来可以从止损、结合基本面、动态参数调整等方面进行优化,使策略更稳定可靠。
/*backtest
start: 2023-11-18 00:00:00
end: 2023-12-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="NoScoobies Bollinger Bands", overlay=true)
source = close
length = input(20, minval=1, title = "Period") //Length of the Bollinger Band
mult = input(1.5, minval=0.001, maxval=50, title = "Standard Deviation") // Use 1.5 SD for 20 period MA; Use 2 SD for 10 period MA
basis = sma(source, length)
dev = mult * stdev(source, length)
upper = basis + dev
lower = basis - dev
long=crossover(source, basis)
short=crossunder(source, basis)
close_long=crossunder(source, upper)
close_short=crossover(source, lower)
if long
strategy.entry("Long", strategy.long)
strategy.close("Long", when = close_long)
if short
strategy.entry("Short", strategy.short)
strategy.close("Short", when = close_short)
plot(basis, color=color.red,title= "SMA")
p1 = plot(upper, color=color.blue,title= "UB")
p2 = plot(lower, color=color.blue,title= "LB")
fill(p1, p2)