Sumber daya yang dimuat... Pemuatan...

Strategi Pembelajaran Mesin KNN: Sistem Perdagangan Prediksi Tren Berdasarkan Algoritma Tetangga terdekat K

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

img

Gambaran umum

Strategi ini menggunakan algoritma pembelajaran mesin K-Nearest Neighbors (KNN) untuk memprediksi tren harga. Dengan memilih metode perhitungan harga yang berbeda (seperti HL2, VWAP, SMA, dll) sebagai nilai input dan berbagai nilai target (seperti price action, VWAP, volatility, dll) untuk evaluasi, algoritma KNN mengidentifikasi titik data historis K yang paling dekat dengan keadaan pasar saat ini. Strategi kemudian membuat prediksi tren panjang atau pendek berdasarkan arah tren dari titik data K ini. Selain itu, strategi menerapkan rata-rata bergerak untuk meluruskan hasil prediksi dan meningkatkan stabilitas. Akhirnya, keputusan perdagangan dibuat sesuai dengan hasil prediksi, dan perubahan tren pasar saat ini secara visual ditunjukkan melalui perubahan tren di latar belakang warna.

Prinsip Strategi

  1. Pilih metode perhitungan harga (misalnya, HL2, VWAP, SMA) sebagai nilai input untuk algoritma KNN.
  2. Pilih target evaluasi (misalnya, price action, VWAP, volatility) sebagai nilai target untuk algoritma KNN.
  3. Atur jumlah tetangga terdekat (K) dan periode perataan untuk menyesuaikan sensitivitas algoritma KNN dan kelancaran hasil prediksi.
  4. Untuk setiap titik data harga baru, gunakan algoritma KNN untuk menemukan K titik data historis yang paling dekat dengan kondisi pasar saat ini.
  5. Berdasarkan arah tren (bullish atau bearish) dari titik data K ini, suara untuk mendapatkan prediksi tren pasar saat ini.
  6. Meluruskan hasil prediksi menggunakan rata-rata bergerak untuk meningkatkan stabilitas.
  7. Menghasilkan sinyal perdagangan (panjang atau pendek) berdasarkan hasil prediksi yang halus dan secara visual menunjukkan prediksi tren pasar saat ini melalui perubahan warna latar belakang.

Keuntungan

  1. Dengan memanfaatkan algoritma pembelajaran mesin, strategi dapat belajar dari data historis dan memprediksi tren harga, memberikan kemampuan beradaptasi dan fleksibilitas.
  2. Kinerja strategi dapat dioptimalkan agar sesuai dengan kondisi pasar yang berbeda dengan menyesuaikan parameter seperti nilai input, nilai target, jumlah tetangga terdekat, dan periode smoothing.
  3. Menggabungkan hasil prediksi dengan rata-rata bergerak meningkatkan stabilitas dan keandalan prediksi.
  4. Prediksi tren pasar saat ini secara visual ditunjukkan melalui perubahan warna latar belakang, memungkinkan pedagang untuk dengan cepat menilai kondisi pasar dan membuat keputusan.

Risiko

  1. Kinerja prediktif algoritma KNN bergantung pada kualitas dan representasi data historis. Data yang tidak cukup atau tidak representatif dapat menyebabkan prediksi yang tidak akurat.
  2. Kinerja strategi dapat dipengaruhi oleh pengaturan parameter, dan kombinasi parameter yang tidak tepat dapat mengakibatkan kinerja yang buruk atau overfit.
  3. Ketika tren pasar mengalami perubahan cepat atau peristiwa angsa hitam terjadi, prediksi berdasarkan data historis mungkin menjadi tidak efektif, menyebabkan strategi menghasilkan sinyal perdagangan yang salah.

Arahan Optimasi

  1. Masukkan lebih banyak indikator teknis atau data sentimen pasar sebagai input untuk algoritma KNN untuk meningkatkan akurasi dan ketahanan prediksi.
  2. Menerapkan mekanisme adaptasi untuk menyesuaikan parameter strategi secara dinamis berdasarkan kondisi pasar yang berbeda dan tingkat volatilitas.
  3. Mengkombinasikan metode analisis teknis lainnya atau langkah-langkah manajemen risiko untuk mengurangi eksposur risiko strategi dan meningkatkan stabilitas pengembalian.

Ringkasan

Dengan menerapkan algoritma pembelajaran mesin KNN untuk prediksi tren harga, strategi ini menunjukkan cara menangkap tren pasar dan menghasilkan sinyal perdagangan menggunakan data historis dan metode statistik. Kekuatan strategi terletak pada kemampuan beradaptasi dan fleksibilitasnya, karena dapat dioptimalkan melalui penyesuaian parameter agar sesuai dengan kondisi pasar yang berbeda. Namun, risiko strategi ini terutama berasal dari kualitas dan representasi data historis, serta masuk akalnya pengaturan parameter. Peningkatan di masa depan dapat melibatkan penggabungan lebih banyak indikator, mekanisme adaptif, dan langkah-langkah manajemen risiko untuk lebih meningkatkan ketahanan dan profitabilitas 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 banyak