반응형
SPY ETF는 미국 S&P 500 지수를 추종하는 대표적인 상장지수펀드(ETF)로, 전 세계 투자자들이 가장 많이 거래하는 금융 상품 중 하나입니다. 이러한 SPY ETF의 가격 흐름을 예측하고 분석하기 위한 방법 중 하나는 이동평균선(Moving Average)을 활용하는 것입니다. 이번 글에서는 파이썬(Python)을 사용하여 SPY ETF의 최근 3개월간 주가 데이터를 시각화하고, 이동평균선을 바탕으로 향후 주가 방향을 예측하는 프로그램을 만드는 과정을 자세히 설명합니다.
이 프로그램은 실제 투자에 사용하기 위한 목적이 아닌, 주가 예측 프로그램만드는 과정을 설명하는데 그 목적이 있으니 이프로그램만으로 투자에 이용하시면 안됩니다.
1. 이동평균선(MA)이란?
**이동평균선(Moving Average, MA)**은 일정 기간 동안의 평균 종가를 선으로 연결한 지표로, 주가의 추세를 파악하는 데 매우 유용한 도구입니다. 대표적으로 단기(예: 5일), 중기(예: 20일), 장기(예: 60일) 이동평균선이 많이 사용됩니다.
이 프로그램에서는 **5일 이동평균선(MA5)**과 **20일 이동평균선(MA20)**을 활용합니다.
2. 프로그램 개요
이 프로그램은 다음과 같은 기능을 포함하고 있습니다:
- SPY ETF의 최근 3개월간의 종가 데이터를 가져옴
- 5일, 20일 이동평균선(MA5, MA20) 계산
- MA5와 MA20의 차이(MA_diff) 계산
- 이동평균선을 바탕으로 향후 주가가 오를지, 내릴지를 판단
- 그래프를 통해 시각적 분석 제공
3. 전체 코드 및 패키지 설치
3-1. 전체 코드
import yfinance as yf
import matplotlib.pyplot as plt
import matplotlib as mpl
import platform
# 한글 폰트 설정
if platform.system() == 'Windows':
plt.rcParams['font.family'] = 'Malgun Gothic'
elif platform.system() == 'Darwin':
plt.rcParams['font.family'] = 'AppleGothic'
else:
plt.rcParams['font.family'] = 'NanumGothic'
plt.rcParams['axes.unicode_minus'] = False
# SPY ETF 데이터 다운로드 (최근 3개월)
spy = yf.Ticker("SPY")
hist = spy.history(period="3mo")
# MA5, MA20, 차이 계산
hist['MA5'] = hist['Close'].rolling(window=5).mean()
hist['MA20'] = hist['Close'].rolling(window=20).mean()
hist['MA_diff'] = hist['MA5'] - hist['MA20']
# === 주가 방향 판단 로직 추가 ===
latest_diff = hist['MA_diff'].iloc[-1]
prev_diff = hist['MA_diff'].iloc[-5:]
if latest_diff > 0 and all(prev_diff.diff().dropna() > 0):
trend_msg = "최근 단기 이동평균이 장기 이동평균보다 높고 계속 증가 → 상승 가능성"
elif latest_diff < 0 and all(prev_diff.diff().dropna() < 0):
trend_msg = "최근 단기 이동평균이 장기 이동평균보다 낮고 계속 감소 → 하락 가능성"
elif latest_diff > 0:
trend_msg = "단기 이동평균이 장기보다 높음 → 상승 가능성"
elif latest_diff < 0:
trend_msg = "단기 이동평균이 장기보다 낮음 → 하락 가능성"
else:
trend_msg = "이동평균선의 차이가 거의 없음 → 중립"
# 그래프 생성
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 10), sharex=True)
# 종가 및 이동평균선
ax1.plot(hist.index, hist['Close'], label='종가', color='blue')
ax1.plot(hist.index, hist['MA5'], label='MA5 (5일 이동평균)', color='orange')
ax1.plot(hist.index, hist['MA20'], label='MA20 (20일 이동평균)', color='green')
ax1.set_title("SPY ETF 최근 3개월간 종가 및 이동평균선")
ax1.set_ylabel("가격 ($)")
ax1.legend()
ax1.grid(True)
# MA5 - MA20 차이
ax2.plot(hist.index, hist['MA_diff'], label='MA5 - MA20 차이', color='purple')
ax2.axhline(0, color='gray', linestyle='--')
ax2.set_title("MA5 - MA20 차이")
ax2.set_xlabel("날짜")
ax2.set_ylabel("차이 ($)")
ax2.legend()
ax2.grid(True)
# 그래프 레이아웃 조정 및 출력
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# 분석 결과 출력
print(f"\n현재 MA5 - MA20: {latest_diff:.2f}")
print(f"추세 판단: {trend_msg}")
3-2. 패키지 설치 설치
pip install yfinance matplotlib
4. 주요 코드 설명
4-1. 데이터 수집
spy = yf.Ticker("SPY")
hist = spy.history(period="3mo")
yfinance 라이브러리를 통해 SPY ETF의 최근 3개월간 데이터를 가져옵니다. 이때 Close, 즉 종가 데이터를 중심으로 분석이 진행됩니다.
4-2. 이동평균선 계산
hist['MA5'] = hist['Close'].rolling(window=5).mean()
hist['MA20'] = hist['Close'].rolling(window=20).mean()
hist['MA_diff'] = hist['MA5'] - hist['MA20']
- MA5: 최근 5일간 종가 평균
- MA20: 최근 20일간 종가 평균
- MA_diff: MA5 - MA20 값 → 주가 방향성 예측에 활용
4-3. 추세 판단 로직
latest_diff = hist['MA_diff'].iloc[-1]
prev_diff = hist['MA_diff'].iloc[-5:]
if latest_diff > 0 and all(prev_diff.diff().dropna() > 0):
trend_msg = "상승 가능성"
elif latest_diff < 0 and all(prev_diff.diff().dropna() < 0):
trend_msg = "하락 가능성"
...
- MA5가 MA20보다 크고, 그 차이가 최근 연속적으로 증가 → 상승 추세 신호
- MA5가 MA20보다 작고, 그 차이가 감소 중 → 하락 추세 신호
이는 간단하지만 실제 기술적 분석에서도 널리 사용되는 원리입니다.
4-4. 시각화 그래프
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 10), sharex=True)
# 종가 및 이동평균선 시각화
ax1.plot(hist.index, hist['Close'], label='종가')
ax1.plot(hist.index, hist['MA5'], label='MA5')
ax1.plot(hist.index, hist['MA20'], label='MA20')
# MA5 - MA20 차이 시각화
ax2.plot(hist.index, hist['MA_diff'], label='MA5 - MA20')
- 상단 그래프: 종가 + MA5 + MA20
- 하단 그래프: MA5 - MA20의 차이
- 날짜는 x축을 공유하여 시간 흐름을 한 눈에 파악 가능
5. 결과
반응형
'파이썬' 카테고리의 다른 글
파이썬으로 파일 이름을 ‘수정한 날짜’ 기준으로 일괄 변경하기 (1) | 2025.06.08 |
---|---|
TensorFlow CPU 최적화 메시지 해결 방법: SSE, AVX 경고 무시해도 될까? (0) | 2025.04.16 |
TensorFlow 설치시 “Could not find a version that ....” 오류 해결방법 (0) | 2025.04.13 |
파이썬에서 텐서플로(TensorFlow) 설치 및 업그레이드, 버전확인 방법 설명 (1) | 2025.04.11 |
파이썬 matplotlib에서 한글 폰트 깨짐, 마이너스(-) 깨짐 문제 해결하기 (0) | 2025.04.10 |