活性化関数の最適化によるスケール正規化ベクトル取引戦略


作成日: 2024-01-22 09:02:30 最終変更日: 2024-01-22 09:02:30
コピー: 0 クリック数: 578
1
フォロー
1617
フォロワー

活性化関数の最適化によるスケール正規化ベクトル取引戦略

概要

この策略はdrkhodakaramiのスケール統一ベクトル策略の改良であり,主としてアクティベーション関数を追加して,策略の性能を向上させる.策略は時間軸差分を利用して市場の変動率を計算し,値判断により多空信号を行う.同時に,策略はswish,ReLU,stepのアクティベーション関数を導入し,差分配列を平滑化して,信号判断の正確性を向上させる.

戦略原則

  1. 設定の時間軸上の差のパーセント変化率 x を計算します.
  2. x をアクティベーション関数に渡し,処理されたpの配列を得ます.
  3. プラスの負の値をthに設定し,pが上を通るときは多し,下を通るときは空にする
  4. 偽信号を避けるために再描画をオフにします.

優位分析

  1. アクティベーション機能の導入により,ノイズをフィルタリングし,信号判断の質を向上させる
  2. 自動取引可能な新しい開設・平成ロジック
  3. パラメータのカスタマイズスペースを追加し,より多くの市場に対応
  4. 取引信号を直感的に反映した優れたビジュアルデザイン

リスク分析

  1. 誤った値設定により,取引機会が失われる可能性があります.
  2. アクティベーション関数の不適切な選択は,市場情報をフィルタリングする可能性があります.
  3. 信号の誤差が重画によって引き起こされる問題をテストする

解決策は

  1. 最適な値を見つけるために,値のパラメータを調整する
  2. 異なるアクティベーション機能を試して
  3. 信号の有効性を確認するために,検出ロジックを再描画する.

最適化の方向

  1. 適応値設定を追加する
  2. アクティベーション関数のパラメータを最適化
  3. 自動ストップロジック
  4. フィルタリング信号を組み合わせる

要約する

この戦略はdrkhodakaramiの基礎で,アクティベーション機能の導入によりパフォーマンスを向上させ,パラメータの最適化スペースの拡張により,市場の変化により良く適応することができる.同時に,取引機会を直感的に反映する優れたビジュアルデザインを可視化することができる.その後,アクティベーション機能と値設定の最適化を継続し,ストップダメージロジックとより多くのシグナルフィルターを追加することで,より良い戦略効果を得ることができる.

ストラテジーソースコード
/*backtest
start: 2023-01-15 00:00:00
end: 2024-01-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// author: capissimo
strategy("Scaled Normalized Vector Strategy, ver.4", precision=2, overlay=false)
// This is a modification of my Scaled Normalized Vector Strategy  
// original: Drkhodakarami (https://www.tradingview.com/script/Fxv2xFWe-Normalized-Vector-Strategy-By-Drkhodakarami-Opensource/)

price    = input(close,  "Price Data")
tf       = input(18,     "Timeframe", minval=1, maxval=1440)
thresh   = input(14.,    "Threshold", minval=.1, step=.1) 
div      = input(1000000,"Divisor", options=[1,10,100,1000,10000,100000,1000000,10000000,100000000])
mmx      = input(233,    "Minimax Lookback", options=[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584])
showVol  = input(false,  "Volume")
useold   = input(true,   "Use Old System")
method   = input("Swish", "Activation", options=["Step", "LReLU", "Swish", "None"])

scaleMinimax(X, p, min, max) => 
    hi = highest(X, p), lo = lowest(X, p)
    (max - min) * (X - lo)/(hi - lo) + min

getdiff(prc, tf) =>
    prev  = scaleMinimax((useold ? security(syminfo.tickerid, tostring(tf), prc[1], barmerge.gaps_off, barmerge.lookahead_on) 
                                 : security(syminfo.tickerid, tostring(tf), prc[1])), tf, 0, 1)
    curr  = scaleMinimax((useold ? security(syminfo.tickerid, tostring(tf), hlc3, barmerge.gaps_off, barmerge.lookahead_on)  
                                 : security(syminfo.tickerid, tostring(tf), hlc3)), tf, 0, 1)
    (curr/prev) - 1

relu(x) => max(x, 0)
lrelu(x, alpha) => relu(x) - alpha * relu(-x)
step(x) => x >= 0 ? 1 : -1
log2(x) => log(x) / log(2)
sigmoid(x) => 1 / (1 + exp(-x))
swish(x) => x * sigmoid(x)

f(m) => method==m

vol  = useold ? security(syminfo.tickerid, tostring(tf), volume, barmerge.gaps_off, barmerge.lookahead_on) 
              : security(syminfo.tickerid, tostring(tf), volume)
obv  = cum(change(price) > 0 ? vol : change(price) < 0 ? -vol : 0*vol)
prix = showVol ? obv : price
x    = getdiff(prix, tf)
p    = f("Swish") ? swish(x) : f("Step") ? step(x) : f("LReLU") ? lrelu(x, .8) : x
th   = thresh/div
long = crossover(p, th)
short= crossunder(p, -th)

lime  = color.new(color.lime, 10), fuchsia = color.new(color.fuchsia, 10), 
black = color.new(color.black, 100), gray = color.new(color.gray, 50)
bg    = long ? lime : short ? fuchsia : black
cl    = p > th ? color.green : p < -th ? color.red : color.silver

bgcolor(bg, editable=false)
plot(scaleMinimax(th, mmx, -1, 1), color=lime, editable=false, transp=0)
hline(0, linestyle=hline.style_dotted, title="base line", color=gray, editable=false)
plot(scaleMinimax(-th, mmx, -1, 1), color=fuchsia, editable=false, transp=0)
plot(scaleMinimax(p, mmx, -1, 1), color=cl, style=plot.style_histogram, transp=70, editable=false)
plot(scaleMinimax(p, mmx, -1, 1), color=cl, style=plot.style_linebr, title="prediction", transp=0, editable=false)

strategy.entry("L", true, 1, when=long)
strategy.entry("S", false, 1, when=short)

alertcondition(long, title='Long', message='Long Signal!')
alertcondition(short, title='Short', message='Short Signal!')

//*** Karobein Oscillator
per  = input(8, "Karobein Osc Lookback")

prix2 = ema(price, per)
a = ema(prix2 < prix2[1] ? prix2/prix2[1] : 0, per)
b = ema(prix2 > prix2[1] ? prix2/prix2[1] : 0, per)
c = (prix2/prix2[1])/(prix2/prix2[1] + b)
d = 2*((prix2/prix2[1])/(prix2/prix2[1] + c*a)) - 1

plot(scaleMinimax(d, mmx, -1, 1), color=color.orange, transp=0)