JiaYiBing 양적 트렌드 동력 거래 전략

저자:차오장, 날짜: 2024-03-08 15:40:05
태그:

img

전반적인 설명

JiaYiBing 양적 트렌드 모멘텀 트레이딩 전략 (Quantitative Trend Momentum Trading Strategy) 은 트렌드 추적, 모멘텀 지표 및 볼링거 밴드 채널을 결합한 장기 단기 양적 트레이딩 전략이다. 이 전략은 트렌드 방향을 결정하기 위해 빠르고 느린 이동 평균의 교차를 사용하여 볼링거 밴드 채널 및 모멘텀 지표에 기반한 입시 신호를 확인합니다. 이 전략에는 또한 수익 취득, 손실 중지, 트레일링 스톱 및 포지션 사이징과 같은 위험 통제 조치가 포함되어 있습니다.

전략 원칙

이 전략의 핵심 원칙은 가격 추세와 추진력 효과를 활용하여 시장 기회를 포착하는 것입니다. 구체적으로, 전략은 가격 트렌드의 방향을 결정하기 위해 서로 다른 기간 (고속 및 느린) 을 가진 두 개의 이동 평균을 사용합니다. 빠른 이동 평균이 느린 이동 평균보다 높을 때 상승 추세를 나타내고 전략은 긴 신호를 생성합니다. 반대로 빠른 이동 평균이 느린 이동 평균보다 낮을 때 하락 추세를 나타내고 전략은 짧은 신호를 생성합니다.

트렌드 및 엔트리 타이밍을 더욱 확인하기 위해 전략에는 볼링거 밴드 및 모멘텀 지표가 포함되어 있습니다. 볼링거 밴드는 세 개의 라인으로 구성됩니다. 중간 라인은 이동 평균이며 상위 및 하부 밴드는 중간 라인의 위와 아래의 일정 수의 표준 편차입니다. 가격이 상위 볼링거 밴드 이상으로 넘으면 높은 상승 동력을 나타내고 전략이 길게 갈 것입니다. 가격이 하위 볼링거 밴드 아래에 넘으면 강한 하향 동력을 나타내고 전략이 짧게 갈 것입니다.

또한 전략은 동력 지표를 도입하여 현재 가격을 특정 기간 전 가격과 비교하여 가격 변화 속도를 측정합니다. 동력 지표는 트렌드의 힘을 판단하고 진입에 대한 추가 확인을 제공하기 위해 사용될 수 있습니다.

포지션 사이즈 측면에서 전략은 계정 자본과 위험 선호도에 따라 포지션 크기를 설정 할 수 있습니다. 동시에 전략에는 각 거래의 위험 노출을 제어하기 위해 수익을 취하고 손실을 중지하고 후속 중지 메커니즘도 포함됩니다.

전체적으로, JiaYiBing 양적 트렌드 모멘텀 거래 전략은 안정적인 투자 수익을 달성하기 위해 트렌드 추적, 모멘텀 확인 및 위험 관리와 같은 여러 차원을 통해 위험을 엄격하게 통제하면서 트렌드 시장 기회를 포착하고자합니다.

이점 분석

  1. 트렌드 추적: 전략은 트렌드 가격 기회를 잡기 위해 빠르고 느린 이동 평균의 교차를 사용하여 다른 시장 조건에 적응하여 상승 추세에서 길고 하락 추세에서 짧을 수 있습니다.

  2. 모멘텀 확인: 트렌드의 2차 확인으로 모멘텀 지표를 도입하면 잘못된 신호를 필터링하고 입시 품질을 향상시킵니다.

  3. 볼링거 밴드 지원 의사결정: 볼링거 밴드는 가격 변동 범위를 반영 할 수 있으며 볼링거 밴드의 브레이크오웃은 트렌드 가속화 또는 비정상적인 가격 변동의 신호로 간주되어 진입에 대한 기준을 제공합니다.

  4. 포지션 사이징: 전략은 계좌 자본의 비율과 최대 한도를 기반으로 하는 포지션 사이징 방법을 사용하며 각 거래에 사용 된 자본의 유연한 통제를 허용하며 자금을 완전히 활용하고 과도한 위험 노출을 피합니다.

  5. 이윤을 취하고 손실을 중지하십시오: 전략 세트는 수익을 취하고, 손실을 중지하고, 예상 방향으로 가격이 움직일 때 이익을 보호하고, 가격이 역전되면 손실을 결정적으로 절감하여 각 거래의 최대 손실을 효과적으로 제어 할 수 있습니다.

  6. 다중 매개 변수 최적화: 전략은 이동 평균 기간, 볼링거 밴드 매개 변수, 수익률 및 스톱 손실 비율 등과 같은 여러 가지 조정 가능한 매개 변수를 포함하며, 전략의 적응력과 견고성을 향상시키기 위해 최적화 할 수 있습니다.

