低周波フーリエ変換トレンドフォロー移動平均戦略


作成日: 2023-12-05 14:56:06 最終変更日: 2023-12-05 14:56:06
コピー: 0 クリック数: 807
1
フォロー
1619
フォロワー

低周波フーリエ変換トレンドフォロー移動平均戦略

概要

この戦略は,低周波の立方シフトを利用して,価格序列の低周波のトレンド成分を抽出し,快速と遅い3つの移動平均を組み合わせて,トレンド認識と取引シグナル生成を実現するトレンド追跡戦略です. 速いMAの上を通過して,中速MAを超えて,価格が遅いMAより高くなった場合,多く行います. 速いMAの下を通過して,中速MAを超えて,価格が遅いMAを下回ると,空になります. この戦略は,中長線トレンドを追跡するのに適しています.

戦略原則

  1. 低周波葉変換を使用して価格序列の抽出の低周波トレンド成分.低周波葉変換は高周波ノイズを効果的にフィルターし,抽出されたトレンド信号をより平らにする.

  2. 遅い/速い3つの移動平均でトレンドを判断する。その中で,遅いMAは200サイクル,中等MAは20サイクル,急速MAは5サイクル。遅いMAは騒音をフィルターし,中等MAはトレンドの転換を捕捉し,急速MAは取引信号を発する。

  3. 急速MAが中速MAを突破し,価格が遅いMAより高いとき,市場が上昇傾向に入ると判断して,多めに; 急速MAが中速MAを突破し,価格が遅いMAより低いとき,市場が下降傾向に入ると判断して,空きをする.

  4. この戦略はトレンド追跡戦略で,トレンドに入ると判断した後に,できるだけ長くポジションを保持し,トレンドで利益を得ようとします.

優位分析

  1. 低周波リ叶変換を使用して高周波ノイズを効果的にフィルタリングし,認識されるトレンド信号をより信頼して平穏にします.

  2. 快中緩慢MAは市場トレンドの転換を判断し,偽信号を回避する.緩慢MAのパラメータ設定は大きいので,ノイズを効果的にフィルターする.

  3. この戦略は中長線トレンドを追跡する明らかな優位性がある.市場がトレンドに入ると判断すると,継続的にトレンドを追跡するポジションを上げ,その結果,余分な利益を得る.

  4. この戦略のパラメータ最適化スペースは広大で,ユーザーは異なる品種と周期に応じてパラメータを調整することができ,適応性が強い。

リスク分析

  1. トレンド追跡戦略として,この戦略は,突発的な出来事によって引き起こされるトレンドの逆転を効果的に判断し,それに反応できず,損失を増加させる可能性があります.

  2. この戦略は,変動の状況では,より多くの利益の取引と損失の取引を生み出します. しかし,最終的に利益を得る可能性があり,一定の心理的耐性が必要です.

  3. 伝統的なトレンド追跡戦略は,化の形成に容易であり,トレンドから早期に脱出することは,この戦略で解決する必要がある問題である.

  4. 単一の損失を制御するためにストップを設定できます.また,戦略のリスク抵抗性を評価するために,反測に突発的なイベントのテストを追加することもできます.

最適化の方向

  1. 異なる移動平均アルゴリズムを試し,より多くの品種と周期に対応します.

  2. リスク管理のためのストップ・ストラトジーを増やし,連続的な損失から脱出する.

  3. トレンドの強度指数を増やして,揺れや弱気中の過剰取引を避ける.

  4. 傾向転換を判断する機械学習モデルの追加により,突発的な出来事に対する戦略の適應性がある.

要約する

この低周波のリベルの変化傾向は,移動平均策を追跡し,騒音をフィルターし,トレンドを識別し,トレンドを追跡する優位性を有しており,中長線保有に適している.傾向追跡策として,主にトレンド反転と継続的な揺れのリスクに直面している.これらのリスクには一定の対応策がある.全体として,この策のパラメータは広範囲で,最適化の可能性は高く,戦略開発とリスク管理能力のある投資家の実体検証に適している.

