다중 요인 모델 모멘텀 반전 전략


생성 날짜: 2023-12-21 16:26:10 마지막으로 수정됨: 2023-12-21 16:26:10
복사: 0 클릭수: 663
avatar of ChaoZhang ChaoZhang
1
집중하다
1623
수행원

다중 요인 모델 모멘텀 반전 전략

개요

다인자 모델 동력 역전 전략은 다인자 모델과 동력 역전 전략을 결합하여 더 안정적이고 더 높은 수익을 달성한다. 이 전략은 123 역전과 공명 지표를 두 개의 독립적인 신호로 사용하고 두 가지의 신호가 일치 할 때 포지션을 개설한다.

전략 원칙

다인자 모델 동력 역전 전략은 두 가지 하위 전략으로 구성된다: 123 역전 전략과 연동 지표 전략.

123 역전 전략은 가격이 2일 연속으로 상승하거나 하락하고, STOCH 지표와 결합하여 시장이 너무 춥거나 너무 뜨거워진지 판단하여 거래 신호를 생성한다. 구체적으로, 가격이 2일 연속으로 상승하면서 9일 STOCH 느린 선이 50보다 낮으면 더 많이 보거나; 가격이 2일 연속으로 하락하면서 9일 STOCH 빠른 선이 50보다 높으면 더 많이 보거나.

연음성 지표 전략은 서로 다른 주기 평균선과 흔들림 지표의 중첩을 사용하여 트렌드 방향과 강도를 판단한다. 선형적 중량화, 시온 더하기 등의 방법이 포괄적으로 다공상 상태를 판단한다. 이 지표는 계열별로 나누어 1에서 9까지 강한 동력을 나타내고, 1에서 9까지 강한 공기를 나타낸다.

마지막으로, 전략은 두 가지 신호가 일치할 때 다단 또는 공백 포지션을 구축하는 것을 선택한다.

우위 분석

다인자 모델 동량 역전 전략은 역전 요소와 역전 요소를 결합하여 역전 기회의 동시 순서를 잡을 수 있으며, 허위 돌파구를 피하여 더 높은 승률을 갖는다. 전략의 장점은 구체적으로 나타난다:

  1. 123 역전 전략은 역전 신호의 원천으로서, 단기적인 역전으로 인해 추가적인 수익을 얻을 수 있다.

  2. 연음성 지표는 트렌드 방향과 강도를 판단하여 반전 공간의 과도한 손실 위험을 피합니다.

  3. 이 둘을 결합하면, 어느 정도 서로 보완할 수 있고, 부족함을 보완하고, 신호의 질을 향상시킬 수 있다.

  4. 단일 모델에 비해 다중 요소의 결합은 전략의 안정성을 향상시킬 수 있다.

위험 분석

다인자 모델 동력 역전 전략에는 장점이 있지만 다음과 같은 위험이 있습니다.

  1. 반전이 완료되지 않은 경우, 가격이 다시 회전으로 이어지는 손실.

  2. 두 신호가 일치하지 않을 때 방향을 결정할 수 없다. 매개 변수를 조정하여 두 신호의 일치도를 높일 수 있다.

  3. 모델은 너무 복잡하고, 변수가 너무 많아서, 조정과 최적화가 쉽지 않다.

  4. 동시에 여러 개의 하위모델에 관심을 기울여야 하며, 실 디스크 운영의 난이도와 심리적 스트레스가 더 크다. 특정 자동 거래 요소를 도입하여 운영의 부담을 줄일 수 있다.

최적화 방향

다인자 모델 동량 역전 전략은 다음과 같은 측면에서 최적화될 수 있다:

  1. 123 역전 전략의 매개 변수를 조정하여 역전 신호를 더 정확하고 신뢰할 수 있도록 했다.

  2. 동향 지표의 파라미터를 조정하여 판단된 트렌드를 실제 트렌드에 더 가깝게 만든다.

  3. 기계 학습 알고리즘의 자동 최적화 파라미트 포괄을 도입한다.

  4. 포지션 관리 모듈을 추가하여 포지션 조정을 더 정량화하고 체계화합니다.

  5. 스톱 손실 모듈을 추가한다. 스톱 손실 가격을 미리 설정하여 단독 손실을 효과적으로 제어한다.

요약하다

다인자 모형 동량 역전 전략은 역전 인자와 동력 인자를 종합적으로 사용하여 높은 신호 품질을 보장하는 데 기초하여 다인자 중첩을 통해 더 높은 승률을 얻는다. 이 전략은 역전 기회를 포착하는 이중 이점을 가지고 있으며, 순차적으로, 고효율의 안정화 전략이다. 미래에는 매개 변수 조정, 위험 제어 등의 측면에서 지속적으로 최적화하여 전략의 수익 위험 비율을 더욱 향상시킬 수 있다.

