Tài nguyên đang được tải lên... tải...

Chiến lược học máy KNN: Hệ thống giao dịch dự đoán xu hướng dựa trên thuật toán hàng xóm gần nhất K

Tác giả:ChaoZhang, Ngày: 2024-05-15 17:09:34
Tags:KNNMAATR

img

Tổng quan

Chiến lược này sử dụng thuật toán học máy K-Nearest Neighbors (KNN) để dự đoán xu hướng giá. Bằng cách chọn các phương pháp tính toán giá khác nhau (như HL2, VWAP, SMA, vv) làm giá trị đầu vào và các giá trị mục tiêu khác nhau (như hành động giá, VWAP, biến động, vv) để đánh giá, thuật toán KNN xác định các điểm dữ liệu lịch sử K gần nhất với trạng thái thị trường hiện tại. Chiến lược sau đó đưa ra các dự đoán xu hướng dài hoặc ngắn dựa trên hướng xu hướng của các điểm dữ liệu K này. Ngoài ra, chiến lược áp dụng đường trung bình động để làm mịn kết quả dự đoán và cải thiện sự ổn định. Cuối cùng, các quyết định giao dịch được đưa ra theo kết quả dự đoán, và sự thay đổi xu hướng thị trường hiện tại được hiển thị trực quan thông qua kết quả dự đoán màu nền.

Nguyên tắc chiến lược

  1. Chọn phương pháp tính toán giá (ví dụ: HL2, VWAP, SMA) làm giá trị đầu vào cho thuật toán KNN.
  2. Chọn mục tiêu đánh giá (ví dụ: hành động giá, VWAP, biến động) làm giá trị mục tiêu cho thuật toán KNN.
  3. Đặt số lượng hàng xóm gần nhất (K) và thời gian làm mịn để điều chỉnh độ nhạy của thuật toán KNN và độ mịn của kết quả dự đoán.
  4. Đối với mỗi điểm dữ liệu giá mới, sử dụng thuật toán KNN để tìm K điểm dữ liệu lịch sử gần nhất với tình trạng thị trường hiện tại.
  5. Dựa trên hướng xu hướng (bullish hoặc bearish) của các điểm dữ liệu K này, bỏ phiếu để có được dự đoán xu hướng thị trường hiện tại.
  6. Đơn giản hóa kết quả dự đoán bằng cách sử dụng đường trung bình động để cải thiện sự ổn định.
  7. Tạo tín hiệu giao dịch (dài hoặc ngắn) dựa trên kết quả dự đoán mịn và hiển thị trực quan dự đoán xu hướng thị trường hiện tại thông qua thay đổi màu nền.

Ưu điểm

  1. Bằng cách sử dụng thuật toán học máy, chiến lược có thể học từ dữ liệu lịch sử và dự đoán xu hướng giá, cung cấp khả năng thích nghi và linh hoạt.
  2. Hiệu suất của chiến lược có thể được tối ưu hóa để phù hợp với các điều kiện thị trường khác nhau bằng cách điều chỉnh các tham số như giá trị đầu vào, giá trị mục tiêu, số lượng hàng xóm gần nhất và thời gian làm mịn.
  3. Kết hợp kết quả dự đoán với đường trung bình động làm tăng sự ổn định và độ tin cậy của các dự đoán.
  4. Dự đoán xu hướng thị trường hiện tại được hiển thị trực quan thông qua các thay đổi màu nền, cho phép các nhà giao dịch đánh giá nhanh chóng điều kiện thị trường và đưa ra quyết định.

Rủi ro

  1. Hiệu suất dự đoán của thuật toán KNN dựa trên chất lượng và tính đại diện của dữ liệu lịch sử. Dữ liệu không đủ hoặc không đại diện có thể dẫn đến dự đoán không chính xác.
  2. Hiệu suất của chiến lược có thể bị ảnh hưởng bởi cài đặt tham số và sự kết hợp tham số không phù hợp có thể dẫn đến hiệu suất kém hoặc quá phù hợp.
  3. Khi xu hướng thị trường thay đổi nhanh chóng hoặc các sự kiện thiên nga đen xảy ra, các dự đoán dựa trên dữ liệu lịch sử có thể trở nên không hiệu quả, khiến chiến lược tạo ra các tín hiệu giao dịch không chính xác.

Hướng dẫn tối ưu hóa

  1. Bao gồm nhiều chỉ số kỹ thuật hoặc dữ liệu tâm lý thị trường như đầu vào cho thuật toán KNN để cải thiện độ chính xác và độ chắc chắn của dự đoán.
  2. Thực hiện một cơ chế thích nghi để điều chỉnh động các tham số chiến lược dựa trên các điều kiện thị trường và mức độ biến động khác nhau.
  3. Kết hợp các phương pháp phân tích kỹ thuật hoặc các biện pháp quản lý rủi ro khác để giảm rủi ro của chiến lược và tăng cường sự ổn định của lợi nhuận.

Tóm lại

Bằng cách áp dụng thuật toán học máy KNN để dự đoán xu hướng giá, chiến lược này chứng minh cách nắm bắt xu hướng thị trường và tạo tín hiệu giao dịch bằng cách sử dụng dữ liệu lịch sử và phương pháp thống kê. Sức mạnh của chiến lược nằm trong khả năng thích nghi và linh hoạt, vì nó có thể được tối ưu hóa thông qua điều chỉnh tham số để phù hợp với các điều kiện thị trường khác nhau. Tuy nhiên, rủi ro của chiến lược chủ yếu xuất phát từ chất lượng và tính đại diện của dữ liệu lịch sử, cũng như tính hợp lý của cài đặt tham số.


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

    


Có liên quan

Thêm nữa