Esta estrategia es un sistema adaptativo de seguimiento de tendencias basado en el algoritmo de aprendizaje automático K-Nearest Neighbors (KNN). La estrategia ajusta dinámicamente los parámetros de seguimiento de tendencias a través del algoritmo KNN y genera señales comerciales en combinación con promedios móviles. El sistema puede ajustar automáticamente los parámetros de estrategia basados en cambios en las condiciones del mercado, mejorando la adaptabilidad y estabilidad de la estrategia. Esta estrategia combina métodos de aprendizaje automático para optimizar las estrategias tradicionales de seguimiento de tendencias, lo que representa una fusión de tecnología e innovación en la inversión cuantitativa.
El principio central de la estrategia es analizar los datos históricos de precios utilizando el algoritmo KNN y predecir las tendencias de precios mediante el cálculo de la similitud entre las condiciones actuales del mercado y los datos históricos.
Esta estrategia aplica innovadoramente el algoritmo KNN a la tendencia después de la negociación, optimizando las estrategias de análisis técnico tradicionales a través de métodos de aprendizaje automático. La estrategia posee una gran adaptabilidad y flexibilidad, capaz de ajustar dinámicamente los parámetros en función de las condiciones del mercado. Aunque existen riesgos como la alta complejidad computacional y la sensibilidad de los parámetros, la estrategia todavía tiene un buen valor de aplicación a través de medidas razonables de optimización y control de riesgos. Se recomienda que los inversores ajusten los parámetros de acuerdo con las características del mercado y combinen otros métodos de análisis para las decisiones comerciales en aplicaciones prácticas.
/*backtest start: 2024-10-01 00:00:00 end: 2024-10-31 23:59:59 period: 1h basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=6 strategy("Trend Following Strategy with KNN", overlay=true,commission_value=0.03,currency='USD', commission_type=strategy.commission.percent,default_qty_type=strategy.cash) // Input parameters k = input.int(5, title="K (Number of Neighbors)", minval=1) // Number of neighbors for KNN algorithm window_size = input.int(20, title="Window Size", minval=1) // Window size for feature vector calculation ma_length = input.int(50, title="MA Length", minval=1) // Length of the moving average // Calculate moving average ma = ta.sma(close, ma_length) // Initialize variables var float[] features = na var float[] distances = na var int[] nearest_neighbors = na if bar_index >= window_size - 1 // Ensure there is enough historical data features := array.new_float(0) // Keep only the current window data for i = 0 to window_size - 1 array.push(features, close[i]) // Calculate distances distances := array.new_float(0) // Clear the array for each calculation for i = 0 to window_size - 1 // Calculate the distance between the current price and all prices in the window var float distance = 0.0 for j = 0 to window_size - 1 distance += math.pow(close[j] - array.get(features, j), 2) distance := math.sqrt(distance) array.push(distances, distance) // Find the nearest neighbors if array.size(distances) > 0 and array.size(distances) >= k nearest_neighbors := array.new_int(0) for i = 0 to k - 1 var int min_index = -1 var float min_distance = na for j = 0 to array.size(distances) - 1 if na(min_distance) or array.get(distances, j) < min_distance min_index := j min_distance := array.get(distances, j) if min_index != -1 array.push(nearest_neighbors, min_index) array.remove(distances, min_index) // Remove the processed neighbor // Calculate the average price change of the neighbors var float average_change = 0.0 if array.size(nearest_neighbors) > 0 for i = 0 to array.size(nearest_neighbors) - 1 var int index = array.get(nearest_neighbors, i) // Ensure index + 1 is within range if index + 1 < bar_index average_change += (close[index] - close[index + 1]) average_change := average_change / array.size(nearest_neighbors) // Generate trading signals if average_change > 0 and close > ma strategy.entry("Long", strategy.long) else if average_change < 0 and close < ma strategy.entry("Short", strategy.short)