経験的モード分解に基づく定量的取引戦略


作成日: 2023-12-22 14:41:34 最終変更日: 2023-12-22 14:41:34
コピー: 0 クリック数: 871
1
フォロー
1623
フォロワー

経験的モード分解に基づく定量的取引戦略

概要

この戦略は,経験的モード分解 (EMD) 方法に基づいて,価格の配列を分解し,異なる波段の特性を抽出し,平均値と組み合わせて取引シグナルを生成する. この戦略は,主に中長線のポジションに適用されます.

戦略原則

  1. EMD法を使用して価格の帯域波を行い,価格の波動特性を抽出する
  2. ピーク数とバレー数から移動平均を計算します.
  3. 平均線がピーク線とバレー線を一定比率を超えると取引信号を生成する
  4. 取引信号に応じて多頭または空頭にする

優位分析

  1. EMDの方法により,価格の配列を効率的に分解して,有用な特性を抽出できます.
  2. ピーク・バレー・ラインは,価格が一定の幅を超えるとのみ取引する戦略を制御する.
  3. 平均線と組み合わせると,偽突破を効果的に排除できます.

リスク分析

  1. EMD 方法のパラメータを正しく選択しない場合,過適合が起こる
  2. 交易信号の形成には長い周期が必要で,高周波取引には適応できない.
  3. 価格の急激な変動に対応できない市場環境

最適化の方向

  1. EMDモデルのパラメータを最適化し,市場への適応性を向上させる
  2. 他の指標と組み合わせたストップ・ストップ・信号
  3. 戦略のインプットとして,異なる価格配列を試す

要約する

この戦略は,経験模様分解法を使用して価格序列の特性を抽出し,抽出された特性の基礎で取引信号を生成し,安定した中長線取引戦略を実現する.この戦略の優点は,価格の周期的な特性を効果的に識別でき,大幅な変動中に取引指示を発行することにある.しかし,一定のリスクも存在し,より複雑な市場環境に対応するためにさらなる最適化が必要である.

ストラテジーソースコード
/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 12/04/2017
// The related article is copyrighted material from Stocks & Commodities Mar 2010
// You can use in the xPrice any series: Open, High, Low, Close, HL2, HLC3, OHLC4 and ect...
//
// You can change long to short in the Input Settings
// Please, use it only for learning or paper trading. Do not for real trading.
////////////////////////////////////////////////////////////
strategy(title="Empirical Mode Decomposition")
Length = input(20, minval=1)
Delta = input(0.5)
Fraction = input(0.1)
reverse = input(false, title="Trade reverse")
xPrice = hl2
beta = cos(3.1415 * (360 / Length) / 180)
gamma = 1 / cos(3.1415 * (720 * Delta / Length) / 180)
alpha = gamma - sqrt(gamma * gamma - 1)
xBandpassFilter = 0.5 * (1 - alpha) * (xPrice - xPrice[2]) + beta * (1 + alpha) * nz(xBandpassFilter[1]) - alpha * nz(xBandpassFilter[2])
xMean = sma(xBandpassFilter, 2 * Length)
xPeak =  iff (xBandpassFilter[1] > xBandpassFilter and xBandpassFilter[1] > xBandpassFilter[2], xBandpassFilter[1], nz(xPeak[1])) 
xValley =  iff (xBandpassFilter[1] < xBandpassFilter and xBandpassFilter[1] < xBandpassFilter[2], xBandpassFilter[1], nz(xValley[1])) 
xAvrPeak = sma(xPeak, 50)
xAvrValley = sma(xValley, 50)
nAvrPeak = Fraction * xAvrPeak
nAvrValley = Fraction * xAvrValley
pos = iff(xMean > nAvrPeak and xMean > nAvrValley, 1,
	     iff(xMean < nAvrPeak and xMean < nAvrValley, -1, nz(pos[1], 0))) 
possig = iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1, 1, pos))	   
if (possig == 1) 
    strategy.entry("Long", strategy.long)
if (possig == -1)
    strategy.entry("Short", strategy.short)	   	    
barcolor(possig == -1 ? red: possig == 1 ? green : blue )
plot(xMean, color=red, title="Mean")
plot(nAvrPeak, color=blue, title="Peak")
plot(nAvrValley, color=blue, title="Valley")