ニューラルネットワーク差分価格変動最適化定量取引戦略

ATR ANN TANH OHLC4 volatility TIMEFRAME NEURAL NETWORK MACHINE LEARNING
作成日: 2025-06-23 11:39:44 最終変更日: 2025-06-23 11:39:44
コピー: 5 クリック数: 306
2
フォロー
319
フォロワー

ニューラルネットワーク差分価格変動最適化定量取引戦略 ニューラルネットワーク差分価格変動最適化定量取引戦略

概要

ニューラルネットワーク差異価格変動最適化量化取引戦略は,人工ニューラルネットワーク (((ANN)) に基づく高周波取引システムで,1秒級のタイムフレーム最適化のために設計されている.この戦略は,ニューラルネットワークを使用して,短期価格変動の差異を分析し,前向き伝達アルゴリズムで価格の方向を予測し,波動率フィルタリングとセッション時間制御を組み合わせて取引意思決定を最適化します.この戦略の核心は,微小な価格変動パターンを捕捉し,高周波環境で高利因子3.754の安定した取引パフォーマンスを実現することです.

戦略原則

この戦略は,3層のニューラルネットワークのアーキテクチャを採用し,価格差のデータを前向きに伝達するアルゴリズムで処理します.

  1. L0 からの入力層: 単一の入力ニューロンとして,現在のOHLC4 ((開高低收益平均値) と参照時間枠 ((デフォルト15秒) の歴史OHLC4の百分差の違いを受信する.

  2. 隠された層1 (L1): 5つのニューロンを含み,双曲正切線 ((tanh) をアクティベーション関数として使って,入力データを非線形に変形する.各ニューロンは,価格差を捕捉するための特定のパターンを捕捉するために,事前に訓練された重量を持っている.

  3. 隠された2層 (L2): 33のニューロンを含み,さらに複雑な重量マトリクスによって第1隠された層の出力を処理するために,tanhの活性化関数も使用する.

  4. 出力層 (L3): 単一のニューロンは最終的な予測信号を出し,その値は信号方向を修正するために反転される.

取引の論理は,ニューラルネットワークの出力値 ((L3_0)) を中心に展開されます.

  • L3_0 が入場値 ((デフォルトは0.003) よりも大きいとき,多信号をトリガーする
  • L3_0が負の入場値 ((−0.003) よりも小さいとき,空白信号を触発する
  • L3_0が退出値 (デフォルト0.001) よりも小さいとき,平仓多頭
  • L3_0が負の退出値 ((−0.001) よりも大きいとき,平仓空頭

この戦略は,以下の3つのフィルター機能も実現しています.

  • 冷却期フィルター: 取引が完了した後に,システムが指定された冷却期間を強制的に待つ (デフォルトは60秒)
  • 波動率のフィルターATR (Average True Range) 指数で,市場波動が最小の値 (デフォルト0.02) を超える場合にのみ取引する.
  • 取引時間フィルター: 選択的に,特定の市場時間 (デフォルトは9:00~16:00) にのみ取引を制限します.

戦略的優位性

  1. 高精度な予測能力: ニューラルネットワークの多層構造は,価格動向の複雑な非線形関係を捉えることができ,これは従来の技術指標では実現することが困難である.特に高周波環境では,この構造は,短期的な価格パターンを認識し,より正確な入場と出場シグナルを提供する.

  2. リスク・リターン・レート戦略は3.754の収益因子を達成し,これは,収益取引の合計が損失取引の合計の3.754倍であることを意味し,これは量化戦略の非常に優れたパフォーマンスである.

  3. フレキシブルなパラメータ最適化空間策略は,入場/出場の値,冷却期間の長さ,参照時間枠,最小変動率の要求など,複数の調整可能なパラメータを提供し,トレーダーは異なる市場環境と取引品種に応じて最適化することができます.

  4. 複数のフィルタリング戦略は,冷却期,波動率,取引時間の3重フィルタリングを統合することで,不必要な取引や偽信号を効果的に削減し,取引の質を向上させました.

  5. 高周波取引環境への適応: 1秒級のタイムフレームに最適化され,高周波取引の特性を最大限に活用し,短期的な価格変動による収益の機会を捉える.

  6. 低遅延を実現: 策略コード構造が明確で高効率で,ニューラルネットワーク部分は,訓練前の重量を使用して直接計算し,リアルタイムトレーニングを必要とせず,高周波環境下での低遅延の実行を保証する.

戦略リスク

  1. オーバーフィットするリスク: ニューラルネットワークモデルは,多くの既定の重みパラメータを含んでおり,歴史データに過度に適合するリスクがあります.これは,特に市場条件が顕著に変化するときに,実況取引で戦略が反転しないようにする可能性があります.対応方法には,定期的にニューラルネットワークをリトレーニングし,より長い周期のデータを使用して検証し,そして堅固なリスク管理措置を実施します.

  2. パラメータ感度戦略の性能は,入場/出場の値,冷却期の長さなど,複数のパラメータ設定に高度に依存している.パラメータの微小な変更は,戦略のパフォーマンスの大幅な変動を引き起こす可能性がある.パラメータのスキャンとステップテストによって安定したパラメータの組み合わせを見つけ,過度に最適化を避けるのがお勧めである.

  3. 高周波取引のリスク: 1秒級の時間枠で,取引コスト (点差や滑り点など) は戦略の収益性に著しく影響する可能性がある.実際の取引の前にこれらのコストを十分に考慮し,反省で実際の取引コスト条件をシミュレートする必要があります.

  4. テクノロジーの挑戦高周波戦略は,取引システムに非常に低い遅延と高い信頼性を要求します. ネットワークの遅延,データの遅延,または実行の遅延は,戦略の失敗につながる可能性があります. プロフェッショナルレベルの取引インフラと低遅延データソースの使用を保証します.

  5. 市場変動のリスク極端な市場条件下では,ニューラルネットワークのモデルは価格の動きを正確に予測できず,大きな損失を招く可能性があります. ストップと最大日損失の制限を設定し,極端な波動の間,戦略の実行を一時停止することをお勧めします.

戦略最適化の方向性

  1. ニューラルネットワークのアーキテクチャの最適化:

    • モデルの予測能力を高めるために,取引量,変動率指標,価格動向指標などのより多くの入力特性を導入することを検討する.
    • 異なる隠された層構造とニューロンの数を試し,複雑性と汎用性の最適なバランスを探す
    • 他の活性化関数 (ReLUやLeaky ReLUなど) の効果を探る.これらの関数は,特定のニューラルネットワークのアプリケーションで tanh より優れている.
  2. ダイナミックパラメータ調整機構:

    • 市場状況に基づく自己調整の入場/出場の値を実現する.例えば,高波動環境で値の上昇,低波動環境で値の低下
    • 波動感の冷却期調整アルゴリズムの開発により,戦略は異なる市場段階において最適な取引頻度を保持できます.
  3. 統合予測フレームワーク:

    • 複数の時間枠を組み合わせたニューラルネットワークモデルで,統合予測信号を形成する
    • 機械学習メタモデルを導入し,異なる予測モデルの重みを動的に調整する
    • この方法により,単一のモデルの限界を軽減し,予測の安定性を高めることができます.
  4. リスク管理の強化:

    • モデルの信頼性と市場条件に応じて取引規模を調整するダイナミックなポジション管理システムを開発
    • 機械学習ベースのストップ・ロスの導入により,取引毎のリスク/リターン比率を最適化
    • 戦略が1日の中で最もうまく機能する時間帯を特定して,日中の時間帯を最適化する
  5. リアルタイムの学習と適応:

    • オンライン学習の仕組みを設計し,ニューラルネットワークが新しいデータから常に学習し,市場の変化に適応できるようにする
    • パフォーマンスモニタリングに基づく自動リテレーニングトリガーを実現し,戦略のパフォーマンスが低下するとモデルを積極的に更新する
    • この方法により,戦略の寿命と安定性が著しく向上します.

要約する

ニューラルネットワークの差異価格変動を最適化する量化取引戦略は,現代的な量化取引の最先端の実践を象徴し,人工ニューラルネットワーク技術を高周波取引の分野に成功裏に適用している.精密に設計された多層のニューラルネットワーク構造により,この戦略は,短期的な価格変動の微妙なパターンを捉え,複数のフィルタリングメカニズムによって取引品質を向上させることができる.

3.754の収益因子は,この戦略がテスト環境で優れたパフォーマンスを証明しているが,実用化においては,過適合,パラメータの感受性,高周波取引に特有のリスクを慎重に考慮する必要がある.神経ネットワークの構造を継続的に最適化し,ダイナミックなパラメータの調整を実現し,リスク管理を強化することにより,この戦略は,競争の激しい量化取引の分野で長期的に競争力を維持する可能性がある.

戦略の重要な成功要因は,複雑なニューラルネットワーク技術と実用的な取引ロジックを組み合わせることで,機械学習の予測能力を活用しながら,実際の取引の実行性を兼ね備えていることです.経験豊富な量化トレーダーにとって,これは異なる市場と個人のリスクの好みに応じてさらにカスタマイズして最適化できる拡張可能なフレームワークを提供します.

ストラテジーソースコード
/*backtest
start: 2024-06-23 00:00:00
end: 2025-06-21 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("ANN Strategy v2 (Optimized for 1s)", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// === INPUTS ===
entryThreshold = input.float(0.003, title="Entry Threshold")
exitThreshold  = input.float(0.001, title="Exit Threshold")
cooldownBars   = input.int(60, title="Cooldown (bars)")  // 60 seconds cooldown
timeframe      = input.timeframe("1", title="Reference Timeframe")  // 1-minute diff reference
minVolatility  = input.float(0.02, title="Min ATR (Volatility Filter)")
useSession     = input.bool(true, title="Use Session Filter")

// === UTILITY FUNCTIONS ===
getDiff() =>
    prev = request.security(syminfo.tickerid, timeframe, ohlc4[1])
    now = ohlc4
    (now - prev) / prev

linear(v) => v
tanh(v) => (math.exp(v) - math.exp(-v)) / (math.exp(v) + math.exp(-v))

// === ANN FORWARD PROPAGATION ===
l0_0 = linear(getDiff())

l1 = array.new_float()
array.push(l1, tanh(l0_0 * 0.8446488687))
array.push(l1, tanh(l0_0 * -0.5674069006))
array.push(l1, tanh(l0_0 * 0.8676766445))
array.push(l1, tanh(l0_0 * 0.5200611473))
array.push(l1, tanh(l0_0 * -0.2215499554))

// === Layer 2 weights ===
w2 = array.from(    0.3341657935, -2.0060003664, 0.8606354375, 0.9184846912, -0.8531172267,    -0.0394076437, -0.4720374911, 0.2900968524, 1.0653326022, 0.3000188806,    -0.559307785, -0.9353655177, 1.2133832962, 0.1952686024, 0.8552068166,    -0.4293220754, 0.8484259409, -0.7154087313, 0.1102971055, 0.2279392724,    0.9111779155, 0.2801691115, 0.0039982713, -0.5648257117, 0.3281705155,    -0.2963954503, 0.4046532178, 0.2460580977, 0.6608675819, -0.8732022547,    0.8810811932, 0.6903706878, -0.5953059103, -0.3084040686, -0.4038498853,    -0.5687101164, 0.2736758588, -0.2217360382, 0.8742950972, 0.2997583987,    0.0708459913, 0.8221730616, -0.7213265567, -0.3810462836, 0.0503867753,    0.4880140595, 0.9466627196, 1.0163097961, -0.9500386514, -0.6341709382,    1.3402207103, 0.0013395288, 3.4813009133, -0.8636814677, 41.3171047132,    1.2388217292, -0.6520886912, 0.3508321737, 0.6640560714, 1.5936220597,    -0.1800525171, -0.2620989752, 0.056675277, -0.5045395315, 0.2732553554,    -0.7776331454, 0.1895231137, 0.5384918862, 0.093711904, -0.3725627758,    -0.3181583022, 0.2467979854, 0.4341718676, -0.7277619935, 0.1799381758,    -0.5558227731, 0.3666152536, 0.1538243225, -0.8915928174, -0.7659355684,    0.6111516061, -0.5459495224, -0.5724238425, -0.8553500765, -0.8696190472,    0.6843667454, 0.408652181, -0.8830470112, -0.8602324935, 0.1135462621,    -0.1569048216, -1.4643247888, 0.5557152813, 1.0482791924, 1.4523116833,    0.5207514017, -0.2734444192, -0.3328660936, -0.7941515963, -0.3536051491,    -0.4097807954, 0.3198619826, 0.461681627, -0.1135575498, 0.7103339851,    -0.8725014237, -1.0312091401, 0.2267643037, -0.6814258121, 0.7524828703,    -0.3986855003, 0.4962556631, -0.7330224516, 0.7355772164, 0.3180141739,    -1.083080442, 1.8752543187, 0.3623326265, -0.348145191, 0.1977935038,    -0.0291290625, 0.0612906199, 0.1219696687, -1.0273685429, 0.0872219768,    0.931791094, -0.313753684, -0.3028724837, 0.7387076712, 0.3806140391,    0.2630619402, -1.9827996702, -0.7741413496, 0.1262957444, 0.2248777886,    -0.2666322362, -1.124654664, 0.7288282621, -0.1384289204, 0.2395966188,    0.6611845175, 0.0466048937, -0.1980999993, 0.8152350927, 0.0032723211,    -0.3150344751, 0.1391754608, 0.5462816249, -0.7952302364, -0.7520712378,    -0.0576916066, 0.3678415302, 0.6802537378, 1.1437036331, -0.8637405666,    0.7016273068, 0.3978601709, 0.3157049654, -0.2528455662, -0.8614146703,    1.1741126834, -1.4046408959, 1.2914477803, 0.9904052964, -0.6980155826)


l2 = array.new_float()
for i = 0 to 32
    sum = 0.0
    for j = 0 to 4
        weight = array.get(w2, i * 5 + j)
        sum += weight * array.get(l1, j)
    array.push(l2, tanh(sum))

// === Output layer weights ===
weights_out = array.from(    -0.1366382003, 0.8161960822, -0.9458773183, 0.4692969576, 0.0126710629,    -0.0403001012, -0.0116244898, -0.4874816289, -0.6392241448, -0.410338398,    -0.1181027081, 0.1075562037, -0.5948728252, 0.5593677345, -0.3642935247,    -0.2867603217, 0.142250271, -0.0535698019, -0.034007685, -0.3594532426,    0.2551095195, 0.4214344983, 0.8941621336, 0.6283377368, -0.7138020667,    -0.1426738249, 0.172671223, 0.0714824385, -0.3268182144, -0.0078989755,    -0.2032828145, -0.0260631534, 0.4918037012)


sum_out = 0.0
for i = 0 to array.size(l2) - 1
    sum_out += array.get(weights_out, i) * array.get(l2, i)

// === Final ANN output (inverted for signal correction) ===
l3_0 = -tanh(sum_out)

// === TRADE FILTERS ===
volatility = ta.atr(14)
isVolOkay = volatility > minVolatility

isSession = (hour >= 9 and hour < 16)  // Adjust to your market hours
sessionOkay = useSession ? isSession : true

// === SIGNAL LOGIC ===
var string activeTrade = "none"
var int lastTradeBar = na
canTrade = (na(lastTradeBar) or (bar_index - lastTradeBar > cooldownBars)) and isVolOkay and sessionOkay

enterLong  = l3_0 > entryThreshold  and activeTrade != "long"  and canTrade
exitLong   = l3_0 < exitThreshold   and activeTrade == "long"
enterShort = l3_0 < -entryThreshold and activeTrade != "short" and canTrade
exitShort  = l3_0 > -exitThreshold  and activeTrade == "short"

// === STRATEGY EXECUTION ===
if barstate.isrealtime
    if enterLong
        strategy.entry("Long", strategy.short)
        activeTrade := "long"
        lastTradeBar := bar_index

    if exitLong
        strategy.close("Long")
        activeTrade := "none"

    if enterShort
        strategy.entry("Short", strategy.long)
        activeTrade := "short"
        lastTradeBar := bar_index

    if exitShort
        strategy.close("Short")
        activeTrade := "none"

// === PLOTTING ===
bgcolor(activeTrade == "long" ? color.new(color.green, 85) : activeTrade == "short" ? color.new(color.red, 85) : na)
plot(l3_0, title="ANN Output (Inverted)", color=color.aqua, linewidth=2)