자동매매 시스템이 돌아가는 동안 속에서 뭔 일이 벌어지는지 처음엔 전혀 몰랐다. 그냥 로그 파일이 쌓이고 있는데, 거기서 뭔가 잘 되고 있는지 안 되고 있는지 판단하려면 수천 줄을 하나하나 읽어야 했다.
그게 너무 불편했다. 시스템을 켜놓고 "지금 잘 돌고 있나?" 한 눈에 파악할 방법이 없었던 것이다. V4.12에서 이걸 해결하기 위해 만든 게 SCAN_SUMMARY다.
60초마다 한 줄. 지금 시스템이 뭘 보고 있고, 얼마나 차단하고 있고, 시장 상태가 어떤지를 압축해서 찍어준다. 단순해 보이지만 이게 생기고 나서 시스템 파악이 완전히 달라졌다.
📋 SCAN_SUMMARY 한 줄이 담고 있는 것
실제 로그에 찍히는 줄은 이렇게 생겼다.
📈 [SCAN_SUMMARY/60s]
ticks=938
codes=71
signals=0(dry=0)
blocks(mkt=0, clu=0, other=936)
orders=0
heat=3
regime=BEAR
이 한 줄에 꽤 많은 정보가 들어 있다. 하나씩 뜯어보면 이렇다.
- ticks=938 — 지난 60초 동안 실시간 시세 데이터가 938번 들어왔다. 그만큼 종목들을 들여다봤다는 뜻이다.
- codes=71 — 그 중 실제로 조건 검토 대상이 된 종목이 71개였다.
- signals=0(dry=0) — 매수 신호는 0개. DRY 신호(조건 충족했지만 차단된 것)도 0개. 아예 신호 자체가 없었다.
- blocks(mkt=0, clu=0, other=936) — 시장필터(mkt)로 차단된 건 0개, 군집필터(clu)로 차단된 건 0개, 나머지 이유(시간 제한 등)로 차단된 게 936개다.
- heat=3 — 군집 열기가 3. 최소 기준(BEAR일 때 need=2)은 넘었지만 아직 약하다.
- regime=BEAR — 현재 시장 레짐은 약세장. 매수 기준이 강화된 상태다.
🧊 하루에 수백 번 차단된다는 게 실제로 어떤 수준인가
V4.12 로그를 보면 장 시작 전부터 차단 요약이 찍히기 시작한다.
🧊 [매수차단요약/30s]
time_block:before_market x514
sample: 000157(두산2우B), 013990(아가방컴퍼니),
002140(고려산업), 002100(경농),
002360(SH에너지화학)
🧊 [매수차단요약/30s]
time_block:before_market x422
sample: 322000(HD현대에너지솔루션),
014830(유니드), 004090(한국석유),
439260(대한조선)
30초 동안 514번, 422번 차단. 장 열리기 전이라 시간 조건에 막힌 것들이다. 이게 하루 종일 쌓이면 수천 건이 된다.
처음엔 이 숫자가 좀 놀라웠다. 시스템이 쉬지 않고 이렇게 많은 걸 들여다보고 차단하고 있었던 거다. SCAN_SUMMARY가 없었으면 이 사실을 로그 수만 줄을 뒤지지 않고는 알 방법이 없었다.
📊 BEAR 장에서 레짐이 움직이는 패턴
V4.12 당시 장 초반 로그를 보면 레짐이 요동치는 게 보인다.
| 시각 | 레짐 변화 | breadth |
|---|---|---|
| 08:49:08 | NEUTRAL → BEAR | 0.0% (hit=0/60) |
| 08:51:08 | BEAR → NEUTRAL | 5.0% (hit=3/60) |
※ breadth = 최근 240초 내 동시 강세 종목 비율
2분 만에 BEAR에서 NEUTRAL로 바뀌었다. 60개 종목 중 3개가 강세를 보이자 레짐이 전환된 것이다. 이게 실시간으로 작동한다는 게 SCAN_SUMMARY를 보고 나서야 체감이 됐다.
❓ Q&A
Q. 60초 리포트가 성능에 영향을 주진 않나?
솔직히 처음엔 그게 걱정됐다. 로그를 너무 많이 찍으면 시스템이 느려질 수 있으니까. 근데 60초마다 한 줄 찍는 건 부하가 거의 없다. 오히려 로그를 덜 찍고 핵심만 요약하는 방식이라 전체 로그 파일 크기는 줄었다. 디버깅할 때도 SCAN_SUMMARY 줄만 grep으로 뽑으면 하루 흐름이 한 눈에 들어온다.
✍️ 4편을 마치며
자동매매 시스템을 만들다 보면 정작 시스템이 뭘 하고 있는지 모르는 상황이 생긴다. 블랙박스처럼 돌아가는데 결과만 보이는 것이다.
SCAN_SUMMARY는 그 블랙박스에 창문을 하나 낸 것이다. 60초마다 "나 지금 이러고 있어"라고 시스템이 알려주는 것. 단순한 기능 같지만 신뢰할 수 있는 시스템을 만드는 데 이런 가시성이 생각보다 중요하다.
5편에서는 BEAR 장이 길어지던 시기, GENIE V4.14에서 시장 필터가 하루 종일 매수를 틀어막은 날들을 다룬다. 그리고 그게 왜 맞는 판단이었는지.
※ 본 글은 자동매매 시스템 개발 과정을 기록한 정보 제공 목적의 개발 일지입니다. 투자 권유나 수익 보장이 아니며, 모든 투자 판단과 책임은 본인에게 있습니다.