ROC 지표를 활용한 트레이딩 전략(ROC Indicator Trading Strategy)

ROC 지표의 개념과 유래

ROC(Rate of Change)는 주가의 변화율을 측정하는 모멘텀 지표 중 하나이다. 이 지표는 현재 가격과 과거 특정 시점의 가격을 비교하여 상승 또는 하락 추세의 강도를 파악하는 데 사용된다. ROC는 주가의 상대적인 변화를 나타내므로 서로 다른 가격대의 종목들을 비교할 때 유용하다.

ROC 지표의 기본 개념은 Richard W. Arms, Jr.가 1970년대 후반에 제시하였다. 이 지표는 주가의 모멘텀을 측정하기 위한 간단하면서도 효과적인 방법으로 널리 사용되고 있다.

ROC 지표 계산 방법

ROC 지표는 다음과 같은 공식으로 계산된다:

ROC = (현재 가격 - n일 전 가격) / n일 전 가격 × 100

여기서 n은 비교 기간을 나타내며, 일반적으로 12일 또는 25일을 사용한다. 예를 들어, 12일 ROC는 현재 가격과 12일 전 가격을 비교하여 계산한다.

계산된 ROC 값이 양수이면 현재 가격이 n일 전 가격보다 높다는 것을 의미하며, 음수이면 현재 가격이 n일 전 가격보다 낮다는 것을 나타낸다. ROC 값의 크기는 가격 변화의 강도를 나타내며, ROC 값이 클수록 강한 추세를 의미한다.

ROC 지표를 활용한 매매 전략

ROC 지표를 활용한 매매 전략은 다음과 같이 구성할 수 있다:

  1. 제로 라인 크로스 전략:
  • ROC 값이 0선을 상향 돌파할 때 매수하고, 0선을 하향 돌파할 때 매도한다.
  • 이는 ROC 값이 양수로 전환될 때 상승 추세, 음수로 전환될 때 하락 추세로 판단하는 전략이다.
  1. 다이버전스 전략:
  • 가격은 더 높은 고점을 형성하는데 ROC 값은 더 낮은 고점을 형성할 경우 베어리시 다이버전스로 해석하여 매도 신호로 활용한다.
  • 가격은 더 낮은 저점을 형성하는데 ROC 값은 더 높은 저점을 형성할 경우 불리시 다이버전스로 해석하여 매수 신호로 활용한다.
  1. ROC 값의 상대적 수준을 활용한 전략:
  • ROC 값이 과거 일정 기간(예: 1년) 동안의 ROC 값의 상위 10% 수준에 진입하면 과매수 신호로 해석하여 매도 기회로 활용한다.
  • ROC 값이 과거 일정 기간(예: 1년) 동안의 ROC 값의 하위 10% 수준에 진입하면 과매도 신호로 해석하여 매수 기회로 활용한다.

ROC 지표는 주가의 모멘텀을 파악하는 데 유용하지만, 단독으로 사용하기보다는 다른 기술적 지표나 차트 패턴 등과 함께 활용하여 종합적으로 판단하는 것이 바람직하다.

파이썬을 활용한 ROC 지표 백테스팅

파이썬을 사용하여 ROC 지표 기반의 트레이딩 전략을 백테스팅해보자. 다음 라이브러리를 활용할 것이다:

  • pandas: 데이터 조작 및 분석
  • numpy: 수치 계산
  • matplotlib: 데이터 시각화
  • FinanceDataReader: 주가 데이터 수집

먼저 가상환경을 활성화하고 필요한 라이브러리를 설치한다.

source venv/bin/activate
pip install pandas numpy matplotlib FinanceDataReader

FinanceDataReader를 설치하면 종속 모듈도 함께 설치된다.

다음으로 ROC 지표를 계산하고 매매 신호를 생성하는 코드를 작성해보자.

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

# 데이터 가져오기
symbol = "VOO"
start_date = "1900-01-01"
end_date = "2023-05-01"

