적응적인 이동 평균에 기초한 전략을 따르는 경향

저자:차오장, 날짜: 2024-01-30 16:30:20
태그:

img

전반적인 설명

이 전략은 트렌드를 따르는 거래 시스템을 설계하기 위해 카우프만 적응 이동 평균 (KAMA) 지표를 사용합니다. 트렌드가 형성되고 소음을 필터 할 때 빠르게 트렌드를 추적 할 수 있습니다. 동시에 시스템은 강력한 리스크 제어 기능을 가진 스톱 손실 메커니즘으로 파라볼릭 SAR (PSAR) 및 평균 트루 레인지 트레일링 스톱을 통합합니다.

전략 논리

  • KAMA 지표의 길이는 최근 시장 변동성에 따라 동적으로 조정됩니다. 가격 변화가 최근 소음보다 크면 EMA 창이 짧아집니다. 가격 변화가 최근 소음보다 작을 때 EMA 창이 길어집니다. 이것은 KAMA가 혼란스러운 시장 중 소음을 필터하는 동안 트렌드를 빠르게 추적 할 수 있습니다.

  • 이 시스템은 주로 가장 빠른 KAMA (KAMA 1) 를 기준으로 트렌드 방향을 판단합니다. KAMA 1이 상향으로 지목되면 길고 KAMA 1이 하향으로 지목되면 짧습니다. 잘못된 브레이크를 필터링하기 위해 KAMA 필터를 설정합니다. KAMA 1의 변화가 최근 변동의 한 표준편차를 초과하면 거래 신호가 생성됩니다.

  • 스톱 로스를 위해 시스템은 KAMA 역전, PSAR 역전 및 ATR 트레일링 스톱의 세 가지 선택적 스톱 로스 방법을 제공합니다. 투자자는 하나 또는 조합을 선택할 수 있습니다.

이점 분석

  • KAMA 지표의 독특한 디자인은 시스템이 급격히 신흥 트렌드를 파악하고, 불안정한 시장에서 거래를 중단하고, 거래 빈도를 효과적으로 제어하고, 불필요한 미끄러짐 및 수수료 비용을 줄일 수 있도록합니다.

  • 이 시스템은 여러 개의 스톱 로스 메커니즘을 내장하고 있습니다. 투자자는 개별 손실을 효과적으로 제어하기 위해 자신의 개인 위험 선호도에 따라 적절한 스톱 로스 스을 선택할 수 있습니다.

  • 이 시스템은 완전히 지표와 스톱 로스 라인을 기반으로 하며, 트랜잭션의 이동으로 인한 일반적인 오차 문제를 피합니다.

  • 여러 매개 변수 설정 및 조건 조합은 시스템 사용자 정의에 큰 공간을 제공합니다. 사용자는 다른 제품과 주파수에 따라 최적화 할 수 있습니다.

위험 분석

  • 이 시스템은 체계적 위험을 고려하지 않으며 극한 시장 조건에서 손실을 효과적으로 제어 할 수 없습니다.

  • 시스템 PARAMETERS는 다른 제품과 빈도에 따라 조정해야 할 수도 있습니다. 그렇지 않으면 너무 공격적이거나 너무 보수적인 결과를 얻을 수 있습니다.

  • 스톱 로스를 위해 KAMA 인디케이터에만 의존하는 경우, 불안한 시장에서 위프사우에 빠지기 쉽습니다. 이를 해결하기 위해 PSAR 또는 ATR 트레일링 스톱과 결합해야합니다.

최적화 방향

  • ADX 또는 암시 변동성 같은 트렌드 필터링 지표를 추가하여 불안정하고 트렌드 전환 단계에서 잘못된 신호를 생성하지 않도록합니다.

  • 안정성을 향상시키기 위해 개별 제품 및 고정 주파수에 대한 PARAMETERS를 최적화하고 백테스트합니다. 최적화 차원은 KAMA 매개 변수 조합, 중지 손실 매개 변수 등을 포함합니다.

  • 매개 변수 최적화 대신 기계 학습 모델을 시도하세요. 많은 역사적 데이터를 가진 신경 네트워크 또는 의사 결정 나무 모델을 훈련시켜 입출시기를 판단하고 손실을 멈추십시오.

  • 암호화폐와 같은 다른 제품으로 전략을 마이그레이션하는 것을 시도하십시오. 이것은 PARAMETERS를 조정하거나 다른 보조 지표를 추가하는 것이 필요할 수 있습니다.

요약