ストラテジーソースコード
/*backtest
start: 2023-11-27 00:00:00
end: 2023-11-29 02:00:00
period: 1m
basePeriod: 1m
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/
// © 03.freeman

//@version=4
strategy("FTSMA", overlay=true )
src=input(close,"Source")
slowMA=input(200,"Slow MA period")
mediumMA=input(20,"Mid MA period")
fastMA=input(5,"Fast MA period")
plotSMA=input(true,"Use MA")
sin1=input(1,"First sinusoid",minval=1)
sin2=input(2,"Second sinusoid",minval=1)
sin3=input(3,"Third sinusoid",minval=1)
smoothinput = input('EMA', title = "MA Type", options =['EMA', 'SMA', 'ALMA','FRAMA','RMA', 'SWMA', 'VWMA','WMA','LinearRegression'])
linearReg=input(false, "Use linear regression?")
linregLenght=input(13, "Linear regression lenght")
linregOffset=input(0, "Linear regression offset")

//------FRAMA ma---------
ma(src, len) =>
    float result = 0
    int len1 = len/2
    frama_SC=200
    frama_FC=1
    e = 2.7182818284590452353602874713527
    w = log(2/(frama_SC+1)) / log(e) // Natural logarithm (ln(2/(SC+1))) workaround
    H1 = highest(high,len1)
    L1 = lowest(low,len1)
    N1 = (H1-L1)/len1
    H2_ = highest(high,len1)
    H2 = H2_[len1]
    L2_ = lowest(low,len1)
    L2 = L2_[len1]
    N2 = (H2-L2)/len1
    H3 = highest(high,len)
    L3 = lowest(low,len)
    N3 = (H3-L3)/len
    dimen1 = (log(N1+N2)-log(N3))/log(2)
    dimen = iff(N1>0 and N2>0 and N3>0,dimen1,nz(dimen1[1]))
    alpha1 = exp(w*(dimen-1))
    oldalpha = alpha1>1?1:(alpha1<0.01?0.01:alpha1)
    oldN = (2-oldalpha)/oldalpha
    N = (((frama_SC-frama_FC)*(oldN-1))/(frama_SC-1))+frama_FC
    alpha_ = 2/(N+1)
    alpha = alpha_<2/(frama_SC+1)?2/(frama_SC+1):(alpha_>1?1:alpha_)
    frama = 0.0
    frama :=(1-alpha)*nz(frama[1]) + alpha*src
    result := frama
    result

// ----------MA calculation - ChartArt and modified by 03.freeman-------------
calc_ma(src,l) => 
    _ma = smoothinput=='SMA'?sma(src, l):smoothinput=='EMA'?ema(src, l):smoothinput=='WMA'?wma(src, l):smoothinput=='LinearRegression'?linreg(src, l,0):smoothinput=='VWMA'?vwma(src,l):smoothinput=='RMA'?rma(src, l):smoothinput=='ALMA'?alma(src,l,0.85,6):smoothinput=='SWMA'?swma(src):smoothinput=='FRAMA'?ma(sma(src,1),l):na
    
//----------------------------------------------


//pi = acos(-1)
// Approximation of Pi in _n terms --- thanks to e2e4mfck
f_pi(_n) =>
    _a = 1. / (4. * _n + 2)
    _b = 1. / (6. * _n + 3)
    _pi = 0.
    for _i = _n - 1 to 0
        _a := 1 / (4. * _i + 2) - _a / 4.
        _b := 1 / (6. * _i + 3) - _b / 9.
    _pi := (4. * _a) + (4. * _b) - _pi
pi=f_pi(20)

//---Thanks to xyse----https://www.tradingview.com/script/UTPOoabQ-Low-Frequency-Fourier-Transform/
//Declaration of user-defined variables
N = input(defval=64, title="Lookback Period", type=input.integer, minval=2, maxval=600, confirm=false, step=1, options=[2,4,8,16,32,64,128,256,512,1024,2048,4096])

//Real part of the Frequency Domain Representation
ReX(k) =>
    sum = 0.0
    for i=0 to N-1
        sum := sum + src[i]*cos(2*pi*k*i/N)
    return = sum
    
//Imaginary part of the Frequency Domain Representation
ImX(k) =>
    sum = 0.0
    for i=0 to N-1
        sum := sum + src[i]*sin(2*pi*k*i/N)
    return = -sum

//Get sinusoidal amplitude from frequency domain  
ReX_(k) =>
    case = 0.0
    if(k!=0 and k!=N/2)
        case := 2*ReX(k)/N
    if(k==0)
        case := ReX(k)/N
    if(k==N/2)
        case := ReX(k)/N
    return = case
    
 //Get sinusoidal amplitude from frequency domain  
ImX_(k) =>
    return = -2*ImX(k)/N
    
//Get full Fourier Transform
x(i, N) =>
    sum1 = 0.0
    sum2 = 0.0
    for k=0 to N/2
        sum1 := sum1 + ReX_(k)*cos(2*pi*k*i/N)
    for k=0 to N/2
        sum2 := sum2 + ImX_(k)*sin(2*pi*k*i/N)
    return = sum1+sum2
    
//Get single constituent sinusoid
sx(i, k) =>
    sum1 = ReX_(k)*cos(2*pi*k*i/N)
    sum2 = ImX_(k)*sin(2*pi*k*i/N)
    return = sum1+sum2
//Calculations for strategy
SLOWMA = plotSMA?calc_ma(close+sx(0,sin1),slowMA):close+sx(0,sin1)
MEDMA = plotSMA?calc_ma(close+sx(0,sin2),mediumMA):close+sx(0,sin2)
FASTMA = plotSMA?calc_ma(close+sx(0,sin3),fastMA):close+sx(0,sin3)

SLOWMA := linearReg?linreg(SLOWMA,linregLenght,linregOffset):SLOWMA
MEDMA := linearReg?linreg(MEDMA,linregLenght,linregOffset):MEDMA
FASTMA := linearReg?linreg(FASTMA,linregLenght,linregOffset):FASTMA

//Plot 3 Low-Freq Sinusoids
plot(SLOWMA, color=color.green)
plot(MEDMA, color=color.red)
plot(FASTMA, color=color.blue)

//  Strategy: (Thanks to JayRogers)
// === STRATEGY RELATED INPUTS ===
// the risk management inputs
inpTakeProfit   = input(defval = 0, title = "Take Profit Points", minval = 0)
inpStopLoss     = input(defval = 0, title = "Stop Loss Points", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss Points", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset Points", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

longCondition = FASTMA>MEDMA and close > SLOWMA             //crossover(FASTMA, MEDMA) and close > SLOWMA
if (longCondition)
    strategy.entry("Long Entry", strategy.long)

shortCondition = FASTMA<MEDMA and close < SLOWMA            //crossunder(FASTMA, MEDMA) and close < SLOWMA
if (shortCondition)
    strategy.entry("Short Entry", strategy.short)

// === STRATEGY RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Buy", from_entry = "Long Entry", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Sell", from_entry = "Short Entry", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)