Chiến lược giao dịch tổng hợp thông minh đa chỉ báo KNN


Ngày tạo: 2025-09-03 17:08:20 sửa đổi lần cuối: 2025-09-04 13:33:59
sao chép: 0 Số nhấp chuột: 161
2
tập trung vào
319
Người theo dõi

Chiến lược giao dịch tổng hợp thông minh đa chỉ báo KNN

Tại sao phân tích kỹ thuật truyền thống cần học máy?

Trong những năm qua, tôi đã tìm hiểu về giao dịch định lượng, và tôi đã phát hiện ra một hiện tượng thú vị: hầu hết các nhà giao dịch vẫn sử dụng các chỉ số kỹ thuật từ nhiều thập kỷ trước, nhưng họ hy vọng sẽ kiếm được lợi nhuận vượt trội trong một thị trường thay đổi nhanh chóng. Điều này giống như việc sử dụng máy tính để giải quyết các vấn đề tính toán.

Chiến lược giao dịch KNN cao cấp mà chúng tôi sẽ phân tích hôm nay, chính là một trong những hướng phát triển quan trọng của giao dịch định lượng:Kết hợp các thuật toán học máy với phân tích kỹ thuật truyền thống để xây dựng hệ thống quyết định giao dịch thông minh hơn

Thuật toán KNN là gì và tại sao nó phù hợp với dự đoán tài chính?

Ý tưởng cốt lõi của thuật toán KNN rất đơn giản nhưng sâu sắc:Một môi trường thị trường tương tự có thể tạo ra một xu hướng giá tương tự.Giả thuyết này cho rằng thị trường tài chính có một nền tảng lý thuyết vững chắc và mô hình hành vi của người tham gia thị trường có một số tính lặp lại và có thể dự đoán được.

Đặc điểm của chiến lược này là xây dựng một không gian đặc tính bảy chiều:

  • Động lực giá- Đánh giá tốc độ và hướng thay đổi của giá cả
  • Chỉ số RSIBáo cáo: Báo cáo về tình trạng mua quá mức
  • Tỷ lệ thành côngSự thay đổi trong dòng tiền
  • Tỷ lệ biến độngTỷ lệ cảm xúc thị trường biến động
  • Xu hướng mạnh mẽXác định xu hướng thông qua hệ thống hai đường bằng nhau
  • Tính năng của MACDGiao thức chuyển đổi động lượng
  • Vùng BrinĐánh giá vị trí của giá cả

Làm thế nào để đạt được sự chuẩn hóa trong công trình đặc trưng?

Đây là một chi tiết kỹ thuật quan trọng đáng để tìm hiểu:Tiêu chuẩn hóa tính năngChiến lược sử dụng phương pháp tiêu chuẩn hóa Z-score để chuyển tất cả các đặc điểm thành cùng một phạm vi số. Bước này rất quan trọng vì:

  1. Loại bỏ ảnh hưởng của kế hoạchCác chỉ số khác nhau như giá cả, khối lượng giao dịch, RSI
  2. Tăng hiệu quả của thuật toánTheo các nhà nghiên cứu, khoảng cách tính bằng đồng Euclidean sau khi được tiêu chuẩn hóa sẽ chính xác hơn.
  3. Tăng cường tính ổn định của mô hìnhTránh để một đặc điểm nào đó thống trị quá nhiều trong quá trình dự đoán
normalize(src, length) =>
    mean_val = ta.sma(src, length)
    std_val = ta.stdev(src, length)
    std_val == 0 ? 0.0 : (src - mean_val) / std_val

Dự báo trọng lượng từ xa: Tại sao “gần xa” lại quan trọng?

Các thuật toán KNN truyền thống thường sử dụng một cơ chế bỏ phiếu đơn giản, nhưng chiến lược này sử dụng một cơ chế bỏ phiếu tinh vi hơn.Phương pháp trọng lượng❚ Càng gần với mẫu lịch sử, dự đoán của nó sẽ có trọng lượng cao hơn. ❚ Thiết kế này phản ánh một đặc điểm quan trọng của thị trường tài chính:Sự tương đồng trong tình trạng thị trường là liên tục, chứ không phải tách rời

Công thức tính trọng lượng:weight = 1.0 / (distance + 0.001)

Một cơ chế tăng trọng lượng như thế có thể:

  • Ghi lại chính xác hơn những điểm tương đồng trong lịch sử
  • Giảm nhiễu dữ liệu nhiễu
  • Cải thiện độ tin cậy của kết quả dự đoán

