資源の読み込みに... 荷物...

多次元KNNアルゴリズムとボリューム価格のキャンドルスタイクパターン取引戦略

作者: リン・ハーンチャオチャン, 日付: 2025-01-17 16:10:07
タグ:SMAKNNRSIVOLマルチSD

 Multi-Dimensional KNN Algorithm with Volume-Price Candlestick Pattern Trading Strategy

概要

この戦略は,K-Nearest Neighbors (KNN) 機械学習アルゴリズム,キャンドルスタックパターン認識,およびボリューム分析を組み合わせた包括的な取引システムである.移動平均チャネル,ボリュームしきい値検証,確率統計を含む多次元分析方法を通じて,戦略は潜在的な取引機会を把握するための三次元分析フレームワークを形成する.

戦略の原則

戦略の基本的な論理は,いくつかの重要な要素に基づいています. 1. 過剰購入と過剰販売領域を特定するための価格チャネルを構築するために,単純な移動平均値 (SMA) と標準偏差を使用する 2. ハマー,シューティングスター,エングルフィングパターンなど,プログラムで定義された条件を通じて9つのクラシックキャンドルスタイクパターンを識別する. 3. 過去の価格動向から学び,将来の価格動向を予測するためのKNNアルゴリズムを組み込む 4. 信号の確認指標としてボリュームを使用し,信号が起動するときにボリュームが設定された値を超える必要があります. 5. シグナルフィルタリング条件の1つとして上下移動の確率分布を計算する

戦略 の 利点

  1. 複数のレベルの信号確認メカニズムは,取引の信頼性を著しく向上させる
  2. KNNアルゴリズムの導入は,従来の技術分析に機械学習の視点を提供します
  3. 量確認メカニズムは誤ったブレイクを効果的に防ぐ
  4. サポートとレジスタンスラインのダイナミックなグラフィックは,重要な価格レベルを把握するのに役立ちます
  5. 重要な取引機会を逃さないよう 徹底的な警告システムが確保される
  6. 異なる市場環境に適応するための強力なパラメータ調整可能性

戦略リスク

  1. KNN アルゴリズムが不安定な市場で遅れる可能性がある
  2. 複数のシグナルフィルタリング条件により,いくつかの取引機会が失われる可能性があります.
  3. 固有量値は,異なる期間に動的調整が必要かもしれない.
  4. 統合段階では過度に誤った信号を生む可能性があります 推奨される溶液:
  • 動的アルゴリズムパラメータ調整
  • 市場環境の認識メカニズムの導入
  • 最大損失制限の設定
  • ポジション管理システムの設置

オプティマイゼーションの方向性

  1. 市場状況に基づいてパラメータを自動的に調整するための適応性パラメータ調整メカニズムを導入する
  2. 予測の精度を向上させるためにディープラーニングアルゴリズムを統合する
  3. より多くの市場マイクロ構造指標を追加する
  4. 容量値の動的計算方法を最適化する
  5. より包括的なリスク管理システムを確立する

概要

この戦略は,従来の技術分析と近代的な機械学習方法を組み合わせて堅牢な取引システムを構築する.この戦略の多次元分析フレームワークと厳格な信号確認メカニズムは,取引決定のための信頼できる基盤を提供します.継続的な最適化とリスク管理を通じて,この戦略はさまざまな市場条件下で安定したパフォーマンスを維持することが期待されています.


