TRIX 지표의 개념과 유래
TRIX(Triple Exponential Average)는 모멘텀 지표의 일종으로, 주가의 변화율을 나타내는 지표이다. 이 지표는 주가의 지수 이동평균(EMA)을 세 번 적용하여 계산되며, 주가 변화의 가속도를 측정한다. TRIX는 주가의 모멘텀을 파악하고 추세의 강도를 평가하는 데 사용된다.
TRIX 지표는 1980년대 초 Paul Levine에 의해 개발되었다. Levine은 이중 지수 이동평균(DEMA)과 유사한 개념을 적용하여 TRIX를 고안하였다. TRIX는 주가의 변화율을 부드럽게 나타내어 추세 변화를 명확하게 포착할 수 있다는 장점이 있다.
TRIX 지표 계산 방법
TRIX 지표는 다음과 같은 단계를 통해 계산된다:
- 주가의 EMA를 계산한다. (예: 15일 EMA)
- 1번에서 계산한 EMA의 EMA를 계산한다. (예: 15일 EMA의 15일 EMA)
- 2번에서 계산한 EMA의 EMA를 계산한다. (예: 15일 EMA의 15일 EMA의 15일 EMA)
- 3번에서 계산한 값의 1일 전 값과 비교하여 변화율을 계산한다.
변화율 = (당일 TRIX 값 – 전일 TRIX 값) / 전일 TRIX 값 * 100
이렇게 계산된 TRIX 값은 주가의 변화율을 나타내며, 양수인 경우 상승 모멘텀을, 음수인 경우 하락 모멘텀을 의미한다.
TRIX 지표를 활용한 매매 전략
TRIX 지표를 활용한 매매 전략은 다음과 같이 구성할 수 있다:
- 제로 라인 크로스 전략:
- TRIX 값이 0선을 상향 돌파할 때 매수하고, 0선을 하향 돌파할 때 매도한다.
- 이는 TRIX 값이 양수로 전환되면 상승 추세, 음수로 전환되면 하락 추세로 판단하는 전략이다.
- TRIX 시그널 라인 크로스 전략:
- TRIX 값과 TRIX의 이동평균(시그널 라인)을 비교하여 매매 신호를 생성한다.
- TRIX 값이 시그널 라인을 상향 돌파할 때 매수하고, 하향 돌파할 때 매도한다.
- TRIX 모멘텀 전략:
- TRIX 값의 절대값이 클수록 강한 모멘텀으로 판단한다.
- TRIX 값이 양수이고 증가할 때 매수하고, 음수이고 감소할 때 매도한다.
TRIX는 주가 모멘텀을 평가하는 데 유용한 지표이지만, 단독으로 사용하기보다는 다른 기술적 지표나 가격 패턴과 함께 활용하는 것이 효과적이다. 또한 TRIX 값의 변화율이 크게 변동하는 시장에서는 거래 시그널의 신뢰도가 낮아질 수 있으므로 주의가 필요하다.
파이썬을 활용한 TRIX 지표 백테스팅
파이썬을 사용하여 TRIX 지표 기반의 트레이딩 전략을 백테스팅해보자. 다음 라이브러리를 활용할 것이다:
pandas
: 데이터 조작 및 분석numpy
: 수치 계산matplotlib
: 데이터 시각화FinanceDataReader
: 주가 데이터 수집
먼저 가상환경을 활성화하고 필요한 라이브러리를 설치한다.
source venv/bin/activate
pip install pandas numpy matplotlib FinanceDataReader
FinanceDataReader를 설치하면 종속 모듈도 함께 설치된다.
다음으로 TRIX 지표를 계산하고 매매 신호를 생성하는 코드를 작성해보자.
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)
# TRIX 지표 계산 함수
def calculate_trix(data, period=15):
ema1 = data['Close'].ewm(span=period, adjust=False).mean()
ema2 = ema1.ewm(span=period, adjust=False).mean()
ema3 = ema2.ewm(span=period, adjust=False).mean()
trix = (ema3 - ema3.shift(1)) / ema3.shift(1) * 100
return trix
# 매매 신호 생성 함수
def get_signals(trix, signal_period=9):
signals = pd.DataFrame(index=trix.index)
signals['trix'] = trix
signals['signal'] = 0
signals['signal_ma'] = trix.ewm(span=signal_period, adjust=False).mean()
signals['signal'][signals['trix'] > signals['signal_ma']] = 1
signals['signal'][signals['trix'] < signals['signal_ma']] = -1
signals['positions'] = signals['signal'].diff()
return signals
# TRIX 지표 계산
trix = calculate_trix(data)
# 매매 신호 생성
signals = get_signals(trix)
# 백테스팅
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(trix, label='TRIX')
ax2.plot(signals['signal_ma'], label='Signal Line')
ax2.set_ylabel('TRIX')
ax2.set_title('TRIX Indicator')
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_trix
함수는 주어진 데이터를 바탕으로 TRIX 지표를 계산한다. 먼저 주가의 EMA를 세 번 연속으로 계산한 후, 계산된 값의 변화율을 구하여 TRIX 값을 산출한다.
get_signals
함수는 계산된 TRIX 지표를 기준으로 매매 신호를 생성한다. TRIX 값이 시그널 라인(TRIX의 EMA)을 상향 돌파할 때 매수 신호(1), 하향 돌파할 때 매도 신호(-1)를 생성한다.
백테스팅을 위해 초기 자본금을 10,000달러로 설정하고, 생성된 매매 신호를 바탕으로 포트폴리오 가치를 계산한다. 최종적으로 총 수익률과 포트폴리오 가치를 출력한다.
matplotlib
을 사용하여 주가, TRIX 지표, 포트폴리오 가치를 시각화한다. TRIX 지표 차트에는 시그널 라인도 함께 표시하여 매매 신호 생성 기준을 나타낸다.
코드 실행 중 발생할 수 있는 오류를 처리하기 위해 try-except
문을 사용하였다. 데이터를 가져오는 과정에서 오류가 발생하면 에러 메시지를 출력하고 프로그램을 종료한다.