- 액면분할이 되면 계좌의 주식 수가 늘어나는데, 자동매매 프로그램은 그걸 모를 수 있습니다. 그러면 청산할 때 일부만 팔고 나머지가 남습니다.
- 남은 물량은 프로그램이 관리하지 않습니다. 자동으로 팔리지 않고 계좌에 방치됩니다.
- 거래정지 중에는 조회 가격이 정지 직전 값에 멈춰 있습니다. 그 값으로 손익을 기록하면 이익 난 거래가 손실로 남습니다.
- 수량 동기화는 「계좌가 적을 때」와 「계좌가 많을 때」를 모두 처리해야 합니다. 한쪽만 보면 분할·무상증자에서 물량이 새어 나갑니다.
실거래를 돌리다 사고가 났습니다. 돈이 걸린 결함이었고, 그날 안에 고쳤습니다. 같은 걸 만드시는 분이 있을 것 같아 적어둡니다.
아침에 이상한 걸 봤습니다
보유 중이던 코미코(183300)가 액면분할 때문에 3주 넘게 거래정지 상태였습니다. 그날 거래가 재개됐고, 시가가 전날 대비 20% 넘게 뛰었습니다.
그런데 자동매매 화면에 매도 기록이 안 보였습니다.
확인해보니 매도는 나갔습니다. 개장 직후 정상적으로 청산됐습니다. 제가 화면에서 못 찾은 것뿐이었습니다.
여기까지는 아무 문제가 없었습니다.
그런데 손익이 이상했습니다
20% 넘게 급등한 날 팔았는데 기록에는 −6.49%로 남아 있었습니다.
원인은 거래정지였습니다.
실제로는 시장가로 나갔으니 그날 시세에 팔렸습니다. 그런데 기록에는 멈춰 있던 옛 가격이 체결가로 남았습니다.
제 프로그램에는 체결 통보를 받는 기능이 없습니다. 주문을 내기 직전에 조회한 가격을 체결가로 적어둘 뿐입니다. 평소에는 큰 차이가 없는데, 거래정지 해제일에는 이게 완전히 틀어집니다.
진짜 문제는 따로 있었습니다
손익을 확인하려고 매수 기록과 계좌를 나란히 놓고 보다가 이상한 숫자를 발견했습니다.

매수 기록은 3주인데, 계좌 평단은 절반 이하로 내려가 있었습니다. 액면분할이 되면 주식 수가 늘고 단가가 그만큼 내려갑니다. 계산해보니 산수가 정확히 맞아떨어졌습니다.
- 분할 전 — 3주 × 54,000원 = 162,000원
- 분할 후 — 7주 × 23,314원 = 163,198원
원금은 그대로인데 주식 수만 3주에서 7주로 늘어난 것이었습니다.
그런데 프로그램은 여전히 3주로 알고 있었습니다. 그래서 청산할 때 3주만 팔았습니다.
급등한 날이라 다행히 손해는 아니었지만, 반대였다면 팔았어야 할 물량을 그대로 안고 내려갔을 겁니다.
왜 못 잡았나 — 구멍이 두 개였습니다

