
トレンドフィルター 移動平均線交差量化戦略は,中長線量化取引戦略である.この戦略は,迅速な移動平均線と遅い移動平均線の交差によって市場のトレンド方向を判断し,有効なトレンドを判断した前提で入場する.同時に,この戦略は,より長い周期の移動平均線をトレンドフィルターとして設定し,価格が移動平均線を突破するときにのみ有効な取引シグナルを形成することができる.
この戦略は主に移動平均線の交差原理に基づいている.具体的には,2つの異なる周期の移動平均線をそれぞれ計算し,典型的には20日線と50日線に設定されている.20日線が下から上へ50日線を突破すると買信が発生し,20日線が上から下へ50日線を突破すると売り信が発生する.これらの簡単な交差信号は,中長線での突破を捕捉できると考えられている.
さらに,この戦略は,200日移動平均線を全体的なトレンドの判断指標として設定している.上記の簡単な交差信号は,価格が200日線を突破したときにのみ有効とみなされる.これは,トレンドフィルタリング機構を構成し,整合市場で多くの無効信号を生じることを防ぐことができる.
中長線操作により,取引頻度が高くなり,取引コストと滑り込みリスクが軽減されます.
移動均線交差の判断は明確で,容易に理解できる.
トレンドフィルタリングは,無効な信号の多くをフィルターして,勝利率を上げます.
移動平均線パラメータを柔軟に調整し,異なる品種と時間周期に適用する.
単一損失を制御するために,ストップ・ロスト・ストップを設定できます.
価格が平均線の近くで振動すると,複数の無効シグナルが生み出され,過剰取引が起こる可能性があります.
長期平均線は市場を遅らせ,トレンドの転換点を逃す可能性があります.
移動平均指標を確立するには,より長い歴史データが必要であり,新しい品種や短い周期は適用できません.
ポリシーのパラメータは,繰り返しテストして最適化する必要があります.不適切な設定は,ポリシーの失敗につながる可能性があります.
リスクに対する対処法:
より長い周期平均線を使用するか,またはトレンドフィルタリング条件を増やす.
エネルギー指数,波動率指数など,他の指標と組み合わせて大きなトレンドを判断する.
移動平均周期パラメータの自主性を向上させる.
パラメータ最適化とフィードバックメカニズムを追加し,動的に戦略パラメータを調整する.
移動平均線の種類を試す.例えば,線形重力移動平均線.
移動平均線周期に適応する機能が追加された.
波動率類の指標と組み合わせてトレンドの断段を判断し,移動平均線交差の有効性を高める.
戦略パラメータの自動最適化を実現する機械学習アルゴリズムを追加する.
種間の関連性を活用する多種組み合わせ戦略を模索する.
トレンドフィルター移動均線交差戦略は,全体として,シンプルで実用的な中長線量化戦略である.それは均線交差によって中長線傾向を判断し,その後,トレンドフィルターと連携して無効な信号を減らす.この戦略は,容易に理解し,実装し,量化取引の初心者にとって適しています.その潜在的な改善の余地は,移動均線の最適化,および他の指標と機械学習アルゴリズムとの統合にあります.
/*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)