본문 바로가기
주식

파이썬으로 주식 백테스트 하는 법 2026 – 초보자도 따라하는 완벽 가이드

by Mi_meon 2026. 6. 28.

파이썬으로 주식 백테스트 하는 법 2026 – 초보자도 따라하는 완벽 가이드

📅 2026년 1월  |  ⏱️ 읽는 시간 약 15분  |  🏷️ 파이썬, 백테스트, 주식, 퀀트, 알고리즘투자

⚠️ 투자 유의사항
이 글은 파이썬 백테스트 구현 방법에 대한 정보 제공을 목적으로 합니다. 모든 투자 결정은 개인이 충분히 학습하고 스스로 의사 결정해야 합니다. 백테스트 결과는 과거 데이터 기반이며 미래 수익을 보장하지 않습니다. 투자에는 원금 손실의 위험이 있습니다.
💡 이 글에서 얻을 수 있는 것
"이 전략이 과거에 통했을까?" 투자 전략을 검증하는 가장 좋은 방법이 백테스트입니다. 이 글에서는 파이썬으로 주식 데이터를 수집하고 전략을 백테스트하는 전 과정을 초보자도 따라할 수 있도록 실제 코드와 함께 설명합니다. Claude를 활용해 코딩을 몰라도 백테스트를 구현하는 방법도 함께 다룹니다.

1. 왜 파이썬으로 백테스트인가?

백테스트 전용 플랫폼(젠포트, 퀀트킹)도 있지만 파이썬으로 직접 구현하면 다음과 같은 장점이 있습니다.

항목 파이썬 직접 구현 전용 플랫폼
비용완전 무료월 수만 원~수십만 원
커스터마이징무제한플랫폼 기능 내 제한
데이터 자유도어떤 데이터든 가능제공 데이터만
학습 곡선높음 (코딩 필요)낮음
AI 활용Claude로 코드 생성 가능제한적
💡 2026년 현재 Claude에게 전략을 설명하고 백테스트 코드를 요청하면 코딩을 몰라도 구현이 가능합니다. 이 글 후반부에서 자세히 다룹니다.

2. 환경 설정 – 필요한 라이브러리 설치

STEP 1 – Python 설치
python.org에서 Python 3.10 이상을 설치합니다.
STEP 2 – 필수 라이브러리 설치
터미널(또는 명령 프롬프트)에서 아래 명령어를 실행합니다.
pip install pandas numpy matplotlib yfinance pykrx
  • pandas: 데이터 처리
  • numpy: 수치 계산
  • matplotlib: 차트 시각화
  • yfinance: 해외 주식 데이터 수집 (무료)
  • pykrx: 국내 주식 데이터 수집 (무료)
STEP 3 – Jupyter Notebook 설치 (선택)
코드를 셀 단위로 실행하며 결과를 바로 확인할 수 있어 백테스트에 적합합니다.
pip install jupyter jupyter notebook
💡 Jupyter 설치가 번거롭다면 Google Colab을 사용하세요. 브라우저에서 바로 파이썬을 실행할 수 있고 설치가 필요 없습니다.

3. 주식 데이터 수집하기

해외 주식 데이터 (yfinance)

미국 주식 데이터 수집
import yfinance as yf import pandas as pd # 애플 주가 5년치 수집 ticker = "AAPL" df = yf.download(ticker, start="2020-01-01", end="2025-01-01") print(df.head()) print(df.shape) # 결과: Date, Open, High, Low, Close, Volume 컬럼

국내 주식 데이터 (pykrx)

코스피/코스닥 주가 데이터 수집
from pykrx import stock # 삼성전자 주가 수집 df = stock.get_market_ohlcv_by_date( fromdate="20200101", todate="20250101", ticker="005930" # 삼성전자 종목코드 ) print(df.head()) # 코스피 전체 종목 코드 조회 tickers = stock.get_market_ticker_list(market="KOSPI") print(f"코스피 종목 수: {len(tickers)}")

4. 기본 백테스트 구조 이해

모든 백테스트는 아래 구조로 이루어집니다.

