この戦略は,線形回帰チャネルの上部および下部帯を,デュアル標準偏差と組み合わせて,ブレイクアウトの購入・販売信号を設定し,価格がブレイクしたときのポジションを確立するために使用する.また,チャネルの中間線のクロスオーバーを利益の徴候として利用し,利益をロックする.
この戦略の基本論理は,線形回帰チャネルの上帯,下帯,中線の計算に基づいています. 具体的な計算プロセスは以下の通りです.
価格の線形回帰値 lineregを計算し,次の期間の線形回帰値 linereg_p を計算します.
傾斜の傾斜と直線回帰線の切断点の切断点を計算する
回帰線に対する価格の偏差偏差を計算する
上と下のバンドのオフセットを取得するために偏差の倍数devを設定
価格が下帯から上向きに突破すると,セット購入信号を購入
価格が上部帯から下へと突破すると,セールシグナルをセットします.
価格がチャネルの中央線から逆転すると,設定 利益シグナル出口
購入,販売,退出シグナルに基づく取引論理を設定する
この戦略の最大の利点は,線形回帰チャンネルが反映する中長期トレンドを利用することです.
上位および下位帯は,価格変動の通常の範囲を効果的に反映することができます.それらを取引信号を設定するために使用すると,誤った信号を減らすことができます.
中間線クロスオーバーは,利益を得る信号として利益を最大化し,利益を得た後に逆転によって生じる損失を回避することができます.
線形回帰チャネルには一定の遅延があり 短期間の市場騒音を効果的にフィルタリングし,取引信号をより信頼性のあるものにすることができます.
この戦略にはパラメータが少なく,実行が容易で,アルゴリズム取引に適しています.
この戦略にはいくつかのリスクがあります:
線形回帰チャネルの遅延は,急激な短期変化の後,トレンドを見逃す可能性があります.最適化するために期間を短縮することができます.
偏差倍数の設定が正しくない場合も,誤った信号が発生する可能性があります.パラメータはバックテストによって最適化できます.
突破信号のみを頼りにすると,ウィップソー損失が発生します.信号フィルタリングのために他の指標を使用することができます.
カーブフィッティングのリスクもあります.他のチャネル指標と組み合わせたり,異なるデータソースをテストしたりすると役立ちます.
この戦略の主要な最適化方向は:
遅延と感度をバランスするために線形回帰チャネルの長さを最適化します
リスク管理を最大化しながら信号品質を向上させるため 偏差倍数を最適化します
EMA,KDJなどなど,勝利率を改善するために,信号フィルタリングのための他の指標を追加します.
ストップ・ロスのメカニズムを ATR トレイリング・ストップ・ロスのように追加します.
戦略に対する異なるデータ源の影響をテストする.例えば調整された閉店,インデックスデータなど.
市場状況に基づいてパラメータや信号重量を動的に調整する.
ストラテジーの論理は明確で理解しやすいもので,パラメータが少ないため,ライブトレーディングは比較的簡単に実装できます.しかし,変化する市場状況に基づいてパラメータを動的に最適化する方法と,シグナルフィルタリングのための他の指標を組み合わせることは,この戦略の成功の鍵です.継続的なテストと最適化によって,この戦略は安定した利益を生む定量システムになることができます.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Robotrading //@version=4 strategy("robotrading linreg", "linreg", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, commission_value = 0.1) //Settings source = input(close) length = input(100, minval=1) offset = input(0, minval=0) dev = input(2.0, "Deviation") smoothing = input(1, minval=1) mtf_val = input("", "Resolution", input.resolution) signals = input("Recent", "Signals Display", options=["Recent", "All"]) goto = input(0, "End At Bar Index") //Lin.reg. cc(x) => x=="Red"?color.red:x=="Lime"?color.lime:x=="Orange"?color.orange:x=="Teal"?color.teal:x=="Yellow"?color.yellow:x=="Black"?color.black:color.white data(x) => sma(security(syminfo.tickerid, mtf_val!="" ? mtf_val : timeframe.period, x), smoothing) linreg = data(linreg(source, length, offset)) linreg_p = data(linreg(source, length, offset+1)) //Deviation x = bar_index slope = linreg - linreg_p intercept = linreg - x*slope deviationSum = 0.0 for i = 0 to length-1 deviationSum:= deviationSum + pow(source[i]-(slope*(x-i)+intercept), 2) deviation = sqrt(deviationSum/(length)) x1 = x-length x2 = x y1 = slope*(x-length)+intercept y2 = linreg //Cross dm_current = -deviation*dev + y2 dp_current = deviation*dev + y2 ex_current = (dm_current + dp_current) / 2 buy = crossunder(close, dm_current) sell = crossover(close, dp_current) exit = crossover(close, ex_current) or crossunder(close, ex_current) //Channel updating = goto <= 0 or x < goto // if updating // line b = line.new(x1, y1, x2, y2, xloc.bar_index, extend.right, color.aqua, width = 3) // line.delete(b[1]) // line dp = line.new(x1, deviation*dev + y1, x2, deviation*dev + y2, xloc.bar_index, extend.right, color.red, width = 3) // line.delete(dp[1]) // line dm = line.new(x1, -deviation*dev + y1, x2, -deviation*dev + y2, xloc.bar_index, extend.right, color.lime, width = 3) // line.delete(dm[1]) //Lines plot(dm_current, color = color.lime) plot(dp_current, color = color.red) plot(ex_current) //Trading if ex_current > 0 strategy.entry("Long", strategy.long, na, limit = dm_current) strategy.entry("Short", strategy.short, na, limit = dp_current) strategy.exit("ExitLong", "Long", limit = ex_current) strategy.exit("ExitShort", "Short", limit = ex_current)