移動平均トレンドフォロー最適化戦略


作成日: 2024-01-04 15:44:23 最終変更日: 2024-01-04 15:44:23
コピー: 0 クリック数: 526
1
フォロー
1621
フォロワー

移動平均トレンドフォロー最適化戦略

概要

量化光は,ストキャスティック指標とOTT指標を組み合わせた戦略である.この戦略は,ストキャスティック指標を利用して買入と売却のシグナルを生成し,OTT指標と組み合わせてシグナルをフィルタリングして,大トレンドを捉え,市場変動による偽信号の影響を軽減しようとする.この記事は,この戦略を詳細に評価する.

戦略原則

この戦略の核心的な考えは,OTT指標をストカスティック指標に重ねて信号フィルタリングを行うことです.ストカスティック指標は,価格が指定された時間帯の最高価格と最低価格と比較して,価格が極端な領域にあるかどうかを判断するために使用されます.OTT指標は,移動平均と動的ストップを動向を追跡するために使用します.

コード設定 ストキャスティックの高位は1080,低位は1020で,ストキャスティックの中位は平らな区間である.ストキャスティックが買取/売却シグナルを生成する際,コードはOTT指標に基づいて信号の有効性を判断する.価格がOTT平均線を上方から越えた場合,買取シグナルが送信され,価格がOTT平均線を下方から越えた場合,販売シグナルが送信されます.

この組み合わせは,ストカスティック判断を活用し,オーバーバイを判断し,入場シグナルを発信する.OTTは,トレンドを追跡し,ストップダメージフィルタをオフにして,強すぎる振動状態による偽信号を利用し,シグナルの正確性と波動率を最適化する.

優位分析

この戦略は,StochasticとOTTの指標を組み合わせて,以下のいくつかの側面を最適化しています.

  1. 信号の精度が向上した. ストキャスティックは,超買いと超売りを判断し,OTTは,震動の状況による偽信号を排除する.
  2. 戦略の波動率を低減した. 動的ストップで本日の損失を制限し,多くの偽の突破をフィルターした.
  3. ストキャスティックが基本信号を出し,OTTがトレンドを追跡する.
  4. 過剰な信号干渉を減らす.信号の質を向上させながらも,無用な信号を減らす.
  5. 定量化ダイナミックストップを設定する. 定性的に当面の損失を保証し,戦略の変動率をさらに低減する.
  6. システムでは,トレンドとオーバーバイ・オーバーセール・インジケーターを組み合わせて,両者を利用し,両者の欠点を最適化します.

総合的に見ると,この戦略はOTTを利用してストキャスティック信号をフィルタリングすることで,信号品質と戦略的利益を効果的に向上させ,取引回数と戦略の変動率を低下させ,傾向に近い,低リスク高利益の効果を達成した.

リスク分析

  • この戦略の適用範囲は比較的狭い。主に明らかな傾向がある株式に適用する。価格変動が大きい株式,または株価が振動整理中の株式に影響は少ない。
  • 株の基本面や市場のマクロ面を考慮しない戦略があり,ある程度の盲目性がある.
  • 参数設定は敏感である。ストキャスティックとOTTの複数の参数には専門的な調整が必要で,そうでなければ戦略の収益性に影響する。
  • ストップ・ロスは緩やかすぎます. 潜在的損失を承担し,さらに最適化する必要があります.
  • 偽突破と震動の状況では一定の損失と信号干渉が生じます.判断条件と停止損失条件を変更する必要があります.

上記のリスクに対して,以下の改善策を講じることができます.

  1. 異なるカテゴリーの株によって異なるパラメータの組み合わせを使用する.
  2. ニュースと基本を組み合わせて,信号を強めること.
  3. パラメータを最適化テストして最適な設定を探します.
  4. 移動式ストップを導入し,リスクをさらに低減する.
  5. 判断条件を修正し,より厳格な信号確認メカニズムを採用する.

最適化の方向

この戦略は,次のいくつかの点で深化・最適化できます.

  1. 異なる市場と株のカテゴリーに応じてパラメータを調整する.現在のデフォルト値は一般的であり,異なる株を個別にテストして最適なパラメータの組み合わせを探することができる.

  2. ストップ・メカニズムと移動ストップの導入.現在,動的な固定ストップが採用されており,損失と利益を動的に追跡することはできません.戦略のリスクと利益をさらに制御するために移動ストップとストップの導入をテストすることができます.

  3. 信号判断の論理を最適化する.現在の判断の論理は比較的単純で,価格の上下突破を直接標識して買いと売りの信号を与える.信号の信頼性を確保するために,より多くの指標と価格形態の判断を組み合わせることを考えることができる.

  4. ポジション開設条件とフィルターメカニズムを追加する.現在の戦略は,各信号を無差別に処理する.量能指標,成交量指標などのポジション開設条件を導入し,偽信号を排除するために一定の信号時間ウィンドウを追加する.

  5. 異なる指標とOTTの組み合わせをテストする.現在,StochasticとOTTの組み合わせが採用されている.MACD,RSIなどの他の指標とOTTの組み合わせの効果をテストすることができる.

  6. 融合資金管理とポジション管理モジュール 資金管理とポジション管理のメカニズムが存在しないため,完全にはストップ・ローズに依存している. 単一のリスクと全体的なリスクをさらに制御するために,異なる種類の資金管理とポジション管理方法をテストすることができます.

