모멘텀을 기반으로 한 양적 추세 추종 전략


생성 날짜: 2024-01-19 15:29:35 마지막으로 수정됨: 2024-01-19 15:29:35
복사: 2 클릭수: 618
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

모멘텀을 기반으로 한 양적 추세 추종 전략

개요

이 전략은 해상선 수준의 해파리 아시 K 선에 기반하여, 다른 주기적 차원의 동력 분석과 결합하여, 동적으로 현재의 주식 가격 뒤에 있는 지지력을 결정하여, 상장 및 상장의 시기를 판단한다.

전략 원칙

  1. 다양한 주기적 차원의 해파리 아히 K선의 종결값을 계산한다. 이것은 후속 동력 계산의 기초이다.

  2. 월선과 일선에 대한 개시 가격과 다른 역사 주기에서 개시 가격의 상승과 하락을 각각 계산한다. 이것은 현재의 주가 가격에 대한 동력 강도를 반영한다.

  3. 달선과 태양선의 동력 상승과 하락률을 각각 평균하여 일부 소음을 필터링하여 안정적인 달선, 태양선 동력 에너지 지표를 얻는다.

  4. 평균 동력 상승 하락에 따라, 현재 주가에서 반영 가능한 시장 지지력을 계산할 수 있다. 즉, 시장 변동의 영향을 제거한 가격이다. 이 가격은 현재 실제 주가에서 동력 임계로 볼 수 있다.

  5. 종결 가격이 동력 문턱보다 높을 때, 매달 더 많은 상장을 한다. 종결 가격이 동력 문턱보다 낮을 때, 평상시 상장을 중지한다.

우위 분석

이 전략의 가장 큰 장점은 단순히 주식 가격을 따라가는 것이 아니라, 주식 가격의 뒤에 있는 동력에 기반하여 실제 지지력을 계산하여 포지션을 세우고 손실을 막는 것이다. 이것은 흔들리는 상황의 잡음을 효과적으로 필터링하여 안정적인 상승 기회를 잠금 할 수 있다.

또한, 전략에 기반한 데이터는 모두 해산 아쉬 K선에서 나온다. 이 특별한 K선 자체는 연결주기에 과도하게 의존하는 문제를 줄일 수 있다. 따라서 전략의 안정성은 다른 K선 전략보다 더 좋다.

위험 분석

이 전략의 가장 큰 위험은 동력 계산이 역사 가격에 기반한다는 것입니다. 회사의 기본 사항과 상황이 크게 변하면 역사 가격의 대표성이 떨어지며, 이로 인해 입점 및 손실 판단이 편향됩니다.

또한, 전략은 월과 일간 주기 (月日周期) 를 사용한다. 이것은 전략의 실시간성이 높지 않으며, 시장의 급격한 변화에 빠르게 반응할 수 없다. 이것은 시장의 변동이 있을 때 손실을 막는 위험을 초래한다.

이러한 위험을 줄이기 위해, 더 높은 빈도의 데이터를 도입하고, 회사의 기본 사항에 대한 실시간 피드백을 고려할 수 있습니다. 또는 다른 더 주관적인 거래 신호와 결합하여 수락 및 최적화 할 수 있습니다.

최적화 방향

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

  1. 해안 아키 K선 자체는 무게 배치를 조정하는 등 추가적으로 최적화 될 수 있습니다.

  2. 더 많은 다양한 주기 데이터를 추가하여 지수 평균 동력 평가 메커니즘을 구축하여 안정성을 향상시킵니다.

  3. 전략의 실시간성을 높이기 위해 일일, 분기선과 같은 더 높은 주파수 데이터를 도입한다.

  4. 실적 예고, 재구성 루머 등의 정보와 결합하여, 동력 계산은 회사의 기본 사항에 대한 피드백을 추가한다.

  5. 월간 창고 구축에 기초하여, 일간 또는 주간을 증가시키는 정지 및 부가 창고 메커니즘을 고려할 수 있다.

요약하다

이 전략은 전체적으로 매우 안정적이며, 동력 추적을 통해 위험을 효과적으로 제어한다. 그것의 가장 큰 장점은 주식 가격 뒤에 있는 동력량을 사용하여 실제 상황을 판단하는 데 있다. 단순히 주식 가격 자체를 따라가는 것이 아니다. 다음 단계는 더 많은 주파수와 더 풍부한 정보를 도입함으로써 이 전략을 더 최적화하여 시장 기회를 더 잘 잡을 수 있다.

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

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FrancoPassuello