Trong trường hợp nào chiến lược này hoạt động tốt nhất?

Dựa trên kinh nghiệm nghiên cứu của tôi về các chiến lược giao dịch học máy, chiến lược KNN thường hoạt động tốt hơn trong các môi trường thị trường sau:

  1. Thị trường xu hướngCác mô hình tương tự trong lịch sử có thể tái hiện khi thị trường có xu hướng rõ ràng.
  2. Môi trường biến động trung bìnhTính năng này có thể bị ảnh hưởng bởi sự biến động quá cao hoặc quá thấp.
  3. Các giống có khả năng di chuyểnĐảm bảo hiệu quả của chỉ số kỹ thuật và thực hiện giao dịch suôn sẻ

Cần lưu ý rằng chiến lược này đặt các tham số quản lý rủi ro bảo thủ hơn: 2% dừng lỗ và 4% dừng, tỷ lệ lợi nhuận rủi ro 1: 2 này thể hiện sự quan tâm của các nhà thiết kế chiến lược đối với kiểm soát rủi ro.

Những điểm sáng tạo của chiến lược và những hướng cải tiến tiềm năng

Một số sáng tạo của chiến lược này đáng khen ngợi:

  1. Sự kết hợp của các tính năng đa chiềuKhông phụ thuộc vào chỉ số đơn lẻ, nhưng xây dựng hệ thống tính năng tổng hợp
  2. Cửa sổ lịch sử động: Tiếp tục lưu trữ dữ liệu theo thời gian thông qua cơ chế cửa sổ trượt
  3. Xuất phát xác suấtNó cung cấp các tín hiệu mua và bán đơn giản thay vì các tín hiệu dự đoán.

Tuy nhiên, tôi cũng thấy có một số điều cần cải thiện:

  • Tối ưu hóa lựa chọn tính năng- Có thể đưa vào đánh giá tầm quan trọng của tính năng, thay đổi trọng lượng tính năng theo động thái
  • Các tham số tự điều chỉnh: Giá trị K và giá trị giảm có thể được điều chỉnh theo các động thái của thị trường
  • Tích hợp nhiều khung thời gianTín hiệu kết hợp các chu kỳ khác nhau có thể cải thiện độ chính xác dự báo

Lưu ý trong ứng dụng thực tế

Trong các ứng dụng trên ổ đĩa, bạn cần đặc biệt chú ý đến những điểm sau:

  1. Tính toán phức tạpSố lượng tính toán của thuật toán KNN tăng lên khi dữ liệu lịch sử tăng lên, cần phải cân bằng giữa độ chính xác và hiệu quả
  2. Rủi ro quá phù hợp: Giá trị K quá nhỏ có thể dẫn đến quá phù hợp, quá lớn có thể không phù hợp
  3. Chất lượng dữ liệuCác điểm dữ liệu bất thường sẽ ảnh hưởng đáng kể đến tính toán khoảng cách, cần thiết phải có cơ chế làm sạch dữ liệu

Kết luận: Tương lai của học máy trong giao dịch định lượng

Chiến lược này của KNN đại diện cho một hướng đi quan trọng trong sự phát triển của giao dịch định lượng:Chuyển từ điều khiển bởi quy tắc đơn giản sang điều khiển bởi dữ liệu thông minhMặc dù không phải là tất cả mọi thứ, nhưng nó cung cấp cho chúng ta một phương pháp khoa học và có hệ thống hơn để hiểu và dự đoán hành vi của thị trường.

Theo tôi, tương lai của giao dịch định lượng sẽ là sự kết hợp sâu sắc giữa lý thuyết tài chính truyền thống, thống kê hiện đại và công nghệ học máy. Chiến lược KNN này chỉ là một khởi đầu, nhiều sự đổi mới và đột phá hơn đang trên đường đi.

Mã nguồn chiến lược
/*backtest
start: 2025-01-01 00:00:00
end: 2025-09-03 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
args: [["v_input_int_1",5],["v_input_int_2",40],["v_input_int_3",5],["v_input_int_4",5],["v_input_float_1",0.8]]
*/

//@version=6
strategy("Advanced KNN Trading Strategy", overlay=true, max_bars_back=500)

