Тенденция низкочастотного преобразования Фурье по стратегии скользящих средних

Автор:Чао Чжан, Дата: 2023-12-05 14:56:06
Тэги:

img

Обзор

Эта стратегия - это стратегия, которая использует низкочастотную трансформацию Фурье для извлечения низкочастотных компонентов тренда из серии цен и сочетает три скользящих средних (быстрые, средние и медленные), чтобы определить тенденции и генерировать торговые сигналы. Она длинная, когда быстрый MA пересекает средний MA, а цена выше медленной MA, и короткая, когда быстрый MA пересекает средний MA, а цена ниже медленной MA. Эта стратегия подходит для отслеживания среднесрочных и долгосрочных тенденций.

Логика стратегии

  1. Использование низкочастотного преобразования Фурье для извлечения низкочастотных компонентов тренда из серии цен.

  2. Используйте три скользящих средних (быстрые, средние и медленные) для оценки тенденций. медленный MA имеет период 200 лет, средний MA имеет период 20 лет, а быстрый MA имеет период 5 лет. медленный MA фильтрует шум, средний MA фиксирует обратные тенденции, а быстрый MA генерирует торговые сигналы.

  3. Когда быстрый MA пересекает средний MA, а цена превышает медленный MA, рынок считается входящим в восходящую тенденцию, идти длинным.

  4. После того, как тренд будет идентифицирован, он попытается удержать позицию как можно дольше, чтобы извлечь выгоду из тренда.

Анализ преимуществ

  1. Использование низкочастотного преобразования Фурье эффективно фильтрует высокочастотный шум, делая идентифицированные сигналы тренда более надежными и стабильными.

  2. Принятие быстрых, средних и медленных МР эффективно оценивает изменение рыночных тенденций и избегает ложных сигналов.

  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)

Больше