주식 데이터 수집하기
yfinance 라이브러리를 사용하면 Yahoo Finance에서 전 세계 주가 데이터를 무료로 수집할 수 있습니다. 실시간에 가까운 데이터로 실전 분석을 시작합니다.
학습 목표
- yfinance로 국내외 주가 데이터를 수집할 수 있습니다.
- DatetimeIndex의 특성을 이해하고 날짜 기반 인덱싱을 할 수 있습니다.
- 여러 종목을 한 번에 수집하여 비교 분석할 수 있습니다.
yfinance 설치
pip install yfinance
단일 종목 수집
import yfinance as yfimport pandas as pd# 삼성전자 (KRX: 005930.KS)samsung = yf.download("005930.KS", start="2023-01-01", end="2024-12-31")print(samsung.head())# Open High Low Close Volume# Date# 2023-01-02 58800.0 59200.0 58400.0 59000.0 9821300# 2023-01-03 59000.0 59300.0 58500.0 58700.0 8734200# ...
OHLCV 데이터 이해
| 컬럼 | 의미 |
|---|---|
| Open | 시가 (장 시작 가격) |
| High | 고가 (당일 최고가) |
| Low | 저가 (당일 최저가) |
| Close | 종가 (장 마감 가격) |
| Volume | 거래량 |
분석에는 주로 종가(Close)를 사용합니다.
DatetimeIndex 활용
yfinance 데이터의 인덱스는 DatetimeIndex입니다. 날짜 기반 슬라이싱이 매우 편리합니다.
# 특정 날짜 선택samsung.loc["2024-01-15"]# 특정 기간 슬라이싱samsung.loc["2024-01-01":"2024-06-30"]# 특정 연도samsung.loc["2024"]# 특정 월samsung.loc["2024-03"]# 날짜 관련 정보 추출samsung.index.yearsamsung.index.monthsamsung.index.dayofweek # 0=월, 6=일samsung.index.quarter
여러 종목 동시 수집
# 주요 IT 종목tickers = { "삼성전자": "005930.KS", "SK하이닉스": "000660.KS", "NAVER": "035420.KS", "카카오": "035720.KS", "LG에너지솔루션": "373220.KS",}# 종가만 수집prices = yf.download(list(tickers.values()), start="2023-01-01")["Close"]prices.columns = list(tickers.keys()) # 영문 티커 → 한글 이름print(prices.head())print(f"\n결측치: {prices.isna().sum().sum()}개")
결측치 처리 (거래 없는 날)
# 공휴일, 거래 정지 등으로 결측치 발생# 전일 종가로 채우기 (가장 일반적)prices = prices.ffill()# 완전히 처음부터 결측인 경우 제거prices = prices.dropna()
데이터 저장 및 재활용
# CSV로 저장 (인터넷 없이 재사용)prices.to_csv("stock_prices.csv")# 불러오기prices = pd.read_csv("stock_prices.csv", index_col="Date", parse_dates=True)
주요 해외 종목 티커
| 종목 | 티커 |
|---|---|
| 삼성전자 | 005930.KS |
| KOSPI 200 ETF | 069500.KS |
| Apple | AAPL |
| Microsoft | MSFT |
| NVIDIA | NVDA |
| S&P 500 ETF | SPY |
정리
yf.download("티커", start="날짜", end="날짜"): 주가 데이터 수집- DatetimeIndex:
df.loc["2024-01"]처럼 직관적인 날짜 슬라이싱 - 여러 종목:
yf.download([티커1, 티커2, ...]) - 수집 후 CSV 저장하면 API 호출 없이 재사용 가능