이 전략은 트렌드 판단 및 트렌드 방향을 효과적으로 추적하고 위험을 제어하기 위해 여러 스톱 로스 방법을 통합합니다. KAMA 지표의 독특함은 전략이 급격히 떠오르는 트렌드의 방향을 결정하고 잘못된 파격 문제를 피하도록합니다. 사용자 정의 및 최적화 가능한 매개 변수는 사용자에게 개인 조정을위한 큰 공간을 제공합니다. 매개 변수를 최적화하고 개별 제품 및 주파수에 대한 기계 학습 모델을 통합함으로써 전략의 성능을 더욱 향상시킬 수 있습니다.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © BenHampson
// @version=4
// Credit to:
// - ChuckBanger for much of the KAMA code
// - cheatcountry for the KAMA Filter code
// - millerrh for much of the ATR Stop code
// - racer8 for much of the Position Sizing code

// I have combined aspects of their work and built upon it to form a strategy I like. 
// The KAMA, with its filter, is used for entry.
// An ATR trailing stop loss, PSAR, and the KAMA can all optionally be used as exits, or you can use a combination of the three.

strategy(title="KAMA Strategy - Kaufman's Adaptive Moving Average", shorttitle="KAMA Strategy", overlay=true)

src = input(title="Source", type=input.source, defval=close)

// Exits
KAMA1SL = input(title = 'KAMA 1 Stop Loss', type = input.bool, defval = true)
ATRTSL = input(title = 'ATR Trailing Stop Loss', type = input.bool, defval = false)
PSARSL = input(title = 'PSAR Stop Loss', type = input.bool, defval = false)

// KAMA 1 (Fastest)
length1 = input(title="KAMA 1: Length", type=input.integer, defval=14)
fastLength1 = input(title="KAMA 1: Fast KAMA Length", type=input.integer, defval=2)
slowLength1 = input(title="KAMA 1: Slow KAMA Length", type=input.integer, defval=20)

length2 = input(title="KAMA 2: Length 2", type=input.integer, defval=15)
fastLength2 = input(title="KAMA 2: Fast KAMA Length", type=input.integer, defval=3)
slowLength2 = input(title="KAMA 2: Slow KAMA Length", type=input.integer, defval=22)

length3 = input(title="KAMA 3: Length 3", type=input.integer, defval=16)
fastLength3 = input(title="KAMA 3: Fast KAMA Length", type=input.integer, defval=4)
slowLength3 = input(title="KAMA 3: Slow KAMA Length", type=input.integer, defval=24)

length4 = input(title="KAMA 4: Length", type=input.integer, defval=17)
fastLength4 = input(title="KAMA 4: Fast KAMA Length", type=input.integer, defval=5)
slowLength4 = input(title="KAMA 4: Slow KAMA Length", type=input.integer, defval=26)

// KAMA 5 (Medium)
length5 = input(title="KAMA 5: Length", type=input.integer, defval=18)
fastLength5 = input(title="KAMA 5: Fast KAMA Length", type=input.integer, defval=6)
slowLength5 = input(title="KAMA 5: Slow KAMA Length", type=input.integer, defval=28)

length6 = input(title="KAMA 6: Length", type=input.integer, defval=19)
fastLength6 = input(title="KAMA 6: Fast KAMA Length", type=input.integer, defval=7)
slowLength6 = input(title="KAMA 6: Slow KAMA Length", type=input.integer, defval=30)

length7 = input(title="KAMA 7: Length", type=input.integer, defval=20)
fastLength7 = input(title="KAMA 7: Fast KAMA Length", type=input.integer, defval=8)
slowLength7 = input(title="KAMA 7: Slow KAMA Length", type=input.integer, defval=32)

// KAMA 8 (Slowest)
length8 = input(title="KAMA 8: Length", type=input.integer, defval=21)
fastLength8 = input(title="KAMA 8: Fast KAMA Length", type=input.integer, defval=9)
slowLength8 = input(title="KAMA 8: Slow KAMA Length", type=input.integer, defval=34)

// Kaufman's Adaptive Moving Average
getKAMA(src, length1, fastLength1, slowLength1) =>
    mom = abs(change(src, length1))
    volatility = sum(abs(change(src)), length1)
    
    // Efficiency Ratio
    er = volatility != 0 ? mom / volatility : 0
    
    fastAlpha = 2 / (fastLength1 + 1)
    slowAlpha = 2 / (slowLength1 + 1)
    
    // KAMA Alpha
    sc = pow((er * (fastAlpha - slowAlpha)) + slowAlpha, 2)
    
    kama = 0.0
    kama := sc * src + (1 - sc) * nz(kama[1])
    kama

