KNN-Strategie für maschinelles Lernen: Trendvorhersage-Handelssystem basierend auf dem K-Nearest-Neighbor-Algorithmus

KNN MA ATR
Erstellungsdatum: 2024-05-15 17:09:34 zuletzt geändert: 2024-05-15 17:09:34
Kopie: 0 Klicks: 1098
1
konzentrieren Sie sich auf
1617
Anhänger

KNN-Strategie für maschinelles Lernen: Trendvorhersage-Handelssystem basierend auf dem K-Nearest-Neighbor-Algorithmus

Überblick

Die Strategie verwendet K-nearest-neighbor (KNN) -Machine-Learning-Algorithmen, um Preistrends vorherzusagen. Durch die Auswahl verschiedener Preisberechnungsmethoden (z. B. HL2, VWAP, SMA usw.) als Inputwerte und die Auswahl verschiedener Zielwerte (z. B. Kursbewegung, VWAP, Volatilität usw.) als Bewertungsobjekte, wird die KNN-Algorithmen verwendet, um die K-historischen Datenpunkte zu finden, die dem aktuellen Marktzustand am nächsten sind, und basierend auf der Trendrichtung dieser K-Datenpunkte eine Multi-Bereichs-Vorhersage zu erstellen.

Strategieprinzip

  1. Wählen Sie die Preisberechnungsmethode ((z. B. HL2, VWAP, SMA usw.) als Eingabe für den KNN-Algorithmus.
  2. Wählen Sie die Bewertungsziele (z. B. Preisentwicklung, VWAP, Volatilität usw.) als Zielwerte des KNN-Algorithmus.
  3. Setzen Sie die nächste Nachbarzahl K und die Gleitzeit, um die Sensitivität des KNN-Algorithmus und die Gleitzeit der Prognose zu justieren.
  4. Für jeden neuen Preis-Datenpunkt wird mit Hilfe des KNN-Algorithmus der K-Datenpunkt in den historischen Daten gefunden, der dem aktuellen Marktzustand am nächsten kommt.
  5. Die Trendrichtung dieser K-Datenpunkte wird dann in einer Mehrkopf- oder Hohlkopf-Vote (Hohlkopf- oder Hohlkopf-Vote) gewählt, um eine Trendprognose für den aktuellen Markt zu erhalten.
  6. Die Prognose wird durch einen gleitenden Durchschnitt geschliffen, um die Stabilität der Prognose zu erhöhen.
  7. Erzeugen Sie ein Handelssignal nach den Ergebnissen der glatten Vorhersage (Multihead oder Blankhead) und zeigen Sie die aktuellen Markttrendprognosen intuitiv anhand der Veränderung der Hintergrundfarbe.

Analyse der Stärken

  1. Mit Hilfe von Algorithmen, die aus historischen Daten lernen und Preisentwicklungen vorhersagen können, verfügt das Unternehmen über eine gewisse Anpassungsfähigkeit und Flexibilität.
  2. Die Strategie kann durch Anpassung der Eingabewerte, Zielwerte, der Anzahl der jüngsten Nachbarn und der Gleitzyklus-Parameter optimiert werden, um die Performance zu optimieren und sich an unterschiedliche Marktbedingungen anzupassen.
  3. Die Kombination der Prognoseergebnisse mit einem Moving Average erhöht die Stabilität und Zuverlässigkeit der Prognose.
  4. Die Veränderung der Hintergrundfarbe zeigt intuitiv die aktuellen Markttrendprognosen und ermöglicht es den Händlern, schnell die Marktlage zu beurteilen und Entscheidungen zu treffen.

Risikoanalyse

  1. Die Vorhersageleistung des KNN-Algorithmus hängt von der Qualität und Repräsentativität der historischen Daten ab. Wenn die historischen Daten unzureichend oder nicht repräsentativ sind, kann dies dazu führen, dass die Vorhersage nicht korrekt ist.
  2. Die Performance einer Strategie kann durch die Einstellung von Parametern beeinflusst werden, und eine unangemessene Kombination von Parametern kann zu einer schlechten Performance der Strategie oder zu einer Überpassung führen.
  3. Bei starken Veränderungen der Markttrends oder bei einem Black Swan-Ereignis können Prognosen, die auf historischen Daten basieren, fehlschlagen, was zu falschen Handelssignalen führt.

Optimierungsrichtung

  1. Die Einführung von mehr technischen Indikatoren oder Marktstimmungsdaten als Eingabe in die KNN-Algorithmen verbessert die Genauigkeit und Stabilität der Vorhersagen.
  2. Strategieparameter werden dynamisch angepasst, um unterschiedlichen Marktsituationen und Schwankungen gerecht zu werden.
  3. In Kombination mit anderen Methoden der technischen Analyse oder Risikomanagement-Maßnahmen, um die Risikothek der Strategie zu verringern und die Ertragsstabilität zu verbessern.

Zusammenfassen

Die Strategie zeigt, wie historische Daten und statistische Methoden genutzt werden können, um Markttrends zu erfassen und Handelssignale zu erzeugen, indem sie KNN-Machine-Learning-Algorithmen auf Preistrendprognosen anwendet. Der Vorteil der Strategie liegt in ihrer Anpassungsfähigkeit und Flexibilität, die in der Lage ist, die Leistung durch Parameteranpassungen zu optimieren und sich an unterschiedliche Marktbedingungen anzupassen. Die Risiken der Strategie bestehen jedoch hauptsächlich aus der Qualität und Repräsentativität der historischen Daten und der Rationalität der Parameter-Einstellungen.

Strategiequellcode
/*backtest
start: 2023-05-09 00:00:00
end: 2024-05-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/
// © Blake_22 {

//@version=5
strategy('money printer part 1', overlay=true)

// ~~ Tooltips {
t1 ="PriceValue selects the method of price computation. \n\nSets the smoothing period for the PriceValue. \n\nAdjusting these settings will change the input values for the K-Nearest Neighbors algorithm, influencing how the trend is calculated."
t2 = "TargetValue specifies the target to evaluate. \n\nSets the smoothing period for the TargetValue."
t3 ="numberOfClosestValues sets the number of closest values that are considered when calculating the KNN Moving Average. Adjusting this number will affect the sensitivity of the trend line, with a higher value leading to a smoother line and a lower value resulting in a line that is more responsive to recent price changes."
t4 ="smoothingPeriod sets the period for the moving average applied to the KNN classifier. Adjusting the smoothing period will affect how rapidly the trend line responds to price changes, with a larger smoothing period leading to a smoother line that may lag recent price movements, and a smaller smoothing period resulting in a line that more closely tracks recent changes."
t5 ="This option controls the background color for the trend prediction. Enabling it will change the background color based on the prediction, providing visual cues on the direction of the trend. A green color indicates a positive prediction, while red indicates a negative prediction."
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

// ~~ Inputs {
PriceValue   = input.string("hl2", options = ["hl2","VWAP", "sma", "wma", "ema", "hma"], group="", inline="Value")
maLen        = input.int(5, minval=2, maxval=200, title="", group="", inline="Value", tooltip=t1)
TargetValue  = input.string("Price Action", options = ["Price Action","VWAP", "Volatility", "sma", "wma", "ema", "hma"], group="", inline="Target")
maLen_       = input.int(5, minval=2, maxval=200, title="", group="", inline="Target", tooltip=t2)
// Input parameters for the KNN Moving Average
numberOfClosestValues = input.int(3, "Number of Closest Values", 2, 200, tooltip=t3) 
smoothingPeriod       = input.int(50, "Smoothing Period", 2, 500, tooltip=t4) 
windowSize            = math.max(numberOfClosestValues, 30) 

// knn Color
Upknn_col   = input.color(color.lime, title="", group="KNN Color", inline="knn col")
Dnknn_col   = input.color(color.red, title="", group="KNN Color", inline="knn col")
Neuknn_col  = input.color(color.orange, title="", group="KNN Color", inline="knn col")
// MA knn Color
Maknn_col   = input.color(color.teal, title="", group="MA KNN Color", inline="MA knn col")
// BG Color
bgcolor = input.bool(false, title="Trend Prediction Color", group="BG Color", inline="bg", tooltip=t5)
Up_col  = input.color(color.lime, title="", group="BG Color", inline="bg")
Dn_col  = input.color(color.red, title="", group="BG Color", inline="bg")
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

// ~~ kNN Classifier {
value_in = switch PriceValue
    "hl2"  => ta.sma(hl2,maLen)
    "VWAP" => ta.vwap(close[maLen])
    "sma" => ta.sma(close,maLen)
    "wma" => ta.wma(close,maLen)
    "ema" => ta.ema(close,maLen)
    "hma" => ta.hma(close,maLen)

meanOfKClosest(value_,target_) => 
    closestDistances = array.new_float(numberOfClosestValues, 1e10) 
    closestValues    = array.new_float(numberOfClosestValues, 0.0) 
    for i = 1 to windowSize 
        value = value_[i] 
        distance = math.abs(target_ - value) 
        maxDistIndex = 0 
        maxDistValue = closestDistances.get(0) 
        for j = 1 to numberOfClosestValues - 1 
            if closestDistances.get(j) > maxDistValue
                maxDistIndex := j
                maxDistValue := closestDistances.get(j)
        if distance < maxDistValue 
            closestDistances.set(maxDistIndex, distance)
            closestValues.set(maxDistIndex, value)
    closestValues.sum() / numberOfClosestValues 

// Choose the target input based on user selection
target_in = switch TargetValue
    "Price Action"  => ta.rma(close,maLen_) 
    "VWAP"          => ta.vwap(close[maLen_])
    "Volatility"    => ta.atr(14)
    "sma" => ta.sma(close,maLen_)
    "wma" => ta.wma(close,maLen_)
    "ema" => ta.ema(close,maLen_)
    "hma" => ta.hma(close,maLen_)

knnMA = meanOfKClosest(value_in,target_in)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

// ~~ kNN Prediction {
// Function to calculate KNN Classifier
price = math.avg(knnMA, close)
c     = ta.rma(knnMA[1], smoothingPeriod) 
o     = ta.rma(knnMA, smoothingPeriod)

// Defines KNN function to perform classification
knn(price) => 
    Pos_count = 0 
    Neg_count = 0 
    min_distance = 10e10 
    nearest_index = 0 
    for j = 1 to 10 
        distance = math.sqrt(math.pow(price[j] - price, 2)) 
        if distance < min_distance 
            min_distance := distance
            nearest_index := j
            Neg = c[nearest_index] > o[nearest_index] 
            Pos = c[nearest_index] < o[nearest_index] 
            if Pos 
                Pos_count += 1
            if Neg 
                Neg_count += 1
    output = Pos_count>Neg_count?1:-1 

// Calls KNN function and smooths the prediction
knn_prediction_raw = knn(price) 
knn_prediction     = ta.wma(knn_prediction_raw, 3)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

// ~~ Plots {
// Plots for display on the chart
knnMA_          = ta.wma(knnMA,5)
knnMA_col       = knnMA_>knnMA_[1]?Upknn_col:knnMA_<knnMA_[1]?Dnknn_col:Neuknn_col
Classifier_Line = plot(knnMA_,"Knn Classifier Line", knnMA_col)
MAknn_          = ta.rma(knnMA, smoothingPeriod)
plot(MAknn_,"Average Knn Classifier Line" ,Maknn_col) 
green = knn_prediction < 0.5
red   = knn_prediction > -0.5 
bgcolor( green and bgcolor? color.new(Dn_col,80) : 
 red and bgcolor ? color.new(Up_col,80) : na) 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

// ~~ Alerts {
knnMA_cross_Over_Ma      = ta.crossover(knnMA_,MAknn_)
knnMA_cross_Under_Ma     = ta.crossunder(knnMA_,MAknn_)
knnMA_cross_Over_Close   = ta.crossover(knnMA_,close)
knnMA_cross_Under_Close  = ta.crossunder(knnMA_,close)
knnMA_Switch_Up          = knnMA_[1]<knnMA_ and knnMA_[1]<=knnMA_[2]
knnMA_Switch_Dn          = knnMA_[1]>knnMA_ and knnMA_[1]>=knnMA_[2]
knnMA_Neutral            = knnMA_col==Neuknn_col and knnMA_col[1]!=Neuknn_col
greenBG                  = green and not green[1]
redBG                    = red and not red[1]

alertcondition(knnMA_cross_Over_Ma,  title = "Knn Crossover Average Knn",  message = "Knn Crossover Average Knn")
alertcondition(knnMA_cross_Under_Ma, title = "Knn Crossunder Average Knn", message = "Knn Crossunder Average Knn")
alertcondition(knnMA_cross_Over_Close,  title = "Knn Crossover Close",  message = "Knn Crossover Close")
alertcondition(knnMA_cross_Under_Close, title = "Knn Crossunder Close", message = "Knn Crossunder Close")
alertcondition(knnMA_Switch_Up,  title = "Knn Switch Up",  message = "Knn Switch Up")
alertcondition(knnMA_Switch_Dn, title = "Knn Switch Dn", message = "Knn Switch Dn")
alertcondition(knnMA_Neutral, title = "Knn is Neutral", message = "Knn is Neutral")
alertcondition(greenBG, title = "Positive Prediction", message = "Positive Prediction")
alertcondition(redBG, title = "Negative Prediction", message = "Negative Prediction")
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

//~~Trenddilo {



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}



//~~ strategy { 1

LongCondtion = knnMA_[1]<knnMA_ and knnMA_[1]<=knnMA_[2]
ShortCondtion = knnMA_[1]>knnMA_ and knnMA_[1]>=knnMA_[2]


//SecondaryLongCondtion = col == color.lime
//SecondaryShortCondtion = col == color.red

strategy.entry("Long", strategy.long, when = LongCondtion)
strategy.close("Long", when =ShortCondtion)

strategy.entry("Short", strategy.short, when =ShortCondtion)
strategy.close("short", when =LongCondtion)


plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}