극도로 과도한 체력 트렌드 브레이크 전략

저자:차오장, 날짜: 2023-09-28 15:54:32
태그:

요약

이 전략은 트렌드 신호를 식별하기 위해 여러 채널과 이동 평균을 사용하여 암호화폐 시장의 강력한 트렌드를 포착하는 것을 목표로 하고 있으며, 트렌드 시장에서 수익을 창출 할 수 있도록 적응적으로 손실을 막는 동시에 가짜 브레이크오프를 필터하기 위해 볼륨 지표를 결합합니다.

전략 원칙

이 전략은 트렌드를 식별하기 위해 빠른 채널, 느린 채널 및 빠른 이동 평균의 조합을 사용합니다. 빠른 채널 매개 변수는 단기 가격 변동을 캡처하는 데 더 민감합니다. 느린 채널 매개 변수는 주요 트렌드를 판단하는 데 더 온화적입니다. 빠른 이동 평균 매개 변수는 사이에 있으며 채널을 통과 할 때 거래 신호를 생성합니다.

특히, 먼저 빠른 채널의 상부와 하부 레일을 계산하고 이동 평균을 계산합니다. 가격이 상부 레일을 통과하면 느린 채널의 하부 레일이 이동 평균보다 높으면 긴 신호가 생성됩니다. 반대로, 하부 레일을 통과하면 느린 채널의 상부 레일이 이동 평균보다 낮는지 확인하여 짧은 신호를 생성합니다.

또한, K-라인 패턴을 감지하고, 가짜 브레이크오웃을 필터링하기 위해 여러 K-라인들이 순서대로 배열되어야 하며, 유실된 역행 기회를 피하기 위해 통합에 진입했는지 여부를 결정하기 위해 가격 변화율 지표를 계산하고, 브레이크오웃 시 부피가 가격을 따르는 것을 보장하기 위해 볼륨 지표를 포함합니다.

스톱 손실에 대한 전략은 적응 스톱 손실을 사용합니다. 최근의 변동성에 따라 스톱 손실 비율을 동적으로 조정합니다. 이는 효과적인 스톱 손실을 보장하면서 가능한 한 많은 트렌드 수익을 잠금 할 수 있습니다.

이점 분석

이 전략의 가장 큰 장점은 거래 신호를 생성하는 기준이 상대적으로 엄격하기 때문에 트렌드 아닌 가짜 브레이크오웃을 효과적으로 필터링하고 시장 트렌드의 전환점을 진정으로 포착 할 수 있다는 것입니다. 구체적으로 몇 가지 주요 측면이 있습니다.

  1. 여러 채널과 이동 평균의 조합은 더 엄격한 기준을 가지고 있으며 잘못된 판단의 가능성을 줄일 수 있습니다.

  2. K-라인 염기서열 검증은 하나의 변칙적인 K-라인으로부터 잘못된 신호를 피합니다.

  3. 가격 변화율 지표를 포함하면 회환 기회를 놓치지 않기 위해 통합에 들어갔는지 여부를 결정할 수 있습니다.

  4. 부피 지표 판단을 추가하면 부피가 가격에 따른 경우에만 신호가 생성되며 비효율적 인 브레이크오웃을 피합니다.

  5. 적응적인 스톱 로스 메커니즘은 스톱 로스를 보장하면서 트렌드 수익을 최대화 할 수 있습니다.

그래서 일반적으로 이 전략은 최적화된 구성, 신중한 의사결정, 적응적인 스톱 손실의 특성을 가지고 있어 트렌드 기회를 포착하는데 매우 적합합니다.

위험 분석

