TECH
파이썬 데이터 분석 기초: 판다스로 주가 데이터 다루기
파이썬 판다스(pandas)로 주가 데이터를 불러오고, 정리하고, 기본 분석하는 방법을 처음부터 정리합니다. 퀀트 분석의 출발점입니다.
왜 판다스인가
주가 데이터를 다루려면 날짜별로 정렬된 숫자를 다뤄야 합니다. 엑셀로도 되지만, 데이터가 수만 행이 넘어가면 느리고 자동화가 어렵습니다.
**판다스(pandas)**는 파이썬에서 표 형태의 데이터를 다루는 표준 라이브러리입니다. 퀀트 분석, 데이터 과학, 금융 모델링에서 가장 많이 쓰입니다.
설치와 시작
pip install pandas yfinance matplotlib
- pandas: 데이터 분석
- yfinance: 야후 파이낸스에서 무료 주가 데이터 다운로드
- matplotlib: 차트 그리기
주가 데이터 불러오기
야후 파이낸스에서 비트코인 데이터
import yfinance as yf
import pandas as pd
# 비트코인 일봉 데이터 (2년)
btc = yf.download("BTC-USD", period="2y")
print(btc.head())
출력 결과:
Open High Low Close Volume
Date
2024-04-08 69543.12 71842.15 68902.31 71015.94 32844900
2024-04-09 71015.94 71655.25 69241.84 69785.52 30492100
...
각 열의 의미:
- Open: 시가 (그날 첫 거래 가격)
- High: 고가 (그날 가장 높은 가격)
- Low: 저가 (그날 가장 낮은 가격)
- Close: 종가 (그날 마지막 거래 가격)
- Volume: 거래량
한국 주식 데이터
# 삼성전자
samsung = yf.download("005930.KS", period="1y")
print(samsung.tail())
기본 데이터 탐색
데이터 크기 확인
print(f"행 수: {len(btc)}")
print(f"기간: {btc.index[0]} ~ {btc.index[-1]}")
print(f"열: {list(btc.columns)}")
기초 통계
print(btc['Close'].describe())
이렇게 하면 평균, 최솟값, 최댓값, 표준편차 등을 한 번에 볼 수 있습니다.
특정 기간 필터링
# 2025년 데이터만
btc_2025 = btc.loc['2025']
# 2025년 1분기
btc_q1 = btc.loc['2025-01':'2025-03']
수익률 계산
퀀트 분석에서 가장 많이 쓰는 계산입니다.
일별 수익률
btc['daily_return'] = btc['Close'].pct_change()
print(btc['daily_return'].tail())
pct_change()는 전날 대비 변화율을 계산합니다. 0.03이면 3% 상승, -0.02면 2% 하락입니다.
누적 수익률
btc['cumulative'] = (1 + btc['daily_return']).cumprod()
print(f"총 수익률: {btc['cumulative'].iloc[-1] - 1:.2%}")
이동평균 계산
이동평균은 일정 기간의 평균 가격입니다. 추세를 파악하는 데 가장 기본적인 도구입니다.
# 20일 이동평균 (단기)
btc['ma20'] = btc['Close'].rolling(20).mean()
# 60일 이동평균 (중기)
btc['ma60'] = btc['Close'].rolling(60).mean()
# 200일 이동평균 (장기)
btc['ma200'] = btc['Close'].rolling(200).mean()
골든크로스 / 데드크로스 찾기
# 골든크로스: 단기 이동평균이 장기를 상향 돌파
btc['golden_cross'] = (
(btc['ma20'] > btc['ma60']) &
(btc['ma20'].shift(1) <= btc['ma60'].shift(1))
)
golden_dates = btc[btc['golden_cross']].index
print(f"골든크로스 발생일: {len(golden_dates)}회")
for d in golden_dates[-5:]:
print(f" {d.date()}")
차트 그리기
종가 + 이동평균 차트
import matplotlib.pyplot as plt
plt.figure(figsize=(14, 6))
plt.plot(btc.index, btc['Close'], label='종가', linewidth=1)
plt.plot(btc.index, btc['ma20'], label='20일 이동평균', linewidth=1)
plt.plot(btc.index, btc['ma60'], label='60일 이동평균', linewidth=1)
plt.title('비트코인 일봉 차트')
plt.xlabel('날짜')
plt.ylabel('가격 (USD)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('btc_chart.png', dpi=150)
plt.show()
일별 수익률 분포
plt.figure(figsize=(10, 5))
btc['daily_return'].hist(bins=100, alpha=0.7)
plt.title('비트코인 일별 수익률 분포')
plt.xlabel('일별 수익률')
plt.ylabel('빈도')
plt.axvline(0, color='red', linestyle='--')
plt.tight_layout()
plt.show()
자주 쓰는 판다스 기능 정리
| 기능 | 코드 | 용도 |
|---|---|---|
| 열 추가 | df['new'] = df['Close'] * 2 | 새 지표 만들기 |
| 필터링 | df[df['Close'] > 70000] | 조건 검색 |
| 정렬 | df.sort_values('Volume') | 거래량 순 정렬 |
| 그룹 | df.groupby(df.index.month).mean() | 월별 평균 |
| 결측치 | df.dropna() | 빈 값 제거 |
| 저장 | df.to_csv('data.csv') | 파일 저장 |
다음 단계
판다스로 데이터를 다루는 것은 퀀트 분석의 기초 중 기초입니다. 여기서 다음으로 갈 수 있는 방향은 세 가지입니다.
기술적 지표 구현: RSI, MACD, 볼린저밴드 등을 직접 계산하고 시각화
백테스트: 매매 규칙을 만들고 과거 데이터로 수익률 검증
자동매매: 거래소 API에 연결해서 실시간 매매 자동화
어느 방향이든 판다스는 계속 쓰게 됩니다. 이 기본기를 탄탄히 해두면 이후가 훨씬 수월합니다.
#파이썬
#판다스
#주가분석
#데이터분석
#초보자
같은 카테고리 더 보기 TECH →