상대적 모멘텀 전략에 기반


생성 날짜: 2024-01-29 08:38:04 마지막으로 수정됨: 2024-01-29 08:38:04
복사: 0 클릭수: 722
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

상대적 모멘텀 전략에 기반

개요

상대적 동력 전략은 주식과 지수의 동력을 비교하여 주식의 대시장에 대한 강점을 판단합니다. 주식의 동력이 대시장보다 높을 때 구매하고, 주식의 동력이 대시장보다 낮을 때 판매하여 주식의 성장 정점을 포착합니다.

전략 원칙

이 전략은 주로 주식들의 대대적인 강점을 판단하는데, 구체적인 논리는 다음과 같다.

  1. 한 주식의 수익률을 한 주식의 동력으로 계산하는 방법
  2. 같은 기간에 대한 수익률을 계산하는 지수는 지수의 동력으로
  3. 한 주식 이동량과 지수 이동량을 계산하는 이동 평균 부드러운 처리가
  4. 개별 주식의 이동 평균에 지수 이동 평균을 착용하면 개별 주식의 움직임이 전체 지수보다 강하다고 생각하여 구매 신호가됩니다.
  5. 개별 주식의 움직임이 지수 움직임의 이동 평균 아래로 이동하면, 개별 주식의 움직임이 전체 지수보다 약하다고 생각하여 판매 신호가 됩니다.

이런 논리적인 판단을 통해 우리는 한 주식의 성장이 활발한 기간을 살 수 있고, 성장 동력이 쇠퇴할 때 그것을 팔 수 있으며, 성장의 최고 기간에 초과 수익을 확보할 수 있다.

우위 분석

상대적 동력 전략은 주로 다음과 같은 장점이 있다:

  1. 동적으로 주식 성장의 정점을 잡을 수 있고, 구체적인 상황을 신경쓰지 않고, 주식 성장이 큰 주식보다 빨리 성장하면 구매할 수 있습니다.
  2. 이동 평균 처리를 통해 단기 변동의 간섭을 필터링하여 신호의 신뢰성을 강화
  3. 간단하고 직접적인 구매와 판매 조건, 쉽게 이해할 수 있는 작업
  4. 상대 동력을 계산하는 자유로이 설정 가능한 시간 파라미터, 최적화 전략

위험 분석

상대적인 동력 전략에는 위험도 있습니다.

  1. 개인 주식 성장이 최고조에 도달한 후 회귀 조정이 발생할 수 있으며, 억제력이 부족할 위험이 있습니다.
  2. 상대적 동력 지표는 잘못된 신호를 줄 수 있으며, 인식된 성장의 최고점은 실제 최고점이 아닙니다.
  3. 최대 손실을 제어하기 위해 스톱을 설정해야 합니다.

이러한 위험은 합리적인 스톱 스톱 손실, 적절하게 조정된 파라미터 등의 방법으로 제어할 수 있다.

최적화 방향

상대적인 동력 전략은 다음과 같은 측면에서 최적화될 수 있다:

  1. 다른 동력 계산 시간 변수를 테스트하여 최적의 변수를 찾습니다.
  2. 다양한 유형의 이동 평균과 길이를 테스트하여 최적의 변수를 찾습니다.
  3. 거래량 지표 필터링을 추가하여 부적절한 양의 가짜 돌파구를 방지합니다.
  4. 다른 기술 지표와 함께 구매 시점을 확인합니다.

요약하다

상대적 동량 전략은 주식별 상대적으로 큰 주식의 성장 정점을 포착하여 초과 수익을 효과적으로 얻을 수 있다. 이 전략은 간단하고 명확한 구매 판매 논리, 작동 쉬운 장점이 있으며, 매개 변수 최적화 및 위험 제어로 더 나은 효과를 얻을 수 있다.

전략 소스 코드
/*backtest
start: 2024-01-21 00:00:00
end: 2024-01-28 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Relative Returns Strategy", overlay=false, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

index_ticker=input("BTC_USDT:swap")
Loopback = input(40, step=20)
useStopAndIndexReturns = input(true)
useStopAndIndexReturnsMa = input(true)

useDifference = not useStopAndIndexReturns

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
MALength = input(10, minval=10,step=10)

i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Backtest Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "Backtest End Time", type = input.time)
inDateRange = true

f_secureSecurity(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on)
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

index = f_secureSecurity(index_ticker, '1D', close, 0)
stock_return = (close - close[Loopback])*100/close
index_return = (index - index[Loopback])*100/index

stock_return_ma = f_getMovingAverage(stock_return, MAType, MALength)
index_return_ma = f_getMovingAverage(index_return, MAType, MALength)
relativeReturns = stock_return - index_return
relativeReturns_ma = f_getMovingAverage(relativeReturns, MAType, MALength)

plot(useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma : stock_return : na, title="StockReturn", color=color.green, linewidth=1)
plot(useStopAndIndexReturns ? useStopAndIndexReturnsMa ? index_return_ma : index_return : na, title="IndexReturn", color=color.red, linewidth=1)

plot(useDifference?relativeReturns:na, title="Relative-Returns", color=color.blue, linewidth=1)
plot(useDifference?relativeReturns_ma:na, title="MA", color=color.red, linewidth=1)

buyCondition = (useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma > index_return_ma : stock_return > index_return : relativeReturns > relativeReturns_ma)
closeBuyCondition = (useStopAndIndexReturns ? useStopAndIndexReturnsMa ? stock_return_ma < index_return_ma : stock_return < index_return : relativeReturns < relativeReturns_ma)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca")
strategy.close("Buy", when=closeBuyCondition)