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

作者: リン・ハーンチャオチャン開催日:2023年12月22日 14:41:34
タグ:

img

概要

この戦略は,価格シリーズを分解し,異なる周波数帯から特徴を抽出するために,経験的モード分解 (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")

もっと