전략 소스 코드
/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-07 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 11/11/2019
// This is combo strategies for get a cumulative signal. 
//
// First strategy
// This System was created from the Book "How I Tripled My Money In The 
// Futures Market" by Ulf Jensen, Page 183. This is reverse type of strategies.
// The strategy buys at market, if close price is higher than the previous close 
// during 2 days and the meaning of 9-days Stochastic Slow Oscillator is lower than 50. 
// The strategy sells at market, if close price is lower than the previous close price 
// during 2 days and the meaning of 9-days Stochastic Fast Oscillator is higher than 50.
//
// Second strategy
// This is modified version of Dale Legan's "Confluence" indicator written by Gary Fritz.
// ================================================================
// Here is Gary`s commentary:
// Since the Confluence indicator returned several "states" (bull, bear, grey, and zero), 
// he modified the return value a bit:
// -9 to -1 = Bearish
// -0.9 to 0.9 = "grey" (and zero)
// 1 to 9 = Bullish
// The "grey" range corresponds to the "grey" values plotted by Dale's indicator, but 
// they're divided by 10.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
Reversal123(Length, KSmoothing, DLength, Level) =>
    vFast = sma(stoch(close, high, low, Length), KSmoothing) 
    vSlow = sma(vFast, DLength)
    pos = 0.0
    pos := iff(close[2] < close[1] and close > close[1] and vFast < vSlow and vFast > Level, 1,
	         iff(close[2] > close[1] and close < close[1] and vFast > vSlow and vFast < Level, -1, nz(pos[1], 0))) 
	pos

