이동 평균 추세 추종 최적화 전략


생성 날짜: 2024-01-04 15:44:23 마지막으로 수정됨: 2024-01-04 15:44:23
복사: 0 클릭수: 526
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

이동 평균 추세 추종 최적화 전략

개요

량화 빛은 스토카스틱 지표와 OTT 지표를 사용하는 조합 전략이다. 전략은 스토카스틱 지표를 사용하여 구매 및 판매 신호를 생성하고, OTT 지표와 결합하여 신호를 필터링하여 큰 트렌드를 잡기 위해 시도하고 시장의 흔들림으로 인한 가짜 신호의 영향을 줄인다. 이 기사는 이 전략에 대한 자세한 평가를 할 것이다.

전략 원칙

이 전략의 핵심 아이디어는 Stochastic 지표에 OTT 지표를 중첩하여 신호 필터링을 수행하는 것입니다. Stochastic 지표는 가격을 지정된 시간 동안의 최고 가격과 최저 가격과 비교하여 가격이 극한 지역에 있는지 판단하는 데 사용됩니다. OTT 지표는 이동 평균과 동적 스톱로스를 사용하여 트렌드를 추적합니다.

코드 설정 Stochastic의 높이는 1080이고, 낮이는 1020이며, Stochastic의 중간값은 그 사이에 평평한 간격이다. Stochastic이 구매/판매 신호를 생성할 때, 코드는 OTT 지표에 따라 신호의 유효성을 판단한다. 가격이 OTT 평균선을 위쪽으로 통과하면 구매 신호가 발송되며, 가격이 OTT 평균선을 아래로 통과하면 판매 신호가 발송된다.

이 조합은 스토카스틱을 사용하여 과매매를 판단하고 진입 신호를 발송합니다. OTT는 트렌드를 추적하고, 너무 강한 진동 상황을 막기 위해 손실 필터를 사용하는 가짜 신호를 사용하여 신호의 정확도와 변동을 최적화합니다.

우위 분석

이 전략은 스토카스틱과 OTT 지표의 조합을 사용하여 다음과 같은 몇 가지 측면을 최적화합니다.

  1. 신호의 정확도가 향상되었다. 스토카스틱은 과매매를 판단하고, OTT는 진동으로 인한 가짜 신호를 제거한다.
  2. 전략의 변동성을 낮추었다. 동적 스톱로드를 통해 이번 손실을 제한하고, 많은 가짜 돌파구를 필터링했다.
  3. 주식 시장의 큰 트렌드를 효과적으로 파악한다. 스토카스틱은 기본 신호를 주고, OTT는 큰 트렌드를 추적한다.
  4. 과도한 신호 간섭을 줄인다. 신호 품질을 높이는 동시에 쓸모없는 신호를 줄인다.
  5. 수량화 동적 스톱 손실 설정. 질적 손해를 보장하여 전략 변동률을 더 낮춰줍니다.
  6. 이 시스템은 추세와 과매매 지표를 결합한다. 이 두 가지 지표를 사용하여 서로의 단점을 최적화한다.

종합적으로 볼 때, 이 전략은 OTT를 사용하여 스토카스틱 신호를 필터링하여 신호 품질과 전략 수익을 효과적으로 향상시키며, 거래 수와 전략 변동성을 줄여서, 경향에 가까운, 낮은 위험과 높은 수익의 효과를 얻었습니다.

위험 분석

  • 이 전략의 적용 범위는 비교적 좁습니다. 주로 명백한 추세가있는 주식에 적용됩니다. 가격 변동이 큰 주식이나 주가가 흔들림에 처한 주식의 영향은 작습니다.
  • 전적으로 기술적인 측면에 의존한다. 전략은 주식의 기본적 측면과 시장의 거시적인 측면을 고려하지 않고, 약간의 맹목성이 존재한다.
  • 매개 변수 설정이 민감하다. 스토카스틱과 OTT의 여러 매개 변수는 전문적인 조정이 필요하며, 그렇지 않으면 전략의 수익성에 영향을 미칩니다.
  • 스톱 손실은 너무 느리고, 잠재적인 손실을 감수하고, 추가적인 최적화가 필요합니다.
  • 허위 돌파와 진동상태에서는 일정 손실과 신호 간섭이 발생할 수 있다. 판단 조건과 중지 손실 조건이 수정될 필요가 있다.

위와 같은 위험에는 다음과 같은 개선방안이 있습니다.

  1. 다른 카테고리의 주식에 따라 다른 파라미터 조합을 사용한다.
  2. “기본과 언론이 결합되어 신호를 강화한다”.
  3. 최적화 테스트를 통해 최적의 설정을 찾습니다.
  4. 이동성 손실을 도입하여 위험을 더 낮출 수 있습니다.
  5. 판단 조건을 수정하고, 더 엄격한 신호 확인 메커니즘을 적용한다.

최적화 방향

