이 전략은 중장기 트렌드를 파악하기 위해 카우프만 적응 이동 평균 (KAMA) 을 사용하여 트렌드 방향을 결정합니다. KAMA 라인이 상승할 때 길게 이동하고 KAMA 라인이 하락할 때 짧게 이동합니다. 이 전략은 이동 평균의 트렌드 추적 기능과 KAMA의 동적 조정 기능을 결합하여 거래 신호의 품질을 향상시킵니다.
이 전략의 핵심 지표는 카우프먼의 적응 이동 평균 (KAMA) 이다. KAMA는 시장 변동성의 크기에 따라 가중 인수를 동적으로 조정하여 곡선의 민감도를 향상시킵니다. 구체적으로, 시장 변동성이 증가하면 KAMA 곡선이 부드러워집니다. 시장 변동성이 감소하면 KAMA 곡선이 더 민감해집니다. 이것은 새로운 트렌드 역전을 적시에 포착하면서 약간의 소음을 필터링합니다.
전략은 먼저 KAMA의 값을 계산합니다. 그 다음 KAMA 라인의 긴 / 짧은 상태를 결정합니다: 닫기 가격이 KAMA 라인을 넘을 때 구매 신호가 생성되며 닫기 가격이 KAMA 라인을 넘을 때 판매 신호가 생성됩니다. 이러한 거래 신호에 따라 포지션은 열립니다.
이 전략의 가장 큰 장점은 트렌드 결정에 대한 KAMA 지표의 사용이다. KAMA 지표 자체는 매우 강력한 트렌드 추적 능력을 가지고 있다. 시장 조건에 적응하기 위해 매개 변수를 동적으로 조정할 수 있으며, 따라서 단순한 이동 평균과 기하급수적인 이동 평균에 비해 더 신뢰할 수 있는 거래 신호를 생산한다.
또한, 전략은 KAMA의 긴/단기 상태를 사용하여 트렌드 방향을 결정합니다. 추가 필터가 없습니다. 이는 전략 논리를 단순화하고 매개 변수 수를 줄여서 과도한 적합성의 위험을 줄이고 시장의 안정성과 적응력을 향상시킵니다.
이 전략의 주요 위험은 KAMA가 지체 지표이기 때문에 거래 신호가 생성 될 때 시장 추세가 이미 반전되어 손실 위험을 초래할 수 있습니다. 또한 KAMA 곡선에는 단기 변동이 발생할 수 있으며, 이는 종종 잘못된 신호를 생성 할 수 있습니다.
위험을 완화하기 위해 다른 지표가 거래 신호를 확인하기 위해 결합 될 수 있습니다. 변동성 지표, 부피 지표 등이 있습니다. 또한 매개 변수를 조정하여 KAMA 곡선을 더 부드럽게 만들 수 있습니다.
이 전략의 최적화를 위해 여전히 많은 공간이 남아 있으며, 주로 다음과 같은 측면에서:
신호 품질을 향상시키기 위해 MACD, 오시레이터 등 신호 필터링을 위한 다른 지표를 결합합니다.
단일 거래 손실을 제어하기 위해 이동 스톱 손실 또는 주식 곡선 기반 스톱과 같은 스톱 손실 전략을 추가하십시오.
KAMA가 트렌드를 더 효과적으로 파악할 수 있도록 매개 변수를 최적화합니다.
더 높은 시간 프레임을 사용하여 주요 트렌드 방향을 결정하기 위해 멀티 타임 프레임 분석을 추가하십시오.
기계 학습 방법을 사용하여 기기 간 적응을 위해 매개 변수를 자동으로 최적화합니다.
이 전략의 전반적인 논리는 트렌드 방향을 결정하기 위해 KAMA 지표를 사용하여 명확합니다. 강력한 트렌드 추적 기능, 간단한 논리 및 더 적은 매개 변수와 같은 장점이 있습니다. 그러나 트렌드 반전을 식별하는 데 차질을 빚을 위험이 있습니다. 전략은 더 효과적이고 적응력을 높이기 위해 여러 가지 방법으로 개선 될 수 있습니다.
/*backtest start: 2022-12-06 00:00:00 end: 2023-12-12 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2019 //@version=3 strategy(title = "Noro's KAMA Strategy", shorttitle="KAMA str", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot") length = input(3, minval = 1) fast = input(2, minval = 1) slow = input(30, minval = 1) src = input(title = "Source", defval = close) type = input(defval = "Trend", options = ["Trend", "Crossing"], title = "Type") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //KAMA volatility = sum(abs(src-src[1]), length) change = abs(src[1]-src[length]) er = iff(volatility != 0, change/volatility, 0) fastSC = 2/(fast+1) slowSC = 2/(slow+1) sc = pow((er*(fastSC-slowSC))+slowSC, 2) bid = hl2 kama = 0.0 kama := nz(kama[1])+(sc*(bid-nz(kama[1]))) plot(kama, color = black, title = "KAMA", trackprice = false, style = line, linewidth = 3) //Signals up = false dn = false up := (type == "Crossing" and kama > kama[1]) or (type == "Trend" and close > kama) dn := (type == "Crossing" and kama < kama[1]) or (type == "Trend" and close < kama) //Trading size = strategy.position_size lot = 0.0 lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1] if up strategy.entry("L", strategy.long, needlong ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if dn strategy.entry("S", strategy.short, needshort ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))