Blog / Project / AI 트레이딩 봇 개발기 중간 회고 — 20일간의 안정화와 시장 레...
Project

AI 트레이딩 봇 개발기 중간 회고 — 20일간의 안정화와 시장 레짐 분석기

AI 자동매매 봇 20일 개발 중간 회고. 시장 레짐 분석기 도입, 30건+ 버그 수정, 실전 71건 거래 성과 분석으로 돌아가는 코드에서 운영 가능한 코인 선물·주식 트레이딩 시스템으로 진화한 과정.

12일을 한 번에 되돌아보는 이유

8일차에서 SL/TP 청산 시 DB 기록이 누락되는 버그를 발견했다. 코드를 한 줄도 바꾸지 않은 날이었지만, “시스템이 실제로 올바르게 동작하고 있는가?”라는 질문을 처음 던진 날이기도 했다.

그 뒤로 12일이 지났다. 매일 포스트를 쓸 수도 있었지만, 이 기간의 작업은 하루 단위로 잘리지 않는다. 버그 수정이 다음 날 기능 추가의 전제 조건이 되고, 성과 분석이 전략 재검토로 이어지고, 운영 인프라 개선이 다시 새로운 버그를 드러냈다. 12일간의 작업은 하나의 큰 흐름이다. 테마별로 묶어서 정리하는 것이 더 정직한 기록이다.


1. 안정화 — 멈추지 않는 시스템 만들기

8일차까지 이미 34건의 버그를 수정했지만, 실전 운영은 새로운 종류의 버그를 끊임없이 드러냈다. 9일차부터 15일차까지 약 30건을 추가로 수정했다.

9일차: 2차 버그 리뷰 5건

8일차에 발견한 DB 누락 문제를 시작으로, 전체 시스템을 다시 훑었다.

# futures_simulator.py — timeframe이 '4h'로 하드코딩되어 있었다
# 수정: _bar_seconds() 헬퍼를 추가해 동적으로 계산
def _bar_seconds(self, timeframe: str) -> int:
    mapping = {'1m': 60, '5m': 300, '15m': 900, '1h': 3600, '4h': 14400}
    return mapping.get(timeframe, 3600)

binance_api.pyclose_fapi_client()에서 race condition이 발생하고 있었다. 여러 스레드가 동시에 클라이언트를 닫으려 할 때 간헐적으로 크래시가 났다. lock을 추가해서 해결했다. 이런 종류의 버그는 로그에도 잘 안 찍히고, 재현도 어렵다. 925개 테스트를 전부 통과시킨 뒤에야 안심할 수 있었다.

10일차: 주식 단타 중복매수 문제

KIS(한국투자증권) API의 특성에서 비롯된 버그다. KIS는 주문 접수와 체결이 분리되어 있다. 주문을 넣으면 즉시 접수 응답이 오지만, 실제 체결은 나중에 일어난다. 봇은 접수 응답만 보고 “매수 완료”로 처리했기 때문에, 다음 사이클에서 같은 종목을 또 매수하는 일이 벌어졌다.

pending_buy 상태를 도입해서 접수와 체결을 분리했다. rotation 매수에도 동일하게 적용했다. 이중 전략(bb_macd + donchian) 슬롯 계산도 수정했다.

total_cap = max_positions + secondary_max_positions
bb_macd:   2슬롯 (40%)
donchian:  3슬롯 (60%)

11일차: SOLUSDT 수량 정밀도

Binance 선물에서 Precision is over the maximum defined for this asset 에러가 터졌다. 각 심볼마다 허용되는 소수점 자릿수가 다른데, 이를 무시하고 주문을 넣고 있었다.

def _adjust_futures_quantity(self, symbol: str, qty: float) -> float:
    info = self.exchange_info[symbol]
    step_size = info['stepSize']  # e.g., 0.001
    precision = info['quantityPrecision']  # e.g., 3
    adjusted = math.floor(qty / step_size) * step_size
    return round(adjusted, precision)

추가로, 청산 실패 시 WebSocket이 1초 루프로 폭주하는 문제도 잡았다. _close_fail_retry에 60초 차단을 걸어서 해결했다.

