Tren Transformasi Fourier Frekuensi Rendah Mengikuti Strategi Rata-rata Bergerak

Penulis:ChaoZhang, Tanggal: 2023-12-05 14:56:06
Tag:

img

Gambaran umum

Strategi ini adalah strategi trend following yang menggunakan transformasi Fourier frekuensi rendah untuk mengekstrak komponen tren frekuensi rendah dari seri harga dan menggabungkan tiga moving average (cepat, menengah dan lambat) untuk mengidentifikasi tren dan menghasilkan sinyal perdagangan.

Logika Strategi

  1. Menggunakan transformasi Fourier frekuensi rendah untuk mengekstrak komponen tren frekuensi rendah dari seri harga.

  2. Gunakan tiga rata-rata bergerak (cepat, menengah dan lambat) untuk menilai tren. MA lambat memiliki periode 200, MA menengah memiliki periode 20, dan MA cepat memiliki periode 5. MA lambat menyaring kebisingan, MA menengah menangkap pembalikan tren, dan MA cepat menghasilkan sinyal perdagangan.

  3. Ketika MA cepat melintasi di atas MA menengah dan harga di atas MA lambat, pasar dinilai memasuki tren kenaikan, pergi panjang.

  4. Ini adalah strategi mengikuti tren. Setelah tren diidentifikasi, ia akan mencoba untuk mempertahankan posisi selama mungkin untuk mendapatkan keuntungan dari tren.

Analisis Keuntungan

  1. Penggunaan transformasi Fourier frekuensi rendah secara efektif menyaring kebisingan frekuensi tinggi, membuat sinyal tren yang diidentifikasi lebih dapat diandalkan dan stabil.

  2. Mengadopsi MA cepat, menengah dan lambat secara efektif menilai pembalikan tren pasar dan menghindari sinyal palsu.

  3. Strategi ini memiliki keuntungan yang signifikan dalam melacak tren jangka menengah dan panjang.

  4. Strategi ini memiliki ruang pengoptimalan parameter yang besar. Pengguna dapat menyesuaikan parameter sesuai dengan berbagai varietas dan siklus untuk meningkatkan kemampuan beradaptasi.

Analisis Risiko

  1. Sebagai strategi yang mengikuti tren, strategi ini tidak dapat secara efektif menentukan dan bereaksi terhadap pembalikan tren yang disebabkan oleh peristiwa mendadak, yang dapat menyebabkan peningkatan kerugian.

  2. Di pasar yang bergesekan, strategi ini akan menghasilkan perdagangan yang lebih menguntungkan dan kehilangan.

  3. Tren tradisional mengikuti strategi cenderung boring, keluar dari tren dini adalah masalah yang strategi ini perlu menyelesaikan.

  4. Stop loss dapat diatur untuk mengontrol kerugian tunggal. tes peristiwa mendadak juga dapat dimasukkan ke dalam backtesting untuk menilai ketahanan risiko strategi.

Arahan Optimasi

  1. Coba algoritma rata-rata bergerak yang berbeda untuk menyesuaikan lebih banyak varietas dan siklus.

  2. Tambahkan stop loss, exit loss berturut-turut dan strategi stop loss lainnya untuk mengendalikan risiko.

  3. Tambahkan indikator kekuatan tren untuk menghindari terlalu banyak transaksi di pasar yang berosilasi dan lemah.

  4. Tambahkan model pembelajaran mesin untuk menilai pembalikan tren, membuat strategi agak adaptif terhadap peristiwa mendadak.

Ringkasan

Strategi transformasi Fourier frekuensi rendah ini memiliki keuntungan untuk menyaring kebisingan, mengidentifikasi tren, dan melacak tren. Ini cocok untuk kepemilikan jangka menengah dan panjang. Sebagai strategi trend berikut, terutama menghadapi risiko pembalikan tren dan osilasi berkelanjutan. Ada strategi mengatasi risiko ini. Secara umum, strategi ini memiliki ruang parameter yang besar dan potensi pengoptimalan yang tinggi. Ini cocok untuk investor dengan kemampuan pengembangan strategi dan kontrol risiko tertentu untuk memverifikasi dalam perdagangan langsung.


/*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)

Lebih banyak