
A estratégia é um sistema de rastreamento de tendências parametrizado e adaptativo, baseado no algoritmo de aprendizagem de máquina K proximidade (KNN). A estratégia ajusta dinamicamente os parâmetros de rastreamento de tendências através do algoritmo de KNN, combinando a geração de sinais de negociação com a média móvel. O sistema é capaz de ajustar automaticamente os parâmetros da estratégia de acordo com as mudanças no ambiente de mercado, aumentando a adaptabilidade e a estabilidade da estratégia.
O princípio central da estratégia é usar o algoritmo KNN para analisar os dados históricos de preços e prever os movimentos de preços, calculando a similaridade entre o estado atual do mercado e os dados históricos. Os passos para a implementação são os seguintes:
A estratégia aplica de forma inovadora o algoritmo KNN em negociações de acompanhamento de tendências, otimizando as estratégias tradicionais de análise técnica por meio de métodos de aprendizado de máquina. A estratégia possui uma forte adaptabilidade e flexibilidade, capaz de ajustar os parâmetros de acordo com a dinâmica do ambiente de mercado. Embora existam riscos, como alta complexidade computacional e sensibilidade a parâmetros, a estratégia ainda tem um bom valor de aplicação com medidas razoáveis de otimização e controle de risco.
/*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)