アダプティブ・ムービング・平均チャネル・ブレイクアウト戦略は,アダプティブ・ムービング・平均 (AMA) とトレーディング・シグナルを生成するための適応チャネル範囲をベースとしたトレンドフォローするブレイクアウト戦略である. AMAを使用して現在の価格トレンド方向と適応チャネルレベルを決定し,タイムリーエントリーと出口のための価格ブレイクアウト信号を検出する.
この戦略の核心指標は,価格傾向を把握するために使用されるアダプティブ・ムービング・平均値 (AMA) です.AMAは以下のように計算されます.
AMA (t) = α (t-1) * P (t) + [1 - α (t-1) ] * AMA (t-1)
P (t) は現在の価格で,α (t) は 0 と 1 の間の平滑定数である.α (t) は,価格変化に対する AMA の敏感性を制御するための特定のルールに従って動的に調整される.特に,α (t) は, AMA と価格の間の偏差 SNRT に比例し,以下のように計算される:
SNRT = (P(t) - AMA(t-1)) / AMA(t-1)
したがって,価格変動が増加するにつれて,α (t) は増加し,AMAをより反応的にします.変動が減少すると,α (t) は減少し,AMAをよりスムーズにします.
AMAをベースに,この戦略は価格ブレイクシグナルを検出するための適応チャネル範囲を構築する.上下チャネルレベルは:
上部: H (t) = (1 + β*H (t-1)) * AMA (t)
下: L (t) = (1 - β*L (t-1)) * AMA (t)
ストラテジーは,チャネル幅を制御する調整可能なパラメータである.最後に,チャネルレベルの価格ブレイクに基づいて取引を生成する.
価格が上位を突破するとロングに入ります.
価格が低値を下回るとショートに入ります.
そうでなければ,平らにして.
この戦略の利点は以下の通りです.
AMAは,特に不安定な市場において,単純な移動平均値と比較して価格動向を捉えるのにより柔軟である.
アダプティブチャネルは動的に幅を調整し,トレンドが不透明なときに拡大し,トレンドが出現すると狭くします.
価格ブレイクシグナルが タイミングを正しく把握でき トレンドがスタートし 勝率が高くなります
論理は単純で明快で 簡単に理解し 定量取引の自動化も可能です
この戦略のリスクは以下のとおりです.
誤ったAMAパラメータは価格動向を見逃したり,誤った信号を生成したりする可能性があります.
βのような適応チャネルパラメータは注意深く調整する必要があります. そうでなければ,あまりにも多くのウィップソーまたは見逃したトレンドが発生することがあります.
価格ブレイクは 偽ブレイクに敏感で フィルターが必要です
戦略にはリスク管理やストップロスのメカニズムが含まれていない.
戦略を最適化するには
AMAをより反応的にするために α 計算を改善する.
偽信号を避けるため 初期ブレイク後に 確認を追加します
ボリュームや波動性などのフィルターを適用して 突破の有効性を検証します
利益とリスクを制御するためにストップロスを取り入れます
異なる資産クラスに対するポジションサイズを最適化する.
簡単に言うと,アダプティブ・ムービング・平均チャネルブレイアウト戦略は,シンプルで実践的なトレンドフォローブレイアウト戦略です. 柔軟なAMAを使用して価格トレンドを追跡し,アダプティブ・チャネルを使用してブレイアウト信号を検出します. この戦略にはいくつかの利点もありますが,潜在的なリスクもあります. パラメータチューニング,フィルター追加,ストップ改善などの最適化により,より堅牢になります. 全体的に,定量取引のための堅牢なベースラインモデルを提供します.
/*backtest start: 2022-10-26 00:00:00 end: 2023-11-01 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // CryptoStatistical - 2019 // AMA Strategy Channel Breakout Strategy from E. Durenard - Professional Automated Trading // https://www.amazon.com/Professional-Automated-Trading-Theory-Practice/dp/1118129857 strategy(title="[CS] AMA Strategy - Channel Break Out", shorttitle="AMA_ChannelBreakout_Strategy", initial_capital = 1000, overlay=true, pyramiding = 0, calc_on_every_tick=false, calc_on_order_fills=false, commission_type= strategy.commission.percent, commission_value = 0.08, currency=currency.USD) testStartYear = input(2019, "Backtest Start Year") testStartMonth = input(6, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=95) testPeriod() => true price = input(title='Price Source:', type=input.source, defval=close) ama = price hb = price lb = price // Static model parameters minfactor = 0. maxfactor = 1. deviation_max = 1. deviation_min = 1. beta_hb = 1. beta_lb = 1. snr = 1. normalized_atan= 0. alpha = 0.5 // Suggested snr-factor from .5 upto 3.1 by .3 to find best parameter snrfactor = input(title='SNR Factor:', type=input.float, minval=0.6, maxval=3.3, step=0.3, defval=2.1) // Sensitivity Lookback search for the best perdiod from 5 to 20 lookback = input(title='Sensitivity Lookback:', type=input.integer, defval=5) // Suggested Beta from .5 below 4.5 by .3, usually in the range 1.2, 1.5 beta = input(title='Beta:', type=input.float, minval=0.6, maxval=4.5, step=0.3, defval=2.1) offsetlabel = input(title='Offset Label:', type=input.float, minval=0.001, maxval=0.03, step=0.001, defval=0.001) // pi/2 pi2 = 1.5707963267948966 // Zero-lag resampled moving average (Durschner nwma) f_nwma(_src, _period) => fast = _period/2 lambda = _period/fast alpha = lambda * (_period - 1)/(_period - lambda) average1 = wma(_src,_period) average2 = wma(average1,fast) nwma = (1+alpha)*average1 - alpha*average2 ama := alpha[1]*price + (1-alpha[1])*nz(ama[1]) deviation_max := alpha[1]*max((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_max[1]) deviation_min := -alpha[1]*min((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_min[1]) beta_hb := beta*deviation_max beta_lb := beta*deviation_min hb := (1 + beta_hb[1])*ama lb := (1 - beta_lb[1])*ama snr := if price > hb ((price - ama[1])/ama[1])/beta_lb else if price < lb -((price - ama[1])/ama[1])/beta_hb else 0 normalized_atan := (atan(snrfactor*snr) + pi2)/(2*pi2) alpha := f_nwma(minfactor + (maxfactor - minfactor)*normalized_atan, lookback) plot(ama, color=color.black) plot(hb, color=color.green) plot(lb, color=color.red) // Buy Condition Var bc = false // Sell Condition Var sc = false d = color.black // Buy Condition if(price > hb) bc := true d := color.green // Sell Condition if(price < lb) sc := true d := color.red if(testPeriod()) strategy.entry("Long", strategy.long, when = bc) strategy.entry("Short", strategy.short, when = sc) alertcondition(bc, title='BuyCondition', message='Buy') alertcondition(sc, title='SellCondition', message='Sell') plotshape(title='Buy', series=bc ? price * (1 - offsetlabel) : na, text='A1B', style=shape.labelup, location=location.absolute, color=d, textcolor=color.white, offset=0) plotshape(title='Sell', series=sc ? price * (1 + offsetlabel) : na, text='A1S', style=shape.labeldown, location=location.absolute, color=d, textcolor=color.white, offset=0)