PSAR(Parabolic SAR)의 개념
PSAR(Parabolic SAR)은 추세 추종 지표 중 하나로, 가격 추세의 방향과 추세 전환점을 파악하는 데 사용된다. PSAR은 1978년 J. Welles Wilder에 의해 개발되었으며, “Stop and Reverse”의 약자이다.
PSAR은 상승 추세에서는 가격 아래에 점으로 표시되고, 하락 추세에서는 가격 위에 점으로 표시된다. 이 지표는 가격이 상승하는 동안에는 점진적으로 상승하고, 가격이 하락하는 동안에는 점진적으로 하락한다. PSAR이 가격 차트와 교차할 때, 이는 잠재적인 추세 전환 신호로 해석된다.
PSAR의 계산에는 가속 계수(Acceleration Factor, AF)와 최고가(EP, Extreme Point)가 사용된다. AF는 추세가 지속될수록 증가하며, 이에 따라 PSAR의 상승 또는 하락 속도가 빨라진다. EP는 상승 추세에서는 최고가, 하락 추세에서는 최저가를 나타낸다.
PSAR을 활용한 트레이딩전략
PSAR을 활용한 트레이딩전략은 다음과 같이 구성할 수 있다:
- PSAR이 가격 아래에 있고 상승 추세를 나타내면 매수 신호로 간주한다.
- PSAR이 가격 위에 있고 하락 추세를 나타내면 매도 신호로 간주한다.
- 매수 포지션은 PSAR이 가격 위로 이동하면 청산한다.
- 매도 포지션은 PSAR이 가격 아래로 이동하면 청산한다.
- 거래량 또는 기타 지표를 함께 사용하여 거래 신호의 정확성을 높일 수 있다.
이 전략은 추세 추종 전략의 일종으로, 강한 추세가 나타날 때 효과적일 수 있다. 그러나 횡보 장세에서는 많은 거래 신호가 발생할 수 있으므로 주의가 필요하다.
파이썬 코드 예시
다음은 FinanceDataReader 모듈을 사용하여 VOO ETF 데이터를 가져와 PSAR을 계산하고, 이를 기반으로 매매 신호를 생성하는 파이썬 코드 예시이다.
먼저, 필요한 라이브러리를 가상환경에 설치한다:
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
def calculate_psar(data, step=0.02, max_step=0.2):
af = step
sar = data.low.copy()
ep = data.low.copy()
trend = 1
for i in range(1, len(data)):
if trend == 1:
sar[i] = sar[i - 1] + af * (ep[i - 1] - sar[i - 1])
else:
sar[i] = sar[i - 1] + af * (ep[i - 1] - sar[i - 1])
if trend == 1 and data.low[i] < sar[i]:
trend = -1
ep[i] = data.high[i]
sar[i] = ep[i - 1]
elif trend == -1 and data.high[i] > sar[i]:
trend = 1
ep[i] = data.low[i]
sar[i] = ep[i - 1]
else:
ep[i] = ep[i - 1]
if trend == 1:
if data.high[i] > ep[i - 1]:
ep[i] = data.high[i]
af = min(af + step, max_step)
else:
if data.low[i] < ep[i - 1]:
ep[i] = data.low[i]
af = min(af + step, max_step)
data['sar'] = sar
data['trend'] = trend
return data
try:
# VOO ETF 데이터 가져오기
data = fdr.DataReader('VOO', data_source='yahoo')
# PSAR 계산
data = calculate_psar(data)
# 매매 신호 생성
data['signal'] = np.where(data['trend'] == 1, 1, -1)
# 수익률 계산
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('PSAR 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 데이터를 가져와 PSAR을 계산한다. 그런 다음, PSAR에 따라 상승 추세일 때 매수 신호(+1), 하락 추세일 때 매도 신호(-1)를 생성한다. 이 신호를 기반으로 전략의 일간 수익률과 누적 수익률을 계산하고, 마지막으로 누적 수익률을 그래프로 그려 전략의 성과를 시각화한다.
또한, 코드는 try-except 블록으로 감싸져 있어 오류가 발생하면 오류 메시지를 출력한다. 이는 데이터를 가져오거나 계산하는 과정에서 발생할 수 있는 오류를 처리하기 위함이다.