KNN 적응 매개변수화 추세 추적 전략

MA KNN SMA
생성 날짜: 2024-11-29 10:54:49 마지막으로 수정됨: 2024-11-29 10:54:49
복사: 0 클릭수: 517
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

KNN 적응 매개변수화 추세 추적 전략

개요

이 전략은 기계 학습 알고리즘 K 근접 ((KNN) 에 기반한 자기 적응형 변수화 트렌드 추적 시스템이다. 이 전략은 KNN 알고리즘을 통해 동적으로 트렌드 추적 파라미터를 조정하고, 이동 평균과 결합하여 거래 신호를 생성한다. 이 시스템은 시장 환경의 변화에 따라 전략 파라미터를 자동으로 조정하여 전략의 적응성과 안정성을 향상시킬 수 있다. 이 전략은 기계 학습 방법을 사용하여 전통적인 트렌드 추적 전략을 최적화하고, 양적 투자 분야의 기술과 새로운 창조를 결합한다.

전략 원칙

전략의 핵심 원칙은 KNN 알고리즘을 사용하여 역사적 가격 데이터를 분석하여 현재 시장 상태와 역사적 데이터의 유사성을 계산하여 가격 움직임을 예측하는 것입니다. 구체적인 구현 단계는 다음과 같습니다:

  1. 관찰 창 크기와 K값을 설정하고, 역사 가격 데이터를 수집하여 특징 벡터를 형성합니다.
  2. 현재 가격 서열과 역사 데이터 사이의 유럽식 거리를 계산합니다.
  3. K의 가장 유사한 역사값 서열을 근접 샘플로 선택합니다.
  4. 이 K의 근접 샘플의 후속 가격 변화를 분석합니다.
  5. 이동 평균과 결합하여 근접 샘플의 평균 가격 변화에 따라 거래 신호를 생성합니다. K개의 근접한 샘플의 평균 가격이 긍정적으로 변하고 현재 가격이 이동 평균선 위에 있을 때, 시스템은 다중 신호를 생성한다; 반대로 공소 신호를 생성한다.

전략적 이점

  1. 자기 적응력: KNN 알고리즘은 시장 환경의 변화에 따라 매개 변수를 자동으로 조정할 수 있으므로 전략이 더 잘 적응할 수 있습니다
  2. 다차원 분석: 기계 학습 알고리즘과 기술 지표가 결합되어 더 포괄적인 시장 분석 관점을 제공합니다.
  3. 위험 제어 합리화: 이동 평균을 보조 확인으로 사용하여 가짜 신호의 영향을 줄입니다.
  4. 계산 논리 명확성: 전략 실행 과정이 투명하고 이해하기 쉽고 최적화됩니다.
  5. 매개 변수 유연성: K값과 창 크기와 같은 매개 변수들을 다른 시장 환경에 따라 조정할 수 있습니다.

전략적 위험

  1. 높은 계산 복잡성: KNN 알고리즘은 많은 역사적 데이터를 계산해야 하며, 정책 실행의 효율성에 영향을 미칠 수 있다.
  2. 매개 변수 민감성: K 값과 창 크기의 선택이 정책 성능에 중요한 영향을 미칩니다.
  3. 시장 환경 의존성: 급격한 변동성 시장 환경에서는 역사적 유사성의 기준값이 낮아질 수 있습니다.
  4. 과도한 적합성 위험: 과도한 역사적 데이터 의존으로 인해 과도한 적합성이 발생할 수 있습니다
  5. 지연 위험: 충분한 역사 데이터를 수집해야 하므로 신호 지연이 발생할 수 있습니다.

전략 최적화 방향

  1. 특징 엔지니어링 최적화:
  • 기술적인 지표들을 추가하는 특징
  • 시장 감정 지표를 도입합니다.
  • 최적화된 특징 표준화 방법
  1. 알고리즘의 효율성 향상:
  • KD 트리 같은 데이터 구조를 사용하여 근접 검색을 최적화
  • 병렬 컴퓨팅
  • 데이터 저장 및 접근을 최적화합니다.
  1. 위험 통제 강화:
  • 손절매 및 이익실현 메커니즘 추가
  • 변동성 필터 소개
  • 동적 포지션 관리 시스템을 설계
  1. 변수 최적화 프로그램:
  • K-값 선택에 적응할 수 있다.
  • 동적으로 관측 창 크기를 조정
  • 이동 평균 주기 최적화
  1. 신호 생성 메커니즘 개선:
  • 신호 강도 점수 시스템을 도입
  • 설계 신호 확인 메커니즘
  • 출전 시점을 최적화

요약하다

이 전략은 트렌드 추적 거래에 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)