Sumber dimuat naik... memuat...

Strategi Pembelajaran Mesin KNN: Sistem Dagangan Ramalan Trend Berdasarkan Algoritma Jiran K-Pusat

Penulis:ChaoZhang, Tarikh: 2024-05-15 17:09:34
Tag:KNNMAATR

img

Ringkasan

Strategi ini menggunakan algoritma pembelajaran mesin K-Nearest Neighbors (KNN) untuk meramalkan trend harga. Dengan memilih kaedah pengiraan harga yang berbeza (seperti HL2, VWAP, SMA, dan lain-lain) sebagai nilai input dan pelbagai nilai sasaran (seperti tindakan harga, VWAP, turun naik, dan lain-lain) untuk penilaian, algoritma KNN mengenal pasti titik data sejarah K yang paling dekat dengan keadaan pasaran semasa.

Prinsip Strategi

  1. Pilih kaedah pengiraan harga (contohnya, HL2, VWAP, SMA) sebagai nilai input untuk algoritma KNN.
  2. Pilih sasaran penilaian (contohnya, tindakan harga, VWAP, turun naik) sebagai nilai sasaran untuk algoritma KNN.
  3. Tetapkan bilangan jiran terdekat (K) dan tempoh pelunturan untuk menyesuaikan kepekaan algoritma KNN dan kelancaran hasil ramalan.
  4. Untuk setiap titik data harga baru, gunakan algoritma KNN untuk mencari K titik data sejarah yang paling dekat dengan keadaan pasaran semasa.
  5. Berdasarkan arah trend (bullish atau bearish) dari titik data K ini, undi untuk mendapatkan ramalan trend pasaran semasa.
  6. Lemparkan hasil ramalan menggunakan purata bergerak untuk meningkatkan kestabilan.
  7. Menghasilkan isyarat dagangan (panjang atau pendek) berdasarkan hasil ramalan yang halus dan secara visual menunjukkan ramalan trend pasaran semasa melalui perubahan warna latar belakang.

Kelebihan

  1. Dengan menggunakan algoritma pembelajaran mesin, strategi dapat belajar dari data sejarah dan meramalkan trend harga, memberikan fleksibiliti dan fleksibiliti.
  2. Prestasi strategi ini boleh dioptimumkan untuk menyesuaikan dengan keadaan pasaran yang berbeza dengan menyesuaikan parameter seperti nilai input, nilai sasaran, bilangan jiran terdekat, dan tempoh pelembap.
  3. Menggabungkan hasil ramalan dengan purata bergerak meningkatkan kestabilan dan kebolehpercayaan ramalan.
  4. Ramalan trend pasaran semasa ditunjukkan secara visual melalui perubahan warna latar belakang, yang membolehkan peniaga menilai keadaan pasaran dengan cepat dan membuat keputusan.

Risiko

  1. Prestasi ramalan algoritma KNN bergantung pada kualiti dan perwakilan data sejarah. Data yang tidak mencukupi atau tidak mewakili boleh menyebabkan ramalan yang tidak tepat.
  2. Prestasi strategi boleh dipengaruhi oleh tetapan parameter, dan kombinasi parameter yang tidak sesuai boleh mengakibatkan prestasi yang buruk atau terlalu banyak.
  3. Apabila trend pasaran mengalami perubahan pesat atau peristiwa angsa hitam berlaku, ramalan berdasarkan data sejarah mungkin menjadi tidak berkesan, menyebabkan strategi menghasilkan isyarat perdagangan yang salah.

Arahan pengoptimuman

  1. Menggabungkan lebih banyak penunjuk teknikal atau data sentimen pasaran sebagai input untuk algoritma KNN untuk meningkatkan ketepatan dan ketahanan ramalan.
  2. Melaksanakan mekanisme penyesuaian untuk menyesuaikan parameter strategi secara dinamik berdasarkan keadaan pasaran dan tahap turun naik yang berbeza.
  3. Menggabungkan kaedah analisis teknikal lain atau langkah pengurusan risiko untuk mengurangkan pendedahan risiko strategi dan meningkatkan kestabilan pulangan.

Ringkasan

Dengan menggunakan algoritma pembelajaran mesin KNN untuk ramalan trend harga, strategi ini menunjukkan bagaimana untuk menangkap trend pasaran dan menjana isyarat perdagangan menggunakan data sejarah dan kaedah statistik. Kekuatan strategi ini terletak pada daya sesuaikan dan fleksibiliti, kerana ia boleh dioptimumkan melalui penyesuaian parameter untuk memenuhi keadaan pasaran yang berbeza. Walau bagaimanapun, risiko strategi ini terutama berasal dari kualiti dan perwakilan data sejarah, serta munasabahnya tetapan parameter. Penambahbaikan masa depan mungkin melibatkan menggabungkan lebih banyak indikator, mekanisme penyesuaian, dan langkah pengurusan risiko untuk meningkatkan lagi kekuatan dan keuntungan 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)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

    


Berkaitan

Lebih lanjut