try:
    data = fdr.DataReader(symbol, start_date, end_date)
except Exception as e:
    print(f"Error occurred while fetching data: {e}")
    exit(1)

# ROC 지표 계산 함수
def calculate_roc(data, n=12):
    roc = (data['Close'] - data['Close'].shift(n)) / data['Close'].shift(n) * 100
    return roc

# ROC 지표 계산
roc_indicator = calculate_roc(data)

# 매매 신호 생성 함수
def get_signals(roc_indicator):
    signals = pd.DataFrame(index=roc_indicator.index)
    signals['signal'] = 0

    signals['signal'][roc_indicator > 0] = 1
    signals['signal'][roc_indicator < 0] = -1

    signals['positions'] = signals['signal'].diff()

    return signals

# 매매 신호 생성
signals = get_signals(roc_indicator)

# 백테스팅
initial_capital = 10000
positions = pd.DataFrame(index=signals.index).fillna(0.0)
positions[symbol] = 100 * signals['signal']

portfolio = positions.multiply(data['Adj Close'], axis=0)
pos_diff = positions.diff()

portfolio['holdings'] = (positions.multiply(data['Adj Close'], axis=0)).sum(axis=1)
portfolio['cash'] = initial_capital - (pos_diff.multiply(data['Adj Close'], axis=0)).sum(axis=1).cumsum()

portfolio['total'] = portfolio['cash'] + portfolio['holdings']
portfolio['returns'] = portfolio['total'].pct_change()

# 결과 출력
print(f"Final portfolio value: ${portfolio['total'][-1]:,.2f}")
print(f"Total returns: {100 * (portfolio['total'][-1] / initial_capital - 1):.2f}%")

# 시각화
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(15, 15), gridspec_kw={'height_ratios': [3, 1, 1]})

ax1.plot(data['Close'], label='Price')
ax1.set_ylabel('Price')
ax1.set_title('Price Chart')
ax1.legend(loc='upper left')

ax2.plot(roc_indicator, label='ROC')
ax2.axhline(y=0, color='r', linestyle='--', label='Zero Line')
ax2.set_ylabel('ROC')
ax2.set_title('Rate of Change (ROC)')
ax2.legend(loc='upper left')

ax3.plot(portfolio['total'], label='Portfolio Value')
ax3.set_ylabel('Portfolio Value')
ax3.set_title('Portfolio Performance')
ax3.legend(loc='upper left')

plt.tight_layout()
plt.show()

위 코드에서는 FinanceDataReader를 사용하여 VOO ETF의 전체 기간 주가 데이터를 가져온다. start_date를 가능한 한 오래전 날짜로 설정하여 모든 데이터를 가져올 수 있도록 한다.

calculate_roc 함수는 주어진 데이터를 바탕으로 ROC 지표를 계산한다. 현재 가격과 n일 전(기본값: 12일) 가격을 비교하여 ROC 값을 산출한다.

get_signals 함수는 계산된 ROC 지표를 기준으로 매매 신호를 생성한다. ROC 값이 0보다 크면 매수 신호(1)를, 0보다 작으면 매도 신호(-1)를 생성한다.

백테스팅을 위해 초기 자본금을 10,000달러로 설정하고, 생성된 매매 신호를 바탕으로 포트폴리오 가치를 계산한다. 최종적으로 총 수익률과 포트폴리오 가치를 출력한다.

matplotlib을 사용하여 주가, ROC 지표, 포트폴리오 가치를 시각화한다. ROC 지표 차트에는 0선을 표시하여 매매 신호 발생 기준을 나타낸다.

코드 실행 중 발생할 수 있는 오류를 처리하기 위해 try-except 문을 사용하였다. 데이터를 가져오는 과정에서 오류가 발생하면 에러 메시지를 출력하고 프로그램을 종료한다.

Leave a Reply

error: Content is protected !!