要約する

量化光線は,OTT指標とストキャスティックが有機的に結合した量化戦略である.これは,2つの指標の互補的な優位性を利用し,信号の正確性を向上させ,大きなトレンドを効果的に捉えながらもリスクを低減する.

この戦略は,誤差が低く,信号が明確で波動が少ないという利点があります.信号の信頼性を高め,ストップ・ロスのレベルを最適化し,取引頻度を低下させ,推奨される量化戦略です.

同時に,この戦略には改善の余地があります.パラメータの最適化,損壊防止機構の改善,信号およびフィルタリング機構の強化などの手段によって,この戦略をより安定,自動化,および知能化へと発展させることができます.これは私たちの将来の仕事の目標でもあります.

ストラテジーソースコード
/*backtest
start: 2023-12-27 00:00:00
end: 2024-01-03 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic
//created by: @Anil_Ozeksi
//developer: ANIL ÖZEKŞİ
//author: @kivancozbilgic


strategy(title="Stochastic Optimized Trend Tracker", shorttitle="SOTT", format=format.price, precision=2)
periodK = input(250, title="%K Length", minval=1)
smoothK = input(50, title="%K Smoothing", minval=1)
src1 = input(close, title="Source")
length=input(3, "OTT Period", minval=1)
percent=input(0.618, "OTT Percent", type=input.float, step=0.1, minval=0)
showsupport = input(title="Show Support Line?", type=input.bool, defval=false)
showsignalsc = input(title="Show Stochastic/OTT Crossing Signals?", type=input.bool, defval=false)
Var_Func1(src1,length)=>
    valpha1=2/(length+1)
    vud11=src1>src1[1] ? src1-src1[1] : 0
    vdd11=src1<src1[1] ? src1[1]-src1 : 0
    vUD1=sum(vud11,9)
    vDD1=sum(vdd11,9)
    vCMO1=nz((vUD1-vDD1)/(vUD1+vDD1))
    VAR1=0.0
    VAR1:=nz(valpha1*abs(vCMO1)*src1)+(1-valpha1*abs(vCMO1))*nz(VAR1[1])
VAR1=Var_Func1(src1,length)
k = Var_Func1(stoch(close, high, low, periodK), smoothK)
src=k+1000
Var_Func(src,length)=>
    valpha=2/(length+1)
    vud1=src>src[1] ? src-src[1] : 0
    vdd1=src<src[1] ? src[1]-src : 0
    vUD=sum(vud1,9)
    vDD=sum(vdd1,9)
    vCMO=nz((vUD-vDD)/(vUD+vDD))
    VAR=0.0
    VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
VAR=Var_Func(src,length)
h0 = hline(1080, "Upper Band", color=#606060)
h1 = hline(1020, "Lower Band", color=#606060)
fill(h0, h1, color=#9915FF, transp=80, title="Background")
plot(k+1000, title="%K", color=#0094FF)
MAvg=Var_Func(src, length)
fark=MAvg*percent*0.01
longStop = MAvg - fark
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop =  MAvg + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
MT = dir==1 ? longStop: shortStop
OTT=MAvg>MT ? MT*(200+percent)/200 : MT*(200-percent)/200 
plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Support Line")
OTTC = #B800D9 
pALL=plot(nz(OTT[2]), color=OTTC, linewidth=2, title="OTT", transp=0)
alertcondition(cross(src, OTT[2]), title="Price Cross Alert", message="OTT - Price Crossing!")
alertcondition(crossover(src, OTT[2]), title="Price Crossover Alarm", message="PRICE OVER OTT - BUY SIGNAL!")
alertcondition(crossunder(src, OTT[2]), title="Price Crossunder Alarm", message="PRICE UNDER OTT - SELL SIGNAL!")
buySignalc = crossover(src, OTT[2])
plotshape(buySignalc and showsignalsc ? OTT*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
sellSignallc = crossunder(src, OTT[2])
plotshape(sellSignallc and showsignalsc ? OTT*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)

dummy0 = input(true, title = "=Backtest Inputs=")
FromDay    = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth  = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear   = input(defval = 2005, title = "From Year", minval = 2005)
ToDay      = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToMonth    = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear     = input(defval = 9999, title = "To Year", minval = 2006)
Start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)
Finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)
Timerange() =>
    time >= Start and time <= Finish ? true : false
if buySignalc
    strategy.entry("Long", strategy.long,when=Timerange())
if sellSignallc
    strategy.entry("Short", strategy.short,when=Timerange())