線形回帰チャネルブレイク・トレード戦略

作者: リン・ハーンチャオチャン開催日:2024年2月18日15時53分
タグ:

img

概要

この戦略は,線形回帰チャネルの上部および下部帯を,デュアル標準偏差と組み合わせて,ブレイクアウトの購入・販売信号を設定し,価格がブレイクしたときのポジションを確立するために使用する.また,チャネルの中間線のクロスオーバーを利益の徴候として利用し,利益をロックする.

戦略の論理

この戦略の基本論理は,線形回帰チャネルの上帯,下帯,中線の計算に基づいています. 具体的な計算プロセスは以下の通りです.

  1. 価格の線形回帰値 lineregを計算し,次の期間の線形回帰値 linereg_p を計算します.

  2. 傾斜の傾斜と直線回帰線の切断点の切断点を計算する

  3. 回帰線に対する価格の偏差偏差を計算する

  4. 上と下のバンドのオフセットを取得するために偏差の倍数devを設定

  5. 価格が下帯から上向きに突破すると,セット購入信号を購入

  6. 価格が上部帯から下へと突破すると,セールシグナルをセットします.

  7. 価格がチャネルの中央線から逆転すると,設定 利益シグナル出口

  8. 購入,販売,退出シグナルに基づく取引論理を設定する

利点分析

この戦略の最大の利点は,線形回帰チャンネルが反映する中長期トレンドを利用することです.

  1. 上位および下位帯は,価格変動の通常の範囲を効果的に反映することができます.それらを取引信号を設定するために使用すると,誤った信号を減らすことができます.

  2. 中間線クロスオーバーは,利益を得る信号として利益を最大化し,利益を得た後に逆転によって生じる損失を回避することができます.

  3. 線形回帰チャネルには一定の遅延があり 短期間の市場騒音を効果的にフィルタリングし,取引信号をより信頼性のあるものにすることができます.

  4. この戦略にはパラメータが少なく,実行が容易で,アルゴリズム取引に適しています.

リスク分析

この戦略にはいくつかのリスクがあります:

  1. 線形回帰チャネルの遅延は,急激な短期変化の後,トレンドを見逃す可能性があります.最適化するために期間を短縮することができます.

  2. 偏差倍数の設定が正しくない場合も,誤った信号が発生する可能性があります.パラメータはバックテストによって最適化できます.

  3. 突破信号のみを頼りにすると,ウィップソー損失が発生します.信号フィルタリングのために他の指標を使用することができます.

  4. カーブフィッティングのリスクもあります.他のチャネル指標と組み合わせたり,異なるデータソースをテストしたりすると役立ちます.

オプティマイゼーションの方向性

この戦略の主要な最適化方向は:

  1. 遅延と感度をバランスするために線形回帰チャネルの長さを最適化します

  2. リスク管理を最大化しながら信号品質を向上させるため 偏差倍数を最適化します

  3. EMA,KDJなどなど,勝利率を改善するために,信号フィルタリングのための他の指標を追加します.

  4. ストップ・ロスのメカニズムを ATR トレイリング・ストップ・ロスのように追加します.

  5. 戦略に対する異なるデータ源の影響をテストする.例えば調整された閉店,インデックスデータなど.

  6. 市場状況に基づいてパラメータや信号重量を動的に調整する.

結論

ストラテジーの論理は明確で理解しやすいもので,パラメータが少ないため,ライブトレーディングは比較的簡単に実装できます.しかし,変化する市場状況に基づいてパラメータを動的に最適化する方法と,シグナルフィルタリングのための他の指標を組み合わせることは,この戦略の成功の鍵です.継続的なテストと最適化によって,この戦略は安定した利益を生む定量システムになることができます.


/*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)

もっと