백테스트로 나의 규칙을 검증한다 — 투자도 테스트 주도 개발(TDD)
“이 전략이 진짜 통할까?”
대부분의 투자자는 이 질문을 머릿속으로만 한다. 하지만 프로그래머는 다르다. 가설은 테스트로 검증한다.
그래서 이번 화에서는 투자 전략을 ‘코드 테스트’하듯 검증하는 과정을 다룬다. 이건 단순한 수익 확인이 아니라, 나의 판단 로직을 객관화하는 실험이다.
🧩 투자도 테스트 주도 개발(TDD)이다
TDD(Test Driven Development)는 ‘먼저 테스트를 만든 뒤 코드를 작성하는 방식’이다. 투자도 같다. “수익 내는 전략을 짜자”가 아니라, “이 전략이 과거 데이터에서도 일관되게 작동하는가?”가 핵심이다.
즉, 이렇게 바뀐다.
# 개발자 버전 def test_functionality(): assert output == expected # 투자자 버전 def test_strategy(): assert profit_rate > 0 and drawdown < 0.2
프로그래머는 실행 결과를 검증하고, 투자자는 전략의 일관성을 검증한다.
⚙️ 간단한 백테스트 예시 – 이동평균선 전략
아래는 “단순 이동평균선 골든크로스 전략”을 검증하는 예시 코드다.
import yfinance as yf import pandas as pd import matplotlib.pyplot as plt # 1. 데이터 불러오기 data = yf.download("AAPL", start="2022-01-01", end="2024-01-01") data["MA20"] = data["Close"].rolling(20).mean() data["MA60"] = data["Close"].rolling(60).mean() # 2. 매수/매도 조건 data["Signal"] = 0 data.loc[data["MA20"] > data["MA60"], "Signal"] = 1 # 매수 신호 data.loc[data["MA20"] < data["MA60"], "Signal"] = -1 # 매도 신호 # 3. 포지션 변동 data["Position"] = data["Signal"].shift(1) data["Daily Return"] = data["Close"].pct_change() data["Strategy Return"] = data["Daily Return"] * data["Position"] # 4. 누적 수익률 계산 data["Cumulative Market"] = (1 + data["Daily Return"]).cumprod() data["Cumulative Strategy"] = (1 + data["Strategy Return"]).cumprod() # 5. 시각화 plt.figure(figsize=(10,5)) plt.plot(data["Cumulative Market"], label="Market", color="gray") plt.plot(data["Cumulative Strategy"], label="Strategy", color="orange") plt.legend() plt.title("Moving Average Strategy vs Market") plt.show()
실행 결과, - 회색 선: 시장 전체 수익률 - 주황색 선: 전략 수익률 이 나온다. 만약 주황색이 더 높다면, 이 전략은 통계적으로 의미가 있다는 뜻이다.
📊 성과 지표를 추가해보자
백테스트에서 중요한 건 ‘이겼다/졌다’가 아니라, “얼마나 안정적으로 이겼는가”다.
그래서 다음 세 가지를 확인한다.
- 총 수익률 – 얼마나 벌었는가?
- 최대 낙폭(Drawdown) – 얼마나 잃었는가?
- 승률 / 손익비 – 예측이 얼마나 일관적이었는가?
예시 코드:
total_return = data["Cumulative Strategy"].iloc[-1] - 1 drawdown = 1 - data["Cumulative Strategy"] / data["Cumulative Strategy"].cummax() max_drawdown = drawdown.max() print(f"총 수익률: {total_return*100:.2f}%") print(f"최대 낙폭: {max_drawdown*100:.2f}%")
이 결과를 매일 기록하면, 전략을 반복적으로 테스트하면서 개선할 수 있다.
🧠 나의 전략을 테스트한다 = 나를 검증한다
프로그래머에게 테스트 코드는 단순한 검증 도구가 아니다. 시스템의 ‘예상된 동작’을 명시하는 **문서이자 철학**이다. 투자에서도 같다.
“어떤 조건일 때 사고팔 것인가?” “이 규칙이 감정 없이도 일관되게 작동할 수 있는가?” 이 질문들이 곧 테스트다.
테스트 없는 투자 = 회의록 없는 프로젝트. 결국 같은 실수를 반복한다.
테스트를 통과한 전략만 실제 투자에 반영한다면, 그건 이미 반쯤 자동화된 시스템이다.
🧩 실패한 테스트도 의미가 있다
백테스트를 하면 반드시 실패한다. “아니, 이렇게 했는데 왜 안 되지?” 하지만 프로그래머는 안다. 테스트 실패는 실패가 아니라 **피드백**이다.
- 조건이 너무 단순하다면 → 더 많은 변수 추가
- 수익률은 높지만 낙폭이 크다면 → 리스크 관리 조건 추가
- 일관성은 있지만 수익이 적다면 → 보완 전략 병합
투자 전략은 완성되는 게 아니라, 리팩토링되는 것이다.
🔧 로그 기반 개선 루프 만들기
앞서 만든 투자 로그를 백테스트 결과와 합치면, 자기 피드백 루프가 완성된다.
for strategy in strategy_list: result = backtest(strategy) log_result(strategy, result) if result["max_drawdown"] < 0.2: deploy(strategy)
이건 단순한 자동화 코드 같지만, 실제로는 ‘테스트 주도 투자 시스템’이다. 감정이 아닌 데이터가 전략을 선택한다.
🧮 테스트 주도 투자(TDI)의 철학
TDD(Test Driven Development)가 ‘버그 없는 코드’를 만드는 개발 철학이라면, TDI(Test Driven Investing)는 ‘감정 없는 투자’를 만드는 재테크 철학이다.
이 방식의 핵심은 단 하나다.
“테스트를 통과하지 않은 전략은 시장에 배포하지 않는다.”
그 철저함이 장기 생존을 만든다.
🧠 정리 — 시장을 이기려 하지 말고, 나를 검증하라
시장 예측은 운이지만, 규칙 검증은 실력이다. 감정은 불안정하지만, 데이터는 일관된다.
테스트 주도 투자는 나를 통제하는 습관이다. 매 거래마다 ‘테스트 통과 여부’를 묻는 순간, 감정은 사라지고 논리만 남는다.
📍다음 편 예고:
이제 테스트를 통과한 전략만 모아 ‘포트폴리오 자동 리밸런싱’으로 확장한다. 투자도 결국, 지속 가능한 코드 아키텍처를 설계하는 일이다.
💡 요약 포인트 투자 전략은 코드처럼 테스트할 수 있다. 백테스트는 예측이 아니라 검증이다. 실패한 전략은 버그 리포트다. 테스트를 통과한 전략만 배포하라. 감정이 아닌 데이터가 결정을 내리게 하라.
'{재테크} > 주식' 카테고리의 다른 글
| 🧮 프로그래머의 재테크 공부: 주식편 8화. (0) | 2025.10.29 |
|---|---|
| 📊 프로그래머의 재테크 공부: 주식편 7화. (0) | 2025.10.28 |
| ⚙️ 프로그래머의 재테크 공부: 주식편 5화 (0) | 2025.10.25 |
| 🔁 프로그래머의 재테크 공부: 주식편 4화 (0) | 2025.10.24 |
| 🧠 프로그래머의 재테크 공부: 주식편 3화 (0) | 2025.10.23 |