본문 바로가기
직접 만든 과정

주식 자동매매 프로그램 만들기 2편 - 백테스팅으로 전략 검증하기

by 코딩제로개발자 2026. 4. 3.

안녕하세요, 코딩제로개발자입니다.

지난 1편에서 키움증권 API 기초 세팅을 했는데요, 혹시 따라하셨나요?

오늘은 2편입니다. 실제로 돈을 넣기 전에 "이 전략이 과거에 통했는지" 검증하는 과정, 백테스팅을 해볼게요.

백테스팅을 안 하고 실전 투자하는 건 지도 없이 모르는 길을 가는 것과 같아요. 꼭 거쳐야 하는 단계예요.

⚠️ 주의: 이 글은 자동매매 프로그램 만드는 과정을 공유하는 것이지, 투자 권유가 아닙니다. 주식 투자는 항상 원금 손실 위험이 있어요. 투자는 본인 책임입니다!


백테스팅이 뭔가요?

백테스팅(Backtesting)은 과거 데이터로 내 투자 전략을 시뮬레이션하는 거예요.

예를 들어 이런 전략이 있다고 해볼게요.

"5일 이동평균선이 20일 이동평균선을 위로 돌파할 때 매수, 아래로 내려올 때 매도"

이 전략이 과거 5년 동안 실제로 수익이 났을까요? 백테스팅으로 확인할 수 있어요.

백테스팅으로 알 수 있는 것들:

  • 총 수익률
  • 최대 손실폭 (MDD)
  • 승률 (몇 번 중 몇 번 이겼는지)
  • 평균 보유 기간

이 숫자들을 보고 전략을 다듬은 다음 실전에 투입하는 거예요.

💡 TIP: 백테스팅 결과가 좋다고 실전에서도 반드시 좋은 건 아니에요. 하지만 백테스팅도 안 하고 실전 투자하는 것보다는 훨씬 안전해요.


백테스팅에 필요한 것

1편에서 파이썬이랑 VS Code 설치했죠? 거기에 라이브러리 2개만 추가로 설치하면 돼요.

터미널에서 아래 명령어 실행:

 
 
pip install pandas yfinance matplotlib
  • pandas: 데이터 처리
  • yfinance: 야후 파이낸스에서 주가 데이터 무료로 가져오기
  • matplotlib: 차트 그리기

설치 완료되면 준비 끝이에요!


실제 백테스팅 코드

오늘 사용할 전략은 가장 기본적인 골든크로스 전략이에요.

5일 이동평균선이 20일 이동평균선을 위로 돌파 → 매수
5일 이동평균선이 20일 이동평균선을 아래로 이탈 → 매도

새 파일 만들기 → 파일명: backtest.py

아래 코드 전체 복사-붙여넣기:

 
 
python
# 골든크로스 백테스팅 프로그램
# 코딩제로개발자의 주식 자동화 2편

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

# ================================================
# 설정값 (여기만 바꾸면 됩니다!)
# ================================================
TICKER = "005930.KS"   # 삼성전자 (다른 종목으로 바꿔도 됨)
START_DATE = "2020-01-01"  # 백테스팅 시작일
END_DATE = "2024-12-31"    # 백테스팅 종료일
INITIAL_CAPITAL = 1000000  # 초기 자본금 (100만원)
SHORT_MA = 5               # 단기 이동평균 (5일)
LONG_MA = 20               # 장기 이동평균 (20일)
# ================================================

print(f"📊 {TICKER} 백테스팅 시작...")
print(f"기간: {START_DATE} ~ {END_DATE}")
print(f"초기 자본금: {INITIAL_CAPITAL:,}원\n")

# 주가 데이터 가져오기
df = yf.download(TICKER, start=START_DATE, end=END_DATE)
df['MA5'] = df['Close'].rolling(window=SHORT_MA).mean()
df['MA20'] = df['Close'].rolling(window=LONG_MA).mean()

# 매매 신호 생성
df['Signal'] = 0
df.loc[df['MA5'] > df['MA20'], 'Signal'] = 1   # 매수 신호
df.loc[df['MA5'] < df['MA20'], 'Signal'] = -1  # 매도 신호
df['Position'] = df['Signal'].diff()

# 백테스팅 실행
capital = INITIAL_CAPITAL
shares = 0
trades = []

for date, row in df.iterrows():
    if pd.isna(row['MA20']):
        continue
    
    # 매수
    if row['Position'] == 2 and capital > 0:
        shares = int(capital / row['Close'])
        cost = shares * row['Close']
        capital -= cost
        trades.append({'날짜': date, '구분': '매수', '가격': row['Close'], '수량': shares})
    
    # 매도
    elif row['Position'] == -2 and shares > 0:
        revenue = shares * row['Close']
        capital += revenue
        trades.append({'날짜': date, '구분': '매도', '가격': row['Close'], '수량': shares})
        shares = 0

# 최종 자산 계산
final_capital = capital + (shares * df['Close'].iloc[-1])
profit = final_capital - INITIAL_CAPITAL
profit_rate = (profit / INITIAL_CAPITAL) * 100

