AI · DATA · QUANT진행 중
퀀트 트레이딩 시스템
trading-bot
국내와 미국 주식을 같은 이벤트 기반 엔진으로 백테스트하고, 모의투자 상태를 파일로 보존하며, 백테스트 수치가 좋아 보여도 실제로 돈을 넣어도 되는지를 따로 판정하도록 만든 시스템입니다.
개요
KOSPI/KOSDAQ와 미국 주식을 같은 이벤트 기반 엔진으로 백테스트하고, 모의투자 상태를 파일로 보존하며, 이후 실전 브로커를 붙일 수 있게 만든 프로젝트입니다. v1(백테스트·모의투자) 완료 후 퀀트 투자 시스템으로 확장하고 있습니다.
실수하지 않게 만드는 데 집중한 부분
금융 데이터는 조용히 틀리기 쉽습니다. 결과가 그럴듯해 보이는데 실제로는 미래 정보를 봤거나 오래된 가격에 매매한 경우가 많습니다. 그래서 방어 장치를 설계의 중심에 뒀습니다.
- Point-in-Time 저장소 — 모든 레코드에
available_at(그 데이터를 실제로 알 수 있게 된 날)을 함께 저장하고, 백테스트는 그 날짜 이전 데이터를 볼 수 없습니다. 미래 정보 유입(look-ahead bias) 차단 signal_id멱등성 원장 — 같은 신호가 재실행돼도 중복 주문이 나가지 않습니다- 가격 신선도 가드 — 캐시가 기본 3거래일보다 오래되면 리밸런싱을 건너뜁니다. 수집이 멈춘 채 옛날 가격에 매매하는 것을 막습니다
- 전략 상태 영속화 — 보유일 카운터가 프로세스 재시작 후에도 복구됩니다
- 거래소 캘린더 — KR/US 공휴일·조기폐장·지연개장을 세션 클록에 반영
- 종가 신호는 다음 거래일 시가 체결 — 당일 종가로 당일 체결하는 비현실적 가정을 배제
전략 승격 판정
백테스트 수치가 좋아 보여도 실제로 자금을 넣어도 되는지는 별개 문제입니다. 승격 기준 6개(Walk-forward 승률, 연 회전율, 비용 2배 검정 등)를 실제로 재서 합격·불합격을 판정하는 명령을 따로 만들었습니다.
측정하지 못한 항목은 통과가 아니라 "측정 불가"로 남깁니다. 판정 결과는 저장소 문서에 그대로 기록했습니다. 지금까지 판정한 두 전략(국내 테마 멀티팩터, 미국 ETF 로테이션) 모두 벤치마크 대비 초과수익 기준을 넘지 못해 모의투자 승격 보류 상태입니다. 미국 ETF 로테이션은 승격되지 못했지만, 절대 모멘텀·국면 필터가 2008·2020·2022 하락장에서 낙폭을 크게 줄였다는 점은 확인했습니다.
다음 단계는 새 아이디어를 덧붙이는 대신, 두 판정에서 측정으로 좁혀진 원인(현금을 고려하지 않는 매수 수량, 유니버스가 작아 팩터보다 표본 크기를 재게 되는 게이트, 상위 소수 종목 선정이 버리는 분산 효과)부터 해소하는 탐색으로 설계했습니다.
구현 범위
- 백테스트 엔진 — MARKET/LIMIT/STOP/MOC 체결, DAY 만료, 슬리피지, KR/US 수수료 모델, 리스크 제한
- 연구 프레임워크 — forward return 라벨, Spearman IC, 분위수 분석, Walk-forward, 실험 기록, 팩터 채택 게이트
- 팩터 — 3·6·12개월(및 12-1) 모멘텀, 수급·가치 팩터, 표준화·가중결합, 200일선 국면 필터
- 가치투자 프레임워크 — FCFF DCF 엔진, CAPM식 요구수익률·IRR·최대매수가, 시나리오 3-튜플, 역산 DCF. 네트워크 의존 0의 순수 코어
- 데이터 파이프라인 — KRX 수급·밸류에이션, DART 재무, 시장·거시 시리즈 수집과 품질 검사
- 리포트 — 자산곡선·드로다운 차트가 포함된 단일 HTML 리포트와 체결 내역 CSV
- 이벤트 리스크 오버레이 — 실적 발표를 앞둔 종목의 비중을 미리 줄입니다. 발표일은 DART 잠정실적 공시에서 모으고, 다음 발표일은 과거 발표 간격으로만 추정해 미래 일정이 백테스트에 새어 들어가지 않게 했습니다
- 미국 시장 — 11개 ETF 자산배분 로테이션을 2007년부터 백테스트
주간 브리핑
토스증권 계좌를 읽기 전용으로 조회해, 지난 실행 이후 무슨 일이 있었는지를 주식
비전문가의 말로 정리해 텔레그램으로 보냅니다. .bat 더블클릭 한 번으로 실행됩니다.
계좌 조회는 주문 인터페이스와 별개의 포트로 만들어 주문 코드가 한 줄도 없습니다. 브리핑 쪽 버그가 돈을 움직일 수 없게 하는 것이 설계의 출발점이었습니다. 매매 제안은 승격을 통과한 전략이 생긴 뒤에 붙입니다.
초보자도 쓸 수 있는 GUI
CLI를 모르는 사람도 쓸 수 있도록 Tkinter GUI를 함께 만들었습니다(추가 의존성 없음).
- 종목을 이름으로 검색 (예: "삼성전자" → 005930 자동 변환)
- 실행 전 시세 데이터 자동 받기 —
data update를 따로 몰라도 됩니다 - 백테스트 완료 시 HTML 리포트 자동 열기
.bat더블클릭이면 가상환경 구성까지 자동 수행
CLI와 GUI는 동일한 실행 로직을 공유합니다.