kama1 = getKAMA(src, length1, fastLength1, slowLength1)
kama2 = getKAMA(src, length2, fastLength2, slowLength2)
kama3 = getKAMA(src, length3, fastLength3, slowLength3)
kama4 = getKAMA(src, length4, fastLength4, slowLength4)
kama5 = getKAMA(src, length5, fastLength5, slowLength5)
kama6 = getKAMA(src, length6, fastLength6, slowLength6)
kama7 = getKAMA(src, length7, fastLength7, slowLength7)
kama8 = getKAMA(src, length8, fastLength8, slowLength8)

//If the kama1 has increased...
kama1delta = kama1[0] - kama1[1]
kama3delta = kama3[0] - kama3[1]
kama8delta = kama8[0] - kama8[1]

// KAMA Plots
plot(kama1, title="KAMA 1", color=#e91e63, display=display.all, linewidth=2)
plot(kama2, title="KAMA 2", color=color.red, display=display.all)
plot(kama3, title="KAMA 3", color=color.red, display=display.all)
plot(kama4, title="KAMA 4", color=color.orange, display=display.all)
plot(kama5, title="KAMA 5", color=color.orange, display=display.all)
plot(kama6, title="KAMA 6", color=color.yellow, display=display.all)
plot(kama7, title="KAMA 7", color=color.yellow, display=display.all)
plot(kama8, title="KAMA 8", color=color.white, display=display.all)



//========================================= KAMA FILTER ===========================================

// Copyright (c) 2019-present, Franklin Moormann (cheatcountry)
// Moving Average Adaptive Filter [CC] script may be freely distributed under the MIT license.

entryFilter = input(title="KAMA Entry Filter", type=input.float, defval=1, minval=0.01)
exitFilter = input(title="KAMA Exit Filter", type=input.float, defval=0.5, minval=0.01)

entryMAAF = entryFilter * stdev(kama1delta, length1)
exitMAAF = exitFilter * stdev(kama1delta, length1)
srcEma = ema(src, length1)



//========================================= TRAILING ATR STOP ====================================

// The following is an adaptation of Trailing ATR Stops by @millerrh
// He based it on scripts by @garethyeo & @SimpleCryptoLife

// Inputs

atrLookback = input(defval=14,title="Trailing ATR Lookback Period",type=input.integer)
multiplier = input(defval=3,title="Trailing ATR Multiplier",type=input.float, step=0.1, minval=0.5, maxval=4)
trailMode = input(title="Trail Mode", defval="Trailing", options=["Running", "Trailing"])
trigInput = input(title="Trigger Trailing Stop On", defval="Wick", options=["Close","Wick"]) 

// Calculate ATR
atrValue = atr(atrLookback)
atrMultiplied = atrValue * multiplier

// Plot the price minus the ATR
atrLow = low - atrMultiplied

// Calculate the low trailing ATRs every time. The trailing stop loss never goes down.
// Set them to something to start with
trailAtrLow = atrLow

// If the ATR Low has gone up AND it has gone above the trail, the low trailing ATR should also go up. If the ATR Low has gone up or down, but not below the trail, the ATR trail stays where it is
trailAtrLow := na(trailAtrLow[1]) ? trailAtrLow : atrLow >= trailAtrLow[1] ? atrLow : trailAtrLow[1]

// Trigger stop based on candle close or low
trigSupport = trigInput == "Close" ? close : trigInput == "Wick" ? low : na

// Determine if price is below support
supportHit = trigSupport <= trailAtrLow

// If price is below support, reset the trailing ATR
trailAtrLow := supportHit ? atrLow : trailAtrLow

// Plot Lines
plotLow = ATRTSL ? trailAtrLow : na
plot(plotLow, title="ATR Low", color=color.white, transp=50, style=plot.style_linebr, linewidth=1, display=display.all)



//====================================== PSAR STOP ==========================================

start = input(0.02, "PSAR Start")
increment = input(0.02, "PSAR Increment")
maximum = input(0.2, "PSAR Max Value")
psar = sar(start, increment, maximum)
psarPlot  = PSARSL ? psar : na
plot(psarPlot, "Parabolic SAR", style=plot.style_cross, color=#3A6CA8, display=display.all)



//========================================= ENTRY & EXITS =====================================================

// Entry
long = kama1delta > 0 and kama1delta > entryMAAF
strategy.entry("Buy", true, when = long) 

// Close
longClose = (PSARSL ? crossunder(close, psar) : na) or (KAMA1SL ? kama1delta < 0 and abs(kama1delta) > exitMAAF : na) or (ATRTSL ? supportHit : na)
strategy.close("Buy", when = longClose, comment = "Sell")

더 많은