주제 조사

260412_퀀트 3

the-rich 2026. 4. 12. 07:46

백테스트 실행해보기

프롬프트

퀀트에서 유명한 몇가지 전략들이 맞는지 확인하는 백테스트를 우선 간략하게 cursor에서 claude code로 시도해보려고 하는데 무엇부터 시작해야할지 퀀트 전문가가 되어서 스텝바이스텝으로 처음시작하는 학생에게 알려준다고 생각하고 알려줘. 참고로 내가 개입하지 않더라도 자동으로 ai가 테스트하고 매수하고 매도하는 (실제 매수, 매도는 아니고 테스트 매수, 매도) 시스템을 최종적으로 만들생각이긴해.

전체로드맵

1단계: 환경 세팅 + 데이터 수집
2단계: 전략 구현 + 간단 백테스트

3단계: 백테스트 프레임워크 고도화
4단계: 자율 AI 시뮬레이션 에이전트

프로젝트 폴더 구조

quant_backtest/
├── data/ # 주가 데이터
├── strategies/ # 전략별 파일
├── backtest/ # 백테스트 엔진
├── results/ # 결과/리포트
└── main.py

필수라이브러리 설치

yfinance # 주가 데이터
pandas
numpy
matplotlib
backtrader # 백테스트 프레임워크
ta # 기술적 지표 (RSI, MACD 등)

검증할 퀀트 전략 5선

이동평균 크로스오버 : 단기MA > 장기MA → 매수

평균 회귀 (RSI) : RSI 30 이하 과매도 → 매수

 

볼린저 밴드 : 하단 이탈 → 매수, 상단 돌파 → 매도

모멘텀 전략 : 최근 6~12개월 수익률 상위 종목
듀얼 모멘텀 : 절대+상대 모멘텀 결합 (Gary Antonacci)

 

백테스트 평가지표

  • 샤프 지수 = 수익률 / 변동성 → 1.0 이상이면 양호
    * 위험 대비 수익률 (2 이상=매우 좋음, 1~2=좋음)
  • MDD = 최고점 대비 최대 낙폭 → -20% 이내 목표
  • 승률 = 수익 거래 / 전체 거래 → 50% 이상
    * 매매 중 수익 거래 비율
  • 연간 수익률 = CAGR → 벤치마크(SPY ~10%) 대비 비교

데이터 수집

퀀트 백테스트 프로젝트를 위한 데이터 수집 모듈을 생성하십시오.

요구 사항:

  • yfinance를 사용하여 2015년부터 2024년까지 AAPL, MSFT, SPY의 일별 OHLCV(시가, 고가, 저가, 종가, 거래량) 데이터를 다운로드합니다.
  • 각 티커(종목코드)별로 data/ 폴더에 별도의 CSV 파일로 저장합니다.
  • 결측치 처리: 전방 채우기(forward fill)를 먼저 수행한 후, 남은 결측치(NaN)는 제거합니다.
  • 데이터 검증: 각 티커별로 데이터의 형태(shape), 날짜 범위, 결측치 개수를 출력합니다.
  • 티커별로 성공/실패 여부를 알리는 간단한 로깅 메시지를 추가합니다.

1. 이동평균 크로스오버

이동평균 교차(Moving Average Crossover) 백테스트 전략을 구현하십시오.

요구 사항:

  • 데이터 로드: data/SPY.csv 파일에서 SPY 데이터를 불러옵니다.
  • 전략 로직:
    • 단기 이동평균선(Short MA): 20일 단순 이동평균(SMA)
    • 장기 이동평균선(Long MA): 60일 단순 이동평균(SMA)
    • 매수 신호: 골든크로스 (단기 이평선이 장기 이평선을 상향 돌파할 때)
    • 매도 신호: 데드크로스 (단기 이평선이 장기 이평선을 하향 돌파할 때)
  • 거래 비용: 매매 건당 0.1%의 거래 비용을 적용합니다.
  • 다음 성과 지표들을 계산하고 출력하십시오:
    • 총 수익률 (Total Return, %)
    • 연평균 성장률 (CAGR, %)
    • 샤프 지수 (Sharpe Ratio, 연간화 기준, 무위험 이자율 = 0.02 적용)
    • 승률 (Win Rate, %)
    • 총 거래 횟수 (Number of trades)
  • 벤치마크 비교:  SPY '매수 후 보유(Buy & Hold)' 전략과 성과를 비교하십시오

 

상세로직 내용

1) 이동평균(SMA) 계산

  단순 이동평균(SMA, Simple Moving Average) 은 최근 N일 종가의 산술 평균입니다.

  SMA_20 (오늘) = (오늘 포함 최근 20일 종가의 합) / 20
  SMA_60 (오늘) = (오늘 포함 최근 60일 종가의 합) / 60

  - SMA_20 (단기선): 최근 한 달 시장의 방향을 반영, 가격에 민감하게 반응
  - SMA_60 (장기선): 최근 세 달 시장의 방향을 반영, 느리게 움직임
  - 처음 60일은 장기선을 계산할 수 없으므로 dropna()로 제거
  NaN이 하나라도 있는 행 전체 삭제

  삭제 전: 2,513행 (2015-01-02 ~ 2024-12-30)
  삭제 후: 2,454행 (2015-04-01 ~ 2024-12-30)
                     ↑
             처음 59행이 제거됨

