자동매매 봇 여정 · 6화
HTS에 찍힌 숫자를 보고 잠깐 멍했습니다. +57.6%. 봇이 산 종목 하나가 상한가에 묶이며 만든 수익이었어요. 트레이더라면 환호할 순간이었죠. 그런데 나는 웃지 못했습니다. 그건 우리 시스템의 실력이 아니라 — 결함이 만든 횡재였거든요.
삼화콘덴서, 그리고 묶여버린 매도
봇은 5월 21일 삼화콘덴서를 80,500원에 25주 샀습니다. 우리 전략의 익절 목표는 +20%, 즉 92,520원이었어요. 그런데 다음 날, 종목이 상한가에 락(lock)되며 102,000원에 묶였습니다. 목표가를 한참 넘긴 거죠. 그러면 봇이 신나게 팔았어야 하는데 — 09시 11분부터 15시 13분까지 약 12번의 매도 시도가 전부 조용히 스킵됐습니다. 매도 0건. 결국 며칠 뒤 내가 직접 121,500원에 팔았고, 수익률은 +57.6%로 찍혔습니다.
+57.6% — 그러나 이건 우리 실력이 아니었다
범인은 ‘침묵’이었다
코드를 열어보니, 상한가 락 상태에서 현재가 조회가 0으로 돌아오자 봇이 이렇게 행동하고 있었습니다.
if cur_price <= 0:
continue # ← 로그 한 줄 없이 조용히 스킵
가격을 못 가져오면, 아무 말 없이 그냥 넘어간 거예요. 이번엔 운 좋게 익절을 못 해서 ‘더 큰 수익’이 났지만, 정말 무서운 건 따로 있었습니다. 똑같은 침묵 실패가 손절에서 일어나면? 팔아야 할 종목을 못 팔고 손실이 눈덩이처럼 불어나는 거죠. 위험관리의 붕괴였습니다.
그래서 패치했어요. 가격 조회를 3번 재시도하고, 그래도 안 되면 호가창의 매수 1호가로 대체(상한가 락에선 그게 곧 매도 가능가니까요), 3번 연속 실패하면 텔레그램으로 경고를 쏘도록. 봇이 더 이상 조용히 실패하지 못하게 만들었습니다.
+57%를 +20%로 적다
그리고 가장 중요한 결정. 이 거래를 실전 전환 기준인 100건 카운트에 넣을 때, 우리는 +57.6%가 아니라 시스템이 의도했던 +20%(380,623원)로 집계했습니다. 초과분 +37.6%는 알파가 아니라 버그가 준 횡재였으니까요.
이 편의 교훈
큰 수익도 정직하게 카운트해야 합니다. 결함이 이번엔 내게 유리하게 작동했다는 건, 다음엔 똑같이 불리하게 작동할 수 있다는 뜻이거든요. 알파와 노이즈를 구분하는 것 — 그게 시스템 개발자의 직업윤리였습니다.
이렇게 정직하게 카운트를 쌓아가던 6월 8일, 시장이 무너졌습니다. 네 종목이 동시에 손절됐고, 하루에 -72만 원이 날아갔어요. 그리고 봇은 — 스스로 멈췄습니다. 다음 화, ‘폭락의 하루’입니다.