
均等自適化チャネル価格突破戦略は,均等自適化移動平均 ((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の計算式は以下の通りである.
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のα値の計算方法を最適化し,価格変化に敏感にします.
突破した通路のさらなる確認を追加し,偽突破が誤信号を生じさせないようにする.
取引量または波動性指標と組み合わせたフィルタリングにより,突破の有効性を確保します.
利潤を固定し,リスクをコントロールするために,追跡可能なストップ・ロスを追加する.
資金管理の最適化,異なる資産の合理的なポジション管理の決定.
均等に適応したチャネル価格突破策は,全体的に,シンプルで実用的なトレンド追跡突破策である.それは,柔軟に適応した移動平均を適用して価格トレンドを追跡し,自己適応したチャネル発見の突破信号に補足される.この戦略には一定の利点があるが,潜在的なリスクも存在する.パラメータを最適化,フィルタリング条件を増やし,止損機構を改善することによって,戦略をより安定的に信頼できる.全体的に言えば,この戦略は,取引を量化するための優れた基礎モデルを提供します.
/*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)