1. 데이터 수집 주가, 거래량, 재무 데이터
2. 신호 생성 매수/매도 조건 계산
3. 포지션 계산 보유 여부 (1=보유, 0=미보유)
4. 수익률 계산 일별 수익률 × 포지션
5. 성과 분석 누적 수익, MDD, 샤프 비율
6. 시각화 자산 곡선 차트
기본 백테스트 템플릿
import yfinance as yf import pandas as pd import numpy as np import matplotlib.pyplot as plt # 1. 데이터 수집 df = yf.download("SPY", start="2015-01-01", end="2025-01-01") df = df[['Close']].copy() # 2. 신호 생성 (여기에 전략 로직 삽입) # signal = 1 (매수), 0 (현금 보유) # 3. 일별 수익률 계산 df['returns'] = df['Close'].pct_change() # 4. 전략 수익률 = 전날 신호 × 오늘 수익률 df['strategy_returns'] = df['signal'].shift(1) * df['returns'] # 5. 누적 수익률 df['cumulative'] = (1 + df['strategy_returns']).cumprod() df['benchmark'] = (1 + df['returns']).cumprod() # 6. 차트 df[['cumulative', 'benchmark']].plot(figsize=(12, 6)) plt.title('전략 vs 벤치마크') plt.show()

5. 전략 1 – 이동평균선 교차 전략

단기 이동평균선이 장기 이동평균선을 위로 돌파할 때 매수, 아래로 돌파할 때 매도하는 고전적인 전략입니다.

전체 코드
import yfinance as yf import pandas as pd import numpy as np import matplotlib.pyplot as plt # 데이터 수집 df = yf.download("SPY", start="2015-01-01", end="2025-01-01") df = df[['Close']].copy() # 이동평균선 계산 df['MA_short'] = df['Close'].rolling(window=20).mean() # 20일 단기 df['MA_long'] = df['Close'].rolling(window=60).mean() # 60일 장기 # 매수 신호: 단기선 > 장기선 → 1 (보유) # 매도 신호: 단기선 < 장기선 → 0 (현금) df['signal'] = np.where(df['MA_short'] > df['MA_long'], 1, 0) # 수익률 계산 df['returns'] = df['Close'].pct_change() df['strategy'] = df['signal'].shift(1) * df['returns'] # 누적 수익률 df['strategy_cum'] = (1 + df['strategy']).cumprod() df['benchmark_cum'] = (1 + df['returns']).cumprod() # 결과 출력 total_return = df['strategy_cum'].iloc[-1] - 1 print(f"전략 총 수익률: {total_return:.2%}") print(f"벤치마크 총 수익률: {df['benchmark_cum'].iloc[-1]-1:.2%}") # 차트 plt.figure(figsize=(12, 6)) plt.plot(df['strategy_cum'], label='이동평균 전략', color='blue') plt.plot(df['benchmark_cum'], label='Buy & Hold', color='gray', alpha=0.7) plt.title('이동평균 교차 전략 백테스트') plt.legend() plt.grid(True) plt.show()

6. 전략 2 – 모멘텀 전략

최근 수익률이 좋은 종목이 계속 좋은 성과를 낸다는 모멘텀 이론을 백테스트합니다.

단일 종목 모멘텀 백테스트
import yfinance as yf import pandas as pd import numpy as np # 데이터 수집 df = yf.download("QQQ", start="2015-01-01", end="2025-01-01") df = df[['Close']].copy() # 12개월(252거래일) 모멘텀 계산 df['momentum'] = df['Close'].pct_change(252) # 신호: 모멘텀 양수 → 매수, 음수 → 현금 df['signal'] = np.where(df['momentum'] > 0, 1, 0) # 수익률 계산 df['returns'] = df['Close'].pct_change() df['strategy'] = df['signal'].shift(1) * df['returns'] # 누적 수익률 및 MDD 계산 df['cum_strategy'] = (1 + df['strategy']).cumprod() df['cum_benchmark'] = (1 + df['returns']).cumprod() # MDD 계산 함수 def calc_mdd(cum_returns): rolling_max = cum_returns.cummax() drawdown = (cum_returns - rolling_max) / rolling_max return drawdown.min() mdd_strategy = calc_mdd(df['cum_strategy'].dropna()) mdd_benchmark = calc_mdd(df['cum_benchmark'].dropna()) print(f"전략 총 수익률 : {df['cum_strategy'].iloc[-1]-1:.2%}") print(f"벤치마크 수익률 : {df['cum_benchmark'].iloc[-1]-1:.2%}") print(f"전략 MDD : {mdd_strategy:.2%}") print(f"벤치마크 MDD : {mdd_benchmark:.2%}")