15일차: 파이프라인 전체 점검 23건

이 날이 안정화의 정점이었다. 전체 파이프라인을 처음부터 끝까지 점검하며 23개 이슈를 분류하고 수정했다.

우선도 건수 대표 항목
HIGH 3건 장외시간 주문 방지, 주문타입 수정, 모니터 재시작 논블로킹 전환
MEDIUM 5건 rate-limit 처리, 부분체결 대응, crash loop 방지, 페이지네이션
LOW 6건+ 자정 넘김 보정, float 변환 방어, 음수 방지 등

장외시간 주문 방지가 HIGH인 이유는 단순하다. 장이 닫혀 있을 때 주문을 보내면 KIS API가 에러를 반환하고, 에러 처리 로직이 포지션 상태를 꼬이게 만들 수 있기 때문이다. “주문이 안 나가는 것”보다 “주문이 안 나간 뒤 상태가 엉키는 것”이 더 위험하다.

925개 테스트 전체 통과. 이 숫자가 반복적으로 등장하는 건, 매번 전체 테스트를 돌렸다는 뜻이다. 트레이딩 시스템에서 “이 부분만 고쳤으니 이 부분만 테스트하면 된다”는 생각은 위험하다.


2. AI 시장 레짐 분석기 — 가장 큰 신규 기능

13일차에 ai_market_analyzer.py를 새로 만들었다. 이 시스템의 핵심 아이디어는 단순하다. 시장 전체의 분위기를 파악하고, 그에 따라 트레이딩 전략의 공격성을 조절한다.

입력 데이터

두 종류의 데이터를 수집한다.

  1. 뉴스 헤드라인: 주요 경제 뉴스를 실시간으로 수집
  2. 매크로 지표: 유가, 금, VIX(변동성 지수), DXY(달러 인덱스), S&P 500

레짐 판단

30분마다 Claude 또는 GPT에게 수집된 데이터를 넘기고, 네 가지 레짐 중 하나를 판단하게 한다.

RISK_ON   → 공격적 진입 허용, 풀 사이징
NEUTRAL   → 기본 전략 유지
CAUTION   → 사이징 축소, 신규 진입 제한
RISK_OFF  → 신규 진입 전면 차단, 기존 포지션만 관리

적용 방식

레짐에 따라 세 가지가 달라진다.

  • 진입 차단: RISK_OFF일 때 신규 포지션 오픈을 막는다
  • 사이징 축소: CAUTION일 때 포지션 크기를 기본값의 50-70%로 줄인다
  • 회피 종목 필터: AI가 특정 섹터나 종목을 회피 대상으로 지정할 수 있다

실전 첫날의 교훈

레짐 분석기를 켜자마자 RISK_OFF가 떴다. 후보 41개 종목이 전부 진입 차단되었다. 코인 선물, 국내 주식, 해외 주식 모두.

처음에는 “너무 보수적인 거 아닌가?” 싶었다. 그런데 14일차에 포트폴리오 성과를 분석해 보니, Fear & Greed Index가 21.9로 극심한 공포 구간이었다. AI의 판단이 틀리지 않았다.

다만 문제도 드러났다. 13일차에 주식 단타 쪽에서 215380 종목이 5분마다 반복 매수되는 버그가 발견되었다. 레짐 분석기와 직접 관련은 없지만, 새로운 기능을 붙이면서 기존 로직을 다시 점검하게 된 계기다.


3. 숫자로 보는 현실

14일차에 전체 포트폴리오 성과를 분석했고, 18일차에 백테스트 기반 수익성 예측까지 진행했다. 결과는 솔직히 기록할 필요가 있다.

코인 선물 성과 (2/26 ~ 3/14)

총 청산 건수:  71건
누적 PnL:     +$31.50
활성 포지션:   5개 (전부 LONG, 전부 수익 중, +$5.49)

2월 26일 첫날에 Stop Loss가 20건 집중 발생했다. 초기 학습 비용이다. 3월 이후로는 안정화되었다.

주식 (국내/해외)

