코인 전망/자동매매

파인스크립트 가우시안 필터를 활용한 전략

cyano 2025. 1. 21. 14:12

안녕하세요. 시아노입니다. 오늘은 트레이딩뷰 화면에서 가우시안 필터를 적용한 매매전략을 확인해 보겠습니다. 기본적으로 가우시안 필터는 복잡한 데이터를 정리해서 보는 느낌이라 트레이딩에 적용하기에 깔끔한 느낌인데, 적절한 필터값을 찾지 못해 실전에는 그리 큰 수익을 보지 못한 면이 있습니다. 

개인적으로 잘 이해하고 있는 다른 전략과 적절히 배합하다보면 그래도 좋은 결과를 가져오지 않을까 하는 기대로 소개합니다. 

 

1. 가우시안 필터란 무엇인가?

가우시안 필터는 데이터의 "노이즈"를 제거하여 핵심적인 트렌드를 더 명확하게 볼 수 있도록 돕는 도구입니다. 이는 데이터를 부드럽게 평활화(smoothing)하여 시장의 진짜 움직임을 파악하는 데 사용됩니다.

예를 들어, 시장 데이터에는 매일 많은 작은 변동이 포함되어 있습니다. 이러한 변동은 때로는 중요한 트렌드를 가리기도 합니다. 가우시안 필터는 이러한 "잡음"을 제거하여 트렌드를 더 명확하게 보여줍니다.

2. 가우시안 필터의 핵심 원리

가우시안 필터는 주어진 데이터에 대해 특정 수학적 계산을 수행하여 데이터를 매끄럽게 만듭니다. 필터의 매끄럽기 정도는 알파(alpha)라는 값에 의해 결정됩니다. 알파 값은 필터의 "길이"와 "극(order)"에 따라 조정됩니다.

3. 가우시안 필터의 구현: 파인스크립트 코드

아래는 가우시안 필터를 구현한 파인스크립트 코드입니다. 각 줄에 주석을 추가하여 초보자도 이해할 수 있도록 설명합니다.

//@version=5
indicator("Smoothed Gaussian Trend Filter", overlay = true)

// 사용자 입력: 필터 길이와 극(order)을 설정합니다.
length = input.int(15, title="Gaussian Length", tooltip="필터의 길이입니다.")
order = input.int(3, title="Poles", minval=1, maxval=4, tooltip="필터의 매끄럽기 수준입니다.")

// 가우시안 알파 값을 계산하는 함수입니다.
calcGaussianAlpha(_length, _order) =>
    freq = (2.0 * math.pi) / _length  // 주기의 크기를 계산합니다.
    factorB = (1.0 - math.cos(freq)) / (math.pow(1.414, (2.0 / _order)) - 1.0)  // 필터 계수 계산
    alphaVal = -factorB + math.sqrt(factorB * factorB + 2.0 * factorB)  // 알파 값 계산
    alphaVal

// 가우시안 필터를 적용하는 함수입니다.
gaussianSmooth(dataIn, filterLevel, alphaCoeff) =>
    var float runningFilterValue = 0.0  // 필터의 초기값 설정
    oneMinusAlpha = 1.0 - alphaCoeff  // (1 - 알파) 값 계산

    if filterLevel == 1
        runningFilterValue := alphaCoeff * dataIn +
                              oneMinusAlpha * nz(runningFilterValue[1])
    else if filterLevel == 2
        runningFilterValue := alphaCoeff * dataIn +
                              2.0 * oneMinusAlpha * nz(runningFilterValue[1]) -
                              (1.0 - alphaCoeff) ^ 2 * nz(runningFilterValue[2])
    runningFilterValue

// 알파 값 계산
gAlpha = calcGaussianAlpha(length, order)

// 가우시안 필터를 적용하여 부드럽게 평활화된 데이터를 생성합니다.
smoothedData = gaussianSmooth(close, order, gAlpha)

// 결과를 차트에 표시합니다.
plot(smoothedData, color=color.blue, title="Smoothed Gaussian Trend")

4. 코드 설명

  • calcGaussianAlpha 함수: 필터의 매끄럽기 정도를 조정하는 알파 값을 계산합니다.
  • gaussianSmooth 함수: 데이터를 매끄럽게 만드는 작업을 수행합니다.
  • plot 함수: 평활화된 데이터를 차트에 시각적으로 표시합니다.

5. 가우시안 필터의 활용

가우시안 필터는 시장의 트렌드를 분석하고, 노이즈를 제거하여 명확한 신호를 포착하는 데 유용합니다. 특히 초보자도 이해하기 쉽도록 설계된 위 코드를 활용하면, 자신만의 맞춤형 트렌드 지표를 만들 수 있습니다.


//가우시안 필터 적용 전략코드
//@version=6
strategy(title="Gaussian Detrended Price Reversion Strategy", shorttitle = "GDR", overlay=false)

// Detrended Price Oscillator base inputs and calculations
period_ = input.int(52, title="Price Length", minval=1)

barsback = period_/2 + 1
ma = ta.ema(close, period_)
dpo = close - ma[barsback]

// ALMA smoothing and inputs on the DPO
almaSource = dpo
almaWindowSize = input(title="Smoothing Length", defval=52)
lagLength = input(title="Lag Length", defval=26)
almaDPO = ta.alma(almaSource, almaWindowSize, 0.85, 6)
almaLag = almaDPO[lagLength]

// Conditions
entryL = ta.crossover(almaDPO, almaLag) and almaDPO < 0
exitL = ta.crossunder(almaDPO, almaLag) or ta.crossunder(almaDPO, 0)
entryS = ta.crossunder(almaDPO, almaLag) and almaDPO > 0
exitS = ta.crossover(almaDPO, almaLag) or ta.crossover(almaDPO, 0)

// Logic
if entryL
    strategy.entry("Long", strategy.long)

if exitL
    strategy.close("Long")

if entryS
    strategy.entry("Short", strategy.short)

if exitS
    strategy.close("Short")

// Plotting
plot(almaDPO, title="Price Line", color=color.green)
plot(almaDPO, title="Lag Line", offset = lagLength, color=color.white)

hline(0, title="Zero Rate Line", color=color.white)

bgcolor(entryL ? color.new(color.green, 40) : na, title = "Long Entry Highlighter")
bgcolor(entryS ? color.new(color.red, 40) : na, title = "Short Entry Highlighter")

plotshape(series=exitL, style=shape.xcross, location=location.top, color=color.green, size=size.tiny, title = "Long Exit Symbol")
plotshape(series=exitS, style=shape.xcross, location=location.bottom, color=color.red, size=size.tiny, title = "Short Exit Symbol")

 

6. 결론

개인적으로는 가우시안 필터를 적용했을때 성과는 그리 좋지 못합니다. 아래는  일봉으로 1년간 백테스트 했을때 나온 결과입니다. 승율도 높지 않고 시장평가수익에 비해 처참한 결과이긴 합니다. 

 

가우시안 필터는 복잡한 시장 데이터를 단순화하여 트렌드 분석을 도와주는 강력한 도구입니다. 비록 백테스트 결과가 그리 좋게 나오지는 않았지만, 직접 실행해보고, 다양한 매개변수를 조정하여 자신만의 전략을 개발하면 도움이 되지 않을까 생각합니다. ^^