2) 매수 매도 관련

매일 계산해서 매수 매도 결정

 

2) 백테스트 실행

SMA_20 > SMA_60 (골든 크로스, 매수)  crossover == +1  →  현금 전액으로 SPY 매수 (수수료 0.1% 차감)
SMA_20 ≤ SMA_60 (데드 크로스, 매도)  crossover == -1  →  보유 주식 전량 매도 (수수료 0.1% 차감)
기간 종료 시 미청산  →  마지막 가격으로 강제 청산


수수료 처리:
  - 매수 시: 투자 가능 금액 = 현금 × (1 - 0.001)
  - 매도 시: 실수령액     = 매도금액 × (1 - 0.001)

시각화

백테스트 결과 시각화 모듈을 추가하십시오.

요구 사항:

  • 그래프 1: 누적 수익률 곡선
    • 전략 수익률과 '매수 후 보유(Buy & Hold)' 벤치마크 수익률을 동일한 차트에 표시합니다.
    • 매수 신호는 녹색 위쪽 삼각형으로 표시합니다.
    • 매도 신호는 빨간색 아래쪽 삼각형으로 표시합니다.
  • 그래프 2: 낙폭(Drawdown) 차트
    • 시간 경과에 따른 낙폭 곡선(Underwater Equity Curve)을 표시합니다.
    • 최대 낙폭(MDD)이 발생한 지점을 강조하여 표시합니다.
  • 그래프 3: 롤링 샤프 지수(Rolling Sharpe Ratio)
    • 252일 윈도우(연간 기준)를 사용한 롤링 샤프 지수를 표시합니다.
  • 모든 그래프는 results/ 폴더에 PNG 파일로 저장합니다.
  • Matplotlib을 사용하며, 깔끔하고 가독성 좋은 스타일로 제작하십시오.

 

 

 

MA Crossover (20/60) — 파란 실선

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

2015~2024년 동안 총 19번 매수/매도 반복

 

 

[현금 100%]  ←→  [SPY 100%]
매수 신호 발생 시 보유 현금 전액으로 SPY 매수, 매도 신호 발생 시 보유 주식 전량 매도 후 현금화

Buy & Hold SPY — 회색 점선

2015년 초에 SPY 사서
2024년 말까지 아무것도 안 하고 그냥 보유

결과 해석 (MA Crossover)

수익률 117.7% vs 238.9% SPY 단순 보유가 2배 더 벌었음
MDD -27.1% vs -33.7% 대신 낙폭은 6%p 덜 떨어짐
샤프 0.57 1.0 미만 → 리스크 대비 수익 아쉬움
승률 63.2% 19번 거래 중 12번은 이겼음 ✅

 

장점: 큰 추세를 온전히 수확

  2020-05-06  매수 ($261.29)  ← COVID 반등 추세 확인 후 진입
  2021-10-04  매도 ($402.94)  ← 추세 소멸 시까지 보유
  수익률: +26.44%  (약 17개월 보유)


단점: 횡보장 잦은 손절

  2018-03-14  매수 ($242.31)
  2018-03-20  매도 ($239.44)  ← 6일 만에 데드 크로스
  손실: -1.19%

  2018-05-21  매수 ($241.57)
  2018-10-19  매도 ($246.33)  ← 5개월 보유했지만
  수익: +1.97%                 ← 수수료 감안 시 실질 이득 거의 없음

  추세가 없는 구간에서 골든/데드 크로스가 반복되며 수수료만 나감. 이것이 19번 거래하고도 B&H    
  대비 수익이 낮은 이유

 

2. RSI 평균회귀

 

RSI 평균 회귀(Mean Reversion) 백테스트 전략을 구현하십시오.

 

요구 사항:

  • 데이터 로드: data/SPY.csv 파일에서 SPY 데이터를 불러옵니다.
  • 지표 계산: ta 라이브러리를 사용하여 14일 기준 RSI를 계산합니다.
  • 전략 로직:
    • 매수 신호: RSI가 30 미만으로 떨어질 때 (과매도 상태)
    • 매도 신호: RSI가 70 위로 올라갈 때 (과매수 상태)
    • 매도 신호가 발생하지 않을 경우, 해당 기간의 마지막에 포지션을 종료합니다.
  • 거래 비용: 매매 건당 0.1%의 거래 비용을 적용합니다.
  • 다음 성과 지표들을 계산하고 출력하십시오:
    • 총 수익률 (Total Return, %)
    • 연평균 성장률 (CAGR, %)
    • 샤프 지수 (Sharpe Ratio, 연간화 기준, 무위험 이자율 = 0.02 적용)
    • 최대 낙폭 (MDD, %)
    • 승률 (Win Rate, %)
    • 총 거래 횟수 (Number of trades)
  • 벤치마크 비교: SPY '매수 후 보유(Buy & Hold)' 전략과 성과를 비교하십시오.
  • 시각화: 다음 3가지 그래프를 results/ 폴더에 PNG 파일로 저장하십시오.
    1. 매수/매도 신호가 포함된 누적 수익률 곡선
    2. MDD가 강조된 낙폭(Drawdown) 차트
    3. 252일 롤링 샤프 지수
  • 추가 그래프: 30/70 기준선이 포함된 RSI 지표 차트를 네 번째 서브플롯(subplot)으로 추가하십시오.

