Стратегия низкочастотного преобразования Фурье по тренду, следующему за скользящей средней


Дата создания: 2023-12-05 14:56:06 Последнее изменение: 2023-12-05 14:56:06
Копировать: 0 Количество просмотров: 807
1
Подписаться
1619
Подписчики

Стратегия низкочастотного преобразования Фурье по тренду, следующему за скользящей средней

Обзор

Эта стратегия является стратегией отслеживания тенденций, которая использует низкочастотные линейные преобразования для извлечения низкочастотных трендовых компонентов из ценовой последовательности в сочетании с тремя движущимися средними в быстром и медленном режиме для идентификации тенденций и генерации торговых сигналов. Сделайте больше, когда быстрый МА пересекает средний МА и цена выше, чем медленный МА, и сделайте пустое, когда быстрый МА пересекает средний МА и цена ниже, чем медленный МА.

Стратегический принцип

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

  2. Для определения тренда используются три скользящих средних: медленный МА - 200 циклов, средний МА - 20 циклов, и быстрый МА - 5 циклов. Медленный МА фильтрует шум, средний МА улавливает обратный тренд, а быстрый МА выдает торговый сигнал.

  3. Когда быстрый MA пересекает средний MA и цена выше, чем медленный MA, судите, что рынок вошел в восходящую тенденцию, делайте больше; когда быстрый 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)