7. 전략 3 – 종가매수 시가매도 전략

앞서 소개한 종가매수 시가매도 전략을 파이썬으로 백테스트합니다.

종가매수 시가매도 백테스트
import yfinance as yf import pandas as pd import numpy as np # 데이터 수집 (Open, Close, Volume 필요) df = yf.download("SPY", start="2015-01-01", end="2025-01-01") df = df[['Open', 'Close', 'Volume']].copy() # 오버나이트 수익률 = 다음날 시가 / 당일 종가 - 1 df['overnight_return'] = df['Open'].shift(-1) / df['Close'] - 1 # 매수 조건: 거래량이 20일 평균보다 많은 날 df['vol_ma20'] = df['Volume'].rolling(20).mean() df['signal'] = np.where(df['Volume'] > df['vol_ma20'] * 1.5, 1, 0) # 전략 수익률 = 신호 × 오버나이트 수익률 df['strategy'] = df['signal'] * df['overnight_return'] # 누적 수익률 df['cum_strategy'] = (1 + df['strategy']).cumprod() # 연간 거래 횟수 trade_count = df['signal'].sum() print(f"총 매매 횟수: {int(trade_count)}회") print(f"연평균 매매: {int(trade_count/10)}회") print(f"전략 누적 수익률: {df['cum_strategy'].iloc[-1]-1:.2%}") print(f"승률: {(df['strategy']>0).sum() / (df['strategy']!=0).sum():.2%}")
⚠️ 위 코드는 거래 비용(수수료, 슬리피지)을 포함하지 않습니다. 실전에서는 거래 비용을 반드시 차감해야 현실적인 수익률이 계산됩니다. 백테스트 결과가 좋아도 실전에서는 다를 수 있습니다. 모든 투자 결정은 개인이 직접 판단해야 합니다.

8. 성과 지표 계산하기

주요 성과 지표 계산 함수
import numpy as np import pandas as pd def performance_metrics(returns, risk_free_rate=0.03): """ returns: 일별 수익률 시리즈 risk_free_rate: 연간 무위험 수익률 (기본값 3%) """ # 누적 수익률 cum_return = (1 + returns).cumprod() total_return = cum_return.iloc[-1] - 1 # 연평균 수익률 (CAGR) n_years = len(returns) / 252 cagr = (1 + total_return) ** (1 / n_years) - 1 # 변동성 (연환산) volatility = returns.std() * np.sqrt(252) # 샤프 비율 sharpe = (cagr - risk_free_rate) / volatility # MDD (최대 낙폭) rolling_max = cum_return.cummax() drawdown = (cum_return - rolling_max) / rolling_max mdd = drawdown.min() # 승률 win_rate = (returns > 0).sum() / (returns != 0).sum() print(f"총 수익률 : {total_return:.2%}") print(f"연평균(CAGR): {cagr:.2%}") print(f"연 변동성 : {volatility:.2%}") print(f"샤프 비율 : {sharpe:.2f}") print(f"최대 낙폭 : {mdd:.2%}") print(f"승률 : {win_rate:.2%}") return { 'total_return': total_return, 'cagr': cagr, 'volatility': volatility, 'sharpe': sharpe, 'mdd': mdd, 'win_rate': win_rate } # 사용 예시 metrics = performance_metrics(df['strategy'].dropna())

9. Claude로 백테스트 코드 만들기

파이썬 코딩이 어렵다면 Claude에게 전략을 설명하고 코드를 요청하면 됩니다.