① 수량 동기화가 한쪽만 봤습니다
프로그램에는 계좌의 실제 수량과 내부 기록을 맞춰주는 기능이 있었습니다. 그런데 이렇게 되어 있었습니다.
| 상황 | 동작 |
|---|---|
| 계좌가 적다 (내가 일부 팔았을 때) | ✅ 맞춰줌 |
| 계좌가 많다 | ⛔ 「미체결 주문이겠지」 하고 그냥 넘어감 |
수량이 줄어드는 경우만 생각하고 만든 것입니다. 실제로 손으로 파는 일은 있어도 손으로 사는 일은 드무니까요.
그런데 액면분할·무상증자·주식배당은 전부 수량이 늘어납니다. 그 경우가 통째로 빠져 있었습니다.
② 「동기화」 버튼도 이걸 못 잡습니다
화면에 실계좌 동기화 버튼이 있어서 눌러봤는데, 코미코가 안 나왔습니다.
이유가 허탈했습니다. 그 버튼은 프로그램이 들고 있는 목록을 하나씩 훑으며 계좌와 대조합니다. 그런데 코미코는 3주를 팔면서 이미 목록에서 지워진 뒤였습니다.
구멍이 두 개인데 서로를 가려주고 있었습니다. 하나만 고쳤으면 나머지로 새어 나갔을 겁니다.
어떻게 고쳤나
고민한 방향은 두 가지였습니다.
| 방법 | 판단 |
|---|---|
| 계좌 수량이 많으면 경고만 띄운다 | 안전하지만 사람이 매번 처리해야 합니다 |
| 팔 때 계좌를 다시 보고 전량 판다 | ✅ 채택 — 사람 손을 없앱니다 |
처음에는 경고만 넣으려 했습니다. 자동으로 수량을 늘리면 제가 직접 산 물량까지 프로그램이 팔아버릴 수 있어서였습니다.
그런데 코미코는 프로그램이 스스로 산 것이었습니다. 분할로 늘어난 4주도 제가 산 게 아니라 프로그램의 물량이 변형된 것입니다. 그 둘은 대부분 구별됩니다.
그래서 파는 길목 한 곳에 조건을 넣었습니다.
→ 계좌를 다시 조회해서 거기 있는 만큼 전부 판다
중요한 건 이 조건을 한 곳에만 넣었다는 점입니다. 청산 규칙이 여러 개인데, 전부 이 길목을 지나갑니다. 규칙마다 따로 고쳤으면 하나를 빠뜨렸을 겁니다.
그리고 절반만 파는 규칙은 일부러 제외했습니다. 안 그러면 「내 물량의 절반」이 「계좌 전체의 절반」으로 뒤바뀝니다.
대가는 알고 갑니다
이 방식에는 대가가 있습니다. 제가 그 종목을 따로 더 샀다면 그것도 같이 팔립니다.
손으로 산 물량은 프로그램의 기록에 남지 않아서 구별할 방법이 구조적으로 없습니다. 그래서 없애는 대신 이럴 때마다 알림이 오도록 했습니다.
조용히 팔지는 않는다 — 이게 타협점이었습니다.
기록도 고쳤습니다
−6.49%로 남아 있던 손익을 실제 체결 내역에 맞춰 정정했습니다.
| 기록 | 실제 | |
|---|---|---|
| 수량 | 3주 | 7주 |
| 수익률 | −6.49% | +18.20% |
부호가 반대였습니다. 이걸 안 고쳤으면 그날 결산이 통째로 틀렸을 겁니다.
배운 것
① 「한쪽만」 처리하는 코드를 의심하세요
수량 동기화는 줄어드는 경우만 보고 있었습니다. 흔한 경우만 생각하고 만들면 이렇게 됩니다.
주식 수가 늘어나는 일은 생각보다 자주 있습니다. 액면분할·무상증자·주식배당 셋 다 그렇습니다. 드문 일이 아니라 제가 안 겪어봤을 뿐이었습니다.
② 확인 도구가 그 결함을 볼 수 있는지 보세요
「실계좌 동기화」 버튼을 눌렀는데 아무것도 안 나왔습니다. 그때 「문제없구나」 하고 넘어갈 뻔했습니다.
그 버튼은 애초에 이 종류의 문제를 볼 수 없는 구조였습니다. 확인 도구가 멀쩡하다고 말하면, 그 도구가 그걸 볼 수 있는지부터 따져봐야 합니다.
③ 고칠 곳은 「길목」입니다
청산 규칙이 여러 개인데 전부 한 곳을 지나갑니다. 거기 한 줄을 넣으니 전부 해결됐습니다.
규칙마다 따로 고쳤다면 하나를 빠뜨렸을 것이고, 그건 나중에 또 사고가 됐을 겁니다.
④ 못 없애는 위험은 「보이게」 만드세요
손으로 산 물량까지 팔릴 수 있다는 위험은 구조적으로 못 없앱니다. 대신 그럴 때마다 알림이 오게 했습니다.
위험을 없애는 게 최선이지만, 못 없앨 때는 모르고 당하지 않게 만드는 게 차선입니다.
아직 안 끝났습니다
솔직하게 적어둡니다. 고치기는 했는데 이번 변경만 노린 검증은 아직 안 만들었습니다. 장중이라 급한 것부터 했습니다.
기존 검증은 전부 통과했지만, 그건 「기존 기능이 안 깨졌다」는 확인이지 「새로 넣은 게 제대로 돈다」는 확인이 아닙니다. 이 둘은 다릅니다.
확인해야 할 건 다섯 가지입니다.
- 계좌가 더 많으면 정말 전량 파는가
- 절반만 파는 규칙이 안 걸리는가
- 손으로 산 물량이 제외되는가
- 계좌 조회가 실패하면 안전하게 물러나는가
- 평소에는 아무 변화가 없는가
이걸 안 하면 고쳤다는 말이 「고쳤다고 믿는다」에 그칩니다. 실거래는 그 차이가 돈으로 돌아옵니다.