동적 이동 평균선 거래 전략
개요
이 전략은 동적 이동평균선을 계산하여 이를 매매 신호로 활용하며, 주가 상승 시 매수 포지션을 열고 주가 하락 시 포지션을 청산합니다. 이 전략은 모멘텀 지표와 이동평균선의 장점을 결합하여 주가의 중기 추세를 추적하고 안정적인 수익을 실현하는 것을 목표로 합니다.
원리
이 전략은 주로 Hull 이동평균선의 세 가지 변형(일반 Hull 이동평균(HMA), 가중 Hull 이동평균(WHMA), 지수 Hull 이동평균(EHMA))을 기반으로 합니다. 코드에 따라 사용자는 이 세 가지 Hull MA 간에 전환할 수 있습니다.
HMA의 계산 공식은 다음과 같습니다:
HMA = WMA(2 * WMA(close, n/2) - WMA(close, n), sqrt(n))
여기서 WMA는 가중 이동평균을, n은 기간 파라미터를 나타냅니다. HMA는 단순 이동평균(SMA)에 비해 가격 변동에 더 빠르게 반응할 수 있습니다.
WHMA와 EHMA의 계산 공식은 HMA와 유사합니다. 전략은 기본적으로 HMA를 사용합니다.
HMA를 계산한 후, 이 전략은 HMA의 중간선 값을 매매 신호로 사용합니다. 가격이 HMA 중간선을 상향 돌파하면 매수 진입하고, 가격이 HMA 중간선을 하향 돌파하면 포지션을 청산합니다. 이렇게 HMA 중간선을 활용하여 가격의 중기 추세를 추적하며 수익을 실현합니다.
장점
전통적인 이동평균선 전략과 비교하여 이 전략은 다음과 같은 장점을 가집니다:
- 반응 속도가 더 빠르고 추세 추적 능력이更强하여 적시 진입 및 손절매 가능
- 불필요한 거래 빈도를 줄이고 추격매수/패닉매도 방지
- Hull MA 파라미터를 유연하게 설정하여 더 넓은 시장 환경에 적응 가능
- HMA, WHMA 및 EHMA 간 전환 가능하여 적용 범위 확장
리스크
이 전략은 다음과 같은 리스크도 존재합니다:
- 횡보장에서 여러 번의 무효 신호가 발생하여 거래 빈도와 슬리피지 비용 증가 가능
- Hull MA 파라미터 설정이 부적절할 경우 추세 반전 지점을 놓쳐 손실 위험 증가
- 종목 선정이 부적절하거나 유동성이 낮은 주식을 선택할 경우 큰 슬리피지 발생 가능
대응 방안:
- Hull MA 파라미터를 최적화하여 최적값 찾기
- 다른 지표를 결합하여 추세 반전 지점 판단
- 유동성이 좋고 일평균 거래량이 많은 주식 선택
최적화 방향
이 전략은 다음과 같은 측면에서 추가 최적화가 가능합니다:
- 거래량 또는 기타 지표 필터를 추가하여 매매 신호의 신뢰성 확보
- MACD, KDJ 등 다른 지표와 결합하여 진입 시점 판단, 승률 향상
- 실전 백테스트 데이터를 기반으로 Hull MA 기간 파라미터 조정
- WHMA 또는 EHMA로 전환하여 특정 주식에서 가장 좋은 성과를 보이는 Hull 변형 테스트
- 손절매 전략을 추가하여 개별 손실 통제
요약
이 동적 이동평균선 매매 전략은 Hull MA의 빠른 반응 장점을 통합하여 주가의 중기 추세를 효과적으로 추적하고, 적절한 시점에 매수 포지션을 열고 손절매하여 청산할 수 있으며, 과거 백테스트에서 좋은 성과를 보였습니다. 파라미터 설정과 종목 선정 범위를 추가로 최적화하면 이 전략을 통해 보다 안정적인 초과 수익을 얻을 수 있습니다. 이는 구현이 용이하고 리스크 관리가 가능한 퀀트 전략입니다.
/*backtest
start: 2022-12-14 00:00:00
end: 2023-12-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy('Position Investing by SirSeff', overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_order_fills=false, slippage=0, commission_type=strategy.commission.percent, commission_value=0)
strat_dir_input = input.string(title='Strategy Direction', defval='long', options=['long', 'short', 'all'])
strat_dir_value = strat_dir_input == 'long' ? strategy.direction.long : strat_dir_input == 'short' ? strategy.direction.short : strategy.direction.all- 1

