이동평균 전략을 따르는 낮은 주파수 푸리에 변환 트렌드

저자:차오장, 날짜: 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. 빠른, 중간 및 느린 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)

더 많은