線形回帰分析に基づく定量的取引戦略


作成日: 2024-01-26 15:48:35 最終変更日: 2024-01-26 15:48:35
コピー: 0 クリック数: 680
1
フォロー
1617
フォロワー

線形回帰分析に基づく定量的取引戦略

概要

適応的線形回帰チャネル戦略は,線形回帰分析に基づいた量化取引戦略である.この戦略は,一定期間中の証券価格の線形回帰方程式を計算して,上下チャネルを形成し,チャネル上下軌道を取引信号として使用して,区間取引またはトレンド追跡を行う.

戦略原則

適応線形回帰通路戦略の核心は,定数のK根K線を計算した閉盘価格線形回帰方程式で,価格の中位数を表す中位線,価格上限を表す上線,価格下限を表す下線を形成することである.具体的計算プロセスは以下のとおりである.

  1. 入力参数lengthで指定されたK根K線の独立変数xと依存変数yを集める. ここでxは1からlengthまでの整数で,yは対応するK線の閉算値である.

  2. 回帰係数を計算する:

    • b = (∑y)/n - m(∑x)/n
    • m = [(n∑xy) - (∑x)(∑y)]/[(n∑x2) - (∑x)2]
  3. 各 K 線に対応する線形回帰値 y’ を計算し,標準差STDDEV

  4. 中央線は回帰方程式y’=mx+bで,上下軌道はそれぞれ中央線上下に標準差倍数間隔を浮遊する.

新しいK線が到着するにつれ,上記の計算をロールアップし,上下自適應通路を形成する.通路上下軌道交差に応じて多空し,中線近くで止損する.

優位分析

適応的線形回帰通路戦略は,従来の平均線形戦略に比べて以下の利点がある.

  1. より科学的で合理的で,回帰分析モデルが平均線より高い統計的意味を持つ

  2. 価格の変動に合わせて,通路の範囲を自動的に調整する.

  3. 追跡効果が優れ,いくつかの品種では平均線戦略よりも優れている.

  4. テスト結果も良好で,実用化も満足できる.

リスク分析

この戦略には以下のリスクがあります.

  1. 価格の変動が大きすぎると,大きな損失が発生します. 解決策は,ストップを設定し,パラメータを最適化することです.

  2. 経路の誤差は追跡の効果を悪くする. 解決策は,他の技術指標と組み合わせたパラメータの調整である.

  3. 回測効果は良く見えるが,実体効果はあまり良くありません. 解決策はパラメータを調整し,充分検証することです.

最適化の方向

この戦略は,以下の側面からさらに最適化できます.

  1. 複数のパラメータをテストし,最適なパラメータを探します.

  2. 他の技術指標と組み合わせると,急激な走行を回避する信号の誤差

  3. 損失を抑える戦略を高め,損失のリスクを抑え,資金を保護する

  4. ポジション管理モジュールを追加し,市場の状況に応じてポジションのサイズを調整する

要約する

適応線形回帰通路戦略は,全体的に見ると,効果の良くない量化戦略である.理論的基盤は堅牢で,実用的な効果は良好で,さらなる研究と最適化に値し,量化取引システムの有効な構成要素になる可能性がある.しかし,その限界を認識し,リスクを防ぎ,慎重に実践する必要がある.

ストラテジーソースコード
/*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)