이 전략은 가짜 유출을 필터링하고 트렌드를 포착하는 데 많은 최적화를 수행했지만, 여전히 주목해야 할 몇 가지 위험이 있습니다.

  1. 복잡한 매개 변수 설정은 매개 변수 조합 간의 큰 차이로 이어질 수 있으며, 최적의 매개 변수를 찾기 위해 광범위한 테스트가 필요합니다. 그렇지 않으면 너무 많은 잘못된 신호를 생성 할 수 있습니다.

  2. 빠른 이동 평균과 채널 사이의 격차가 너무 작을 때, 이는 빈번한 입출구를 생성하는 경향이 있으며, 이는 지속적으로 트렌드를 추적하는 데 도움이되지 않습니다.

  3. 적응식 스톱 로스 메커니즘의 스톱 로스 비율 계산은 단순한 표준 오차에 의존하며, 이는 극단적인 시장 조건에서 충분한 스톱 로스를 초래할 수 있습니다.

  4. 이는 기술 지표에 크게 의존하고 있으며 큰 근본적인 변화에 대응하지 못할 수 있습니다.

  5. 트렌드를 따라가는 전략으로서, 범위에 묶여있는 불안정한 시장에서 낮은 성과를 내고 있습니다.

이러한 위험을 통제하려면 다음과 같은 조치를 권장합니다.

  1. 최적의 매개 변수 조합을 결정하기 위해 충분한 역 테스트를 수행하거나 매개 변수 최적화를 위해 기계 학습을 사용하는 것을 고려하십시오.

  2. 채널 간격을 약간 넓히고, 불필요한 항목을 줄이기 위해 이동 평균 기간을 길게하십시오.

  3. 헤지 펀드 방법과 같은 더 고급 변동성 모델을 도입하는 것을 고려하십시오.

  4. 순전히 기술적인 거래를 피하기 위해 기본적인 정보를 적시에 참조하십시오.

  5. 시장 상태에 대한 판단을 높이고 불안한 시장에서 거래를 중단하십시오.

최적화

이 전략은 다음과 같은 방법으로 더 이상 최적화 될 수 있습니다.

  1. 자동 매개 변수 최적화를 위해 기계 학습 알고리즘을 도입하여 다른 시장 환경에서 매개 변수 성능을 기록하여 동적 최적화를 위한 검색 테이블을 구축합니다.

  2. 시장 상태에 대한 판단을 추가하십시오. 예를 들어 시장이 트렌드인지 불안정한지 결정하는 모듈을 추가하고 불필요한 손실을 피하기 위해 불안정한 시장에서 거래를 중단하십시오.

  3. 트레일링 스톱 로스, 비례 스톱 로스 등 스톱 로스 전략을 최적화합니다.

  4. 기본 요소를 포함하여 주요 기본 이벤트가 발생했을 때 경고를 보내기 위해, 순전히 기술적 지표에 기반한 손실을 피합니다.

  5. 포트폴리오 최적화를 실시하고, 이 전략을 다른 관련 없는 전략과 결합하여 위험을 더욱 다양화합니다.

  6. 자동화 된 신호 실행 및 엄격한 위험 통제를 위한 정량적 거래 틀을 도입합니다.

결론

요약하자면, 이 전략은 암호화폐 시장에서 트렌딩 기회를 포착하는 데 매우 적합합니다. 거래 신호를 생성하기 위해 여러 채널과 이동 평균을 사용하여 잘못된 브레이크아웃 소음을 효과적으로 필터하고 트렌드 수익을 성공적으로 잠금합니다. 그러나 매개 변수 최적화, 스톱 로스 방법, 시장 상태 판단 등은 여전히 주의가 필요합니다. 지속적인 개선으로 안정적인 투자 수익을 얻을 수 있습니다. 양적 전략 설계에 좋은 예를 제공합니다.


