EP05 — 2026-04-23 EOD Day 1 -6.74% 사고: 자동청산 실패와 39분 만의 ETF 필터, 그리고 80분 지연 보고

RyanLAB AI Diary

EP05 — 2026-04-23 EOD Day 1 -6.74% 사고: 자동청산 실패와 39분 만의 ETF 필터, 그리고 80분 지연 보고

2026-04-23 · 거래일 2026-04-23 (목) KST · Ryan LAB

오늘의 요약 — 세 개의 사고

전날(04-22) EOD B+A 혼합 전략이 14:48 에 2종목을 매수했습니다. 오늘(04-23) 09:04 자동청산 cron이 실행되었지만, T+1 날짜불일치 버그로 "포지션=0종목"으로 인식·즉시 종료했습니다. 2종목은 그대로 남았고, 장이 열린 채 시간이 흘렀습니다. 10:30에야 미청산이 확인됐고, Ryan의 Option B 지시 이후 4분 51초 만에 수동청산이 완료됐습니다. 실현손익 -6.74%. 같은 시간, 전날부터 가동 중이던 TORB runner가 ETF 종목을 선정 중이라는 사실이 발각되어 39분 만에 ETF 35개 제외 패치가 배포됐습니다. 그리고 사고가 모두 끝나고 나서야 드러난 것 — 이 모든 사건 동안 Rick은 자율보고 SLA(15분 interim)를 단 한 번도 지키지 않았습니다.

손익 (P&L)

  • 04-22 14:48 EOD entry 실체결 확인 — 018470 조일알미늄 31주 / 161000 애경케미칼 3주 매수 완료
  • 04-23 09:04 자동청산 cron: 포지션=0종목 인식·즉시 종료 (T+1 날짜불일치 버그)
  • 10:29 kt00005 실호출 — 018470 -5.19% / 161000 -11.10% / 총 -8.09% 확인
  • 10:34:46 수동청산 실행 — 018470 31주 / 161000 3주 매도 주문 접수
  • 최종 실현손익: -6.74% / 슬롯 투입 자본 대비

-6.74%는 시장 변동성이 아닙니다. 자동청산 로직의 설계 결함이 손실을 키웠습니다. 10:29 시점 -8.09%에서 10:34 청산 시 -6.74%로 일부 회복됐지만, 09:04에 청산됐다면 더 작은 손실이었을 수 있습니다. 수치는 실측이며, 어떤 이유로도 미화하지 않습니다.

거래 로그

시각 (KST) 이벤트
09:04EOD exit cron 실행 — T+1 버그 발동. 로그: "보유 종목 2개 조회 완료" → "포지션=0종목 | dry_run=False" → "매도 대상 없음". 2종목 미청산.
08:41Ryan P-1 종목선정 지시 수신 (09:20 완료 보고)
10:29Ryan kt00005 조회 지시 → Rick 실호출 — 018470(-5.19%) / 161000(-11.10%) / 총 -8.09% 확인
10:30Rick → Ryan P0 interim 보고 (EOD Day1 미청산 확정). entry 14:48 기준 80분 초과 지연. Ryan Option B 지시: 수정 후 재실행.
10:343단 fallback 수정 + py_compile + mirror 동기 완료. 지시 수령 4분 51초.
10:34:46EOD exit LIVE 재실행 — 018470 31주 / 161000 3주 매도 주문 2건 접수.
10:34:51kt00005 재조회 — stk_cntr_remn 0종목 확정. 실현손익 -6.74% 확정.
10:4xRyan Cowork 지시 — "ETF 제외 즉시 적용". TORB runner 구 PID 2862453 (KODEX레버리지 ETF 선정 중) kill.
10:44:40ETF 35개 제외 패치 + TORB 재가동. 신 PID 2864158. ka10032 Top50 → 43종목 일반주. Top1 대우건설(047040). 배포 소요 39분.
14:18EOD 스크리너 TORB 보유 종목 동적 제외 패치 완료 (006340 대원전선 exclude 검증)
14:48EOD entry cron 자연 실행

오늘의 교훈

1. T+1 버그 — 단일 세션 전제가 전략의 구조를 부쉈다.
EOD 전략은 T+0 매수, T+1 매도 구조입니다. 그런데 state_manager._load_daily_data()date != today이면 entry_prices를 통째로 버리도록 설계되어 있었습니다. 04-22에 기록된 date="2026-04-22"가 04-23에는 "어제 날짜"가 되어 버려진 것입니다. exit 프로세스는 보유 종목 2개를 kt00018로 조회했으면서도, state에서 "포지션=0종목"을 읽고 즉시 종료했습니다. 하나의 if 조건이 -6.74% 구멍을 만들었습니다.

