KIS 자율매매 프로젝트, 여기까지 정리하고 넘어간다

2026. 9. 2. 10:12ㆍ카테고리 없음

반응형
실시간 시장 스캐너 화면

지금도 5분마다 사이클을 도는 실제 대시보드

이 시리즈로 세 편을 썼다. Open API 연동하면서 만난 버그들, 로컬 LLM을 판단에 붙인 구조, 그리고 백테스트로 그 구조를 검증한 결과. 이번 글은 그 세 편을 하나로 묶는 마무리 글이다.

만든 것

FastAPI + SQLite 백엔드, Next.js 프론트엔드로 만든 국내주식 모의투자 대시보드다. 핵심은 두 개의 독립된 자율매매 엔진이다 — 하나는 자체 시뮬레이터 위에서 돌고, 하나는 한국투자증권 Open API 모의투자 서버에 실제로 주문을 낸다. 둘 다 같은 설계 원칙을 따른다: 로컬 LLM(Ollama + EXAONE 3.5 7.8B)이 매수/매도 후보를 제안하면, 손절/익절 강제 룰과 국면별 매수 차단, 종목당 비중 한도 같은 규칙 엔진이 그 제안을 걸러서 최종 주문을 만든다.

고친 것

  • 멀티스레드 환경에서 SQLite 동시 접근 시 나던 database is locked — WAL 모드 + busy_timeout으로 해결
  • 오래 살아있는 requests 세션이 죽은 커넥션을 재사용하며 나던 RemoteDisconnected — HTTPAdapter 재시도 정책으로 해결
  • 유동성 무시한 대량 시장가 주문이 미체결로 쌓이며 엔진 전체가 멈추던 문제 — 평균 거래량 대비 참여율 상한으로 해결
  • 잔고 정산 지연으로 가용 현금이 마이너스까지 가던 문제 — 매수 직전 실시간 주문가능금액 재확인으로 해결
  • useSWR에 fetcher 함수를 잘못 넘겨서 종목코드 자리에 API 경로 문자열이 들어가던 프론트엔드 버그

검증한 것, 그리고 인정한 것

워크포워드 백테스트를 돌려보니 지금 규칙 조합(기술점수 임계값 25, 손절 -5%/익절 +12%, 8종목 분산)은 60~64거래일 구간에서 벤치마크(동일가중 매수 후 보유)를 크게 밑돌았다. 알파 -15~-24%p, 승률 30%, 손익비 0.95. 판정 기준상 명백한 fail이다.

이 숫자를 감추지 않고 그대로 남기는 이유는 이 프로젝트의 목적이 애초에 "AI가 알아서 돈 벌어주는 봇"을 만드는 게 아니었기 때문이다. 목적은 브로커 API 연동, LLM을 실전 파이프라인에 안전하게 끼워 넣는 구조, 그리고 그 구조를 백테스트로 검증하는 습관을 직접 만들어보는 것이었다. 그 세 가지는 다 손에 잡히는 형태로 남았다. 돈 버는 전략은 아직이다.

지금 상태, 정직하게

레포에는 아직 커밋 안 된 변경사항이 남아있다 — 더 넓게 분산하는 새 경쟁 전략을 실험 중이고, 이건 백테스트로 다시 검증한 뒤에 정리할 일이다. 자율매매 엔진은 지금도 5분마다 사이클을 돌며 시장 국면과 후보를 관찰하고 있고, 계정 잔고와 로그는 계속 쌓이는 중이다. 즉 이 프로젝트는 "끝났다"기보다 "지금 시점에서 한 번 정리하고 다음으로 넘어간다"에 가깝다.

이 시리즈에서 남긴 교훈을 한 줄로 정리하면: 파이프라인을 만드는 것과 그 파이프라인이 돈을 버는 것은 다른 문제이고, 그 차이를 숫자로 확인하는 습관이 없으면 둘을 착각하기 쉽다. 다음 글부터는 다른 프로젝트 이야기를 써볼 예정이다.


이 프로젝트는 학습/실험 목적의 모의투자 시스템이며, 실제 투자 조언이 아닙니다. 코드는 개인 레포에서 관리 중입니다.

GitHub 저장소: sunwoo8478/kis-paper-trading

반응형