/*backtest
start: 2022-09-21 00:00:00
end: 2023-09-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Extremely Overfit", overlay=true, commission_type=strategy.commission.percent, commission_value=.16, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding = 1)
price = close

goLong = input(title="go long?", type=input.bool, defval=true)
goShort = input(title="go short?", type=input.bool, defval=true)
//trendRestrict = input(title="basic trend restriction?", type=input.bool, defval=false)
dynamicRestrict = true //input(title="dynamic trend restriction?", type=input.bool, defval=true)
longtrendimpt = true //input(title="additional weight on long-term trends?", type=input.bool, defval=true)
volRestrict = true //input(title="volume restriction?", type=input.bool, defval=true)
conservativeClose = false //input(title="conservative order closing?", type=input.bool, defval=false)

Restrictiveness = input ( -40,step=10,title ="Restrictiveness (higher = make fewer trades)")
volatilityImportance = 3.2 //input( 3.2, step = 0.1, minval = 0)
fastChannelLength = input( 6 )
fastChannelMargin = input ( 3.2, step = 0.1, minval = 0)
slowChannelLength = input ( 6, step = 1, minval = 0)
slowChannelMargin = input ( 1.5, step = 0.1, minval = 0)
fastHMAlength = input (4, step = 1, minval = 0)
stopLoss = input( 3, step = 0.1, minval = 0)
//altClosePeriod = input( 27, step = 1, minval = 1)
//altCloseFactor = input( 4.9, step = 0.1)
stopLossFlexibility = 50 //input(50, step=10, title="effect of volatility on SL?")
volumeMAlength = 14 //input ( 14, step = 1, minval = 1)
volumeVolatilityCutoff = 3.8 // ( 3.8, step = 1, minval = 0)
trendSensitivity = 3.8 //input ( 3.8, step = 0.1)
obvLookback = 10 //input(10, step = 10, minval = 10)
obvCorrThreshold = 0.89 //input(0.89, step = 0.01)
ROClength = 80 //input( 80, step = 10)
ROCcutoff = 5.6 //input( 5.6, step=0.1)

trendRestrict = false
//trendLookback = input ( 360, step = 10, minval = 10)
//longTrendLookback = input(720, step = 10, minval = 10)
//longTrendImportance = input(1.5, step = 0.05)
trendLookback = 360
longTrendLookback = 720
longTrendImportance = 1.5

//conservativeness = input( 2.4, step = 0.1)
conservativeness = 0
//trendPower = input( 0, step=1)
trendPower = 0
//conservativenessLookback = input( 650, step = 10, minval = 0)
conservativenessLookback = 10
//consAffectFactor = input( 0.85,step=0.01)
consAffectFactor = 0.85
//volatilityLookback = input(50, step=1, minval=2)
volatilityLookback = int(50)
recentVol = stdev(price,volatilityLookback)/sqrt(volatilityLookback)

//price channel

fastChannel = ema(price, fastChannelLength)
fastChannelUB = fastChannel * (1 + (float(fastChannelMargin) / 1000)) + (recentVol * (float(volatilityImportance) * (1 + (Restrictiveness/100))))
fastChannelLB = fastChannel * (1 - (float(fastChannelMargin) / 1000)) - (recentVol * (float(volatilityImportance) * (1 + (Restrictiveness/100))))
fchU = ((fastChannelUB < open) and (fastChannelUB < close))
fchL = ((fastChannelLB > open) and (fastChannelLB > close))
//plot(fastChannelUB)
//plot(fastChannelLB)

//slow channel
//slowChannelLBmargin = input ( 2, step = 0.1, minval = 0 )
slowChannel = ema(ema(price,slowChannelLength),slowChannelLength)
slowChannelUB = slowChannel * (1 + (float(slowChannelMargin) / 2000)) + (recentVol * (float(volatilityImportance) * (1 + (Restrictiveness/100))))
slowChannelLB = slowChannel * (1 - (float(slowChannelMargin) / 2000)) - (recentVol * (float(volatilityImportance) * (1 + (Restrictiveness/100))))
schU = ((slowChannelUB < close))
schL = ((slowChannelLB > close))
cschU = (((slowChannelUB * (1 + conservativeness)) < close))
cschL = (((slowChannelUB * (1 - conservativeness)) > close))
//plot(slowChannel,color = #00FF00)
//plot(slowChannelUB,color = #00FF00)
//plot(slowChannelLB,color = #00FF00)


fastHMA = hma(price,fastHMAlength)
fastAboveUB = (fastHMA > slowChannelUB)
fastBelowLB = (fastHMA < slowChannelLB)
//plot(fastHMA, color = 	#FF0000, linewidth = 2)

//consecutive candles
//consecutiveCandlesReq = input(1, step = 1, minval = 1, maxval = 4)
consecutiveCandlesReq = 1
consecutiveBullReq = float(consecutiveCandlesReq)
consecutiveBearReq = float(consecutiveCandlesReq)
cbull = ((close[0] > close[1]) and (consecutiveBullReq == 1)) or (((close[0] > close[1]) and (close[1] > close[2])) and consecutiveBullReq == 2) or (((close[0] > close[1]) and (close[1] > close[2]) and (close[2] > close[3])) and consecutiveBullReq == 3) or (((close[0] > close[1]) and (close[1] > close[2]) and (close[2] > close[3]) and (close[3] > close[4])) and consecutiveBullReq == 4)
cbear = ((close[0] < close[1]) and (consecutiveBearReq == 1)) or (((close[0] < close[1]) and (close[1] < close[2])) and consecutiveBearReq == 2) or (((close[0] < close[1]) and (close[1] < close[2]) and (close[2] < close[3])) and consecutiveBearReq == 3) or (((close[0] < close[1]) and (close[1] < close[2]) and (close[2] < close[3]) and (close[3] < close[4])) and consecutiveBearReq == 4)

//trend detection
//trendCutoff = input(0, step = 0.1)
trendCutoff = 0
trendDetectionPct = float(trendCutoff/100)
trendVal = float((close[0] - close[trendLookback])/close[0])
trendUp = (trendVal > (0 + trendDetectionPct))
trendDown = (trendVal < (0 - trendDetectionPct))
//plot(trendVal+36.5,linewidth=2)

// peak indicators
peakHigh = ((fastHMA > fastChannelUB) and (fastChannelLB > slowChannelUB))
peakLow = ((fastHMA < fastChannelLB) and (fastChannelUB < slowChannelLB))
TpeakHigh = (fastHMA > fastChannelUB) and (fastChannelUB > slowChannelUB)
TpeakLow = (fastHMA < fastChannelUB) and (fastChannelLB < slowChannelLB)
//TpeakHigh = (fastHMA > fastChannelUB) and (fastChannelLB > avg(slowChannelUB,slowChannelLB))
//TpeakLow = (fastHMA < fastChannelUB) and (fastChannelUB < avg(slowChannelLB,slowChannelUB))
//TpeakHigh = ((crossover(fastHMA,fastChannelUB)) and (fastChannelLB > slowChannelUB))
//TpeakLow = ((crossover(fastChannelLB,fastHMA)) and (fastChannelUB < slowChannelLB))
//TpeakHigh = (fastHMA > (fastChannelUB * (1 + (trendPower/800)))) and (fastChannelUB > (slowChannelUB * (1 + (trendPower/800))))
//TpeakLow = (fastHMA < (fastChannelUB * (1 - (trendPower/800)))) and (fastChannelLB < (slowChannelLB * (1 - (trendPower/800))))
//TpeakHigh = (fastHMA > (fastChannelUB * (1 + (trendPower/800)))) and (avg(fastChannelUB,fastChannelLB) > (slowChannelUB * (1 + (trendPower/800))))
//TpeakLow = (fastHMA < (fastChannelUB * (1 - (trendPower/800)))) and (avg(fastChannelLB,fastChannelUB) < (slowChannelLB * (1 - (trendPower/800))))
//plot(fastChannelUB * (1 + (trendPower/700)), color=#FF69B4)

// and for closing...
closeLong = (crossover(fastHMA,fastChannelUB) and (fastChannelLB > slowChannelUB))
closeShort = (crossover(fastChannelLB,fastHMA) and (fastChannelUB < slowChannelLB))
//closeLong = (crossover(fastHMA,fastChannelUB) and (fastChannelLB > slowChannelUB)) or (roc(price,altClosePeriod) > altCloseFactor)
//closeShort = (crossover(fastChannelLB,fastHMA) and (fastChannelUB < slowChannelLB))  or (roc(price,altClosePeriod) < (altCloseFactor) * -1)
//closeLong = (crossover(fastHMA,fastChannelUB) and (fastChannelLB > slowChannelUB)) or (((price - fastChannelUB) > (altCloseFactor * abs(((fastChannelUB - fastChannelLB)/2) - ((slowChannelUB - slowChannelLB)/2)))) and (fastChannelLB > slowChannelUB))
//closeShort = (crossover(fastChannelLB,fastHMA) and (fastChannelUB < slowChannelLB)) or (((fastChannelLB - price) > (altCloseFactor * abs(((fastChannelUB - fastChannelLB)/2) - ((slowChannelUB - slowChannelLB)/2)))) and (fastChannelUB < slowChannelLB))
//closeLong = crossover(fastHMA,fastChannelUB) and ((fastChannelLB[0] - fastChannelLB[1]) < (slowChannelUB[0] - slowChannelUB[1]))
//closeShort = crossover(fastChannelLB,fastHMA) and ((fastChannelUB[0] - fastChannelUB[1]) > (slowChannelLB[0] - slowChannelLB[1]))


//stop-loss
priceDev = stdev(price,trendLookback) * (1 + stopLossFlexibility/5)
stopLossMod = stopLoss * (1 + (priceDev/price))
//longStopPrice  = strategy.position_avg_price * (1 - (stopLoss/100))
//shortStopPrice = strategy.position_avg_price * (1 + (stopLoss/100))
longStopPrice  = strategy.position_avg_price * (1 - (stopLossMod/100))
shortStopPrice = strategy.position_avg_price * (1 + (stopLossMod/100))


// volume
volumeMA = ema(volume,volumeMAlength)
volumeDecrease = ((not volRestrict ) or (volumeMA[0] < ema(volumeMA[1] * (1 - (volumeVolatilityCutoff/100)),5)))
volumeCutoff = ema(volumeMA[1] * (1 - (volumeVolatilityCutoff/100)),5)
//plot(volumeMA)
//plot(volumeCutoff)

// detect volatility
//trendinessLookback = input ( 600, step = 10, minval = 0)
trendinessLookback = trendLookback
trendiness = (stdev(price,trendinessLookback)/price) * (1 - (Restrictiveness/100))
longtermTrend = ((price - price[longTrendLookback])/price)
//dynamicTrendDetected = (dynamicRestrict and (abs(trendiness * 100) < trendSensitivity))
dynamicTrendDetected = (longtrendimpt and (dynamicRestrict and (abs(trendiness * 100) < (trendSensitivity+(longtermTrend * longTrendImportance))))) or (not longtrendimpt and ((dynamicRestrict and (abs(trendiness * 100) < trendSensitivity))))

// adapt conservativeness to volatility

//consVal = sma(((stdev(price,conservativenessLookback))/price)*100,25)
consVal = sma(((stdev(price,conservativenessLookback))/price)*100,25)
cVnorm = sma(avg(consVal,3),60)
cVal = consVal - cVnorm

//conservativenessMod = conservativeness * (cVal * consAffectFactor)
conservativenessMod = conservativeness * (consVal * consAffectFactor)
//plot(consVal,linewidth=4)
//plot(cVnorm,color = #00FF00)
//plot(cVal,linewidth=2)

// ROC cutoff (for CLOSING)
//rocCloseLong = (ema(roc(price,ROClength),10) > ROCcutoff)
//rocCloseShort = (ema(roc(price,ROClength),10) < (ROCcutoff * -1))
ROCval = roc(price,ROClength)
ROCema = ema(ROCval,30)
ROCabs = abs(ROCema)
ROCallow = ROCabs < ROCcutoff
ROCallowLong = (ROCabs < ROCcutoff)  or ((ROCabs >= ROCcutoff) and ((fastChannelLB < slowChannelLB) and (fastHMA < fastChannelLB)))
ROCallowShort = (ROCabs < ROCcutoff) or ((ROCabs >= ROCcutoff) and ((fastChannelUB > slowChannelUB) and (fastHMA > fastChannelUB)))
//plot(ROCallow)

// obv
evidence_obv = (correlation(price,obv[0],obvLookback))
obvAllow = evidence_obv > obvCorrThreshold


//if (not na(vrsi))
if trendRestrict or dynamicTrendDetected
    //if (strategy.position_size == 0)
    if not (strategy.position_size < 0)
        if trendUp
        	//if cbear and schL and fchL and trendUp and goLong
        	if cbear and TpeakLow and volumeDecrease and ROCallow and goLong and obvAllow
        	//if cbear and peakLow and rocHigh and volumeDecrease and goLong
        		strategy.entry("Long", strategy.long, comment="Long")
    if not (strategy.position_size > 0)
        if trendDown
        	//if cbull and schU and fchU and trendDown and goShort
        	if cbull and TpeakHigh and volumeDecrease and ROCallow and goShort and obvAllow
        	//if cbull and peakHigh and rocLow and volumeDecrease and goShort
        		strategy.entry("Short", strategy.short, comment="Short")
else
    //if (strategy.position_size == 0)
    if not (strategy.position_size < 0)
        //if cbear and peakLow and goLong
    	//if cbear and peakLow and volumeDecrease and ROCallow and goLong
    	if TpeakLow and goLong and obvAllow
    		strategy.entry("Long", strategy.long, comment="Long")
    if not (strategy.position_size > 0)
        //if cbull and peakHigh and goShort
    	//if cbull and peakHigh and volumeDecrease and ROCallow and goShort
    	if TpeakHigh and goShort and obvAllow
    		strategy.entry("Short", strategy.short, comment="Short")

if conservativeClose
    //pkHigh = ((fastHMA > fastChannelUB) and (fastChannelUB > (slowChannelUB * (1 + conservativeness/1000))))
    //pkLow = ((fastHMA < fastChannelLB) and (fastChannelLB < (slowChannelLB * (1 - conservativeness/1000))))
    //pkHigh = ((fastHMA > fastChannelUB) and (fastChannelUB > (slowChannelUB * (1 + conservativenessMod/1000))))
    //pkLow = ((fastHMA < fastChannelLB) and (fastChannelLB < (slowChannelLB * (1 - conservativenessMod/1000))))
    pkHigh = ((fastHMA > fastChannelUB) and (fastChannelUB > (slowChannelUB * (1 + ((conservativenessMod/1000) * (1 - Restrictiveness/100))))))
    pkLow = ((fastHMA < fastChannelLB) and (fastChannelLB < (slowChannelLB * (1 - ((conservativenessMod/1000) * (1 - Restrictiveness/100))))))
    
    if (strategy.position_size > 0)
        //if fastAboveUB
        //if pkHigh and closeLong
        if closeLong
    		strategy.close("Long", comment="closeLong")
    if (strategy.position_size < 0)
        //if fastBelowLB
        //if pkLow and closeShort
        if closeShort
    		strategy.close("Short", comment="closeShort")
else
    if (strategy.position_size > 0)
        //if fastAboveUB
        if peakHigh
    		strategy.close("Long", comment="closeLong")
    if (strategy.position_size < 0)
        //if fastBelowLB
        if peakLow
    		strategy.close("Short", comment="closeShort")

if (strategy.position_size > 0)
    strategy.exit(id="Long", stop=longStopPrice, comment="stopLong")

if (strategy.position_size < 0)
    strategy.exit(id="Short", stop=shortStopPrice, comment="stopShort")
//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)












더 많은