composite_score가 BUY 임계값에 미달하는 상태가 지속되었다. Fear & Greed Index 21.9. AI가 “사지 마라”고 판단한 것이 맞았다.

백테스트 vs 현실 (18일차)

트레일링 스탑 5가지 파라미터 세트를 비교 백테스트했다.

지표
트레일링 스탑 최적 설정 OFF (Sharpe 10.43)
승률 38.6%
SL 비율 51.7%

1년 투자 성과 시나리오는 세 가지로 나뉜다.

최악:     -4.8%
백테스트: +14.7%
현실적:   +1~5%

승률 38.6%와 SL 비율 51.7%가 핵심 문제다. 거래의 절반 이상이 손절로 끝난다. 수익이 나는 거래의 크기가 손실을 상쇄하기 때문에 전체적으로는 흑자이지만, 정서적으로나 리스크 관리 측면에서 개선이 필요하다.

19일차에 수익성 개선 방향을 정리했다.

  1. 섹터 로테이션 활성화 (백테스트 Sharpe 1.36, +24.2%)
  2. AI 레짐 RISK_OFF 대응 전략 세분화
  3. 코인 선물 승률 개선 (TP/SL 비율 조정, MACD 강도 필터)

4. 운영 인프라 — 시스템을 시스템답게

코드가 올바르게 돌아가는 것과, 시스템이 운영 가능한 상태인 것은 다른 문제다.

Discord 웹훅 알림 (20일차)

주문이 체결될 때마다 Discord 채널로 알림이 온다. order_executorsector_rotation 모듈에 웹훅을 연결했다. 이전에는 체결 여부를 확인하려면 로그 파일을 열어봐야 했다. 이제는 폰을 보면 된다.

워치독 개선 (20일차)

워치독이 15개 subprocess를 관리하는데, 각 프로세스가 시작/재시작될 때마다 cmd 창이 깜빡였다. CREATE_NO_WINDOW 플래그를 모든 subprocess 호출에 적용해서 해결했다.

사소해 보이지만, 24시간 돌아가는 시스템에서 cmd 창이 수시로 깜빡이면 데스크톱 작업이 방해받는다. 운영 품질이란 이런 것이다.

웹 대시보드 설계 (16일차)

기존 Flask + Jinja2 대시보드를 React SPA로 전면 개편하기로 했다. Vite + TypeScript + Tailwind + TanStack Query 스택이다. 아직 구현은 시작하지 않았고, 설계만 완료한 상태다.

[Flask API] → SSE(Server-Sent Events) → [React SPA]

WebSocket 대신 SSE를 선택한 이유는 단순하다. 단방향 데이터 흐름(서버→클라이언트)이면 충분하고, Flask 위에서 SSE가 WebSocket보다 구현이 가볍다.


5. 20일간의 궤적

1일차부터 지금까지의 전체 흐름이다.

일차 날짜 핵심 작업 성격
1 02-26 Claude API 529 폴백 + OpenAI 자동 전환 장애 대응
2 02-27 트레일링 스탑 구현 신규 기능
3 02-28 백테스트 프레임워크 구축 인프라
4 03-01 선물 백테스트 확장 기능 확장
5 03-02 30건 버그 수정 안정화
6 03-03 배포 자동화 + 이벤트 트래킹 설계 설계
7 03-04 운영 버그 4건 + 전체 코드 감사 안정화
8 03-05 거래 기록 분석 → DB 누락 버그 발견 진단
9 03-06 2차 버그 리뷰 5건 수정 안정화
10 03-07 주식 중복매수 + 선물 슬롯 수정 안정화
11 03-08 SOLUSDT 수량 정밀도 수정 안정화
12 03-09 코인 선물 후보 분석 (코드 변경 없음) 진단
13 03-10 AI 시장 레짐 분석기 구현 신규 기능
14 03-11 전체 포트폴리오 성과 분석 진단
15 03-12 파이프라인 전체 점검 23건 수정 안정화
16 03-13 웹 대시보드 React 개편 설계 설계
17 03-14 KITE 포지션 청산 분석 진단
18 03-15 트레일링 스탑 백테스트 + 수익 예측 분석
19 03-16 수익성 개선 검토 설계
20 03-17 Discord 알림 + 워치독 개선 운영

