확률론과 캔들스틱 패턴을 기반으로 한 자동 시장 반전 거래 전략

ATR Candlestick Patterns Stochastic Oscillator risk management Reversal Trading
생성 날짜: 2025-03-03 10:03:52 마지막으로 수정됨: 2025-03-03 10:03:52
복사: 4 클릭수: 484
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

확률론과 캔들스틱 패턴을 기반으로 한 자동 시장 반전 거래 전략 확률론과 캔들스틱 패턴을 기반으로 한 자동 시장 반전 거래 전략

개요

무작위 지표와 폭락 모드를 기반으로 한 자동화 시장 역전 거래 전략은 기술 분석에서 클래식 폭락 형태를 식별하고 무작위 지표 트렌드를 확인하는 양적 거래 시스템이다. 이 전략의 핵심 설계 아이디어는 시장의 중요한 역전 지점을 식별하여 과매 또는 과매 지역에서 잠재적인 트렌드 전환 기회를 잡는 것이다. 이 전략은 파인 스크립트를 사용하여 작성되었으며, TradingView 플랫폼에서 신호 생성, 위험 관리 및 차트 표기 기능을 포함한 전체 자동화 거래 프로세스를 구현했다. 이 전략은 여러 가지 클래식 폭락 형태를 식별할 수 있으며, 예를 들어, 줄의 유동적인 별 라인, 침몰 형태 및 별 개시 등과 같은 무작위 지표를 통해 트렌드를 확인하여 거래에 더 높은 신뢰성과 정확성을 제공합니다.

전략 원칙

이 전략은 두 가지 핵심 기술 원칙에 기초하고 있습니다. 붕괴 형태 인식과 트렌드 확인 필터링.