위험 분석

  1. 빈번한 거래: 이 전략은 이동 평균 크로스오버와 볼링거 밴드 브레이크오버를 기반으로 엔트리 신호를 생성합니다. 시장의 변동성이 높을 때, 과도한 거래 빈도와 증가 수수료 및 미끄러짐 비용을 초래하는 거래 신호를 자주 생성 할 수 있습니다.

  2. 매개 변수 민감성: 전략은 이동 평균 기간, 추진 기간, 볼링거 밴드 매개 변수 등 여러 매개 변수를 포함합니다. 다른 매개 변수 선택은 전략의 성능에 상당한 영향을 줄 수 있습니다. 매개 변수가 올바르게 선택되지 않으면 나쁜 전략 성능으로 이어질 수 있습니다.

  3. 후진 트렌드 인식: 이동 평균은 후진 지표입니다. 특히 이동 평균 기간이 길어지면 트렌드 반전을 식별하는 속도가 느려지고 가장 좋은 입시 시기를 놓칠 수 있습니다.

  4. 스톱 로스 위험: 전략은 스톱 로스 조치를 설정하지만 극심한 시장 조건 (빠른 격차와 같이) 에서 가격은 직접 스톱 로스 수준을 넘어서 실제 손실이 예상보다 높을 수 있습니다.

  5. 집중된 포지션 위험: 전략이 일정 기간 동안 같은 방향으로 신호를 지속적으로 생성하면 한 방향으로 포지션이 과도하게 집중되어 더 큰 포지션 위험에 직면 할 수 있습니다.

  6. 유동성 위험: 백테스팅 및 실시간 거래에서 전략의 성능은 시장 유동성에 영향을 받을 수 있습니다. 특히 큰 펀드와 거래할 때, 유동성 저하와 거래량이 충분하지 않을 수 있습니다.

최적화 방향

  1. 더 많은 기술 지표를 도입: 현재 이동 평균, 추진력 및 볼링거 밴드를 기반으로, RSI 및 MACD와 같은 더 많은 기술 지표를 도입하여 멀티 지표 확인을 통해 신호의 신뢰성을 향상시킬 수 있습니다.

  2. 진입 및 출구 메커니즘을 최적화: 진입 및 출구 판단에 더 많은 조건을 도입할 수 있습니다. 예를 들어 가격 파기 전에 특정 거래량을 요구하거나 단계적 인 포지션 폐쇄 또는 출구에 수익을 취하는 것을 사용하여 전략의 유연성과 수익성을 높일 수 있습니다.

  3. 동적 매개 변수 조정: 이동 평균 기간, 운동 기간, 볼링거 밴드 매개 변수 등에 대해 매개 변수 적응 메커니즘 세트를 설계하여 다른 시장 상태와 변동성 수준에 따라 매개 변수 값을 동적으로 조정하여 전략의 적응성을 향상시킬 수 있습니다.

  4. 포지션 사이징을 개선합니다. 현재 포지션 사이징을 기반으로 더 발전된 돈 관리 방법, 예를 들어 켈리 기준, 고정 비율, 동적 자금 등이 더 나은 균형 수익과 위험을 위해 도입 될 수 있습니다.

  5. 기본 분석과 결합: 순수 기술 분석 전략은 시장의 비효율성 또는 실패의 위험에 직면 할 수 있습니다. 거시 경제 데이터 및 산업 동향과 같은 몇 가지 기본 요인이 기술 신호를 필터하고 확인하기 위해 결합 될 수 있다면 전략의 성능을 향상시킬 수 있습니다.

  6. 백테스팅과 라이브 트레이딩의 일관성을 향상: 백테스팅과 라이브 트레이딩의 전략의 성능은 다를 수 있습니다. 백테스팅 및 라이브 트레이딩의 실행 품질에 초점을 맞추는 것이 필요합니다. 실행 가격, 미끄러짐 및 지연과 같은 요소를 포함하여 라이브 성능과 백테스팅 결과의 일관성을 보장합니다.

요약

JiaYiBing 양적 트렌드 모멘텀 거래 전략은 여러 기술적 분석 방법을 통합 한 양적 거래 전략입니다. 트렌드를 포착하기 위해 이동 평균 크로스오버를 사용합니다.


/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('甲易炳', overlay=true)

