[알고리즘 트레이딩] 오버랩(Overlap, 가격조정) 감지 방법 연구

1. 오버랩(Overlap)이란?

트레이딩에서 "오버랩(Overlap)"이란 시장 가격이 이전의 스윙(swing) 영역으로 되돌아오는 현상을 의미합니다. 즉, 새로운 저점(low)이나 고점(high)을 형성한 후 다시 기존 가격대 안으로 돌아오는 경우를 말합니다.

이 현상은 시장이 조정(Correction) 상태인지, 아니면 새로운 추세(Trend)가 시작되는지를 판단하는 데 중요한 역할을 합니다. 오버랩이 발생하면 현재의 움직임이 단순 조정일 가능성이 높고, 반대로 오버랩 없이 한 방향으로 지속된다면 새로운 추세가 형성되고 있을 가능성이 큽니다.


2. 오버랩을 활용한 트레이딩 전략

(1) 오버랩이 발생했을 때 (Correction 신호)

✅ 시장이 하락 중일 때, 새로운 저점이 나오지만 이전 저점 범위로 다시 되돌아오면 → 조정일 가능성이 높음
✅ 상승장에서 새로운 고점이 나오고 다시 기존 범위로 되돌아오면 → 단기 조정 가능성
트레이딩 전략: 오버랩이 확인되면 무리한 추격매매를 피하고, 조정이 끝난 후 진입을 고려

(2) 오버랩이 발생하지 않았을 때 (New Trend 신호)

✅ 시장이 한 방향으로 강하게 움직이며 이전 가격대에 다시 들어오지 않음 → 새로운 추세 가능성
✅ 상승장이면 계속 고점을 높여가고, 하락장이면 저점을 낮춰가면서 지속적인 움직임을 보임
트레이딩 전략: 추세 추종(Trend Following) 전략 활용, 예를 들어 상승장이 유지되면 지속 매수, 하락장이 유지되면 지속 매도


3. 오버랩 감지 알고리즘 구현 (Python & Pandas)

오버랩을 감지하기 위해 Pandas를 활용한 간단한 구현을 소개합니다.

import pandas as pd

def detect_overlap(df, swing_period=5):
    df = df.copy()
    df['swing_low'] = df['low'].rolling(swing_period).min()
    df['prev_swing_low'] = df['swing_low'].shift(1)
    df['overlap'] = (df['low'] < df['prev_swing_low']) & (df['close'] > df['prev_swing_low'])
    return df

# 샘플 데이터 생성
data = {
    'high': [100, 102, 105, 103, 98, 96, 94, 97, 101, 103, 106, 104, 102],
    'low':  [98,  99, 100, 97,  95, 93, 91, 94,  99, 100, 103, 101, 100],
    'close': [99, 101, 103, 98,  96, 94, 92, 95, 100, 102, 105, 103, 101]
}
df = pd.DataFrame(data)
df = detect_overlap(df, swing_period=3)
print(df[['low', 'prev_swing_low', 'overlap']])

위 코드에서는 특정 기간 동안의 최저점(swing low) 을 계산하고, 새로운 저점이 발생한 후 다시 그 범위 안으로 돌아왔는지를 확인하여 오버랩 발생 여부를 True/False로 출력합니다.


4. 머신러닝을 활용한 오버랩 감지

단순한 규칙 기반 감지를 넘어, 머신러닝을 활용하면 더 정교하게 오버랩을 감지할 수 있습니다.

(1) 머신러닝 모델을 활용하는 이유

✅ 다양한 기술적 지표(EMA, RSI, 볼린저 밴드)를 활용하여 오버랩 발생 확률을 학습 가능
✅ 단순 규칙 기반보다 더 높은 정확도 제공
✅ 과거 데이터를 활용해 자동 최적화 가능

(2) 랜덤 포레스트(Random Forest) 기반 오버랩 감지 모델

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np

# 기술적 지표 추가
df['SMA_5'] = df['close'].rolling(5).mean()
df['SMA_10'] = df['close'].rolling(10).mean()
df['Volatility'] = df['high'] - df['low']

df['Overlap'] = df['overlap'].astype(int)  # 타겟 변수 설정
features = ['SMA_5', 'SMA_10', 'Volatility']
X = df[features].fillna(0)
y = df['Overlap']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f'모델 정확도: {accuracy_score(y_test, y_pred):.2f}')

이 모델은 단순한 오버랩 감지 로직을 머신러닝으로 학습하여, 더 정교한 조정 여부를 판단할 수 있도록 개선한 것입니다.


5. 결론 및 향후 개선 방향

오버랩 패턴을 활용하면 시장이 조정 중인지, 새로운 추세가 시작되는지를 판단할 수 있음
✔ 단순한 규칙 기반 감지 외에도, 머신러닝을 활용하면 정확도를 높이고 자동화 가능
✔ 향후 딥러닝(LSTM) 적용강화학습 기반 트레이딩 자동화로 발전 가능


댓글

이 블로그의 인기 게시물

공압 속도 제어: 미터인 vs 미터아웃

[PLC] PLC 아날로그 입출력 기본

전력(kW) 계산하기 (직류, 교류 단상, 교류 삼상)

NPN, PNP 트랜지스터 차이점

[PLC] 래더 다이어그램과 PLC

Industrial Control with Relay: 파워릴레이와 범용릴레이

[PLC] 접지(지락) 사고와 단락의 차이점 (The Difference Between a Ground Fault and Short Circuit)

제너 다이오드에 저항을 연결하는 이유

[PLC] SSR 선정시 고려사항 - 돌입전류

[아두이노] 가변저항(Potential Divider)과 전압분배(Voltage Divider)