線形回帰チャネルに基づくブレイクアウト取引戦略


作成日: 2024-02-18 15:00:53 最終変更日: 2024-02-18 15:00:53
コピー: 1 クリック数: 1045
1
フォロー
1617
フォロワー

線形回帰チャネルに基づくブレイクアウト取引戦略

概要

この戦略は,線形回帰チャネルの上下軌道を利用し,二重標準差の設定と組み合わせて,突破する買入と売却のシグナルを組み合わせて,価格突破後にポジション開設を確立する.同時に,チャネルの中線の交差を平仓シグナルとして利用し,利潤の後にストップを実現する.

戦略原則

この戦略の核心論理は,線形回帰通路の上下軌道と中線に基づいている.具体的計算プロセスは以下の通りである.

  1. 価格の線形回帰値linreg,および次の周期の線形回帰値linreg_p を計算する

  2. 線形回帰線の傾斜slopeと切開interceptを線形回帰値から計算する

  3. 価格の偏差をリグレーションラインから計算する

  4. 偏差の倍数devを設定し,上線と下線の偏移量を得ます.

  5. 価格が下線から上昇すると,buy信号を設定します.

  6. 価格が上から下へと突破すると, sell 信号を設定します.

  7. 価格がチャネル中線から反転したとき,ストップシグナルexitを設定する

  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)