트렌드 필터 이동 평균 크로스오버 양적 전략 (Trend Filter Moving Average Crossover Quantitative Strategy) 은 중장기 양적 거래 전략이다. 빠른 이동 평균과 느린 이동 평균의 크로스오버를 통해 시장의 트렌드 방향을 결정하고 효과적인 트렌드를 식별하는 전제 아래 시장에 진출한다. 동시에 이 전략은 더 긴 사이클 이동 평균을 트렌드 필터로 설정하여 가격이 이동 평균을 깨는 경우에만 유효한 거래 신호가 생성될 수 있다.
이 전략은 주로 이동 평균 크로스오버의 원리에 기반한다. 구체적으로, 서로 다른 기간을 가진 두 개의 이동 평균을 계산하고, 일반적으로 20일선과 50일선에 설정한다. 20일선이 하위에서 50일선 위로 넘어가면 구매 신호가 생성되고, 20일선이 상위에서 50일선을 넘어가면 판매 신호가 생성된다. 이러한 간단한 크로스오버 신호는 중장기간에 브레이크를 포착하는 것으로 간주된다.
또한 전략은 200일 이동 평균을 전체 트렌드 벤치마크로 설정합니다. 가격이 200일 라인을 넘을 때만 앞서 언급한 간단한 크로스오버 신호가 유효하다고 간주됩니다. 이것은 범위 제한 시장에서 많은 유효하지 않은 신호를 생성하지 않도록 트렌드 필터링 메커니즘을 구성합니다.
중장기 거래 빈도는 과도한 거래를 피하고 거래 비용과 미끄러짐 위험을 줄입니다.
이동평균의 크로스오버 결정은 명확하고 이해하기 쉽고 구현하기 쉽습니다.
트렌드 필터링 메커니즘은 대부분의 유효하지 않은 신호를 필터링하고 승률을 향상시킬 수 있습니다.
이동 평균 매개 변수의 유연한 조정은 다른 품종과 시간 주기에 적용됩니다.
스톱 로스 및 취득은 단일 이익과 손실을 제어하도록 설정할 수 있습니다.
가격이 이동 평균 주위에서 변동할 때, 여러 가지 유효하지 않은 신호가 생성되어 거래가 과도하게 발생할 수 있습니다.
장기 주기의 이동 평균은 시장에서 뒤쳐질 수 있으며, 따라서 트렌드 전환 지점을 놓칠 수 있습니다.
이동 평균 기준을 설정하기 위해서는 비교적 긴 역사 데이터가 필요하므로 새로운 품종이나 짧은 주기가 적용되지 않습니다.
전략 매개 변수들은 반복적인 테스트와 최적화가 필요하며, 부적절한 설정은 전략 실패를 유발할 수 있습니다.
위험 완화:
더 긴 사이클 이동 평균을 채택하거나 트렌드 필터링 조건을 증가시킵니다.
주요 트렌드를 결정하기 위해 에너지 지표, 변동성 지표 등 다른 지표를 포함합니다.
이동 평균 사이클 매개 변수의 적응력을 향상시킵니다.
매개 변수 최적화 및 피드백 메커니즘을 강화하여 전략 매개 변수를 동적으로 조정합니다.
선형 가중화 이동 평균과 같은 다른 종류의 이동 평균을 시도하십시오.
적응적인 이동 평균 사이클 기능을 높여
트렌드 단계를 결정하는 변동성 지표를 포함하여 이동 평균 크로스오버의 유효성을 향상시킵니다.
기계 학습 알고리즘을 도입하여 전략 매개 변수를 자동으로 최적화합니다.
이윤을 위한 자산 간 상관관계를 활용하여 다중 자산 조합 전략을 탐구합니다.
트렌드 필터 이동 평균 크로스오버 전략 (Trend Filter Moving Average Crossover Strategy) 은 전반적으로 간단하고 실용적인 중장기 양적 전략이다. 이동 평균 크로스오버를 통해 중장기 트렌드를 결정하고 유효하지 않은 신호를 줄이기 위해 트렌드 필터를 사용한다. 이 전략은 이해하기 쉽고 구현하기 쉽다는 장점이 있으며, 양적 거래의 초보자에게 적합하다. 개선의 잠재적인 영역은 이동 평균의 최적화와 다른 지표 및 기계 학습 알고리즘과의 통합에 있다. 기본적인 전략으로서, 더 고급 양적 중재 알고리즘에 대한 거래 신호를 제공할 수 있다.
/*backtest start: 2023-11-23 00:00:00 end: 2023-11-30 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //////////////////////////////////////////////////////////////////////////////// // Booz Strategy // Developed for Godstime // Version 1.1 // 11/28/2021 //////////////////////////////////////////////////////////////////////////////// //@version=4 strategy("Booz Strategy", "", true) // ----------------------------- Inputs ------------------------------------- // source_ma_type = input("EMA", "Source MA Type", options=["SMA", "EMA"]) source_ma_length = input(50, "Source MA Length") fast_ma_length = input(20, "Fast MA Length") slow_ma_length = input(50, "Slow MA Length") use_trend_filter = input(true, "Trend Filter") trend_filter_ma_type = input("EMA", "Trend Filter MA Type", options=["SMA", "EMA"]) trend_filter_ma_length = input(200, "Trend Filter MA Period") show_mas = input(true, "Show MAs") swing_trading_mode = input(false, "Swing Trading") // -------------------------- Calculations ---------------------------------- // fast_ma = ema(close, fast_ma_length) slow_ma = ema(close, slow_ma_length) source_ma = source_ma_type == "EMA"? ema(close, source_ma_length): sma(close, source_ma_length) trend_filter_ma = trend_filter_ma_type == "EMA"? ema(close, trend_filter_ma_length): sma(close, trend_filter_ma_length) // --------------------------- Conditions ----------------------------------- // uptrend = not use_trend_filter or close > trend_filter_ma buy_cond = crossover(fast_ma, slow_ma) and uptrend downtrend = not use_trend_filter or close < trend_filter_ma sell_cond = crossunder(fast_ma, slow_ma) and downtrend // ---------------------------- Plotting ------------------------------------ // bgcolor(use_trend_filter and downtrend? color.red: use_trend_filter? color.green: na) plot(show_mas? fast_ma: na, "Fast MA", color.green) plot(show_mas? slow_ma: na, "Slow MA", color.red) plot(show_mas? source_ma: na, "Source MA", color.purple) plot(show_mas? trend_filter_ma: na, "Trend Filter MA", color.blue) // ---------------------------- Trading ------------------------------------ // // Inputs sl_perc = input(1.0, "Stop Loss (in %)", group="Backtest Control")/100 tp_perc = input(1.0, "Take Profit (in %)", group="Backtest Control")/100 leverage = input(10, "Leverage", maxval=100, group="Backtest Control") bt_start_time = input(timestamp("2021 01 01"), "Backtest Start Time", input.time, group="Backtest Control") bt_end_time = input(timestamp("2021 12 31"), "Backtest End Time", input.time, group="Backtest Control") // Trading Window in_trading_window = true trade_qty = 1 // Long Side strategy.entry("Long Entry", strategy.long, trade_qty, when=buy_cond and in_trading_window) long_tp = strategy.position_avg_price * (1 + tp_perc) long_sl = strategy.position_avg_price * (1 - sl_perc) if not swing_trading_mode strategy.exit("Long Exit", "Long Entry", limit=long_tp, stop=long_sl) // Short Side strategy.entry("Short Entry", strategy.short, trade_qty, when=sell_cond and in_trading_window) short_tp = strategy.position_avg_price * (1 - tp_perc) short_sl = strategy.position_avg_price * (1 + sl_perc) if not swing_trading_mode strategy.exit("Short Exit", "Short Entry", limit=short_tp, stop=short_sl) // End of trading window close strategy.close_all(when=not in_trading_window)