이 전략은 다음의 몇 가지 측면에서 더욱 개선될 수 있습니다.

  1. 다른 시장과 주식 종류에 따라 변수를 조정한다. 현재 기본값은 일반적이며, 다른 주식마다 개별적으로 테스트하여 최적의 변수 조합을 찾을 수 있다.

  2. 스톱 메커니즘과 모바일 스톱을 도입한다. 현재는 다이내믹한 고정 스톱이 적용되고 있으며, 손실과 수익을 동적으로 추적할 수 없다. 전략적 위험과 수익을 더 제어하기 위해 모바일 스톱과 스톱을 도입하는 테스트가 가능하다.

  3. 최적화 신호 판단 논리. 현재 판단 논리는 간단하고, 가격의 상하 돌파는 직접적으로 구매 및 판매 신호를 표시한다. 신호의 신뢰성을 보장하기 위해 더 많은 지표와 가격 형태 판단을 결합하는 것을 고려할 수 있다.

  4. 포지션 개시 조건과 필터링 메커니즘을 추가한다. 현재 전략은 각 신호를 무차별적으로 처리한다. 양력 지표, 거래량 지표 등의 포지션 개시 조건을 도입하고, 가짜 신호를 필터링하기 위해 특정 신호 시간 창을 추가할 수 있다.

  5. 다양한 지표와 OTT의 결합을 테스트한다. 현재는 Stochastic과 OTT의 조합이 사용된다. MACD, RSI 등 다른 지표와 OTT의 결합 효과를 테스트할 수 있다.

  6. 융합자금관리 및 포지션관리 모듈. 현재는 자금관리 및 포지션 제어 장치가 없으며, 전적으로 스톱로스에 의존한다. 개별 및 전체 위험을 더욱 제어하기 위해 다양한 유형의 자금관리 및 포지션 관리 방법을 테스트 할 수 있다.

요약하다

량화의 빛 Stochastic과 OTT 지표가 유기적으로 결합된 수치화 전략이다. 그것은 두 지표의 상호 보완적 장점을 활용하여 신호의 정확도를 높이고, 큰 트렌드를 효과적으로 포착하면서도 위험을 줄인다.

이 전략은 오류율이 낮고, 신호가 뚜렷하고, 변동성이 적다는 장점이 있다. 신호의 신뢰성을 강화하고, 스톱로스 수준을 최적화하고, 거래 빈도를 낮추는 것이 추천되는 양적 전략이다.

동시에, 이 전략에는 개선의 여지가 있습니다. 매개 변수 최적화, 손해 방지 장치의 개선, 신호 및 필터링 장치의 강화와 같은 수단으로이 전략이 더 안정적이고 자동화되고 지능화되는 방향으로 발전 할 수 있습니다. 이것은 우리의 후속 작업 목표입니다.

전략 소스 코드
/*backtest
start: 2023-12-27 00:00:00
end: 2024-01-03 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic
//created by: @Anil_Ozeksi
//developer: ANIL ÖZEKŞİ
//author: @kivancozbilgic


strategy(title="Stochastic Optimized Trend Tracker", shorttitle="SOTT", format=format.price, precision=2)
periodK = input(250, title="%K Length", minval=1)
smoothK = input(50, title="%K Smoothing", minval=1)
src1 = input(close, title="Source")
length=input(3, "OTT Period", minval=1)
percent=input(0.618, "OTT Percent", type=input.float, step=0.1, minval=0)
showsupport = input(title="Show Support Line?", type=input.bool, defval=false)
showsignalsc = input(title="Show Stochastic/OTT Crossing Signals?", type=input.bool, defval=false)
Var_Func1(src1,length)=>
    valpha1=2/(length+1)
    vud11=src1>src1[1] ? src1-src1[1] : 0
    vdd11=src1<src1[1] ? src1[1]-src1 : 0
    vUD1=sum(vud11,9)
    vDD1=sum(vdd11,9)
    vCMO1=nz((vUD1-vDD1)/(vUD1+vDD1))
    VAR1=0.0
    VAR1:=nz(valpha1*abs(vCMO1)*src1)+(1-valpha1*abs(vCMO1))*nz(VAR1[1])
VAR1=Var_Func1(src1,length)
k = Var_Func1(stoch(close, high, low, periodK), smoothK)
src=k+1000
Var_Func(src,length)=>
    valpha=2/(length+1)
    vud1=src>src[1] ? src-src[1] : 0
    vdd1=src<src[1] ? src[1]-src : 0
    vUD=sum(vud1,9)
    vDD=sum(vdd1,9)
    vCMO=nz((vUD-vDD)/(vUD+vDD))
    VAR=0.0
    VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
VAR=Var_Func(src,length)
h0 = hline(1080, "Upper Band", color=#606060)
h1 = hline(1020, "Lower Band", color=#606060)
fill(h0, h1, color=#9915FF, transp=80, title="Background")
plot(k+1000, title="%K", color=#0094FF)
MAvg=Var_Func(src, length)
fark=MAvg*percent*0.01
longStop = MAvg - fark
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop =  MAvg + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
MT = dir==1 ? longStop: shortStop
OTT=MAvg>MT ? MT*(200+percent)/200 : MT*(200-percent)/200 
plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Support Line")
OTTC = #B800D9 
pALL=plot(nz(OTT[2]), color=OTTC, linewidth=2, title="OTT", transp=0)
alertcondition(cross(src, OTT[2]), title="Price Cross Alert", message="OTT - Price Crossing!")
alertcondition(crossover(src, OTT[2]), title="Price Crossover Alarm", message="PRICE OVER OTT - BUY SIGNAL!")
alertcondition(crossunder(src, OTT[2]), title="Price Crossunder Alarm", message="PRICE UNDER OTT - SELL SIGNAL!")
buySignalc = crossover(src, OTT[2])
plotshape(buySignalc and showsignalsc ? OTT*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
sellSignallc = crossunder(src, OTT[2])
plotshape(sellSignallc and showsignalsc ? OTT*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)

dummy0 = input(true, title = "=Backtest Inputs=")
FromDay    = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth  = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear   = input(defval = 2005, title = "From Year", minval = 2005)
ToDay      = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToMonth    = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear     = input(defval = 9999, title = "To Year", minval = 2006)
Start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)
Finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)
Timerange() =>
    time >= Start and time <= Finish ? true : false
if buySignalc
    strategy.entry("Long", strategy.long,when=Timerange())
if sellSignallc
    strategy.entry("Short", strategy.short,when=Timerange())