ETF 200일 이동평균선 매매 전략: 전략 분석 및 최적화

안녕하세요!

오늘은 미국 ETF를 대상으로 한 200일 이동평균선 매매 전략에 대해 다루어 보겠습니다.

이 전략은 기술적 분석에서 널리 사용되며, 특히 장기 투자자들에게 인기가 많습니다.

이 전략에서는 200일 이동평균선을 주가의 장기 추세를 파악하고 이를 매수 및 매도 신호로 활용합니다.

우리는 200일 이동평균선을 활용하여 매매 전략을 Python으로 구현하고 그 성과를 분석하며 이 전략을 자세히 살펴볼 것입니다.

ETF 200일 이동평균선 매매 전략이란?

200일 이동평균선 매매 전략은 주가가 장기적으로 어떤 방향으로 움직이고 있는지를 판단하는 데 도움을 줍니다. 이 전략의 기본 원칙은 다음과 같습니다:

  • 매수 신호: 주가가 200일 이동평균선을 상향 돌파할 때 매수.
  • 매도 신호: 주가가 200일 이동평균선을 하향 돌파할 때 매도.

이 전략은 추세가 지속될 때 수익을 내기 쉽지만, 횡보장에서 잦은 매매로 인해 손실이 발생할 수 있는 단점도 있습니다.

이제, 이를 Python으로 구현한 코드와 그 결과를 분석해 보겠습니다.

Python 코드: 이동평균선 매매 전략

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

# ETF 심볼, 날짜 범위를 설정하고 역사적 가격 데이터를 다운로드
symbol = "SPY"  # S&P 500 ETF의 티커 심볼
start_date = "2010-01-01"
end_date = "2023-11-10"

# Yahoo Finance에서 데이터 다운로드
df = yf.download(symbol, start=start_date, end=end_date)

# MultiIndex 처리 - DataFrame의 다중 레벨 컬럼명을 단순화하여 접근을 쉽게 함
# 'Price' 레벨만 선택하여 DataFrame의 구조를 단일 레벨로 만듦
df.columns = df.columns.get_level_values(0)  # MultiIndex 컬럼을 단일 레벨로 변경

# 디버그: MultiIndex 조정 후 컬럼명을 출력하여 확인
print("Columns after adjusting MultiIndex:", df.columns)

# 'Close' 가격의 200일 이동평균을 계산
df['MA200'] = df['Close'].rolling(window=200).mean()  # 200일 이동 평균 계산

# 디버그: 'Close'와 'MA200' 컬럼에서 NaN 값 확인하여 데이터 일관성 보장
print("NaN values in 'Close':", df['Close'].isna().sum())
print("NaN values in 'MA200':", df['MA200'].isna().sum())

# 'Close' 또는 'MA200'에 NaN 값이 있는 행을 삭제
# 이동평균 계산으로 인해 발생하는 NaN 값을 제거하여 이후 계산 시 정렬 문제 해결
df.dropna(subset=['Close', 'MA200'], inplace=True)

# 200일 이동평균을 기준으로 매매 신호 생성
# 'Signal' 컬럼: 1은 매수 신호 (가격이 MA200 위에 있음), 0은 신호 없음
df['Signal'] = (df['Close'] > df['MA200']).astype(int)

# 'Position' 컬럼: 거래가 발생할 때를 표시
# +1은 매수 신호, -1은 매도 신호를 나타냄
df['Position'] = df['Signal'].diff()

# 종가 변동에 따른 일일 수익률을 계산
df['Returns'] = df['Close'].pct_change()

# 전략 수익률 계산 (포지션이 있는 경우에만 수익률 반영)
# 전략 수익률은 신호 발생 다음 날 매수/매도를 하는 것처럼 설정하여 수익률을 계산
df['Strategy_Returns'] = df['Signal'].shift(1) * df['Returns']

# 누적 수익률을 계산하여 단순 매수-보유와 이동평균 전략의 성과를 비교
df['Cumulative_Returns'] = (1 + df['Returns']).cumprod()  # 매수-보유 누적 수익률
df['Cumulative_Strategy_Returns'] = (1 + df['Strategy_Returns']).cumprod()  # 이동평균 전략 수익률

# 200일 이동평균 전략 결과 시각화
plt.figure(figsize=(12, 8))
plt.plot(df.index, df['Close'], label='Close Price')  # 종가를 그래프로 표시
plt.plot(df.index, df['MA200'], label='200-day MA')  # 200일 이동평균을 그래프로 표시

# 매수 신호를 녹색 삼각형으로 표시 (Position이 +1일 때)
plt.plot(df.index[df['Position'] == 1], df['Close'][df['Position'] == 1], '^', markersize=10, color='g', label='Buy Signal')

