Strategi Pembelajaran Mesin KNN: Sistem Perdagangan Ramalan Trend Berdasarkan K Algoritma Jiran Terdekat

KNN MA ATR
Tarikh penciptaan: 2024-05-15 17:09:34 Akhirnya diubah suai: 2024-05-15 17:09:34
Salin: 0 Bilangan klik: 1098
1
fokus pada
1617
Pengikut

Strategi Pembelajaran Mesin KNN: Sistem Perdagangan Ramalan Trend Berdasarkan K Algoritma Jiran Terdekat

Gambaran keseluruhan

Strategi ini menggunakan algoritma pembelajaran mesin K yang berdekatan (KNN) untuk meramalkan trend harga. Dengan memilih kaedah pengiraan harga yang berbeza (seperti HL2, VWAP, SMA, dan lain-lain) sebagai nilai input, dan memilih nilai sasaran yang berbeza (seperti pergerakan harga, VWAP, kadar turun naik, dan lain-lain) sebagai objek penilaian, menggunakan algoritma KNN untuk mencari K titik data sejarah yang paling dekat dengan keadaan pasaran semasa, dan berdasarkan arah trend K titik data ini untuk membuat ramalan multi-ruang.

Prinsip Strategi

  1. Pilih kaedah pengiraan harga ((seperti HL2, VWAP, SMA, dan lain-lain) sebagai nilai input algoritma KNN.
  2. Pilih sasaran penilaian (seperti pergerakan harga, VWAP, kadar turun naik, dll.) sebagai nilai sasaran algoritma KNN.
  3. Tetapkan bilangan berdekatan K dan kitaran kelancaran untuk menyesuaikan sensitiviti algoritma KNN dan kelancaran hasil ramalan.
  4. Untuk setiap titik data harga baru, algoritma KNN mencari K titik data dalam data sejarah yang paling dekat dengan keadaan pasaran semasa.
  5. Berdasarkan arah trend pada titik data K ini (paling banyak atau kosong), undian dibuat untuk membuat ramalan trend pasaran semasa.
  6. Hasil ramalan diproses dengan rata-rata bergerak untuk meningkatkan kestabilan ramalan.
  7. Menjana isyarat dagangan berdasarkan hasil ramalan selepas meluruskan ((multiply head atau blank head)) dan menunjukkan ramalan trend pasaran semasa secara intuitif dengan perubahan warna latar belakang.

Analisis kelebihan

  1. Menggunakan algoritma pembelajaran mesin, mampu belajar dari data sejarah dan meramalkan trend harga, mempunyai kebolehan beradaptasi dan fleksibiliti.
  2. Anda boleh mengoptimumkan prestasi strategi dan menyesuaikan diri dengan keadaan pasaran yang berbeza dengan menyesuaikan parameter seperti nilai input, nilai sasaran, bilangan jiran terkini dan kitaran peluncur.
  3. Menggabungkan hasil ramalan dengan purata bergerak meningkatkan kestabilan dan kebolehpercayaan ramalan.
  4. Dengan perubahan warna latar belakang, ramalan trend pasaran semasa ditunjukkan secara intuitif, yang membantu peniaga menilai keadaan pasaran dengan cepat dan membuat keputusan.

Analisis risiko

  1. Prestasi ramalan algoritma KNN bergantung kepada kualiti dan representasi data sejarah, yang boleh menyebabkan hasil ramalan tidak tepat jika data sejarah tidak mencukupi atau tidak mewakili.
  2. Prestasi strategi mungkin dipengaruhi oleh tetapan parameter, kombinasi parameter yang tidak sesuai boleh menyebabkan prestasi strategi yang buruk atau menghasilkan overfit.
  3. Ramalan berdasarkan data sejarah mungkin gagal apabila terdapat perubahan pesat dalam trend pasaran atau berlaku peristiwa black swan, menyebabkan strategi menghasilkan isyarat perdagangan yang salah.

Arah pengoptimuman

  1. Memperkenalkan lebih banyak petunjuk teknikal atau data sentimen pasaran sebagai input ke dalam algoritma KNN untuk meningkatkan ketepatan dan kestabilan ramalan.
  2. Menggunakan mekanisme penyesuaian diri untuk menyesuaikan parameter strategi secara dinamik untuk menyesuaikan diri dengan keadaan pasaran yang berbeza dan tahap turun naik.
  3. Gabungan dengan kaedah analisis teknikal lain atau langkah-langkah pengurusan risiko untuk mengurangkan risiko strategi dan meningkatkan kestabilan pendapatan.

ringkaskan

Strategi ini menggunakan algoritma pembelajaran mesin KNN untuk meramalkan trend harga, menunjukkan bagaimana menggunakan data sejarah dan kaedah statistik untuk memahami trend pasaran dan menghasilkan isyarat perdagangan. Kelebihan strategi ini adalah kesesuaian dan fleksibiliti, mampu mengoptimumkan prestasi dan menyesuaikan diri dengan keadaan pasaran yang berbeza melalui penyesuaian parameter.

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