// Parameters
trendPeriod = input(50, 'Trend Period')
momentumPeriod = input(14, 'Momentum Period')
bbPeriod = input(20, 'Bollinger Bands Period')
bbDeviation = input(2, 'Bollinger Bands Deviation')
fastMALen = input(23, 'Fast SMA Length')
slowMALen = input(50, 'Slow SMA Length')
longTakeProfitPerc = input.float(0.5, 'Long Take Profit %', minval=0.05, step=0.05) * 0.01
shortTakeProfitPerc = input.float(0.5, 'Short Take Profit %', minval=0.05, step=0.05) * 0.01
stopLossPerc = input.float(0.5, 'Stop Loss %', minval=0.05, step=0.05) * 0.01
enableTrailing = input.bool(true, 'Enable Trailing')
trailingTakeProfitPerc = input.float(0.01, 'Trailing Take Profit %', minval=0.01, maxval=100, step=0.01) * 0.01
trailingStopLossPerc = input.float(0.5, 'Trailing Stop Loss %', minval=0.05, step=0.05) * 0.01
qty_percent = input.int(20, 'Position Size %', step=1)
qty_cap = input.int(10000, 'Max Position Size', step=1000)
beast_mode = input.bool(false, 'Beast Mode')
set_cap = input.bool(true, 'Cap Position Size')
strategy.initial_capital = 50000
// Calculate position size
qty1 = (strategy.initial_capital + strategy.netprofit) * qty_percent / 10 / close
qty = (set_cap and qty1 > qty_cap) ? qty_cap : qty1

// Calculate moving averages
fastMA = ta.sma(close, fastMALen)
slowMA = ta.sma(close, slowMALen)

// Bollinger Bands
[upperBB, middleBB, lowerBB] = ta.bb(close, bbPeriod, bbDeviation)

// Entry conditions
buySignal = ta.crossover(close, fastMA) and close > upperBB
sellSignal = ta.crossunder(close, fastMA) and close < lowerBB

// Rampage mode entry conditions
if beast_mode
    buySignal := buySignal and fastMA > fastMA[2]
    sellSignal := sellSignal and fastMA < fastMA[2]

// Active positions
longIsActive = buySignal or strategy.position_size > 0
shortIsActive = sellSignal or strategy.position_size < 0

// Declare take profit and stop loss variables
var float longTakeProfitPrice = na
var float shortTakeProfitPrice = na

// Take profit and stop loss calculation
if longIsActive
    if buySignal and not (strategy.position_size > 0)
        longTakeProfitPrice := close * (1 + longTakeProfitPerc)
    else
        longTakeProfitPrice := nz(longTakeProfitPrice[1], close * (1 + longTakeProfitPerc))
if shortIsActive
    if sellSignal and not (strategy.position_size < 0)
        shortTakeProfitPrice := close * (1 - shortTakeProfitPerc)
    else
        shortTakeProfitPrice := nz(shortTakeProfitPrice[1], close * (1 - shortTakeProfitPerc))

longTrailingTakeProfitStepTicks = longTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick
shortTrailingTakeProfitStepTicks = shortTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick
longTrailingStopLossPrice = close * (1 - trailingStopLossPerc)
shortTrailingStopLossPrice = close * (1 + trailingStopLossPerc)

// Entries and exits
if strategy.position_size == 0
    strategy.entry('Long Entry', qty=qty, direction=strategy.long, when=buySignal, alert_message='Long Entry')
    strategy.entry('Short Entry', qty=qty, direction=strategy.short, when=sellSignal, alert_message='Short Entry')
    strategy.exit('Long Take Profit', 'Long Entry', loss=close * stopLossPerc / syminfo.mintick, limit=enableTrailing ? na : longTakeProfitPrice, trail_price=enableTrailing ? longTakeProfitPrice : na, trail_offset=enableTrailing ? longTrailingTakeProfitStepTicks : na, when=longIsActive, alert_message='Long Take Profit')
    strategy.exit('Short Take Profit', 'Short Entry', loss=close * stopLossPerc / syminfo.mintick, limit=enableTrailing ? na : shortTakeProfitPrice, trail_price=enableTrailing ? shortTakeProfitPrice : na, trail_offset=enableTrailing ? shortTrailingTakeProfitStepTicks : na, when=shortIsActive, alert_message='Short Take Profit')
else
    if longIsActive
        strategy.exit('Long Stop Loss', 'Long Entry', stop=longTrailingStopLossPrice, when=longIsActive)
    if shortIsActive
        strategy.exit('Short Stop Loss', 'Short Entry', stop=shortTrailingStopLossPrice, when=shortIsActive)

// Plotting
plot(fastMA, 'Fast SMA', color=color.blue, linewidth=1, style=plot.style_line)
plot(slowMA, 'Slow SMA', color=color.orange, linewidth=1, style=plot.style_line)
plot(upperBB, 'Upper BB', color=color.green, linewidth=1, style=plot.style_line)
plot(lowerBB, 'Lower BB', color=color.red, linewidth=1, style=plot.style_line)


더 많은