# 결과 출력
print("=" * 40)
print("📈 백테스팅 결과")
print("=" * 40)
print(f"초기 자본금:  {INITIAL_CAPITAL:>12,.0f}원")
print(f"최종 자산:    {final_capital:>12,.0f}원")
print(f"순수익:       {profit:>12,.0f}원")
print(f"수익률:       {profit_rate:>12.2f}%")
print(f"총 거래 횟수: {len(trades):>12}회")
print("=" * 40)

# 차트 그리기
plt.figure(figsize=(14, 7))
plt.plot(df['Close'], label='주가', alpha=0.7)
plt.plot(df['MA5'], label=f'{SHORT_MA}일 이동평균', alpha=0.8)
plt.plot(df['MA20'], label=f'{LONG_MA}일 이동평균', alpha=0.8)

# 매수/매도 포인트 표시
buy_signals = df[df['Position'] == 2]
sell_signals = df[df['Position'] == -2]
plt.scatter(buy_signals.index, buy_signals['Close'], 
           marker='^', color='red', s=100, label='매수', zorder=5)
plt.scatter(sell_signals.index, sell_signals['Close'], 
           marker='v', color='blue', s=100, label='매도', zorder=5)

plt.title(f'{TICKER} 골든크로스 전략 백테스팅 ({START_DATE} ~ {END_DATE})')
plt.xlabel('날짜')
plt.ylabel('주가 (원)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('backtest_result.png', dpi=150)
plt.show()
print("\n✅ 차트가 'backtest_result.png'로 저장됐어요!")

실행:

 
 
python backtest.py

실행하면 이런 결과가 나와요

터미널에 이런 결과가 출력돼요.

 
 
📈 백테스팅 결과
========================================
초기 자본금:     1,000,000원
최종 자산:       1,245,320원
순수익:            245,320원
수익률:              24.53%
총 거래 횟수:          18회
========================================

그리고 매수/매도 포인트가 표시된 차트도 자동으로 저장돼요!

💡 TIP: TICKER 부분을 바꾸면 다른 종목도 테스트할 수 있어요. 카카오는 035720.KS, 네이버는 035420.KS, 현대차는 005380.KS예요.


결과 해석하는 법

수익률만 보면 안 돼요. 이 3가지를 같이 봐야 해요.

① 수익률 단순히 얼마나 벌었는지예요. 같은 기간 코스피 수익률과 비교해보세요. 코스피보다 낮으면 그냥 ETF 사는 게 나아요.

② 거래 횟수 너무 많으면 수수료가 수익을 갉아먹어요. 보통 연 10~20회 정도가 적당해요.

③ 최대 손실폭 (MDD) 한때 얼마나 떨어졌는지예요. -30%가 넘으면 실전에서 멘탈 버티기 힘들어요.


전략 바꿔보기

TICKER랑 날짜만 바꿔도 재미있는데, 이동평균 기간도 바꿔볼 수 있어요.

 
 
python
SHORT_MA = 5    # 10으로 바꿔보기
LONG_MA = 20    # 60으로 바꿔보기

숫자만 바꾸고 다시 실행하면 다른 전략 결과가 나와요. 이렇게 여러 조합을 테스트해보면서 가장 좋은 전략을 찾는 거예요.


마치며

오늘 배운 백테스팅, 어떠셨나요?

코드 한 줄 한 줄 이해 안 해도 괜찮아요. 일단 돌려보고, 숫자 바꿔보고, 결과 비교해보는 게 먼저예요. 그러다 보면 자연스럽게 이해가 돼요.

다음 3편에서는 백테스팅으로 검증한 전략을 실제 자동매매에 연결하는 과정을 보여드릴게요. 드디어 진짜 자동매매예요! 😊

궁금한 점은 댓글로 남겨주세요!


💡 AI로 자동화 프로그램 만드는 전 과정이 궁금하신 분들!
주식 자동매매부터 쿠팡 파트너스 자동화까지 담긴 전자책을 크몽에서 확인해보세요 😊

👉코딩제로 AI 주식 자동매매 시스템 만들기 

 

코딩제로 AI 주식 자동매매 시스템 만들기 - 크몽

코딩제로개발자 전문가의 전자책 서비스를 만나보세요. <p>코딩을 1도 모르는 제가, AI의 도움만으로</p><p&g...

kmong.com

👉AI로 쿠팡 파트너스 자동화 수익 만들기

 

AI로 쿠팡 파트너스 자동화 수익 만들기 - 크몽

코딩제로개발자 전문가의 전자책 서비스를 만나보세요. <p>코딩을 1도 몰라도 괜찮습니다. AI와 파이썬으로 쿠팡 파트너스 수익을 자...

kmong.com

👉애드센스 승인 완전정복 전자책 (초보자 필독)

 

애드센스 승인 완전정복 전자책 (초보자 필독) - 크몽

코딩제로개발자 전문가의 전자책 서비스를 만나보세요. <p>블로그 시작했는데 애드센스 승인이 안 되시나요?</p><p...

kmong.com