안녕하세요, 코딩제로개발자입니다.
지난 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
아래 코드 전체 복사-붙여넣기:
# 골든크로스 백테스팅 프로그램
# 코딩제로개발자의 주식 자동화 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랑 날짜만 바꿔도 재미있는데, 이동평균 기간도 바꿔볼 수 있어요.
SHORT_MA = 5 # 10으로 바꿔보기
LONG_MA = 20 # 60으로 바꿔보기
숫자만 바꾸고 다시 실행하면 다른 전략 결과가 나와요. 이렇게 여러 조합을 테스트해보면서 가장 좋은 전략을 찾는 거예요.
마치며
오늘 배운 백테스팅, 어떠셨나요?
코드 한 줄 한 줄 이해 안 해도 괜찮아요. 일단 돌려보고, 숫자 바꿔보고, 결과 비교해보는 게 먼저예요. 그러다 보면 자연스럽게 이해가 돼요.
다음 3편에서는 백테스팅으로 검증한 전략을 실제 자동매매에 연결하는 과정을 보여드릴게요. 드디어 진짜 자동매매예요! 😊
궁금한 점은 댓글로 남겨주세요!
💡 AI로 자동화 프로그램 만드는 전 과정이 궁금하신 분들!
주식 자동매매부터 쿠팡 파트너스 자동화까지 담긴 전자책을 크몽에서 확인해보세요 😊
👉코딩제로 AI 주식 자동매매 시스템 만들기
코딩제로 AI 주식 자동매매 시스템 만들기 - 크몽
코딩제로개발자 전문가의 전자책 서비스를 만나보세요. <p>코딩을 1도 모르는 제가, AI의 도움만으로</p><p&g...
kmong.com
AI로 쿠팡 파트너스 자동화 수익 만들기 - 크몽
코딩제로개발자 전문가의 전자책 서비스를 만나보세요. <p>코딩을 1도 몰라도 괜찮습니다. AI와 파이썬으로 쿠팡 파트너스 수익을 자...
kmong.com
애드센스 승인 완전정복 전자책 (초보자 필독) - 크몽
코딩제로개발자 전문가의 전자책 서비스를 만나보세요. <p>블로그 시작했는데 애드센스 승인이 안 되시나요?</p><p...
kmong.com
'직접 만든 과정' 카테고리의 다른 글
| 주식 자동매매 프로그램 만들기 1편 - 기초 세팅 (코딩 몰라도 됩니다) (0) | 2026.03.25 |
|---|---|
| AI로 블로그 글 5분 만에 쓰는 방법 (프롬프트 공개) (0) | 2026.03.20 |
| 파이썬 설치부터 첫 자동화 프로그램 실행까지 (왕초보용) (0) | 2026.03.13 |


