유민우 · Tech Notes


자동매매 시스템 구축기

🗓️ 1/18/2026 👤 Role: Quant System Builder
PythonBinance APIWebSocketSQLiteRich TUIPyTorch

자동매매 시스템 구축기

— 실험용 알파를 실거래로 옮기기까지

Problem & Context

왜 이걸 만들었나

알파 모델 실험은 충분히 진행됐지만, 늘 같은 문제가 남았다.

“이 신호가 실제 시장에서도 의미가 있는가?”

백테스트 상에서는 성과가 좋아도, 실거래 환경에서는 다음 요소들이 빠지면 검증이 불가능하다.

  • 실시간 데이터 지연
  • 체결 품질과 슬리피지
  • 포지션 관리와 리스크 제약
  • 주문 실패 / 부분 체결 / 잔량(dust)

즉, 모델 성능이 아니라 ‘실행 시스템’이 병목이 되는 상황이었다.


Requirements & Constraints

필수 요구사항

  1. 실시간 데이터 → 추론 → 주문 실행이 하나의 파이프라인으로 연결될 것
  2. 주문·체결·포지션·상태 전이를 사후 재현 가능하게 기록할 것
  3. 운영 중 현재 상태를 즉시 파악할 수 있는 경량 대시보드 제공

현실적 제약

  • 거래소: Binance 선물 API
  • 운영 비용 최소화를 위해 SQLite 기반 로컬 로그
  • PyTorch 기반 모델 → CPU / GPU 모두 대응

Architectural Candidates

Option 1. 신호 생성 ↔ 주문 실행 완전 분리 (이벤트 큐)

장점

  • 장애 격리
  • 다중 전략 / 다중 심볼 확장 용이

단점

  • 메시지 브로커, 스키마 관리 등 운영 복잡도 급증
  • 실험 단계에서는 과도한 설계

Option 2. 단일 프로세스 + 루프 기반 구조 ✅ (채택)

장점

  • 구현 속도 빠름
  • 상태 추적과 디버깅이 매우 용이
  • 로그와 실제 행동의 1:1 대응

단점

  • 병렬성 한계
  • 장기 운용 시 구조 분리 필요

Decision

최종 선택

단일 프로세스 내부에서 데이터 수집 → 추론 → 리스크 판단 → 주문 실행을 순환

핵심 설계 철학

  • “지금 무슨 일이 벌어지고 있는지”를 항상 설명할 수 있을 것
  • 실행·체결·포지션 변화가 FSM 이벤트로 명확히 남을 것
  • 나중에 로그만 보고도 전략의 의사결정을 복원할 수 있을 것

이를 위해 다음을 도입했다.

  • FSM 기반 포지션 생명주기 관리
  • OMS / Risk / Gate 모듈 분리
  • 모든 결정에 대해 원인 로그 기록

System Overview

실행 파이프라인

MarketDataBuffer
      ↓
LiveModelRunner
      ↓
LiveGateEvaluator
      ↓
TradeFSM
      ↓
RiskManager / ExitEngine
      ↓
OrderManager → BinanceAdapter

주요 컴포넌트 역할

  • MarketDataBuffer 실시간 캔들 / 히스토리 관리 (추론용 스냅샷 제공)

  • LiveModelRunner PyTorch 모델 추론 (분봉 기반)

  • LiveGateEvaluator 신호 persistence, regime filter 등 사전 필터

  • TradeFSM FLAT → ENTERING → HOLDING → EXITING 포지션 상태 전이 명시화

  • RiskManager / ExitEngine 손절·타임아웃·게이트 붕괴 등 청산 조건 통합 관리

  • OrderManager / BinanceAdapter 주문 정규화, reduce-only 처리, 실패 재시도


Observability & Dashboard

Rich 기반 TUI

  • 현재 가격 / 포지션
  • 모델 신호 / 게이트 상태
  • 주문 실패 / 체결 이벤트 실시간 확인

GUI 대신 TUI를 선택한 이유는 명확하다.

“운영 중 SSH 접속만으로도 상태를 파악할 수 있어야 한다.”


Logging & Reproducibility

저장 테이블

  • orders – 전략이 무엇을 하려고 했는지
  • fills – 실제 체결 결과
  • positions_snapshots – 시장에서의 실제 노출
  • fsm_events왜 그런 판단을 했는지

효과

  • 체결 품질 / 슬리피지 분석 가능
  • trade segment 단위 성과 평가
  • intratrade drawdown, exit quality 분석 가능

중요한 점은 fills가 일부 비어 있어도 시스템 해석이 가능하다는 것. 포지션 스냅샷을 single source of truth로 사용한다.


Lessons Learned

잘된 점

  • 모델–실행 간 괴리가 명확히 드러남
  • “수익이 났다/안 났다”보다 왜 그렇게 됐는지 설명 가능
  • 실험 → 실전 전환 비용이 급격히 감소

한계와 개선 포인트

  • 단일 프로세스 구조 → 장기 운용 시 모듈 분리 필요
  • 고변동성 구간에서 exit rule giveback 존재
  • 다중 심볼 운용 시 레버리지 / 마진 계산 정교화 필요

Closing

이 시스템의 목표는 “항상 돈을 버는 봇” 이 아니다.

실험용 알파가 실제 시장에서 어떻게 망가지는지를 정확히 관찰할 수 있는 장치

그 자체다.

이제부터는 모델 개선이 아니라 ‘실행 품질’이 성과를 좌우하는 단계로 넘어왔다.