
動的回帰チャネル戦略は,線形回帰を用いて価格トレンドを分析し,動的ストップロスを組み合わせてトレンド追跡を実現する量化取引戦略である.この戦略は,線形回帰を用いて価格チャネルをマッピングし,価格がチャネルを突破した信号を判断し,買入および販売指示を発行する.同時に,戦略は,価格をリアルタイムで更新し,ストップロスを固定する.
この戦略は,まず価格の線形回帰曲線を計算し,価格が上行または下行回帰チャネルを突破するかどうかを判断する.価格がチャネル上線を超えると,買入シグナルを生成し,価格がチャネル下線を下回ると,売り込みシグナルを生成する.
市場に出回った後,戦略は,価格が止損平均線を突破した状況をリアルタイムで追跡する.多量注文をすると,価格が止損平均線を下回ると,止損売り指示を発行する.空き注文をすると,価格が止損平均線を超えると,止損買い指示を発行する.このようにして,利益をロックし,リスクを制御する.
注目すべきは,もし価格が再びチャネルを突破し,逆操作を実行すると,戦略はすぐに,元のポジションを平置し,逆取引に変更されるということです.
この戦略は,トレンドと反転の取引思想を組み合わせ,価格の全体的な動きに順応し,短期的な調整の機会を掴むことができます.リアルタイムで更新されたストップ・ロスの戦略は,リスクを効果的に制御し,よりバランスの取れた取引方法です.
動的回帰チャネル戦略は,単純な移動均線戦略と比較して,価格変化により敏感であり,誤取引を減らすことができます.さらに,この戦略は,価格がチャネルを突破して上下軌道に乗ったときにのみ実行され,無秩序な激進取引を避けるのに役立ちます.
この戦略は,主に回帰曲線の不正確なフィットがもたらすリスクに直面する.回帰通路の範囲が不適切で,あまりにも広い場合,無効取引の確率を増やす.狭すぎると取引の機会が逃される.
また,ストップポジションの設定も重要です.ストップがあまりにも近く,短期的な価格変動によって引き起こすことが容易であり,ストップがあまりにも緩やかである場合,リスク管理の効果を及ぼしません.異なる品種に応じてパラメータを調整する必要があります.
周期や品種によって自動的に最適化するパラメータを考慮して,回帰通路とストップローンを価格の傾向に適したものにすることができる.例えば,機械学習アルゴリズムと組み合わせて最適のパラメータを訓練することができる.
一方,多項式回帰,局所加重回帰などの異なる種類の回帰方法を試すこともできます.
ダイナミック・リバース・チャネル戦略は,トレンドと逆転分析の方法を総合的に適用し,価格の全体的な動きに順応しながら,短期的な調整の機会を利用して取引を行う. 重要なリバース・チャネルとストップ・ロスの位置の設定は,戦略の効果に重要な影響を与える. 参数最適化とモデルエピレートにより,この取引戦略をさらに完善することができる.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Estratégia de Regressão Linear", shorttitle="Regressão Linear Estratégia", overlay=true, initial_capital = 100, default_qty_value = 10, default_qty_type = strategy.percent_of_equity)
// média móvel exponencial para definição de regressao linear
var SlopeEMASize = input.int(defval = 21, title = "Slope EMA" )
// ema_length = 21
slope_ema = ta.ema(close, SlopeEMASize)
// média móvel exponencial para definição de nivel de stop
var StopEMASize = input.int(defval = 13, title = "Stop EMA" )
stop_ema = ta.ema(close, StopEMASize)
// Variáveis para controle de posição
var float long_stop_level = na
var float long_entry_level = na
var bool long_signal = false
var bool long_order_open = false
var int long_order_id = 0
var float short_stop_level = na
var float short_entry_level = na
var bool short_signal = false
var bool short_order_open = false
var int short_order_id = 0
// Regressão linear para uso como sinal de entrada
var SlopeLenght = input.int(defval = 21, title = "Slope Lenght" )
entry_signal = ta.linreg(slope_ema, SlopeLenght, 0)
//Variaveis com a indicação do pivot da regressao
long_entry_signal = ta.crossover(entry_signal, entry_signal[1])
short_entry_signal = ta.crossunder(entry_signal, entry_signal[1])
// Condição de entrada (reversão da regressão)
if long_entry_signal
long_signal := true
short_signal := false
long_entry_level := high
long_stop_level := low
if short_entry_signal
short_signal := true
long_signal := false
short_entry_level := low
short_stop_level := high
// Indica quando o preço cruzou o nível de stop
price_cross_stop_ema_up = ta.crossover(close, stop_ema)
price_cross_stop_ema_down = ta.crossunder(close, stop_ema)
// Mover o stop quando o preço cruzar a nível stop e operação long ativa
if long_signal and long_order_open and price_cross_stop_ema_down
if low > long_entry_level
long_stop_level := high
// Mover o stop quando o preço cruzar a nível stop e operação short ativa
if short_signal and short_order_open and price_cross_stop_ema_up
if high < short_stop_level
short_stop_level := low
// Sair da posição se houver nova reversão da regressão
if long_order_open or short_order_open
if long_entry_signal //and short_order_open
strategy.close(str.tostring(short_order_id), comment ="Inversão Sinal("+str.tostring(short_order_id)+")")
short_order_open:= false
if short_entry_signal //and long_order_open
strategy.close(str.tostring(long_order_id), comment = "Inversão Sinal("+str.tostring(long_order_id)+")")
long_order_open:=false
// Sinais de compra e venda com base no stop
if long_signal and close > long_entry_level and not long_order_open
if strategy.opentrades != 0
strategy.cancel_all()
long_order_id+=1
// strategy.order(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level)
strategy.entry(str.tostring(long_order_id), strategy.long, comment="Open Long("+str.tostring(long_order_id)+")", limit = long_entry_level)
long_order_open := true
// log.info("Open Long:"+str.tostring(long_order_id))
if short_signal and close < short_entry_level and not short_order_open
if strategy.opentrades != 0
strategy.cancel_all()
short_order_id+=1
// strategy.order(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
strategy.entry(str.tostring(short_order_id), strategy.short, comment="Open Short("+str.tostring(short_order_id)+")", limit = short_entry_level)
short_order_open := true
// log.info("Open Short:"+str.tostring(short_order_id))
// Sinais de compra e venda com base no stop
if long_signal and close < long_stop_level and long_order_open
strategy.close(str.tostring(long_order_id), comment = "Stop Atingido("+str.tostring(long_order_id)+")", immediately = true)
long_order_open := false
if short_signal and close > short_stop_level and short_order_open
strategy.close(str.tostring(short_order_id),comment = "Stop Atingido("+str.tostring(short_order_id)+")", immediately = true)
short_order_open := false
// Plotagem da regressão e do stop
plot(stop_ema, title="Stop Signal", color=color.red)
plot(entry_signal,"Entry Signal", linewidth = 5, color = color.rgb(155, 0, 140))
plotshape(long_order_open?long_stop_level:na, title = "Long Stop Level", color = color.green, location = location.absolute)
plotshape(long_order_open?long_entry_level:na, title="Long Entry Value",location=location.absolute, color = color.green, style = shape.circle)
plotshape(series=long_entry_signal, title="Long Signal", location=location.abovebar, color=color.green, style=shape.triangleup, size=size.small, text = "Long Signal")
plotshape(short_order_open?short_stop_level:na, title = "Short Stop Level", color = color.red, location = location.absolute)
plotshape(short_order_open?short_entry_level:na, title="Short Entry Value",location=location.absolute, color = color.red, style = shape.circle)
plotshape(series=short_entry_signal, title="Short Signal", location=location.belowbar, color=color.red, style=shape.triangledown, size=size.small, text="Short Signal")