이격도를 활용한 트레이딩전략(Gap Trading Strategy Using Disparity)

이격도(Disparity)의 개념

이격도는 가격의 상대적인 위치를 파악하는 기술적 지표 중 하나이다. 이격도는 현재 가격이 이동평균선에서 얼마나 떨어져 있는지를 백분율로 나타낸 값이다. 이 지표는 가격이 이동평균선과 어떤 관계에 있는지 쉽게 파악할 수 있게 도와준다.

이격도는 1986년 스티븐 아킨(Steven Achelis)이 처음 소개했다. 그는 가격과 이동평균선 사이의 차이를 측정하여 가격의 상대적인 위치를 파악하고자 했다.

이격도는 다음과 같은 식으로 계산된다:

이격도 = (현재 가격 - 이동평균선) / 이동평균선 * 100

예를 들어, 현재 가격이 100달러이고 20일 이동평균선이 90달러라면, 이격도는 (100 – 90) / 90 * 100 = 11.11%가 된다. 이는 현재 가격이 20일 이동평균선보다 11.11% 위에 위치해 있다는 것을 의미한다.

반대로 현재 가격이 80달러이고 20일 이동평균선이 90달러라면, 이격도는 (80 – 90) / 90 * 100 = -11.11%가 된다. 이는 현재 가격이 20일 이동평균선보다 11.11% 아래에 위치해 있다는 것을 의미한다.

이격도를 활용한 트레이딩전략(Gap Trading Strategy)

이격도를 활용한 트레이딩전략은 가격이 이동평균선에서 크게 벗어날 때 매매 기회를 포착하는 것을 목표로 한다. 이 전략의 기본 아이디어는 다음과 같다:

  1. 이격도의 상한선과 하한선을 설정한다. 일반적으로 상한선은 양수로, 하한선은 음수로 설정한다.
  2. 이격도가 상한선을 초과하면 과매수 신호로 간주하고 매도한다. 이는 가격이 이동평균선에서 크게 벗어나 상승했을 때 매도하는 것을 의미한다.
  3. 이격도가 하한선 미만이면 과매도 신호로 간주하고 매수한다. 이는 가격이 이동평균선에서 크게 벗어나 하락했을 때 매수하는 것을 의미한다.
  4. 이격도가 상한선과 하한선 사이에 있으면 매매를 자제하고 관망한다.

예를 들어, 상한선을 +20%, 하한선을 -20%로 설정할 수 있다. 이격도가 +25%라면 과매수 신호로 간주하고 매도하며, 이격도가 -25%라면 과매도 신호로 간주하고 매수한다.

파이썬 코드 예시

다음은 FinanceDataReader 모듈을 사용하여 VOO ETF 데이터를 가져와 이격도를 계산하고, 이를 기반으로 매매 신호를 생성하는 파이썬 코드 예시이다.

먼저, 필요한 라이브러리를 가상환경에 설치한다:

python -m venv myenv
source myenv/bin/activate
pip install finance-datareader pandas numpy matplotlib

이제 코드를 실행할 수 있다:

import FinanceDataReader as fdr
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

try:
    # VOO ETF 데이터 가져오기
    data = fdr.DataReader('VOO', data_source='yahoo')

    # 20일 이동평균선 계산
    data['MA20'] = data['Close'].rolling(window=20).mean()

    # 이격도 계산
    data['Disparity'] = (data['Close'] - data['MA20']) / data['MA20'] * 100

    # 상한선과 하한선 설정
    upper_limit = 20
    lower_limit = -20

    # 매매 신호 생성
    data['Signal'] = np.where(data['Disparity'] > upper_limit, -1, np.nan)
    data['Signal'] = np.where(data['Disparity'] < lower_limit, 1, data['Signal'])
    data['Signal'] = data['Signal'].fillna(0)

    # 수익률 계산
    data['Returns'] = data['Close'].pct_change()
    data['Strategy_Returns'] = data['Signal'].shift(1) * data['Returns']

    # 누적 수익률 계산
    data['Cumulative_Returns'] = (1 + data['Strategy_Returns']).cumprod()

    # 결과 출력
    print(data.tail())

    # 그래프 그리기
    plt.figure(figsize=(12,8))
    plt.plot(data['Cumulative_Returns'])
    plt.title('Disparity Strategy Backtest')
    plt.ylabel('Cumulative Returns')
    plt.xlabel('Date')
    plt.grid(True)
    plt.show()

except Exception as e:
    print(f"An error occurred: {e}")

이 코드는 FinanceDataReader 모듈을 사용하여 VOO ETF 데이터를 가져와 20일 이동평균선과 이격도를 계산한다. 그런 다음, 이격도가 상한선(+20%)을 초과하면 매도 신호(-1)를, 하한선(-20%) 미만이면 매수 신호(+1)를 생성한다. 이 신호를 기반으로 전략의 일간 수익률과 누적 수익률을 계산하고, 마지막으로 누적 수익률을 그래프로 그려 전략의 성과를 시각화한다.

또한, 코드는 try-except 블록으로 감싸져 있어 오류가 발생하면 오류 메시지를 출력한다. 이는 데이터를 가져오거나 계산하는 과정에서 발생할 수 있는 오류를 처리하기 위함이다.

Leave a Reply

error: Content is protected !!