
適応的線形回帰チャネル戦略は,線形回帰分析に基づいた量化取引戦略である.この戦略は,一定期間中の証券価格の線形回帰方程式を計算して,上下チャネルを形成し,チャネル上下軌道を取引信号として使用して,区間取引またはトレンド追跡を行う.
適応線形回帰通路戦略の核心は,定数のK根K線を計算した閉盘価格線形回帰方程式で,価格の中位数を表す中位線,価格上限を表す上線,価格下限を表す下線を形成することである.具体的計算プロセスは以下のとおりである.
入力参数lengthで指定されたK根K線の独立変数xと依存変数yを集める. ここでxは1からlengthまでの整数で,yは対応するK線の閉算値である.
回帰係数を計算する:
各 K 線に対応する線形回帰値 y’ を計算し,標準差STDDEV
中央線は回帰方程式y’=mx+bで,上下軌道はそれぞれ中央線上下に標準差倍数間隔を浮遊する.
新しいK線が到着するにつれ,上記の計算をロールアップし,上下自適應通路を形成する.通路上下軌道交差に応じて多空し,中線近くで止損する.
適応的線形回帰通路戦略は,従来の平均線形戦略に比べて以下の利点がある.
より科学的で合理的で,回帰分析モデルが平均線より高い統計的意味を持つ
価格の変動に合わせて,通路の範囲を自動的に調整する.
追跡効果が優れ,いくつかの品種では平均線戦略よりも優れている.
テスト結果も良好で,実用化も満足できる.
この戦略には以下のリスクがあります.
価格の変動が大きすぎると,大きな損失が発生します. 解決策は,ストップを設定し,パラメータを最適化することです.
経路の誤差は追跡の効果を悪くする. 解決策は,他の技術指標と組み合わせたパラメータの調整である.
回測効果は良く見えるが,実体効果はあまり良くありません. 解決策はパラメータを調整し,充分検証することです.
この戦略は,以下の側面からさらに最適化できます.
複数のパラメータをテストし,最適なパラメータを探します.
他の技術指標と組み合わせると,急激な走行を回避する信号の誤差
損失を抑える戦略を高め,損失のリスクを抑え,資金を保護する
ポジション管理モジュールを追加し,市場の状況に応じてポジションのサイズを調整する
適応線形回帰通路戦略は,全体的に見ると,効果の良くない量化戦略である.理論的基盤は堅牢で,実用的な効果は良好で,さらなる研究と最適化に値し,量化取引システムの有効な構成要素になる可能性がある.しかし,その限界を認識し,リスクを防ぎ,慎重に実践する必要がある.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy("Stealthy 7 Linear Regression Channel Strategy", overlay=true)
source = open
length = input(100, minval=1)
mult1 = input(1, minval=0.001, maxval=50)
mult2 = input(1, minval=0.001, maxval=50)
DayTrader = input(title="Range Mode", type=bool, defval=false)
//Making the first least squares line
sum_x = length * (length + 1) / 2
sum_y = 0
sum_xy = 0
xyproductsum = 0
sum_xx = 0
for i = 1 to length
sum_y := sum_y + close[i]
sum_xy := i * close[i] + sum_xy
sum_xx := i * i + sum_xx
m = (length*sum_xy - (sum_x * sum_y)) / (length * sum_xx - (sum_x * sum_x))
b = sum_y / length - (m * sum_x / length)
//Finding the first standard deviation from the line
difference = 0
for i = 1 to length
y = i * m + b
difference := pow(abs(close[i] - y),2) + difference
STDDEV = sqrt(difference / length)
//Creating trading zones
dev = mult1 * STDDEV
dev2 = mult2 * STDDEV
upper = b + dev
lower = b - dev2
middle = b
if DayTrader == false
if crossover(source, upper)
strategy.entry("RGLONG", strategy.long, oca_name="RegChannel", comment="RegLong")
else
strategy.cancel(id="RGLONG")
if crossunder(source, lower)
strategy.entry("RGSHORT", strategy.short, oca_name="RegChannel", comment="RegShort")
else
strategy.cancel(id="RGSHORT")
if crossover(source, middle) and strategy.position_size < 0
strategy.close_all()
if crossunder(source,middle) and strategy.position_size > 0
strategy.close_all()
if DayTrader == true
if crossover(source, lower)
strategy.entry("RGLONG", strategy.long, oca_name="RegChannel", comment="RegLong")
else
strategy.cancel(id="RGLONG")
if crossunder(source, upper)
strategy.entry("RGSHORT", strategy.short, oca_name="RegChannel", comment="RegShort")
else
strategy.cancel(id="RGSHORT")
plot(upper, title="UpperBand", color=purple, linewidth=1, style=line)
plot(lower, title="LowerBand", color=purple, linewidth=1, style=line)
plot(middle, title="MiddleBand", color=black, linewidth=1, style=line)