20일의 성격을 분류하면 이렇다.

안정화(버그 수정):  6일  (5, 7, 9, 10, 11, 15)
진단/분석:         5일  (8, 12, 14, 17, 18)
설계:             3일  (6, 16, 19)
신규 기능:         2일  (2, 13)
인프라/확장:       2일  (3, 4)
운영:             1일  (20)
장애 대응:         1일  (1)

안정화가 전체의 30%를 차지한다. 트레이딩 봇 개발에서 가장 많은 시간이 든 것은 새 기능을 만드는 것이 아니라, 기존 기능이 깨지지 않게 만드는 것이었다.


무엇이 바뀌었나

8일차의 시스템

  • 기본 기능은 돌아간다
  • 버그가 어디에 있는지 모른다
  • 성과 데이터를 신뢰할 수 없다
  • 문제가 생기면 로그 파일을 열어봐야 한다

20일차의 시스템

  • 925개 테스트가 전체 파이프라인을 검증한다
  • AI가 시장 상황을 판단하고 진입을 통제한다
  • 71건의 실전 거래 데이터가 쌓여 있고, 분석 가능하다
  • 체결 알림이 Discord로 온다
  • 아직 승률 38.6%, SL 비율 51.7%라는 숫자는 해결되지 않았다

마지막 항목이 중요하다. 20일간 코드를 갈고닦았지만, 트레이딩 전략 자체의 수익성은 아직 만족스럽지 않다. 시스템이 안정적으로 돌아간다는 것과 시스템이 돈을 벌어다 준다는 것은 별개의 문제다.

배운 것

운영 가능한 시스템은 코드 품질만으로 만들어지지 않는다. 로그, 알림, 모니터링, 자동 재시작, 정밀도 처리, 장외시간 방어 같은 것들이 쌓여야 한다. 이런 작업은 화려하지 않지만, 없으면 시스템은 사람이 24시간 붙어 있어야만 돌아가는 반자동 도구에 머문다.

데이터를 먼저 보고, 코드를 나중에 고쳐라. 12일차처럼 코드 변경 없이 분석만 한 날도 있었다. 14일차에 성과 분석을 하고, 18일차에 백테스트를 돌린 뒤에야 19일차에 개선 방향이 정리되었다. 코드를 고치는 것보다 무엇을 고쳐야 하는지 파악하는 데 더 많은 시간이 들었고, 그 시간은 낭비가 아니었다.

AI는 도구지 마법이 아니다. 레짐 분석기가 RISK_OFF를 판정한 날, 41개 종목 전부 진입이 차단되었다. Fear & Greed 21.9 극공포 구간에서 AI의 판단은 합리적이었다. 하지만 “AI가 시장을 읽어주니까 수익이 날 것”이라는 기대는 틀렸다. AI는 판단의 한 층을 추가할 뿐이고, 전략의 근본적인 승률 문제는 AI가 아니라 전략 자체를 개선해야 한다.


다음 단계

19일차에 정리한 개선 방향 중 우선순위가 높은 세 가지다.

  1. 섹터 로테이션 실전 투입: 백테스트 Sharpe 1.36. 가장 즉각적인 수익성 개선이 기대되는 항목이다.
  2. 코인 선물 승률 개선: TP/SL 비율 조정과 MACD 강도 필터. 51.7% SL 비율을 줄이는 것이 목표다.
  3. 웹 대시보드 React 전환: 설계는 끝났다. 구현을 시작한다.

20일간 “돌아가는 코드”를 “운영 가능한 시스템”으로 끌어올렸다. 다음 20일은 “운영 가능한 시스템”을 “수익을 내는 시스템”으로 만들 차례다.


8일차 이후 12일간, AI 시장 레짐 분석기 도입과 30건 이상의 버그 수정을 거쳐 트레이딩 봇이 ‘돌아가는 코드’에서 ‘운영 가능한 시스템’으로 진화한 중간 회고다.

댓글

블로그 목록으로
ACHIEVEMENT UNLOCKED
LOADING...
SCORE 000000
HITS
0