Estrategia de negociación de fusión inteligente con múltiples indicadores de KNN


Fecha de creación: 2025-09-03 17:08:20 Última modificación: 2025-09-04 13:33:59
Copiar: 0 Número de Visitas: 161
2
Seguir
319
Seguidores

Estrategia de negociación de fusión inteligente con múltiples indicadores de KNN

¿Por qué el análisis tecnológico tradicional requiere de la adición de aprendizaje automático?

Después de varios años en el campo de la negociación cuantitativa, descubrí un fenómeno curioso: la mayoría de los traders siguen usando indicadores técnicos de hace décadas, pero esperan obtener beneficios exagerados en un mercado cambiante. Es como usar una calculadora para resolver problemas de cálculo. Las herramientas no tienen problemas en sí mismas, pero la eficiencia y la precisión no están a la altura.

La estrategia de trading avanzada de KNN que analizaremos hoy representa una de las direcciones más importantes hacia las operaciones cuantitativas:Combinar algoritmos de aprendizaje automático con análisis técnicos tradicionales para construir sistemas de toma de decisiones de transacciones más inteligentes

¿Qué es el algoritmo KNN y por qué es bueno para las predicciones financieras?

La idea central del algoritmo KNN es muy simple y profunda:Un entorno de mercado similar a menudo produce movimientos de precios similares.La hipótesis de que los mercados financieros tienen una base teórica sólida y que los modelos de comportamiento de los participantes en los mercados tienen cierta repetibilidad y predictibilidad.

La estrategia se caracteriza por la construcción de un espacio de características en siete dimensiones:

  • Dinámica de los preciosLa velocidad y la dirección de los cambios en los precios
  • Indicadores de la RSIEl precio de la gasolina es muy alto en Japón.
  • Tasa de adquisiciónEl gobierno de la República Democrática del Congo ha anunciado una nueva ley para el sector de la energía.
  • La fluctuaciónLa cantidad de emociones en el mercado.
  • Intensidad de la tendenciaIdentificación de tendencias a través de un sistema de doble línea.
  • Características del MACDCaptura de señales de conversión de movimiento
  • Posicionamiento de la cinta Brin¿Qué es lo que está ocurriendo?

¿Cómo se puede lograr un procesamiento estandarizado de la ingeniería de características?

Aquí hay un detalle técnico clave que vale la pena profundizar:Estandarización de las característicasLa estrategia utiliza el método de estandarización de Z-score para convertir todas las características en el mismo rango de valores. Este paso es crucial porque:

  1. Eliminación del efecto de las cuotasEl precio, el volumen de transacciones, el RSI y otros indicadores varían considerablemente.
  2. Mejorar la eficiencia de los algoritmosLa distancia en eclíetros es más precisa después de la normalización
  3. Mejora de la estabilidad del modeloEvitar que una característica predomine en el proceso de predicción debido a un número demasiado grande.
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

Pronóstico de la Distancia a la Gravedad: ¿Por qué es tan importante que los vecinos estén “muy cerca” de nosotros?

Los algoritmos tradicionales de KNN suelen emplear un mecanismo de votación simple, pero esta estrategia utiliza un mecanismo más sofisticado para que los votantes puedan elegir entre los diferentes tipos de contenido.Distancia desde el método de pesoEl diseño refleja una característica importante de los mercados financieros:Las similitudes en el estado de los mercados son continuas, no aisladas

La fórmula para calcular el peso:weight = 1.0 / (distance + 0.001)

Este mecanismo de ponderación puede:

  • Reflexión más precisa de las similitudes históricas
  • Reducción de la interferencia de los datos por ruido
  • Mejorar la fiabilidad de los resultados de las predicciones

¿Cuáles son las situaciones en las que esta estrategia funciona mejor?

Basado en mi experiencia en el estudio de estrategias de comercio de aprendizaje automático, las estrategias KNN suelen funcionar mejor en los siguientes entornos de mercado:

  1. Mercado de tendenciasLa tendencia es que los patrones históricos similares se repiten más fácilmente cuando hay una tendencia clara en el mercado.
  2. Medio ambiente de fluctuacionesLa estabilidad de las características puede verse afectada por una fluctuación demasiado alta o demasiado baja.
  3. Variedades con mucha movilidadAsegurar la eficacia de los indicadores técnicos y el buen funcionamiento de las transacciones

Cabe señalar que la estrategia establece parámetros de gestión de riesgos más conservadores: 2% de stop loss y 4% de stop loss, y este riesgo de ganancias por riesgo de 1: 2 refleja la importancia que los diseñadores de la estrategia otorgan al control de riesgos.

Las innovaciones en la estrategia y las posibles mejoras

Algunas de las innovaciones de esta estrategia son dignas de elogio:

  1. Fusión de las características multidimensionalesNo depender de un solo indicador, sino construir un sistema integral de características
  2. Ventana de historia dinámica: Mantener la puntualidad de los datos mediante el mecanismo de ventana deslizante
  3. Probabilidad de salidaEl objetivo de la plataforma es proporcionar probabilidades de pronóstico en lugar de una simple señal de compra o venta.

Pero al mismo tiempo, veo algunas cosas que se pueden mejorar:

  • Optimización de selección de característicasSe puede introducir una evaluación de la importancia de las características y ajustar dinámicamente el peso de las características.
  • Los parámetros se adaptanLos valores de K y los valores mínimos se pueden ajustar según la dinámica del mercado.
  • Fusión de marcos de tiempo múltiplesLa combinación de señales de diferentes periodos podría mejorar la precisión de las predicciones.

Precauciones en la aplicación práctica

En las aplicaciones de disco duro, hay que prestar especial atención a los siguientes puntos:

  1. La complejidad del cálculoLa cantidad de cálculos del algoritmo KNN crece con el aumento de los datos históricos, lo que requiere un equilibrio entre precisión y eficiencia.
  2. Riesgo de una adaptación excesivaUn valor de K demasiado pequeño puede conducir a una sobreadaptación, y un valor de K demasiado grande puede conducir a una falta de adaptación.
  3. Calidad de los datosLos puntos de datos anormales afectan significativamente a los cálculos de distancia, por lo que es necesario crear un mecanismo de limpieza de datos.

Conclusión: El futuro de las transacciones cuantitativas mediante el aprendizaje automático

La estrategia de KNN representa una dirección importante para el desarrollo de la transacción cuantitativa:De las reglas simples a los datos inteligentesAunque el aprendizaje automático no es omnipotente, nos ofrece una forma más científica y sistemática de entender y predecir el comportamiento del mercado.

En mi opinión, el futuro de las transacciones cuantitativas será una profunda fusión de la teoría financiera tradicional, la estadística moderna y la tecnología de aprendizaje automático. Esta estrategia de KNN es solo el comienzo, y más innovaciones y avances están en el camino.

Código Fuente de la Estrategia
/*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预测\")}}");//空头信号提醒