# 매도 신호를 빨간색 삼각형으로 표시 (Position이 -1일 때)
plt.plot(df.index[df['Position'] == -1], df['Close'][df['Position'] == -1], 'v', markersize=10, color='r', label='Sell Signal')

# 그래프 제목, 축 레이블, 범례 추가하여 가독성 향상
plt.title(f'{symbol} - 200-day Moving Average Strategy')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()  # 그래프 표시

코드 분석

첫 번째 코드는 yfinance 라이브러리를 이용하여 SPY ETF 데이터를 다운로드하고, 200일 이동평균선을 계산하여 매매 신호를 생성합니다. 주요 단계는 다음과 같습니다:

  • 데이터 수집: 2010년부터 2023년까지의 SPY ETF 데이터를 Yahoo Finance에서 가져옵니다.
  • 200일 이동평균선 계산: rolling() 메서드를 사용해 200일 이동평균선을 계산합니다.
  • 매매 신호 생성: 종가가 200일 이동평균선을 상향 돌파할 때 매수(1), 하향 돌파할 때 매도(-1) 신호를 생성합니다.
  • 시각화: 매수 및 매도 신호를 포함해 종가와 200일 이동평균선을 그래프로 시각화합니다.

실행 결과

첫 번째 그림(실행결과1)은 SPY의 종가와 200일 이동평균선을 시각화한 것입니다. 매수 신호는 초록색 삼각형으로, 매도 신호는 빨간색 삼각형으로 표시됩니다.

두 번째 그림(실행결과2)은 매수-보유 전략과 200일 이동평균선 전략의 누적 수익률을 비교한 결과입니다. 파란색 선은 매수-보유 전략의 누적 수익률을, 주황색 선은 200일 이동평균선 전략의 누적 수익률을 나타냅니다.

실행 결과 분석

  • 매매 신호 시각화: 첫 번째 차트를 보면, 매수 및 매도 신호가 200일 이동평균선을 기준으로 적절하게 생성되는 것을 확인할 수 있습니다. 주가가 이동평균선을 상향 돌파할 때 매수하고, 하향 돌파할 때 매도하는 방식입니다. 이러한 방식은 큰 추세를 포착하려는 장기적인 전략에 적합합니다.
  • 누적 수익률 비교: 두 번째 차트에서 보이듯이, 매수-보유 전략이 200일 이동평균선 전략보다 성과가 좋습니다. 특히 강한 상승장에서는 매수-보유 전략이 훨씬 높은 수익률을 기록합니다. 반면, 200일 이동평균선 전략은 시장의 하락 위험을 줄이는 데는 효과적일 수 있으나, 잦은 매매로 인해 상승장에서 기회를 놓치는 경우가 많아 누적 수익률이 낮은 편입니다.
  • 한계점: 횡보하는 구간에서 잦은 매매로 인해 수수료와 슬리피지 같은 추가 비용이 발생할 수 있습니다. 또한, 큰 하락장에서는 손실을 줄일 수 있지만, 반등 시점에서 매도한 후 재진입이 늦어지는 경우 수익 기회를 놓칠 수 있습니다.

결론

이 전략은 주가가 200일 이동평균선 위에 있을 때만 매수 포지션을 유지하고, 그 아래로 내려가면 매도하는 방식으로 작동합니다. 그러나 장기적인 관점에서 단순 Buy and Hold 전략 보다 한참 낮은 수익률을 보여 다소 아쉬운 결과였습니다.

Future Works

이번 분석에서는 단일 ETF(SPY)를 대상으로 200일 이동평균선 매매 전략을 구현하고 그 성과를 분석했습니다. 향후 연구에서는 다음과 같은 발전 가능성이 있습니다:

  1. 다양한 자산군에 대한 적용: SPY 외에도 다른 ETF나 개별 주식, 혹은 채권과 같은 다양한 자산군에 대해 동일한 전략을 적용해 성과를 비교해볼 수 있습니다.
  2. 기타 기술적 지표와의 조합: RSI, MACD와 같은 다른 기술적 지표와 200일 이동평균선을 결합하여 보다 정교한 매매 신호를 생성하는 전략을 개발해볼 수 있습니다.
  3. 머신러닝 활용 최적화: 이동평균선의 최적 기간을 머신러닝 알고리즘을 통해 탐색하고, 시장 상황에 따라 동적으로 조정하는 방법도 고려할 수 있습니다. 이는 전략의 적응력을 높여줄 수 있습니다.
  4. 리스크 관리 요소 추가: 리스크를 줄이기 위한 손절매 설정, 포트폴리오 최적화 등 리스크 관리 요소를 결합하여 전략의 안정성을 높일 수 있습니다.

이러한 추가적인 분석을 통해 투자 전략을 더욱 정교하게 다듬고, 시장의 변화에 보다 유연하게 대응할 수 있는 방안을 마련할 수 있을 것입니다.

Leave a Comment