리소스 로딩... 로딩...

KNN 기반 적응 파라미터 트렌드 전략

저자:차오장, 날짜: 2024-11-29 10:54:49
태그:MAKNNSMA

img

전반적인 설명

이 전략은 K-Nearest Neighbors (KNN) 기계 학습 알고리즘에 기반한 적응적 매개 변수 추종 시스템이다. 이 전략은 KNN 알고리즘을 통해 트렌드 추종 매개 변수를 동적으로 조정하고 이동 평균과 결합하여 거래 신호를 생성한다. 이 시스템은 시장 조건의 변화에 따라 전략 매개 변수를 자동으로 조정하여 전략 적응력과 안정성을 향상시킬 수 있다. 이 전략은 전통적인 트렌드 추종 전략을 최적화하기 위해 기계 학습 방법을 결합하여 양적 투자에서 기술과 혁신의 융합을 나타낸다.

전략 원칙

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

  1. 관찰 창 크기와 K 값을 설정하고 특징 벡터를 형성하기 위해 역사 가격 데이터를 수집
  2. 현재 가격 순서와 역사적 데이터 사이의 유클리드 거리를 계산
  3. 이웃 표본으로 가장 유사한 역사 가격 순서를 선택
  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)



관련

더 많은