В процессе загрузки ресурсов... загрузка...

Многомерный алгоритм KNN со стратегией торговли моделем свечей по объему и цене

Автор:Чао Чжан, Дата: 2025-01-17 16:10:07
Тэги:SMAКННРСИVOLМ.А.СД

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

Обзор

Эта стратегия представляет собой комплексную торговую систему, которая сочетает в себе алгоритм машинного обучения K-Nearest Neighbors (KNN), распознавание моделей свечей и анализ объема.

Принципы стратегии

Основная логика стратегии основана на нескольких ключевых элементах: 1. Использование простой скользящей средней (SMA) и стандартного отклонения для построения ценовых каналов для определения перекупленных и перепроданных областей 2. Определение девяти классических моделей свечей с помощью программно определенных условий, включая модели "Молоток", "Стреляющая звезда", "Поглощение" и т.д. Включение алгоритма KNN для изучения исторических движений цен и прогнозирования будущих направлений цен 4. Использование объема в качестве индикатора подтверждения сигнала, требующего, чтобы объем был выше установленного порога, когда сигналы запускаются 5. Расчет распределения вероятности для движения вверх и вниз как одно из условий фильтрации сигнала

Преимущества стратегии

  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!")


Связанные

Больше