상세 로직 내용

1) 매수, 매도 관련


  중복 거래가 생기지 않도록 RSI < 30 일 때 한 번 진입하면 청산 조건을 충족하기 전까지 추가 진입하지        
  않음

  RSI 흐름 예시:
    45 → 35 → 27 → 24 → 29 → 32 → ... → 71
               ↑                           ↑
             매수 진입                  매도 청산
          (처음으로 30 하향 돌파)    (처음으로 70 상향 돌파)

 

2) 백테스트 실행 (backtest/engine.py)

 

0 → 1 변화: 매수 이벤트 (RSI가 30 하향 돌파한 날) :  crossover == +1   →  보유 현금 전액으로 SPY 매수 (수수료 0.1% 차감)
1 → 0 변화: 매도 이벤트 (RSI가 70 상향 돌파한 날) : crossover == -1   →  보유 주식 전량 매도 (수수료 0.1% 차감)
마지막 날까지 미청산  →  마지막 가격으로 강제 청산 (수수료 없음)

수수료 처리:
  - 매수 시: 투자 가능 금액 = 현금 × (1 - 0.001)
  - 매도 시: 실수령액     = 매도금액 × (1 - 0.001)

 

전체 결과 (지금까지 누적)

Metric RSI Mean Rev MA Crossover Buy & Hold
Total Return +84.9% +117.7% +240.8%
CAGR 6.4% 8.3% 13.2%
Sharpe 0.37 0.57 0.68
MDD -28.3% -27.1% -33.7%
Win Rate 90.0% 63.2%
Trades 10 19

 

RSI 전략 특징

1. 승률은 좋은데 수익률이 낮음

10번 거래 중 9번 이겼는데 수익은 가장 낮음

이유 → "현금으로 쉬는 시간"이 너무 길어요
RSI가 30 아래로 잘 안 내려오기 때문에
포지션 없이 현금으로 대기하는 기간이 길고
그 기간 동안 SPY가 올라가버림

초록 음영(포지션 보유 구간)이 전체의 절반도 안 됨

 

2. MDD -28.3% (2020년 코로나)

2020년 3월 23일이 최저점
RSI 30 이하 신호 받고 매수했는데
코로나 폭락이 계속 이어지면서 손실
→ 과매도 구간에서 샀는데 더 떨어지는 전형적인 리스크

 

  두 전략 모두 B&H를 이기지 못했지만, 이는 SPY가 10년간 강력한 상승 추세였기 때문. 변동성이   
  높거나 횡보하는 시장에서는 두 전략 모두 B&H 대비 유리해질 수 있음.

 

느낀점

 

현재 이거는 SPY만을 기준으로 테스트해본 것이기에 다른 종목들에 대해서도 테스트를 해봐야하며,
만약에 개별 종목과 지수를 비교할 때는 지수는 동일가중이 아니라 시가총액 가중인 점도 고려해야함.

만드는 것은 빨리 만들어주는데 여기서 허점이 없는지 찾아보고 고민하는데 시간을 많이 투자해야할 것 같음

 

단계

[현재] 수동 백테스트

[다음] 전략 자동 비교 + 최적 파라미터 탐색 (Grid Search)

[중간] 스케줄러로 매일 자동 실행 (APScheduler)

[최종] AI 에이전트가 전략 선택 → 시뮬 매수/매도 → 결과 리포트

최종 시스템 구조

AI Agent (LangChain or Claude API)
├── 시장 데이터 수집 모듈
├── 전략 평가 모듈 (백테스트)
├── 포지션 관리 모듈 (가상 계좌)
└── 리포트 생성 모듈 (텔레그램 or 이메일)

 

 

※ 이 글은 개인적인 공부 및 정보 공유 목적에서 작성된 내용으로, 투자 권유나 재정적 조언이 아닙니다.

※  시장 상황은 언제든 변할 수 있으며 글의 내용은 작성자의 주관적 해석이 포함되어 있습니다.

※  투자에 따른 모든 결과와 책임은 투자자 본인에게 있으니, 반드시 본인의 판단과 추가적인 검토를 거쳐 결정하시기 바랍니다.

'주제 조사' 카테고리의 다른 글

260419_퀀트4  (0) 2026.04.19
260412_주간 현황  (1) 2026.04.12
260405 퀀트 2  (0) 2026.04.12
260405_브라질 경제 현황 종합 분석 (2023~2026년)  (0) 2026.04.05
260328_K-콘텐츠 시장 개요  (0) 2026.03.28