다중 기간 모멘텀 기반 적응형 변동성 필터링 전략

momentum volatility SMA ATR stdev SPX
생성 날짜: 2025-02-24 09:38:10 마지막으로 수정됨: 2025-02-24 09:38:10
복사: 0 클릭수: 346
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

다중 기간 모멘텀 기반 적응형 변동성 필터링 전략 다중 기간 모멘텀 기반 적응형 변동성 필터링 전략

개요

이 전략은 다중 주기적 역동성 지표와 변동률 필터링을 기반으로 한 고급 거래 시스템이다. 3개월, 6개월, 9개월, 12개월의 4개의 시간주기의 가격 역동성을 계산하여 통합적인 역동성 점수 시스템을 구축한다. 또한, 전략은 연간 변동률 필터링 메커니즘을 도입하여 변동률 하락값을 설정하여 거래 위험을 제어한다. 이 전략은 지속적인 상승 추세와 변동이 상대적으로 안정적인 거래 기회를 포착하는 데 초점을 맞추고 있으며, 전형적인 트렌드 추적 시스템이다.

전략 원칙

이 전략의 핵심 논리는 다음과 같은 핵심 요소들을 포함하고 있습니다.

  1. 동력 계산: ((현재 가격/역사 가격-1) 의 방법을 사용하여 각각 4 시간 주기 동력 지표를 계산한다.
  2. 변동율 필터: 일일 수익률의 표준 차이는 연간 처리하여, 기본 값 ((0.5) 과 비교하여 높은 변동율 기간을 필터링한다.
  3. 신호 생성: 통합 운동량 지표가 마이너스 전환을 통해 교정되고 변동률이 하위값보다 낮을 때 여러 신호를 생성한다. 운동량 지표가 마이너스 전환을 통해 평형한다.
  4. 리스크 관리: 1%의 스톱로스와 50%의 스톱스을 사용하여 단일 거래의 위험을 제어한다.

전략적 이점

  1. 다차원 동력 분석: 여러 시기의 동력을 종합적으로 고려하여 가격 경향의 강도와 지속성을 보다 포괄적으로 평가할 수 있다.
  2. 적응된 변동률 필터링: 동적으로 계산하고 변동률을 필터링하여 높은 변동률 동안의 잘못된 신호를 효과적으로 피한다.
  3. 완벽한 위험 제어: 단 하나 거래의 위험을 효과적으로 제어할 수 있도록 중지 손실 및 중지 마이너스를 설정합니다.
  4. 체계화 된 의사 결정: 전략이 완전히 체계화되어 주관적 판단으로 인한 방해가 없도록합니다.

전략적 위험

  1. 트렌드 반전 위험: 강한 트렌드가 갑자기 반전되면 큰 손실을 입을 수 있습니다.
  2. 매개 변수 감수성: 전략 효과는 동량 주기, 변동률 절정 등 매개 변수 설정에 민감하다.
  3. 시장 환경 의존성: 불안정한 시장에서 빈번하게 잘못된 신호가 발생할 수 있다.
  4. 슬라이드 포인트 효과: 시장의 유동성이 부족할 때 거래 비용이 더 많이 발생할 수 있습니다.

전략 최적화 방향

  1. 동적 파라미터 최적화: 시장 상태에 따라 동적 조정 동력 주기 및 변동률 값을 도입할 수 있다.
  2. 시장 상태 분류: 시장 상태 식별 모듈을 추가하여 다른 시장 환경에서 다른 파라미터 설정을 사용합니다.
  3. 신호 확인 메커니즘: 거래 신호를 확인하기 위해 추가적인 기술 지표를 도입하여 전략의 안정성을 향상시킵니다.
  4. 자금 관리 최적화: 신호 강도에 따라 지주 규모를 조정하여 자금 사용 효율을 향상시킬 수 있습니다.

요약하다

이 전략은 다주기 동력 분석과 변동률 필터를 결합하여 전체적인 트렌드 추적 거래 시스템을 구축한다. 그것의 핵심 장점은 체계화된 의사결정 과정과 완벽한 위험 제어 장치에 있다. 일부 고유한 위험이 존재하지만, 제안된 최적화 방향을 통해 전략에는 여전히 큰 개선 공간이 있다. 전체적으로 볼 때, 이것은 합리적이고 논리적으로 엄격한 거래 전략이며, 낮은 변동률의 트렌드 시장에서 적용하기에 적합하다.

전략 소스 코드
/*backtest
start: 2024-02-25 00:00:00
end: 2025-02-22 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/

//@version=5
strategy("GOATED Long-Only", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Strategy parameters
var float VOLATILITY_THRESHOLD = input.float(0.5, "Volatility Threshold", minval=0.1, maxval=1.0, step=0.1)
var int TRADING_DAYS_PER_YEAR = 252
var float SQRT_TRADING_DAYS = math.sqrt(TRADING_DAYS_PER_YEAR)

// Trade parameters
var float STOP_LOSS = input.float(0.05, "Stop Loss %", minval=0.01, maxval=0.20, step=0.01)
var float TAKE_PROFIT = input.float(0.15, "Take Profit %", minval=0.05, maxval=0.50, step=0.01)

// Momentum periods (in trading days)
var int MOMENTUM_3M = input.int(63, "3-Month Momentum Period", minval=20)
var int MOMENTUM_6M = input.int(126, "6-Month Momentum Period", minval=40)
var int MOMENTUM_9M = input.int(189, "9-Month Momentum Period", minval=60)
var int MOMENTUM_12M = input.int(252, "12-Month Momentum Period", minval=80)

// Function to calculate momentum for a specific period
momentum(period) =>
    close / close[period] - 1

// Function to calculate annualized volatility
calcVolatility() =>
    returns = ta.change(close) / close[1]
    stdDev = ta.stdev(returns, TRADING_DAYS_PER_YEAR)
    annualizedVol = stdDev * SQRT_TRADING_DAYS
    annualizedVol

// Calculate individual momentum scores
float mom3m = momentum(MOMENTUM_3M)
float mom6m = momentum(MOMENTUM_6M)
float mom9m = momentum(MOMENTUM_9M)
float mom12m = momentum(MOMENTUM_12M)

// Calculate average momentum score
var int validPeriods = 0
var float totalMomentum = 0.0

validPeriods := 0
totalMomentum := 0.0

if not na(mom3m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom3m

if not na(mom6m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom6m

if not na(mom9m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom9m

if not na(mom12m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom12m

float compositeMomentum = validPeriods > 0 ? totalMomentum / validPeriods : na

// Calculate volatility
float annualizedVolatility = calcVolatility()

// Generate trading signals
var float MOMENTUM_THRESHOLD = input.float(0.0, "Momentum Threshold", minval=-1.0, maxval=1.0, step=0.01)
bool validVolatility = not na(annualizedVolatility) and annualizedVolatility <= VOLATILITY_THRESHOLD
bool validMomentum = not na(compositeMomentum) and compositeMomentum > MOMENTUM_THRESHOLD

// Store previous momentum state
bool prevValidMomentum = nz(validMomentum[1])

// Entry and exit conditions
bool longCondition = validVolatility and validMomentum and not prevValidMomentum
bool exitLongCondition = validVolatility and (not validMomentum) and prevValidMomentum

// Plot signals
plotshape(longCondition, title="Long Entry", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(exitLongCondition, title="Long Exit", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

// Plot momentum and volatility indicators
plot(compositeMomentum, "Composite Momentum", color=color.blue, linewidth=2)
hline(MOMENTUM_THRESHOLD, "Momentum Threshold", color=color.gray, linestyle=hline.style_dashed)

plot(annualizedVolatility, "Annualized Volatility", color=color.purple, linewidth=1)
hline(VOLATILITY_THRESHOLD, "Volatility Threshold", color=color.gray, linestyle=hline.style_dashed)

// Strategy execution - Long positions
if (longCondition)
    strategy.entry("Long", strategy.long)
    
if (strategy.position_size > 0)
    float longStopLoss = strategy.position_avg_price * (1 - STOP_LOSS)
    float longTakeProfit = strategy.position_avg_price * (1 + TAKE_PROFIT)
    strategy.exit("Exit Long", "Long", stop=longStopLoss, limit=longTakeProfit)
    if (exitLongCondition)
        strategy.close("Long", comment="Signal Exit")