Este artículo explica en detalle una estrategia de negociación cuantitativa a largo plazo utilizando bandas de volatilidad para identificar reversiones.
I. Lógica de la estrategia
El indicador básico son las bandas de volatilidad, calculadas como:
Calcular las bandas medias móviles medias, superiores e inferiores.
Una señal de compra se genera cuando el precio se rompe a través de la banda inferior.
Una señal de venta se genera cuando el precio rompe la banda superior.
Las salidas pueden estar en señales de venta o interrupciones de banda superior.
El stop loss es un porcentaje fijo.
Esto permite comprar en fases descendentes, luego salir a través de la obtención de ganancias o paradas para capitalizar las reversiones.
II. Ventajas de la Estrategia
La mayor ventaja es el uso de bandas de volatilidad para identificar puntos de reversión, una técnica de análisis técnico madura.
Otra ventaja es el mecanismo de stop loss para controlar el riesgo por operación.
Por último, la pirámide también ayuda a incrementar las ganancias después de las reversiones.
III. Riesgos potenciales
Sin embargo, existen algunos problemas potenciales:
En primer lugar, las medias móviles tienen retraso y pueden causar que se pierda el mejor momento de entrada.
En segundo lugar, los niveles de toma de ganancias y stop loss requieren una optimización cuidadosa.
Por último, los largos períodos de retención significan que se deben soportar ciertas reducciones.
IV. Resumen
En resumen, este artículo ha explicado una estrategia de negociación cuantitativa a largo plazo utilizando bandas de volatilidad para capitalizar las reversiones. Puede detectar efectivamente oportunidades de reversión para las tenencias a largo plazo. Pero los riesgos como los lags de MA necesitan prevención y se requiere optimización para las salidas. En general, proporciona un enfoque comercial a largo plazo robusto.
/*backtest start: 2023-09-07 00:00:00 end: 2023-09-12 04:00:00 period: 14m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © ediks123 //strategy logic has been borrowed from ceyhun and tweaked the settings for back testing //@version=4 //SPY 4 hrs settings 8, 13 , 3.33 , 0.9 on 4 hrs chart //QQQ above settings is good , but 13, 13 has less number of bars //QQQ 4 hrs settings 13, 13 , 3.33 , 0.9 on 4 hrs chart strategy(title="Volatility Bands Reversal Strategy", shorttitle="VolatilityBandReversal" , overlay=true, pyramiding=2, default_qty_type=strategy.percent_of_equity, default_qty_value=20, initial_capital=10000, currency=currency.USD) //default_qty_value=10, default_qty_type=strategy.fixed, av = input(8, title="Band Average") vp = input(13, title="Volatility Period") df = input(3.33,title="Deviation Factor",minval=0.1) lba = input(0.9,title="Lower Band Adjustment",minval=0.1) riskCapital = input(title="Risk % of capital", defval=10, minval=1) stopLoss=input(6,title="Stop Loss",minval=1) exitOn=input(title="Exit on", defval="touch_upperband", options=["Sell_Signal", "touch_upperband"]) src = hlc3 typical = src >= src[1] ? src - low[1] : src[1] - low deviation = sum( typical , vp )/ vp * df devHigh = ema(deviation, av) devLow = lba * devHigh medianAvg = ema(src, av) emaMediaAvg=ema(medianAvg, av) upperBandVal= emaMediaAvg + devHigh lowerbandVal= emaMediaAvg - devLow MidLineVal=sma(medianAvg, av) UpperBand = plot ( upperBandVal, color=#EE82EE, linewidth=2, title="UpperBand") LowerBand = plot ( lowerbandVal , color=#EE82EE, linewidth=2, title="LowerBand") MidLine = plot (MidLineVal, color=color.blue, linewidth=2, title="MidLine") buyLine = plot ( (lowerbandVal + MidLineVal )/2 , color=color.blue, title="BuyLine") up=ema(medianAvg, av) + devHigh down=ema(medianAvg, av) - devLow ema50=ema(hlc3,50) plot ( ema50, color=color.orange, linewidth=2, title="ema 50") //outer deviation //deviation1 = sum( typical , vp )/ vp * 4 //devHigh1 = ema(deviation, av) //devLow1 = lba * devHigh //medianAvg1 = ema(src, av) //UpperBand1 = plot (emaMediaAvg + devHigh1, color=color.red, linewidth=3, title="UpperBand1") //LowerBand1 = plot (emaMediaAvg - devLow1, color=color.red, linewidth=3, title="LowerBand1") // ///Entry Rules //1)First candle close below the Lower Band of the volatility Band //2)Second candle close above the lower band //3)Third Candle closes above previous candle Buy = close[2] < down[2] and close[1]>down[1] and close>close[1] //plotshape(Buy,color=color.blue,style=shape.arrowup,location=location.belowbar, text="Buy") //barcolor(close[2] < down[2] and close[1]>down[1] and close>close[1] ? color.blue :na ) //bgcolor(close[2] < down[2] and close[1]>down[1] and close>close[1] ? color.green :na ) ///Exit Rules //1)One can have a static stops initially followed by an trailing stop based on the risk the people are willing to take //2)One can exit with human based decisions or predefined target exits. Choice of deciding the stop loss and profit targets are left to the readers. Sell = close[2] > up[2] and close[1]<up[1] and close<close[1] //plotshape(Sell,color=color.red,style=shape.arrowup,text="Sell") barcolor(close[2] > up[2] and close[1]<up[1] and close<close[1] ? color.yellow :na ) bgcolor(close[2] > up[2] and close[1]<up[1] and close<close[1] ? color.red :na ) //Buyer = crossover(close,Buy) //Seller = crossunder(close,Sell) //alertcondition(Buyer, title="Buy Signal", message="Buy") //alertcondition(Seller, title="Sell Signal", message="Sell") //Entry-- //Echeck how many units can be purchased based on risk manage ment and stop loss qty1 = (strategy.equity * riskCapital / 100 ) / (close*stopLoss/100) //check if cash is sufficient to buy qty1 , if capital not available use the available capital only qty1:= (qty1 * close >= strategy.equity ) ? (strategy.equity / close) : qty1 strategy.entry(id="vbLE", long=true, qty=qty1, when=Buy) bgcolor(strategy.position_size>=1 ? color.blue : na) // stop loss exit stopLossVal = strategy.position_size>=1 ? strategy.position_avg_price * ( 1 - (stopLoss/100) ) : 0.00 //draw initil stop loss plot(strategy.position_size>=1 ? stopLossVal : na, color = color.purple , style=plot.style_linebr, linewidth = 2, title = "stop loss") //, trackprice=true) strategy.close(id="vbLE", comment="SL exit Loss is "+tostring(close - strategy.position_avg_price, "###.##") , when=abs(strategy.position_size)>=1 and close < stopLossVal ) //close on Sell_Signal strategy.close(id="vbLE", comment="Profit is : "+tostring(close - strategy.position_avg_price, "###.##") , when=strategy.position_size>=1 and exitOn=="Sell_Signal" and Sell) //close on touch_upperband strategy.close(id="vbLE", comment="Profit is : "+tostring(close - strategy.position_avg_price, "###.##") , when=strategy.position_size>=1 and exitOn=="touch_upperband" and (crossover(close, up) or crossover(high, up)))