//输入参数配置:设置KNN算法和交易策略的各项参数
k = input.int(5, "KNN邻居数量", minval=3, maxval=50);//K最近邻算法中K值
lookback = input.int(40, "历史数据回望期", minval=50, maxval=500);//历史数据窗口大小
feature_length = input.int(5, "特征计算周期", minval=5, maxval=20);//技术指标计算周期
norm_length = input.int(5, "标准化计算周期", minval=20, maxval=100);//特征标准化周期
prediction_threshold = input.float(0.8, "预测阈值", minval=0.5, maxval=0.9, step=0.1);//交易信号阈值
stop_loss_pct = input.float(2.0, "止损百分比", minval=0.5, maxval=5.0, step=0.1);//止损比例
take_profit_pct = input.float(4.0, "止盈百分比", minval=1.0, maxval=10.0, step=0.1);//止盈比例

//特征工程函数:数据预处理和特征提取
//标准化函数:将原始数据转换为标准正态分布
normalize(src, length) =>
    mean_val = ta.sma(src, length);//计算均值
    std_val = ta.stdev(src, length);//计算标准差
    std_val == 0 ? 0.0 : (src - mean_val) / std_val;//Z-score标准化

//原始技术特征计算:提取价格、成交量、波动率等基础特征
raw_price_momentum = (close - close[feature_length]) / close[feature_length] * 100;//价格动量
raw_rsi = ta.rsi(close, feature_length);//相对强弱指数
raw_volume_ratio = volume / ta.sma(volume, feature_length);//成交量比率
raw_volatility = ta.stdev(ta.change(close), feature_length) / close * 100;//价格波动率

//趋势特征计算:识别价格趋势强度
sma_short = ta.sma(close, 5);//短期均线
sma_long = ta.sma(close, 20);//长期均线
raw_trend_strength = (sma_short - sma_long) / sma_long * 100;//趋势强度

//MACD特征计算:动量指标
[macd_line, signal_line, histogram] = ta.macd(close, 12, 26, 9);//MACD指标
raw_macd_feature = macd_line - signal_line;//MACD差值

//布林带特征计算:价格相对位置
[bb_middle, bb_upper, bb_lower] = ta.bb(close, 20, 2);//布林带
raw_bb_position = (close - bb_lower) / (bb_upper - bb_lower);//价格在布林带中的位置

//特征标准化:将所有特征转换为相同量级
price_momentum = normalize(raw_price_momentum, norm_length);//标准化价格动量
rsi_feature = normalize(raw_rsi, norm_length);//标准化RSI
volume_ratio = normalize(raw_volume_ratio, norm_length);//标准化成交量比率
volatility = normalize(raw_volatility, norm_length);//标准化波动率
trend_strength = normalize(raw_trend_strength, norm_length);//标准化趋势强度
macd_feature = normalize(raw_macd_feature, norm_length);//标准化MACD
bb_position = normalize(raw_bb_position, norm_length);//标准化布林带位置

//目标变量定义:预测标签生成
future_return = (close - close[1]) / close[1] * 100;//未来收益率
target_label = future_return > 0 ? 1.0 : 0.0;//二分类标签:1为上涨,0为下跌