/*backtest
start: 2024-01-17 00:00:00
end: 2025-01-16 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=6
strategy("Candle Pattern Analyzer with Volume", overlay=true)

// Input parameters
length = input.int(20, "Channel Length", minval=1)
mult = input.float(2.0, "Volatility Multiplier", minval=0.1)
candleLength = input.int(5, "Candle Length", minval=1)
k = input.int(5, "KNN Neighbors", minval=1)
volumeThreshold = input.int(100000, "Volume Threshold", minval=1)

// Calculate channel
basis = ta.sma(close, length)
dev = mult * ta.stdev(close, length)
upper = basis + dev
lower = basis - dev

// Plot channel
plot(basis, color=color.blue)
plot(upper, color=color.green)
plot(lower, color=color.red)

// Identify candle patterns
isBullish = close > open
isBearish = close < open

// Pre-calculate SMAs
smaLow = ta.sma(low, candleLength)
smaHigh = ta.sma(high, candleLength)
smaClose = ta.sma(close, candleLength)

// Hammer pattern
isHammer = isBullish and 
           low < smaLow and 
           close > smaClose and 
           (close - low) / (high - low) > 0.6 and
           low < low[1]

// Shooting Star pattern
isShootingStar = isBearish and 
                 high > smaHigh and 
                 close < smaClose and 
                 (high - close) / (high - low) > 0.6 and
                 high > high[1]

// Inverse Hammer pattern
isInverseHammer = isBullish and 
                   high > smaHigh and 
                   close < smaClose and 
                   (high - close) / (high - low) > 0.6 and
                   high > high[1]

// Bullish Engulfing pattern
isBullishEngulfing = isBullish and 
                      close > high[1] and 
                      open < low[1]

// Bearish Engulfing pattern
isBearishEngulfing = isBearish and 
                      close < low[1] and 
                      open > high[1]

// Morning Star pattern
isMorningStar = isBullish and close[2] < open[2] and close[1] < open[1] and  close > open[1]

// Evening Star pattern
isEveningStar = isBearish and  close[2] > open[2] and  close[1] > open[1] and  close < open[1]

// Three Black Crows pattern
isThreeBlackCrows = isBearish and 
                     close < close[1] and 
                     close[1] < close[2] and 
                     close[2] < close[3]

// Three White Soldiers pattern
isThreeWhiteSoldiers = isBullish and close > close[1] and  close[1] > close[2] and  close[2] > close[3]

// Compare previous candles
prevCandleUp = close[1] > open[1]
prevCandleDown = close[1] < open[1]

// Calculate probability
probUp = ta.sma(close > open ? 1 : 0, candleLength) / candleLength
probDown = ta.sma(close < open ? 1 : 0, candleLength) / candleLength

// Generate signals
buySignal = isHammer and prevCandleDown and probUp > probDown and volume > volumeThreshold
sellSignal = isShootingStar and prevCandleUp and probDown > probUp and volume > volumeThreshold

// Highlight patterns
color candleColor = na
if (isHammer)
    candleColor := color.green
    label.new(bar_index, high, "Hammer", color=color.green, style=label.style_label_up)

else if (isShootingStar)
    candleColor := color.red
    label.new(bar_index, low, "Shooting Star", color=color.red, style=label.style_label_down)
else if (isInverseHammer)
    candleColor := color.blue
    label.new(bar_index, high, "Inverse Hammer", color=color.blue, style=label.style_label_up)
else if (isBullishEngulfing)
    candleColor := color.yellow
    label.new(bar_index, high, "Bullish Engulfing", color=color.yellow, style=label.style_label_up)
else if (isBearishEngulfing)
    candleColor := color.purple
    label.new(bar_index, low, "Bearish Engulfing", color=color.purple, style=label.style_label_down)

else if (isMorningStar)
    candleColor := color.orange
    label.new(bar_index, high, "Morning Star", color=color.orange, style=label.style_label_up)

else if (isEveningStar)
    candleColor := color.new(color.red, 80)
    label.new(bar_index, low, "Evening Star", color=color.new(color.red, 80), style=label.style_label_down)

else if (isThreeBlackCrows)
    candleColor := color.black
    label.new(bar_index, low, "Three Black Crows", color=color.black, style=label.style_label_down)

else if (isThreeWhiteSoldiers)
    candleColor := color.white
    label.new(bar_index, high, "Three White Soldiers", color=color.white, style=label.style_label_up)


// Plot candles
barcolor(candleColor)

// KNN algorithm
var float[] knnData = array.new_float(k, na)
var float[] knnLabels = array.new_float(k, na) // Create an array to store KNN labels
array.set(knnLabels, 0, 1.0) // Label for "up" movement

// Shift KNN dataset to make room for new data point
for i = 1 to k-1
    array.set(knnData, i, array.get(knnData, i-1))
    array.set(knnLabels, i, array.get(knnLabels, i-1))

// Predict next movement using KNN algorithm
float prediction = 0.0
for i = 0 to k-1
    float distance = math.abs(close - array.get(knnData, i))
    prediction += array.get(knnLabels, i) / distance

prediction /= k

// Plot prediction
// line.new(bar_index, close, bar_index + 1, prediction, color=color.purple)

// Plot resistance and support lines
float resistance = ta.sma(high, length)
float support = ta.sma(low, length)
// line.new(bar_index, resistance, bar_index + 1, resistance, color=color.green, style=line.style_dashed)
// line.new(bar_index, support, bar_index + 1, support, color=color.red, style=line.style_dashed)

// Plot buy and sell signals with prices
if (buySignal)
    // label.new(bar_index, low, "Buy at " + str.tostring(low), color=color.green, style=label.style_label_up)
    strategy.entry("Buy", strategy.long, comment="Buy at " + str.tostring(low))
if (sellSignal)
    // label.new(bar_index, high, "Sell at " + str.tostring(high), color=color.red, style=label.style_label_down)
    strategy.entry("Sell", strategy.short, comment="Sell at " + str.tostring(high))

// Create alerts
alertcondition(buySignal, title="Buy Signal", message="Buy signal generated!")
alertcondition(sellSignal, title="Sell Signal", message="Sell signal generated!")


関連性

もっと