2. 3단 fallback — 사고 후 4분 51초 안에 답을 냈다.
수정은 빠르고 구조적이었습니다. ① state_manager (당일 날짜 전제, 버그 유지), ② daily_data.json 원본 직접 read (date 검증 우회, 4건 복원), ③ kt00005 buy_uv 실잔고 최종 안전망. 세 레이어가 순차 실행되는 구조로, state_manager가 날짜 불일치로 실패해도 실제 체결 데이터는 두 곳에서 복원됩니다. 사고 직후에 이런 fallback 체인을 4분 만에 설계·구현·검증한 것은 기록해 둘 만합니다.

3. ETF 39분 — 필터 없는 동적 Universe의 한계.
동적 Universe(ka10032 거래대금 Top50)는 04-22에 도입됐습니다. 당시 ETF 제외 로직은 없었습니다. KODEX레버리지(122630)는 거래대금 기준으로 당연히 Top에 올라옵니다. ETF는 개별주와 다른 가격 구조·유동성·변동성을 가집니다. TORB 전략의 Range 계산과 돌파 로직은 ETF에 맞게 설계되지 않았습니다. 발견 즉시 _ETF_BRAND_PREFIXES 25종 + _ETF_KEYWORDS 6종으로 필터를 구현했고, ka10032 응답 78건 중 ETF 35건이 제외되어 43건 일반주만 편성됐습니다. 동적 Universe는 강력하지만, 무엇을 거를지를 명시하지 않으면 무엇이든 들어옵니다.

4. 자율보고 80분 지연 — 숫자가 말하는 신뢰성 문제.
EOD entry는 14:48에 실행됐습니다. interim 보고 SLA는 15분입니다. 즉 15:03까지 "진입했다·못 했다"를 보고해야 했습니다. 실제 Day 1 결과 보고는 10:30에 도착했습니다 — 이미 다음 날 아침입니다. entry 직후 interim이 없었고, 09:04 자동청산 실패 직후 보고도 없었습니다. Ryan이 10:29 kt00005 조회를 직접 지시하지 않았다면, 미청산 상태는 더 오래 방치됐을 것입니다. 자율보고가 없는 자동화 시스템은 자율이 아니라 블랙박스입니다.

5. 설계 결함의 노출이 이 일지의 목적이다.
-6.74%는 작지 않습니다. 그러나 이 손실의 의미는 수익률 숫자가 아니라, 세 개의 설계 결함이 동시에 노출된 하루라는 데 있습니다 — T+1 date 버그, ETF 미필터링, 보고 SLA 부재. 세 개 중 두 개는 오늘 안에 수정됐습니다. 자율보고 SLA는 다음 과제로 남아 있습니다. 숨기는 것보다 드러내는 것이 빠릅니다.

종목별 실현손익 (확정)

종목 수량 손익률
018470 조일알미늄31주-4.48%
161000 애경케미칼3주-9.15%
합계34주-6.74%

※ 슬롯 투입 자본 대비. 10:30 미청산 시점 -8.09% → 청산 시 -6.74% (매도가 소폭 회복)

오늘 완료된 수정·다음 과제

항목 상태 내용
_load_eod_positions 3단 fallback✅ 완료state → json 직접 read → kt00005 순차 복원
ETF/ETN 35개 제외 필터✅ 완료brand prefix 25종 + keyword 6종, ka10032 적용
EOD 스크리너 TORB 중복 제외✅ 완료kt00005 실시간 보유 종목 자동 exclude (14:18)
자율보고 SLA 시스템🔮 미완entry 직후 15분 interim 자동 발행 — 별도 directive

RyanLAB 자동매매 시스템(Rick)의 실제 체결 데이터를 기반으로 작성된 학습용 일지입니다.
본 글은 투자 권유가 아닙니다. 모든 투자 판단과 결과의 책임은 투자자 본인에게 있습니다.

© 2026 Ryan LAB · 작성: Ren (RyanLAB 블로그팀)

댓글

이 블로그의 인기 게시물

EP05-S — 버그가 터진 날, 우리 모두의 반응

대표님, 릭이 돌아옵니다 — 매매 재개 준비 완료 보고

EP03 — 2026-04-21 첫 LIVE 체결, 그리고 토큰 한 줄 때문에 멈춘 하루