
マラ・アダプティブ・ムービング・アベアージ・ストラテジー (Mala Adaptive Moving Average Strategy) は,ジョン・エラーズのMESAアダプティブ・ムービング・アベアージ・インジケーターに基づく量化取引戦略である.この戦略は,正弦波を用いて取引決定を行い,低点で買い,高点で売り,滑動調節パラメータによって正弦波を異なる品種と市場環境に自律的に適応させる.
順応的な移動平均線戦略は正弦波を生成器を使用して取引信号を生成する.正弦波は,回転するベクトル (これは相量と呼ばれる) が直軸に投げる影によって決定される.ベクトルが360度回転すると,一周期が完了する.ベクトルがある角度を通るときは買取信号を生成し,別の角度を通るときは売り信号を生成する.このように,取引決定は,時域の波形特征ではなく,周波数域の角度によって定義され,戦略をより粗略化して,異なる品種と市場環境に適応させることができる.
具体的には,この戦略は,まず価格を平滑化および反動化処理を行い,その後正弦波の2つの分数を計算します.同相分数Iと正交分数Qである.この2つの分数は,相平移によって重なり,波され,最終的なReとImが得られます.ReとImは正弦波の周波数情報を反映し,atanによって周期期を推し出すことができます.期間の範囲に応じて平滑な周期を決定します.周期および相位情報は,MAMAとFAMAの曲線を決定し,その交差は取引信号を生成します.パラメータのアルファ周期と相位変化率のデルタフェーズ動的調節により,一定の範囲で波動し,指標は市場環境の変化に自律的に適応することができます.
適応型移動平均策には以下の利点があります.
交易信号として正弦波と相位を使用し,戦略をより頑丈にし,時域波形の影響を受けない.
周期とパラメータは,市場の変化に動的に適応し,強い自己適応能力を持っています.
MAMAとFAMAの曲線は,価格そのものの特性にのみ依存し,遅滞がないので,トレンド転換をタイムリーに捉えることができます.
パラメータ設定により,異なるスタイルのトレーダーに適した戦略の感度が調整できます.
戦略の論理は明快でシンプルで,理解しやすく,修正しやすく,研究と教育に適しています.
移動平均策には以下のリスクがあります.
シンソニー曲線の周期と相に依存しているため,価格が異常な歪んだ場合,誤った信号が生じます.
周期判断時に硬度境界が設定され,周期の変化を十分に滑らかにはしない。
位相と周期の蜂群効果は,曲線を重要な点の近くで振動させ,最良のエントリーとエグジットを逃す可能性があります.
市場波動が強くなると,パラメータと曲線の自律性が低下する.
技術指標として,戦略は重要な技術位置で偽の突破や誤信号に容易である.
これらのリスクは,よりスムーズなパラメータを設定し,他の指標と組み合わせてフィルタリングし,ポジションの規模を調整することによって緩和することができます.
適応型移動平均策は,以下の点で最適化できます.
周期やパラメータの計算方法を改善し,その変化をより滑らかに自然にします.例えば,価格のより良いモデリングのための統計的方法が導入できます.
波動率,交差量などの指標を組み合わせて信号をフィルタリングし,精度が向上する.また,基本的な理解信号の信頼性も組み合わせることができる.
パラメータ設定と滑点制御を最適化し,取引コストを削減し,システムの安定性を向上させる.
機械学習や遺伝的アルゴリズムなどの方法が導入され,動的に最適化パラメータが導入され,システムパラメータが常に進化し更新される.
異なるエントリーとエグジットを設定し,トレンドと反転システムを組み合わせて,ポートフォリオを構築し,持続的な収益性を向上させます.
適応型移動平均線戦略は正弦波分析を用いて取引信号を生成し,動的に調節するパラメータによってシステムに市場環境の変化に自主的に適応できるようにし,強固な頑丈性と広範な適用性を有している.他の適応型移動平均線戦略と比較して,それはより高い実戦性と安定性を有している.しかし,この戦略は技術策として,重要な技術位にも誤信号が発生し,これは他の補助ツール導入によるフィルタリング最適化が必要である.継続的な改善により,この戦略は,推奨に値する適応型取引システムとなる見通しがある.
/*backtest
start: 2022-11-30 00:00:00
end: 2023-12-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © dongyun
//@version=4
strategy("自适应移动平均的MESA系统", overlay=true)
fastlimit = input(0.5,'')
slowlimit = input(0.05,'')
smooth = 0.0
detrender = 0.0
I1 = 0.0
Q1 = 0.0
JI = 0.0
JQ = 0.0
I2 = 0.0
Q2 = 0.0
Re = 0.0
Im = 0.0
period = 0.0
smoothperiod = 0.0
phase = 0.0
deltaphase = 0.0
alpha = 0.0
MAMA = 0.0
FAMA = 0.0
price = 0.0
price := (high + low)/2
PI = 2 * asin(1)
if (bar_index > 5)
smooth := (4*price + 3*price[1] + 2*price[2] + price[3])/10
detrender := (.0962*smooth + .5769*nz(smooth[2]) - .5769*nz(smooth[4]) - .0962*nz(smooth[6]))*(.075*nz(period[1]) + .54)
// compute InPhase and Quadrature components
Q1 := (.0962*detrender + .5769*nz(detrender[2]) - .5769*nz(detrender[4]) - .0962*nz(detrender[6]))*(.075*nz(period[1]) + .54)
I1 := nz(detrender[3])
// advance the pulse of i1 and q1 by 90 degrees
JI := (.0962*I1 + .5769*nz(I1[2]) - .5769*nz(I1[4]) - .0962*nz(I1[6]))*(.075*nz(period[1]) + .54)
JQ := (.0962*Q1 + .5769*nz(Q1[2]) - .5769*nz(Q1[4]) - .0962*nz(Q1[6]))*(.075*nz(period[1]) + .54)
//phase addition for 3-bar averaging
I2 := I1 - JQ
Q2 := Q1 + JI
//smooth the i and q components before applying
I2 := .2*I2 + .8*nz(I2[1])
Q2 := .2*Q2 + .8*nz(Q2[1])
// hymodyne discriminator
Re := I2*I2[1] + Q2*nz(Q2[1])
Im := I2*Q2[1] + Q2*nz(I2[1])
Re := .2*Re + .8*nz(Re[1])
Im := .2*Im + .8*nz(Im[1])
if (Im != 0 and Re != 0)
period := 2 * PI/atan(Im/Re)
if (period > 1.5 * nz(period[1]))
period := 1.5*nz(period[1])
if (period < .67*nz(period[1]))
period := .67*nz(period[1])
if (period < 6)
period := 6
if (period > 50)
period := 50
period := .2*period + .8*nz(period[1])
smoothperiod := .33*period + .67*nz(smoothperiod[1])
if (I1 != 0)
phase := (180/PI) * atan(Q1/I1)
deltaphase := nz(phase[1]) - phase
if (deltaphase < 1)
deltaphase := 1
alpha := fastlimit/deltaphase
if(alpha < slowlimit)
alpha := slowlimit
MAMA := alpha*price + (1 - alpha)*nz(MAMA[1])
FAMA := .5*alpha*MAMA + (1 - .5*alpha)*nz(FAMA[1])
if (FAMA < MAMA)
strategy.entry("Long", strategy.long)
else
if (FAMA > MAMA)
strategy.entry("Short", strategy.short)