저주파 푸리에 변환 추세 추종 이동 평균 전략


생성 날짜: 2023-12-05 14:56:06 마지막으로 수정됨: 2023-12-05 14:56:06
복사: 0 클릭수: 490
avatar of ChaoZhang ChaoZhang
1
집중하다
1237
수행원

저주파 푸리에 변환 추세 추종 이동 평균 전략

개요

이 전략은 트렌드 추적 전략으로, 낮은 주파수 잎 변형을 사용하여 가격 서열의 낮은 주파수 트렌드 구성 요소를 추출하고, 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)