스토카스틱 모멘텀 전략

저자:차오장, 날짜: 2024-01-22 10:13:23
태그:

img

전반적인 설명

스토카스틱 모멘텀 전략 (Stochastic Momentum Strategy) 은 스토카스틱 모멘텀 지수 (SMI) 와 상대적 강도 지수 (RSI) 를 결합한 양적 거래 전략이다. 빠른 RSI가 신호 필터로 작용하여 시장의 과반 구매 및 과반 판매 지역을 식별하기 위해 SMI를 사용합니다. 또한 더 신뢰할 수있는 신호 선택을 위해 신체 필터를 구현합니다.

전략 원칙

스토카스틱 모멘텀 인덱스

스토카스틱 모멘텀 인덱스 (STOCHASTIC IMMENTUM INDEX, SMI) 는 양적 거래에서 사용되는 일반적인 기술 지표로 모멘텀 및 오스실레이션 지표의 강점을 결합합니다.

특히 SMI는 다음과 같이 계산됩니다.

SMI = (Close - (HH + LL) /2)/(0.5*(HH - LL)) * 100

여기 HH는 지난 N일 동안 가장 높은 가격이고 LL는 가장 낮은 가격입니다.

따라서 SMI는 트렌드를 따르는 운동량 판단과 변동의 역량 판단을 모두 포함합니다. 80 이상의 값은 과소매로 간주되며 20 이하의 값은 과소매로 간주됩니다. SMI가 이러한 과소매 또는 과소매 수준에 도달하면 전략은 거래 신호를 생성합니다.

빠른 RSI

상대적 강도 지수 (RSI) 는 표준 과잉 구매/ 과잉 판매 지표입니다. 이 전략은 단기 과잉 구매/ 과잉 판매 상황을 판단하기 위해 7 기간의 빠른 RSI를 사용합니다.

20 이하의 판독은 과판된 것으로 간주되며, 80 이상의 판독은 급속한 RSI에 따라 과반된 것으로 간주됩니다. 이 문턱이 위반되면 신호가 생성됩니다.

몸 필터

이 전략은 또한 특정 신호를 필터하기 위해 촛불체 크기를 확인하여 몸 필터를 구현합니다. 설정된 임계치를 초과하는 몸만이 거래를 유발합니다.

이것은 일부 잘못된 신호를 필터링하고 신뢰성을 높입니다.

장점

다중 지표 조합

이 접근법은 SMI, 빠른 RSI 및 바디 필터를 강력한 3부 시스템으로 결합합니다. 여러 통합 신호를 사용하여 정확도를 향상시키고 안정성을 향상시킵니다.

과잉 구매/대량 판매를 탐지

SMI와 빠른 RSI 모두 고갈된 트렌드를 탐지하는 데 탁월합니다. 이러한 과장된 영역에서 평균 반전을 거래함으로써 전략은 낮게 구매하고 높게 판매합니다.

양방향 거래

하락과 짧은 상승을 동시에 구매할 수 있는 능력은 시장 조건에서 기회를 극대화시킵니다.

위험 관리

보디 필터는 격동 상태에서 낮은 단속 신호를 거부함으로써 윙사 (wipssaws) 를 피합니다.

위험성

윙사

자주 긴 / 짧은 전환은 윙사 위험을 가져옵니다. 논리를 최적화하면 이것을 최소화 할 수 있습니다.

붐비는 무역

신호는 시장 참여자를 그룹화하여 진입 시 빠른 반전을 유발할 수 있습니다. 미세 조정 매개 변수는 양떼 위험을 줄일 수 있습니다.

검은 백조

극단적인 사건은 모든 모델을 뒤집을 수 있습니다. 체계적인 위험을 통제하기 위해 지능적인 스톱 손실이 필요합니다.

개선

매개 변수 최적화

다른 SMI/RSI 기간과 신체 필터 임계값을 테스트하면 더 높은 수익을 위한 최적값을 밝혀낼 수 있습니다.

동적 정지

변동성 기반 또는 ATR 중단을 포함하면 포지션 및 포트폴리오 위험을 더 잘 포함 할 수 있습니다.

기계 학습

미래 지표 수준을 예측하는 모델은 전환점을 더 일찍 식별할 수 있습니다. 이것은 예측 능력을 향상시킬 것입니다.

결론

요약하자면, SMI, 빠른 RSI 및 몸 필터를 통합함으로써이 전략은 상당히 포괄적 인 과반 구매 / 과반 판매 시스템을 만들었습니다. 멀티 신호 접근 방식은 정확성을 향상시키며 양방향 거래 능력과 위험 통제는 균형에 기여합니다. 지속적인 매개 변수 및 모델 최적화로 장기적으로 이익을 얻는 것을 약속합니다.


/*backtest
start: 2023-12-22 00:00:00
end: 2024-01-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.1", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(5, "SMI Percent K Length")
b = input(3, "SMI Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2017, defval = 2017, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Fast RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
avgrel = ema(ema(rdiff,b),b)
avgdiff = ema(ema(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMIsignal < -1 * limit and close < open and body and usesmi
dn1 = SMIsignal > limit and close > open and body and usesmi
up2 = fastrsi < 20 and close < open and body and usersi
dn2 = fastrsi > 80 and close > open and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

더 많은