유동성 추세에 기반한 양적 거래 전략


생성 날짜: 2023-12-21 10:19:52 마지막으로 수정됨: 2023-12-21 10:19:52
복사: 0 클릭수: 701
avatar of ChaoZhang ChaoZhang
1
집중하다
1623
수행원

유동성 추세에 기반한 양적 거래 전략

개요

이 전략은 유동성 동원 트렌드 전략이라고 불리는데, 그 목적은 서로 다른 시간 주기에서의 가격 트렌드 방향을 식별하고 그에 따라 구매 또는 판매 결정을 내리는 것이다. 이 전략은 쌍평등 시스템 사용으로 트렌드를 판단하고, 다중 시간 프레임에 대한 가격 차이 상대 강도 지수 (RSI) 를 활용하여 트렌드 변화가 있을 때 신속하게 반응한다.

전략 원칙

이 전략의 핵심 논리는 CHOP 지표에 기반을 두고 있으며, 여기에는 변동 평균 시스템이 큰 트렌드 방향을 판단한다. 구체적으로, 전략은 고주기 시간 프레임에서 빠른 선 (Length=20) 과 느린 선 (Length=50) 의 RSI 값을 계산하고, 둘 사이의 차이를 계산한다. 빠른 선의 RSI 상에서 느린 선의 RSI를 통과하면 낙관적이라고 판단되며, 다중 신호를 형성한다. 반대로, 빠른 선의 RSI 아래에서 느린 선의 RSI를 통과하면 낙관적이라고 판단하고, 공백 신호를 형성한다. 가격 상승과 하락에 따라 변화하는 RSI 차이는 민감한 지점으로 추세 변화를 판단할 수 있다.

이 전략은 또한 다중 시간 프레임 판단을 도입합니다: 더 높은 수준의 주기 (예: 일선) 에서 RSI 차이를 계산하여 전반적인 트렌드 방향을 판단합니다. 더 높은 수준의 주기 판단 결과에 따라 더 낮은 수준의 주기 (예: 5 분 라인) 에서 특정 구매 및 판매를 수행합니다. 이러한 다중 시간 프레임의 조합은 고 주기 트렌드 판단을 고려하고 저 주기 운영의 유연성을 고려합니다.

전략적 이점

  • RSI 차이는 잠재적인 트렌드 반전, 사전에 반응, 민감한
  • 다중 시간 프레임 사고를 적용, 고주기 판단 경향, 저주기 동작 실행
  • RSI 지표는 가격과 거래량의 변화를 반영하며 시장의 유동성과 참여 열기를 반영합니다.
  • 간단한 파라미터 설정, 이해하기 쉽고, 설명 가능하며, 조정 가능

전략적 위험과 해결

  • 쌍평선 판정에서 가짜 돌파구가 발생할 수 있습니다.
  • 실패한 돌파는 불필요한 손실을 초래할 수 있습니다.

해결책:

  1. 평균선 변수를 조정하여 가짜 돌파 가능성을 낮춘다
  2. 필터링을 강화하여 불필요한 입원을 방지합니다.

전략 최적화 방향

  • Kalman Filter 알고리즘을 사용하여 RSI 파라미터를 최적화
  • MACD와 같은 지표가 추가됩니다.
  • 거래량 변화와 함께 동적 출구 위치를 설정

요약하다

이 전략은 RSI 차수를 사용하여 잠재적인 트렌드 변화를 판단하여 민감한 전환점을 포착합니다. 다중 시간 프레임의 사용은 큰 트렌드에 대한 판단을 보장하고 특정 거래에 대한 거래가 더 유연합니다. 다른 트렌드 추적 전략에 비해이 전략은 더 간단합니다.

전략 소스 코드
/*backtest
start: 2023-11-19 00:00:00
end: 2023-12-19 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Flow Trend Indicator Strategy", "FlowTI", overlay=true, calc_on_every_tick=true)

isTimeFrame(timeFrame) =>
    timeFrame == timeframe.period ? true : false

Htf() =>
    isTimeFrame("12") ? "60" : isTimeFrame("60") ? "300" : isTimeFrame("300") ? "D" : isTimeFrame("D") ? "W" : isTimeFrame("W") ? "M" : isTimeFrame("M") ? "5M" : "D"

TrendIndication() =>
    trendFastLength = 20
    trendSlowLength = 50
    upFastHtf = request.security(syminfo.tickerid, Htf(), rma(max(change(close), 0), trendFastLength), barmerge.gaps_off, barmerge.lookahead_on)
    downFastHtf = request.security(syminfo.tickerid, Htf(), rma(-min(change(close), 0), trendFastLength), barmerge.gaps_off, barmerge.lookahead_on)
    rsiFastHtf = downFastHtf == 0 ? 100 : upFastHtf == 0 ? 0 : 100 - (100 / (1 + upFastHtf / downFastHtf))
    upSlowHtf = request.security(syminfo.tickerid, Htf(), rma(max(change(close), 0), trendSlowLength), barmerge.gaps_off, barmerge.lookahead_on)
    downSlowHtf = request.security(syminfo.tickerid, Htf(), rma(-min(change(close), 0), trendSlowLength), barmerge.gaps_off, barmerge.lookahead_on)
    rsiSlowHtf = downSlowHtf == 0 ? 100 : upSlowHtf == 0 ? 0 : 100 - (100 / (1 + upSlowHtf / downSlowHtf))
    rsiDiff = rsiFastHtf - rsiSlowHtf
    crossover(rsiDiff, 0) ? true : crossunder(rsiDiff, 0) ? false : na

if (TrendIndication() == true)
    strategy.entry("Long", strategy.long)

if (TrendIndication() == false)
    strategy.entry("Short", strategy.short)