Claude 프롬프트 예시 1 – 기본 요청
"파이썬으로 주식 백테스트 코드를 짜줘. 전략: - yfinance로 SPY 데이터를 2015년부터 2025년까지 수집 - 20일 이동평균선이 60일 이동평균선 위에 있을 때 매수 유지 - 아래로 내려오면 현금 보유 - 거래 비용 0.1% 적용 결과로 보여줄 것: - 전략 vs 벤치마크 누적 수익률 차트 - CAGR, MDD, 샤프 비율, 승률 출력 - 연도별 수익률 표 Google Colab에서 바로 실행 가능하게 해줘."
Claude 프롬프트 예시 2 – 국내 주식
"pykrx 라이브러리로 삼성전자(005930) 데이터를 수집해서 다음 전략을 백테스트하는 파이썬 코드 짜줘. 전략: - 종가 기준 RSI 30 이하일 때 매수 - RSI 70 이상일 때 매도 - 포지션 없을 때 현금 보유 RSI 계산 포함해줘. 결과: 누적 수익률 차트 + 성과 지표 출력"
✅ Claude가 생성한 코드를 Google Colab에 붙여넣고 실행하면 됩니다. 에러가 나면 에러 메시지를 그대로 Claude에게 보내면 수정해줍니다.

10. 백테스트의 함정과 주의사항

함정 1 – 과최적화 (Overfitting)
파라미터를 과거 데이터에 맞게 너무 세밀하게 조정하면 실전에서 성과가 나오지 않습니다. 파라미터 조정은 최소화하고 논리적 근거가 있는 값을 사용하세요.
함정 2 – 생존자 편향 (Survivorship Bias)
현재 상장된 종목만으로 백테스트하면 이미 상장폐지된 종목이 제외됩니다. 실제보다 성과가 좋게 나오는 왜곡이 발생합니다.
함정 3 – 미래 참조 (Look-ahead Bias)
매수 신호 계산에 미래 데이터가 사용되는 경우입니다. 신호는 반드시 shift(1)을 사용해 전날 신호로 오늘 매매하는 구조로 만들어야 합니다.
함정 4 – 거래 비용 미포함
매매 수수료, 세금, 슬리피지를 포함하지 않으면 실제보다 훨씬 좋은 결과가 나옵니다. 최소 편도 0.1~0.3% 거래 비용을 반드시 적용하세요.
함정 5 – 짧은 테스트 기간
3~5년 데이터만으로 검증하면 특정 시장 환경에만 최적화된 결과일 수 있습니다. 최소 10년 이상, 가능하면 여러 시장 사이클(상승장 + 하락장)을 포함해야 합니다.
⚠️ 최종 경고: 백테스트 수익률이 아무리 좋아도 미래 수익을 보장하지 않습니다. 주식 투자의 모든 결정은 개인이 직접 판단해야 하며, 소액으로 실전 테스트를 충분히 거친 후 규모를 늘리는 것을 권장합니다.

11. 정리

단계 내용 도구
환경 설정Python + 라이브러리 설치pip, Google Colab
데이터 수집해외: yfinance / 국내: pykrx무료
신호 생성전략 로직을 코드로 구현pandas, numpy
성과 계산CAGR, MDD, 샤프 비율, 승률직접 계산 또는 Claude
시각화누적 수익률 차트matplotlib
코드 모르면Claude에게 전략 설명 → 코드 요청claude.ai

파이썬 백테스트는 처음에는 어렵게 느껴지지만, Claude의 도움을 받으면 코딩을 잘 몰라도 시작할 수 있습니다. 가장 중요한 것은 백테스트 결과를 맹신하지 않고 논리적 근거가 있는 전략을 검증하는 도구로 활용하는 것입니다.

📌 최종 안내: 이 글의 코드와 전략은 교육 목적입니다. 모든 투자 결정은 반드시 개인이 충분히 학습하고 스스로 내려야 합니다.
📌 이 글이 도움이 되셨나요?
구독하시면 파이썬 퀀트 투자, AI 자동화 실전 코드를 매주 무료로 받아보실 수 있습니다.
반응형