//KNN核心算法:K最近邻预测函数
knn_predict() =>
    var historical_features = array.new<array<float>>();//历史特征向量存储
    var historical_labels = array.new<float>();//历史标签存储
    
    //当前样本特征向量:使用已知的历史数据避免未来函数
    current_features = array.from<float>(
         price_momentum[1], rsi_feature[1], volume_ratio[1], volatility[1], 
         trend_strength[1], macd_feature[1], bb_position[1]
     )
    
    //历史数据收集:维护固定大小的历史样本窗口
    if bar_index >= lookback
        //滑动窗口:移除最旧数据
        if array.size(historical_features) >= lookback
            array.shift(historical_features)
            array.shift(historical_labels)
        
        //添加新的历史样本:使用[2]期特征预测[1]期走势
        hist_features = array.from<float>(
             price_momentum[2], rsi_feature[2], volume_ratio[2], volatility[2],
             trend_strength[2], macd_feature[2], bb_position[2]
         )
        
        array.push(historical_features, hist_features)
        array.push(historical_labels, target_label[1])
    
    //KNN预测计算:基于历史相似样本进行预测
    prediction = 0.0
    if array.size(historical_features) >= k
        distances = array.new<float>();//距离存储数组
        labels = array.new<float>();//对应标签存储数组
        
        //距离计算:计算当前样本与所有历史样本的欧几里得距离
        for i = 0 to array.size(historical_features) - 1
            hist_point = array.get(historical_features, i)
            distance = 0.0
            
            //欧几里得距离计算:各维度差值平方和的平方根
            for j = 0 to array.size(current_features) - 1
                curr_val = array.get(current_features, j)
                hist_val = array.get(hist_point, j)
                distance += math.pow(curr_val - hist_val, 2)
            
            distance := math.sqrt(distance)
            array.push(distances, distance)
            array.push(labels, array.get(historical_labels, i))
        
        //K个最近邻选择:找出距离最小的K个样本
        knn_predictions = array.new<float>();//K个最近邻的标签
        knn_distances = array.new<float>();//K个最近邻的距离
        
        for n = 0 to k - 1
            min_dist = 999999.0
            min_index = 0
            
            //寻找最小距离的样本索引
            for i = 0 to array.size(distances) - 1
                if array.get(distances, i) < min_dist
                    min_dist := array.get(distances, i)
                    min_index := i
            
            //保存K最近邻结果
            array.push(knn_predictions, array.get(labels, min_index))
            array.push(knn_distances, min_dist)
            
            //标记已使用的样本,避免重复选择
            array.set(distances, min_index, 999999.0)
        
        //加权预测:距离越近的样本权重越大
        weighted_sum = 0.0
        weight_total = 0.0
        
        for i = 0 to array.size(knn_predictions) - 1
            distance = array.get(knn_distances, i)
            weight = distance > 0 ? 1.0 / (distance + 0.001) : 1000.0;//反距离权重
            weighted_sum += array.get(knn_predictions, i) * weight
            weight_total += weight
        
        prediction := weight_total > 0 ? weighted_sum / weight_total : 0.5
    
    prediction

//获取KNN预测结果:执行预测算法
knn_prediction = knn_predict()

//交易信号生成:基于预测结果生成买卖信号
long_threshold = prediction_threshold;//多头信号阈值
short_threshold = 1 - prediction_threshold;//空头信号阈值

//交易信号判断:预测概率超过阈值时产生信号
long_signal = knn_prediction > long_threshold;//多头信号:预测上涨概率高
short_signal = knn_prediction < short_threshold;//空头信号:预测下跌概率高

//风险管理:计算止损止盈价格
long_stop_loss = strategy.position_avg_price * (1 - stop_loss_pct / 100);//多头止损价
long_take_profit = strategy.position_avg_price * (1 + take_profit_pct / 100);//多头止盈价
short_stop_loss = strategy.position_avg_price * (1 + stop_loss_pct / 100);//空头止损价
short_take_profit = strategy.position_avg_price * (1 - take_profit_pct / 100);//空头止盈价

//策略执行:开仓和平仓逻辑
//开仓条件:无持仓时根据信号开仓
if long_signal and strategy.position_size == 0
    strategy.entry("Long", strategy.long, comment="KNN多头: " + str.tostring(knn_prediction, "#.##"))

if short_signal and strategy.position_size == 0
    strategy.entry("Short", strategy.short, comment="KNN空头: " + str.tostring(knn_prediction, "#.##"))

//平仓条件:持仓时设置止损止盈
if strategy.position_size > 0
    strategy.exit("Long Exit", "Long", stop=long_stop_loss, limit=long_take_profit)

if strategy.position_size < 0
    strategy.exit("Short Exit", "Short", stop=short_stop_loss, limit=short_take_profit)

//图表可视化:在图表上显示预测结果和信号
plot(knn_prediction, "KNN预测", color=color.blue, linewidth=2);//预测值曲线
hline(prediction_threshold, "多头阈值", color=color.green, linestyle=hline.style_dashed);//多头阈值线
hline(1 - prediction_threshold, "空头阈值", color=color.red, linestyle=hline.style_dashed);//空头阈值线
hline(0.5, "中性线", color=color.gray, linestyle=hline.style_dotted);//中性参考线

//交易信号标记:在图表上标注买卖点
plotshape(long_signal, "多头信号", shape.triangleup, location.belowbar, 
          color=color.green, size=size.small);//多头信号标记
plotshape(short_signal, "空头信号", shape.triangledown, location.abovebar, 
          color=color.red, size=size.small);//空头信号标记

//交易提醒设置:配置交易信号的自动提醒
alertcondition(long_signal, title="KNN多头信号", 
               message="KNN预测多头信号,预测值: {{plot(\"KNN预测\")}}");//多头信号提醒
alertcondition(short_signal, title="KNN空头信号", 
               message="KNN预测空头信号,预测值: {{plot(\"KNN预测\")}}");//空头信号提醒