첫째, 다이 형태 인식에서, 전략은 정확한 수학 계산을 통해 K 선의 구조를 분석하고, 엔트리, 상도선 및 하도선의 비율 관계를 포함합니다. 시스템은 다양한 형태의 특성을 정량화하기 위해 일련의 매개 변수를 정의합니다. 예를 들어, 도선은 엔트리 길이의 두 배 이상의 하도선 길이가 필요하며, 엔트리는 전체 길이의 50%를 넘지 않습니다. 상도선은 거의 존재하지 않습니다. 전략 식별 형태는 다음과 같습니다.

  • 다중 머리 신호: ?? 子線 ((Hammer), 반사線 ((Inverted Hammer), 다중 머리 삼키기 형태 ((Bullish Engulfing) 와 다중 머리 시작 별 바닥 ((Tweezer Bottom))
  • 허공 신호: 상중선 (Hanging Man), 유성선 (Shooting Star), 허공 삼키기 형태 (Bearish Engulfing) 및 허공 시동 별 꼭대기 (Tweezer Top)

둘째, 전략은 무작위 지표 (((Stochastic) 를 트렌드 확인 도구로 도입하여 오버 바이 또는 오버 소드 영역에서만 역전 신호를 잡을 수 있도록 한다. 기한을 설정하여 (기본 80), 무작위 지표가 기한 영역보다 높을 때 오버 바이 영역으로 간주되며 (기준 부진 영역), 100- 기한 값보다 낮을 때 오버 소드 영역으로 간주된다 (기준 부진 영역). 전략은 또한 무작위 지표를 처리하기 위해 부드러운 알고리즘을 사용하며, 소음 방해를 줄이고, 신호 신뢰성을 강화한다.

거래 실행 논리는 다음과 같습니다.

  1. 다수점 신호: 오버셀 지역 (bearZone) 에서 하락세를 인식할 때, 시스템이 다수점 포지션으로 들어갑니다.
  2. 공백 신호: 오버 바이 지역 (bullZone) 에서 하락 하락 형태를 인식 할 때 시스템 공백 포지션에 들어갑니다.

위험 관리에 있어서, 전략은 ATR 기반의 동적 스톱 스톱 손실 메커니즘을 사용합니다:

  • 다수 거래: 스톱 = 입시 가격 + (ATR × 1.5) 스톱 로스 = 입시 가격 - (ATR × 1.0)
  • 공백 거래: 중지 = 입시 가격 - (ATR × 1.5), 중지 = 입시 가격 + (ATR × 1.0)

이 디자인은 스톱포드피스가 시장의 변동성에 자동으로 적응하도록 하고, 변동성이 높은 시장에서 보호 범위를 자동으로 확장하고, 변동성이 적은 시장에서는 보호 범위를 좁히고, 위험과 수익의 비율이 1:1: 5로 유지되도록 한다.

전략적 이점

코드의 심층적인 분석을 통해, 이 전략은 다음과 같은 중요한 장점을 보여준다:

  1. 다차원 신호 검증 메커니즘이 전략은 부진 형태에만 의존하지 않고, 무작위 지표와 결합하여 트렌드 확인을 수행합니다. 이중 필터링은 가짜 신호를 크게 줄여 거래 성공률을 높입니다. 분석에 따르면, 부진 형태를 혼자 사용하면 많은 잘못된 신호가 발생할 수 있으며, 트렌드 확인을 추가하면 유효한 신호 품질이 눈에 띄게 향상됩니다.

  2. 자율적 위험 관리: ATR를 동적으로 설정하여, 전략은 다양한 시장 환경과 변동 조건에 지능적으로 적응할 수 있으며, 인적 개입 없이 보호 범위를 조정할 수 있습니다. 이 메커니즘은 높은 변동 기간 동안 보호 범위를 자동으로 확장하고 낮은 변동 기간 동안 파라미터를 강화하여 작은 변동으로 인한 중지 손실을 방지합니다.

  3. 고도의 사용자 정의전략은 ATR 주기, 스톱 스톱 손실 비율, 트렌드 회전 기간, 반전 마이너스 및 평형 인자 등과 같은 사용자 조정을위한 여러 파라미터를 제공합니다. 각 폭락 형태는 개별적으로 열거나 닫을 수 있으며, 상인은 다른 시장 특성 또는 개인 선호에 따라 시스템을 사용자 정의 할 수 있습니다.

  4. 시각화 거래 신호전략: 전략은 자동으로 “HAM” ((子線)), “STAR” ((流星線) 등과 같은 거래 신호를 차트에 표시하여 거래자가 시장 상태를 직관적으로 식별할 수 있도록하고, 추적 분석과 실시간 모니터링을 용이하게합니다.

  5. 자금 관리 통합전략: 계좌 지분의 10%를 거래당 자금 할당으로 기본으로 사용하고, 필요에 따라 조정할 수 있으며, 과도한 거래와 자금 위험을 방지하기 위해 완전한 자금 관리 기능을 구현합니다.

  6. 수수료 비용 고려전략 내재 수수료 계산 (설정값 0.1%) 은 재검토 결과를 실제 거래 환경에 더 가깝게 만들고, 거래자가 전략의 성과를 평가할 때 거래 비용을 충분히 고려하도록 도와줍니다.

전략적 위험

이 전략은 포괄적으로 설계되었지만, 심층적인 분석을 통해 다음과 같은 잠재적인 위험 요소가 발견되었습니다.

  1. 역전 실패 위험시장 역전 신호는 100% 신뢰할 수 없습니다. 동시적으로 폭락 형태와 무작위 지표 조건을 충족하더라도 역전 실패의 가능성이 있습니다. 강한 추세 시장에서 역전 신호는 연속적인 손실을 초래할 수 있습니다. 해결 방법: 더 높은 시간 주기에서 전체적인 추세 방향을 확인하는 것이 좋습니다.

  2. 변수 최적화 함수과잉 최적화 파라미터는 전략이 역사적 데이터에서 우수한 성능을 발휘하지만 실장 거래에서 효과가 좋지 않을 수 있습니다. 해결 방법: 샘플 테스트 (Out-of-Sample) 방법을 사용하여 파라미터의 안정성을 검증하고 과잉 적합성을 피하십시오.

  3. 신호 꽉 막혔다: 높은 변동성 시장에서, 짧은 시간 내에 여러 거래 신호가 생성될 수 있으며, 이로 인해 시장에 자주 진입하거나 진출하는 것이 거래 비용을 증가시킨다. 해결 방법: 신호 확인 메커니즘을 추가하여, 연속적으로 두 개의 K 라인 확인을 요구하거나, 거래 간격 제한을 추가한다.

  4. 위험 비율이 고정되어 있습니다.: 전략은 동적 ATR을 사용하지만 고정 비율은 모든 시장 환경에 적합하지 않을 수 있습니다. 해결 방법: 다른 시장 주기 및 변동 특성에 따라 위험 수익률을 동적으로 조정합니다.

  5. 무작위적 지표 지연: 랜덤 지표 자체는 약간의 지연성을 가지고 있으며, 신호의 발생 시기가 좋지 않을 수 있습니다. 해결 방법: RSI와 같은 더 민감한 지표를 사용하여 트렌드 확인을 고려하거나 이동 평균과 결합하십시오.

  6. 단일 시간 주 기간: 전략은 현재 시간 주기 분석에만 기반하고, 다중 시간 주기 확인이 부족하다. 해결 방법: 더 높은 레벨과 더 낮은 레벨의 시간 프레임워크가 함께 신호를 확인하는 것을 요구하는 다중 시간 주기 분석을 도입한다.

전략 최적화 방향

코드 분석을 바탕으로 이 전략이 더 개선될 수 있는 주요 방향은 다음과 같습니다.

  1. 다중 시간 주기 분석을 도입: 더 높은 시간 주기 트렌드 확인과 결합하여 신호 품질을 크게 향상시킬 수 있다. 높은 시간 프레임의 트렌드 판단 기능을 추가하여 상위 수준의 트렌드 방향에 부응하는 경우에만 거래를 실행하여 큰 트렌드와 작은 트렌드가 충돌할 때 잘못된 신호를 피하는 것이 좋습니다.

  2. 임의 지표 변수를 최적화: 현재 고정된 경계를 사용하는 것은 모든 시장에 적합하지 않을 수 있습니다. 시장의 변동 특성에 따라 자동으로 과매도 과매도 경계를 조정하거나 상대적으로 약한 지표 (RSI) 와 함께 교차 확인하는 적응적 경량 메커니즘을 구현하는 것이 좋습니다.

  3. 위험 관리 시스템을 개선합니다.: 동적 위험 조정 시스템을 구현할 수 있으며, 연속적으로 수익을 올릴 때 포지션을 확장하거나, 연속적으로 손실을 줄일 때 포지션을 축소하거나, 시장의 변동에 따라 위험 수익률을 자동으로 조정할 수 있다. 이동적 손실 중지 기능을 추가하여 트렌드가 확립된 후 이미 수익을 보호하는 것이 좋습니다.

  4. 다이 모양 인식 정확도 강화: 현재 형태 인식 알고리즘은 비교적 간단하며, 더 복잡한 패턴 인식 기술을 도입할 수 있습니다. 예를 들어, 기계 학습 알고리즘이 더 많은 붕괴 조합 형태를 식별하거나, 거래량 확인 신호의 유효성을 결합합니다.

  5. 시장 환경 적응: 시장 상태 분류를 추가하고, 다른 거래 전략 파라미터를 사용하여 다른 시장 환경에 맞게 사용한다. 높은 변동 기간 동안 반전 마이너스 요건을 높이고, 낮은 변동 시장은 요건을 낮추고, 전략과 시장 상태의 지능적인 매칭을 구현한다.

  6. 필터링 조건을 추가거래량 확인을 도입하고, 저항 수준을 지원하고, 핵심 가격 평준을 위한 추가 필터링 조건을 도입하여, 잘못된 신호를 줄여줍니다. 특히 중요한 가격 수준 (예: 이전 시점의 하위점, 정수 문) 에서 반전 신호는 더 의미가 있습니다.

  7. 리포트 최적화: 리테크 프레임워크를 개선하여 슬라이드 시뮬레이션, 다른 시장 조건 테스트, 스트레스 테스트 등의 기능을 추가하여 전략의 성능을 전체적으로 평가합니다. 분기 리테크를 구현하여 다양한 시장 주기 동안의 전략의 성능 차이를 비교하는 것이 좋습니다.

요약하다

무작위 지표와 폭락 모드를 기반으로 한 자동화 시장 역전 거래 전략은 고전적인 기술 분석 개념과 현대적인 정량 거래 기술을 결합한 완전한 거래 시스템입니다. 고전적인 폭락 역전 형태를 식별하고 무작위 지표를 사용하여 트렌드를 확인함으로써 전략은 과매도 과매도 지역에서 잠재적인 시장 역전 지점을 포착하고 ATR 기반의 동적 위험 관리 장치로 거래 자금을 보호합니다.

전략의 주요 특징은 전통적인 붕괴 분석을 수학화하고 체계화하여 정확한 형태 인식과 자동 거래 실행을 구현하면서도 높은 사용자 정의를 유지한다는 것입니다. 시스템의 내장 된 차트 표기 기능은 거래 프로세스의 가시성을 강화하여 분석 및 모니터링을 용이하게합니다. 전통적인 단일 기술 지표 시스템과 비교하여 전략은 다수의 확인 메커니즘을 통해 거래 신호 품질을 크게 향상시킵니다.

그러나, 모든 거래 전략에는 한계가 있습니다. 이 전략에 직면한 주요 과제는 역전 실패 위험, 매개 변수 최적화 어려움, 신호 혼잡 문제 등입니다. 다중 시간 주기 분석, 지표 매개 변수 최적화, 위험 관리 장치 개선 등의 조치를 도입함으로써 전략의 안정성과 수익성을 더욱 향상시킬 수 있습니다.

전반적으로, 이 전략은 자동화와 유연성을 균형 잡은 프레임 워크를 제공하며, 기술 분석에 익숙하고 거래 실행을 체계화하려는 투자자에게 적합합니다. 합리적인 매개 변수 조정과 필요한 최적화를 통해, 이 전략은 시장 역전 기회를 효과적으로 포착하는 실용적인 도구가 될 수 있습니다.

전략 소스 코드
/*backtest
start: 2025-02-23 00:00:00
end: 2025-02-25 07:00:00
period: 2m
basePeriod: 2m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

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

//@version=6
strategy("Bauhaus Reversal Master", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.1)

// Yo! Let's set some user controls
atrLen = input.int(14, title="ATR Period for Risk")
profitTarget = input.float(1.5, title="Profit Target (ATR x)")
stopLoss = input.float(1.0, title="Stop Loss (ATR x)")
trendLen = input.int(14, "Trend Lookback", minval=2)
thresh = input.float(80, "Reversal Threshold", minval=0, maxval=100)
smoothPeriod = input.float(20, "Smoothing Warmup", minval=1)

// Candlestick toggles because we love options
bullStuff = "Bullish Vibes"
bearStuff = "Bearish Blues"
hammerOn = input.bool(true, "Hammer Time", group=bullStuff, inline="b1")
invHammerOn = input.bool(true, "Upside-Down Hammer", group=bullStuff, inline="b2")
bullEngulfOn = input.bool(true, "Bullish Munch", group=bullStuff, inline="b3")
tweezerBotOn = input.bool(true, "Bottom Tweezers", group=bullStuff, inline="b4")
hangManOn = input.bool(true, "Hanging Dude", group=bearStuff, inline="r1")
shootStarOn = input.bool(true, "Falling Star", group=bearStuff, inline="r2")
bearEngulfOn = input.bool(true, "Bearish Gobble", group=bearStuff, inline="r3")
tweezerTopOn = input.bool(true, "Top Tweezers", group=bearStuff, inline="r4")

// Trend magic
var float smoothK = 0.0
alphaSmooth = 2 / (smoothPeriod + 1)
kTrend = ta.stoch(close, close, close, trendLen)
smoothK := kTrend > 50 ? smoothK + (100 - smoothK) * alphaSmooth : kTrend < 50 ? smoothK + (0 - smoothK) * alphaSmooth : kTrend
bullZone = kTrend >= thresh and smoothK >= thresh
bearZone = kTrend <= (100 - thresh) and smoothK <= (100 - thresh)

// Candle math because we’re nerds
redCandle = close < open
greenCandle = close > open
candleTop = math.max(open, close)
candleBot = math.min(open, close)
fullRange = high - low
bodySize = candleTop - candleBot
upperWickP = ((high - candleTop) / fullRange) * 100
lowerWickP = ((candleBot - low) / fullRange) * 100
bodyP = (bodySize / fullRange) * 100
isDoji = math.round_to_mintick(close) == math.round_to_mintick(open)

// Bullish signals, let’s catch that bounce
hammerSig = hammerOn and (lowerWickP > (bodyP * 2) and bodyP < 50 and upperWickP < 2 and not isDoji) and bearZone
invHammerSig = invHammerOn and (upperWickP > (bodyP * 2) and bodyP < 50 and lowerWickP < 2 and not isDoji) and bearZone
bullEngulfSig = bullEngulfOn and redCandle[1] and greenCandle and (bodySize > (bodySize[1] / 2)) and (open < close[1]) and candleTop > candleTop[1] and bearZone[1]
tweezerBotSig = tweezerBotOn and (math.round_to_mintick(low) - math.round_to_mintick(low[1]) == 0) and greenCandle and redCandle[1] and bearZone[1]

// Bearish signals, time to drop
shootStarSig = shootStarOn and (upperWickP > (bodyP * 2) and bodyP < 50 and lowerWickP < 2 and not isDoji) and bullZone
hangManSig = hangManOn and (lowerWickP > (bodyP * 2) and bodyP < 50 and upperWickP < 2 and not isDoji) and bullZone
bearEngulfSig = bearEngulfOn and greenCandle[1] and redCandle and (bodySize > (bodySize[1] / 2)) and (open > close[1]) and candleBot < candleBot[1] and bullZone[1]
tweezerTopSig = tweezerTopOn and (math.round_to_mintick(high) - math.round_to_mintick(high[1]) == 0) and redCandle and greenCandle[1] and bullZone[1]

// Risk management, keep the cash safe
atrVal = ta.atr(atrLen)
longProfit = close + atrVal * profitTarget
longStop = close - atrVal * stopLoss
shortProfit = close - atrVal * profitTarget
shortStop = close + atrVal * stopLoss

// Let’s trade, baby!
if hammerSig or invHammerSig or bullEngulfSig or tweezerBotSig
    strategy.entry("GoLong", strategy.long)
    strategy.exit("LongExit", "GoLong", limit=longProfit, stop=longStop)

if shootStarSig or hangManSig or bearEngulfSig or tweezerTopSig
    strategy.entry("GoShort", strategy.short)
    strategy.exit("ShortExit", "GoShort", limit=shortProfit, stop=shortStop)

// Slap some labels on this chart
if hammerSig
    label.new(bar_index, low, "HAM", color=color(na), textcolor=color.green, style=label.style_label_up, size=size.tiny)
if invHammerSig
    label.new(bar_index, low, "INV", color=color(na), textcolor=color.green, style=label.style_label_up, size=size.tiny)
if bullEngulfSig
    label.new(bar_index, low, "BULL", color=color(na), textcolor=color.green, style=label.style_label_up, size=size.tiny)
if tweezerBotSig
    label.new(bar_index, low, "TWZB", color=color(na), textcolor=color.green, style=label.style_label_up, size=size.tiny)
if shootStarSig
    label.new(bar_index, high, "STAR", color=color(na), textcolor=color.red, style=label.style_label_down, size=size.tiny)
if hangManSig
    label.new(bar_index, high, "HANG", color=color(na), textcolor=color.red, style=label.style_label_down, size=size.tiny)
if bearEngulfSig
    label.new(bar_index, high, "BEAR", color=color(na), textcolor=color.red, style=label.style_label_down, size=size.tiny)
if tweezerTopSig
    label.new(bar_index, high, "TWZT", color=color(na), textcolor=color.red, style=label.style_label_down, size=size.tiny)