//@version=5
strategy("Heiken Ashi ADM", overlay=true)
haClose = (open + high + low + close) / 4
// prevHaOpen = line.new(na, na, na, na, width = 1)
haOpen = (open[1] + close[1]) / 2
// line.set_xy1(prevHaOpen, bar_index[1], nz(haOpen[1]))
// line.set_xy2(prevHaOpen, bar_index, haClose[1])


[monopen, _1monopen, _2monopen, _3monopen, _4monopen, _5monopen, _6monopen] = request.security(syminfo.tickerid, "M", [haOpen, haOpen[1], haOpen[2], haOpen[3], haOpen[4], haOpen[5], haOpen[6]] , barmerge.gaps_off, barmerge.lookahead_on)
[monclose, _1monclose, _3monclose, _6monclose] = request.security(syminfo.tickerid, "M", [haClose, haClose[1], haClose[3], haClose[6]] , barmerge.gaps_off, barmerge.lookahead_on)
[dayclose1, _21dayclose, _63dayclose, _126dayclose, dayclose] = request.security(syminfo.tickerid, "1D", [haClose[1], haClose[21], haClose[63], haClose[126], haClose], barmerge.gaps_off, barmerge.lookahead_on)
[dayopen1, _21dayopen, _63dayopen, _126dayopen] = request.security(syminfo.tickerid, "1D", [haOpen[1], haOpen[21], haOpen[63], haOpen[126]], barmerge.gaps_off, barmerge.lookahead_on)


get_rate_of_return(price1, price2) =>
    return_ = (price1/price2 -1)*100
    return_

m0 = get_rate_of_return(monclose, monopen)
m1 = get_rate_of_return(_1monclose, _1monopen)
m2 = get_rate_of_return(monclose, _2monopen)
m3 = get_rate_of_return(_1monclose, _3monopen)
m4 = get_rate_of_return(monclose, _4monopen)
m5 = get_rate_of_return(monclose, _5monopen)
m6 = get_rate_of_return(_1monclose, _6monopen)
MS = (m1 + m3 + m6)/100
CS = (m0 + m2 + m5)/100

d1 = get_rate_of_return(dayclose1, _21dayopen)
d2 = get_rate_of_return(dayclose1, _63dayopen)
d3 = get_rate_of_return(dayclose1, _126dayopen)
DS = (d1 + d2 + d3)/100

//Last (DAILY)
lastd_s_avg1 = DS/3

lastd_Approximate1 = dayclose1*(1-lastd_s_avg1)

last_approx1_d21 = lastd_Approximate1 / _21dayopen-1
last_approx1_d63 = lastd_Approximate1 / _63dayopen-1
last_approx1_d126 = lastd_Approximate1 / _126dayopen-1

lastd_s_avg2 = (last_approx1_d21 + last_approx1_d63 + last_approx1_d126) / 3
lastd_approximate2 = (dayclose1)*(1-(lastd_s_avg1 + lastd_s_avg2))
lastd_price = lastd_approximate2

//plot(lastd_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold")

//Last

last_s_avg1 = MS/3

last_Approximate1 = _1monclose*(1-last_s_avg1)

last_approx1_m1 = last_Approximate1 / _1monopen-1
last_approx1_m3 = last_Approximate1 / _3monopen-1
last_approx1_m6 = last_Approximate1 / _6monopen-1

last_s_avg2 = (last_approx1_m1 + last_approx1_m3 + last_approx1_m6) / 3
last_approximate2 = (_1monclose)*(1-(last_s_avg1 + last_s_avg2))
last_price = last_approximate2
Scoring_price = _1monclose*(1-CS)

plot(last_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold")
//plot(Scoring_price,color = color.rgb(234, 0, 255, 14), title = "Last momentum threshold")

//Long based on month close and being the first trade of the month.

var int lastClosedMonth = -1
limit_longCondition = _1monclose > last_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth)

// Long based on day close and being the first trade of the month.
limit_Dlongcondition = dayclose1 > lastd_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth)

// Close trade based on day close

DCloseLongCondition = dayclose1<lastd_approximate2

//Old standard Trading rules
longCondition = _1monclose > Scoring_price
MCloseLongCondition = _1monclose<Scoring_price
shortCondition = CS < 0

if (longCondition)
    strategy.entry("Long", strategy.long)


if (strategy.position_size > 0 and MCloseLongCondition)
    strategy.close("Long")
    lastClosedMonth := month(time)