
Эта стратегия является самостоятельной адаптивной параметрической системой отслеживания тенденций, основанной на алгоритме машинного обучения K близко к {\displaystyle K} . Эта стратегия динамически корректирует параметры отслеживания тенденций с помощью алгоритма KNN в сочетании с созданием торговых сигналов в сочетании с движущейся средней. Система может автоматически корректировать параметры стратегии в зависимости от изменения рыночной среды, повышая адаптивность и стабильность стратегии.
Ключевым принципом стратегии является использование алгоритмов KNN для анализа исторических данных о ценах и прогнозирования движения цены путем вычисления сопоставимости текущего состояния рынка с историческими данными. Конкретные шаги по реализации следующие:
Стратегия инновационно применяет алгоритм KNN в торговле, отслеживающей тенденции, оптимизируя традиционные технические аналитические стратегии с помощью методов машинного обучения. Стратегия обладает высокой адаптивностью и гибкостью, способна корректировать параметры в соответствии с динамикой рыночной среды. Несмотря на риски, такие как высокая сложность вычислений и чувствительность к параметрам, стратегия имеет хорошую ценность при использовании разумных мер оптимизации и контроля риска.
/*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)