Die Ressourcen sind geladen. Beförderung...

KNN Machine Learning Strategy: Trendvorhersagendes Handelssystem auf Basis des K-Nächsten Nachbarn-Algorithmus

Schriftsteller:ChaoZhang, Datum: 2024-05-15 17:09:34
Tags:KNN- Nein.ATR

img

Übersicht

Diese Strategie verwendet den K-Nearest Neighbors (KNN) Machine Learning Algorithmus, um Preistrends vorherzusagen. Durch die Auswahl verschiedener Preisberechnungsmethoden (wie HL2, VWAP, SMA usw.) als Eingabewerte und verschiedene Zielwerte (wie Preisaktion, VWAP, Volatilität usw.) zur Auswertung identifiziert der KNN Algorithmus die K historischen Datenpunkte, die dem aktuellen Marktzustand am nächsten stehen. Die Strategie macht dann lange oder kurze Trendvorhersagen auf der Grundlage der Trendrichtung dieser K Datenpunkte. Darüber hinaus wendet die Strategie einen gleitenden Durchschnitt an, um die Vorhersageergebnisse zu glätten und die Stabilität zu verbessern. Schließlich werden Handelsentscheidungen gemäß den vorhergesagten Ergebnissen getroffen, und die aktuelle Markttrendvorhersage wird visuell durch Veränderungen in der Hintergrundfarbe demonstriert.

Strategieprinzipien

  1. Wählen Sie eine Preisberechnungsmethode (z. B. HL2, VWAP, SMA) als Eingabewert für den KNN-Algorithmus aus.
  2. Wählen Sie als Zielwert für den KNN-Algorithmus ein Evaluierungsziel (z. B. Preisbewegung, VWAP, Volatilität).
  3. Stellen Sie die Anzahl der nächsten Nachbarn (K) und den Glättungszeitraum fest, um die Empfindlichkeit des KNN-Algorithmus und die Glättlichkeit der Vorhersageergebnisse anzupassen.
  4. Für jeden neuen Preisdatenpunkt wird mit dem KNN-Algorithmus die K historischen Datenpunkte ermittelt, die dem aktuellen Marktzustand am nächsten stehen.
  5. Auf der Grundlage der Trendrichtung (bullisch oder bärisch) dieser K-Datenpunkte wählen Sie die aktuelle Markttrendprognose.
  6. Die Prognoseergebnisse mit einem gleitenden Durchschnitt glätten, um die Stabilität zu verbessern.
  7. Erstellen von Handelssignalen (lang oder kurz) auf der Grundlage der glatten Prognoseergebnisse und visuell zeigen die aktuelle Markttrendprognose durch Änderungen der Hintergrundfarbe.

Vorteile

  1. Durch die Nutzung eines Machine-Learning-Algorithmus kann die Strategie aus historischen Daten lernen und Preistrends vorhersagen, was Anpassungsfähigkeit und Flexibilität bietet.
  2. Die Leistung der Strategie kann durch Anpassung von Parametern wie Eingabewerten, Zielwerten, Anzahl der nächsten Nachbarn und Ausgleichszeit an unterschiedliche Marktbedingungen optimiert werden.
  3. Die Kombination von Prognoseergebnissen mit einem gleitenden Durchschnitt erhöht die Stabilität und Zuverlässigkeit der Vorhersagen.
  4. Die aktuelle Markttrendvorhersage wird durch Änderungen der Hintergrundfarbe visuell dargestellt, sodass Händler schnell die Marktbedingungen bewerten und Entscheidungen treffen können.

Risiken

  1. Die vorausschauende Leistung des KNN-Algorithmus beruht auf der Qualität und Repräsentativität der historischen Daten.
  2. Die Leistung der Strategie kann durch Parameter-Einstellungen beeinflusst werden, und unangemessene Parameterkombinationen können zu schlechter Leistung oder Überanpassung führen.
  3. Wenn sich der Markttrend rasch ändert oder schwarze Schwanenereignisse auftreten, können Vorhersagen auf der Grundlage historischer Daten unwirksam werden, wodurch die Strategie falsche Handelssignale erzeugt.

Optimierungsrichtlinien

  1. Mehr technische Indikatoren oder Marktbewusstseinsdaten als Input für den KNN-Algorithmus einbeziehen, um die Vorhersagegenauigkeit und Robustheit zu verbessern.
  2. Einführung eines Anpassungsmechanismus zur dynamischen Anpassung der Strategieparameter anhand unterschiedlicher Marktbedingungen und Volatilitätsniveaus.
  3. Kombination anderer technischer Analysemethoden oder Risikomanagementmaßnahmen zur Verringerung der Risikoposition der Strategie und zur Steigerung der Stabilität der Renditen.

Zusammenfassung

Durch die Anwendung des KNN-Maschinenlern-Algorithmus auf die Preistrendvorhersage zeigt diese Strategie, wie man Markttrends erfasst und Handelssignale mithilfe historischer Daten und statistischer Methoden generiert. Die Stärken der Strategie liegen in ihrer Anpassungsfähigkeit und Flexibilität, da sie durch Parameteranpassungen an unterschiedliche Marktbedingungen optimiert werden kann. Die Risiken der Strategie beruhen jedoch in erster Linie auf der Qualität und Repräsentativität historischer Daten sowie der Vernünftigkeit der Parameter-Einstellungen. Zukünftige Verbesserungen könnten die Einbeziehung mehrer Indikatoren, adaptive Mechanismen und Risikomanagementmaßnahmen zur weiteren Steigerung der Robustheit und Rentabilität der Strategie beinhalten.


/*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)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

    


Verwandt

Mehr