자동매매 시스템 구축기
자동매매 시스템 구축기
— 실험용 알파를 실거래로 옮기기까지
Problem & Context
왜 이걸 만들었나
알파 모델 실험은 충분히 진행됐지만, 늘 같은 문제가 남았다.
“이 신호가 실제 시장에서도 의미가 있는가?”
백테스트 상에서는 성과가 좋아도, 실거래 환경에서는 다음 요소들이 빠지면 검증이 불가능하다.
- 실시간 데이터 지연
- 체결 품질과 슬리피지
- 포지션 관리와 리스크 제약
- 주문 실패 / 부분 체결 / 잔량(dust)
즉, 모델 성능이 아니라 ‘실행 시스템’이 병목이 되는 상황이었다.
Requirements & Constraints
필수 요구사항
- 실시간 데이터 → 추론 → 주문 실행이 하나의 파이프라인으로 연결될 것
- 주문·체결·포지션·상태 전이를 사후 재현 가능하게 기록할 것
- 운영 중 현재 상태를 즉시 파악할 수 있는 경량 대시보드 제공
현실적 제약
- 거래소: 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
이 시스템의 목표는 “항상 돈을 버는 봇” 이 아니다.
실험용 알파가 실제 시장에서 어떻게 망가지는지를 정확히 관찰할 수 있는 장치
그 자체다.
이제부터는 모델 개선이 아니라 ‘실행 품질’이 성과를 좌우하는 단계로 넘어왔다.