Confluence(Harmonic, BuyBand, SellBand) =>
    pos = 0.0
    Price = close
    STL = round((Harmonic * 2) - 1 - 0.5)
    ITL = round((STL * 2) - 1 - 0.5)
    LTL = round((ITL * 2) - 1 - 0.5)
    HOFF = round(Harmonic / 2 - 0.5)
    SOFF = round(STL / 2 - 0.5)
    IOFF = round(ITL / 2 - 0.5)
    xHavg = sma(Price, Harmonic)
    xSavg = sma(Price, STL)
    xIavg = sma(Price, ITL)
    xLavg = sma(Price, LTL)
    xvalue2 = xSavg - xHavg[HOFF]
    xvalue3 = xIavg - xSavg[SOFF]
    xvalue12 = xLavg - xIavg[IOFF]
    xmomsig = xvalue2 + xvalue3 + xvalue12
    xLavgOHLC = sma(ohlc4, LTL - 1)
    xH2 = sma(Price, Harmonic - 1)
    xS2 = sma(Price, STL - 1)
    xI2 = sma(Price, ITL - 1)
    xL2 = sma(Price, LTL - 1)
    DerivH = (xHavg * 2) - xHavg[1]
    DerivS = (xSavg * 2) - xSavg[1]
    DerivI = (xIavg * 2) - xIavg[1]
    DerivL = (xLavg * 2) - xLavg[1]
    SumDH = Harmonic * DerivH
    SumDS = STL * DerivS
    SumDI = ITL * DerivI
    SumDL = LTL * DerivL
    LengH = Harmonic - 1
    LengS = STL - 1
    LengI = ITL - 1
    LengL = LTL - 1
    N1H = xH2 * LengH
    N1S = xS2 * LengS
    N1I = xI2 * LengI
    N1L = xL2 * LengL
    DRH = SumDH - N1H
    DRS = SumDS - N1S
    DRI = SumDI - N1I
    DRL = SumDL - N1L
    SumH = xH2 * (Harmonic - 1)
    SumS = xS2 * (STL - 1)
    SumI = xI2 * (ITL - 1)
    SumL = xLavgOHLC * (LTL - 1)
    xvalue5 = (SumH + DRH) / Harmonic
    xvalue6 = (SumS + DRS) / STL
    xvalue7 = (SumI + DRI) / ITL
    xvalue13 = (SumL + DRL) / LTL
    value9 = xvalue6 - xvalue5[HOFF]
    value10 = xvalue7 - xvalue6[SOFF]
    value14 = xvalue13 - xvalue7[IOFF]
    xmom = value9 + value10 + value14
    HT = sin(xvalue5 * 2 * 3.14 / 360) + cos(xvalue5 * 2 * 3.14 / 360)
    HTA = sin(xHavg * 2 * 3.14 / 360) + cos(xHavg * 2 * 3.14 / 360)
    ST = sin(xvalue6 * 2 * 3.14 / 360) + cos(xvalue6 * 2 * 3.14 / 360)
    STA = sin(xSavg * 2 * 3.14 / 360) + cos(xSavg * 2 * 3.14 / 360)
    IT = sin(xvalue7 * 2 * 3.14 / 360) + cos(xvalue7 * 2 * 3.14 / 360)
    ITA = sin(xIavg * 2 * 3.14 / 360) + cos(xIavg * 2 * 3.14 / 360)
    xSum = HT + ST + IT
    xErr = HTA + STA + ITA
    Condition2 = (((xSum > xSum[SOFF]) and (xHavg < xHavg[SOFF])) or ((xSum < xSum[SOFF]) and (xHavg > xHavg[SOFF])))
    Phase = iff(Condition2 , -1 , 1)
    xErrSum = (xSum - xErr) * Phase
    xErrSig = sma(xErrSum, SOFF)
    xvalue70 = xvalue5 - xvalue13
    xvalue71 = sma(xvalue70, Harmonic)
    ErrNum = iff (xErrSum > 0 and xErrSum < xErrSum[1] and xErrSum < xErrSig, 1,
                  iff (xErrSum > 0 and xErrSum < xErrSum[1] and xErrSum > xErrSig, 2, 
                     iff (xErrSum > 0 and xErrSum > xErrSum[1] and xErrSum < xErrSig, 2,
                         iff (xErrSum > 0 and xErrSum > xErrSum[1] and xErrSum > xErrSig, 3,
                          iff (xErrSum < 0 and xErrSum > xErrSum[1] and xErrSum > xErrSig, -1,
                             iff (xErrSum < 0 and xErrSum < xErrSum[1] and xErrSum > xErrSig, -2,
                              iff (xErrSum < 0 and xErrSum > xErrSum[1] and xErrSum < xErrSig, -2,
                                 iff (xErrSum < 0 and xErrSum < xErrSum[1] and xErrSum < xErrSig, -3, 0))))))))

    momNum = iff (xmom > 0 and xmom < xmom[1] and xmom < xmomsig , 1,
              iff (xmom > 0 and xmom < xmom[1] and xmom > xmomsig, 2,
               iff (xmom > 0 and xmom > xmom[1] and xmom < xmomsig, 2,
                 iff (xmom > 0 and xmom > xmom[1] and xmom > xmomsig, 3,
                  iff (xmom < 0 and xmom > xmom[1] and xmom > xmomsig, -1,
                   iff (xmom < 0 and xmom < xmom[1] and xmom > xmomsig, -2,
                     iff (xmom < 0 and xmom > xmom[1] and xmom < xmomsig, -2,
                      iff (xmom < 0 and xmom < xmom[1] and xmom < xmomsig, -3, 0))))))))
    
    TCNum =  iff (xvalue70 > 0 and xvalue70 < xvalue70[1] and xvalue70 < xvalue71, 1,
              iff (xvalue70 > 0 and xvalue70 < xvalue70[1] and xvalue70 > xvalue71, 2,
               iff (xvalue70 > 0 and xvalue70 > xvalue70[1] and xvalue70 < xvalue71, 2,
                 iff (xvalue70 > 0 and xvalue70 > xvalue70[1] and xvalue70 > xvalue71, 3,
                  iff (xvalue70 < 0 and xvalue70 > xvalue70[1] and xvalue70 > xvalue71, -1,
                   iff (xvalue70 < 0 and xvalue70 < xvalue70[1] and xvalue70 > xvalue71, -2,
                     iff (xvalue70 < 0 and xvalue70 > xvalue70[1] and xvalue70 < xvalue71, -2,
                      iff (xvalue70 < 0 and xvalue70 < xvalue70[1] and xvalue70 < xvalue71, -3,0))))))))
    
    value42 = ErrNum + momNum + TCNum
    Confluence = iff (value42 > 0 and xvalue70 > 0, value42,
                  iff (value42 < 0 and xvalue70 < 0, value42,
                   iff ((value42 > 0 and xvalue70 < 0) or (value42 < 0 and xvalue70 > 0), value42 / 10, 0)))
    Res1 = iff (Confluence >= 1, Confluence, 0)
    Res2 = iff (Confluence <= -1, Confluence, 0)
    Res3 = iff (Confluence == 0, 0, iff (Confluence > -1 and Confluence < 1, 10 * Confluence, 0))
    pos := iff(Res2 >= SellBand and Res2 != 0, -1,
	         iff(Res1 <= BuyBand and Res1 != 0, 1, 
    	      iff(Res3 != 0, 2, nz(pos[1], 0))))
    pos

strategy(title="Combo Backtest 123 Reversal & Confluence", shorttitle="Combo", overlay = true)
Length = input(14, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(3, minval=1)
Level = input(50, minval=1)
//-------------------------
Harmonic = input(10, minval=1)
BuyBand = input(9)
SellBand = input(-9)
reverse = input(false, title="Trade reverse")
posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posConfluence = Confluence(Harmonic, BuyBand, SellBand)
pos = iff(posReversal123 == 1 and posConfluence == 1 , 1,
	   iff(posReversal123 == -1 and posConfluence == -1, -1, 0)) 
possig = iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1 , 1, pos))	   
if (possig == 1) 
    strategy.entry("Long", strategy.long)
if (possig == -1)
    strategy.entry("Short", strategy.short)	 
if (possig == 0) 
    strategy.close_all()
barcolor(possig == -1 ? #b50404: possig == 1 ? #079605 : #0536b3 )