“손실이 마이너스 8퍼센트에 닿으면 무조건 판다.” 봇에게 이렇게 못을 박아 뒀습니다. 그런데 시장이 무너진 그날, 실제로 잘린 자리는 마이너스 12에서 15퍼센트였습니다.
지난 개발기⑧에서는 봇에게 심어 둔 규칙들이 사실은 사람이 못 지키는 것들이더라는 이야기를 했습니다. 오늘은 그 규칙들이 진짜 시험대에 오른 날 이야기입니다.
결론부터 말씀드리면, 봇은 잘 버티지 못했습니다. 그리고 무너지고 나서야 저는 안전장치가 있다는 것과, 그게 실제로 작동하는 것은 완전히 다른 문제라는 걸 알았습니다.

그날의 성적표부터 보겠습니다
먼저 이 이야기의 무대를 정확히 밝히고 시작하겠습니다. 오늘 나오는 손실은 AI가 스스로 종목을 고르는 실험용 트랙에서 일어난 일입니다. 실제 주문은 단 한 건도 나가지 않았고, 진짜 돈은 0원 들어가 있지 않은 순수 가상 장부입니다. 실전 계좌를 지키는 안전장치들과는 아예 분리된 별도 실험이고요.
그러니 이건 돈을 잃은 이야기가 아니라, 돈을 잃기 전에 미리 깨져 본 이야기입니다.

표로 보기
| 항목 | 설명 | 값 |
|---|---|---|
| 트랙 전체 | 급락 구간 낙폭 | -7.37% |
| 가장 크게 밀린 종목 | 보유 12종 중 최악 | -15.1% |
이틀 사이 실험 트랙 전체가 마이너스 7.37퍼센트, 들고 있던 12개 종목이 전부 마이너스였습니다. 가장 크게 밀린 종목은 마이너스 15.1퍼센트였고요.
여기까지는 “시장이 빠졌으니 나도 빠졌구나”로 넘어갈 수도 있었습니다. 그런데 손실 자체보다 이상한 게 있었습니다. 분명 마이너스 8퍼센트에서 자르라고 해 뒀는데, 왜 15퍼센트까지 밀린 종목이 남아 있었을까요?
봇의 눈이 하루 늦어 있었습니다
원인을 파고들었더니 어이없는 게 나왔습니다. 봇이 어제 종가를 보고 오늘을 판정하고 있었습니다.

봇은 장 마감 직전에 “지금 손실이 몇 퍼센트지?” 하고 계산합니다. 그런데 그때 꺼내 쓰는 가격표가 전날 장 마감 뒤에 만들어 둔 파일이었습니다. 오늘 하루 폭락한 값은 그 파일에 없었던 거죠.

표로 보기
| 항목 | 설명 | 값 |
|---|---|---|
| 봇이 판정에 쓴 값 | 전날인 7월 1일 종가 기준 | -3.7% |
| 그날의 실제 값 | 7월 2일 종가 기준 | -12.4% |
그날 봇 장부에 찍힌 이 종목의 실제 보유 손실률은 마이너스 12.4퍼센트였습니다. 그런데 봇이 손절 판정에 쓴 숫자는 전날 값인 마이너스 3.7퍼센트였고요. 마이너스 8퍼센트 기준으로 보면 아직 여유 있음 — 그래서 그냥 통과시켰습니다.
집에 화재경보기를 달아 놨는데, 그 경보기가 어제 온도를 재고 있었던 셈입니다. 오늘 불이 나도 울리지 않죠.

표로 보기
| 단계 | 내용 | 설명 |
|---|---|---|
| 1단계 | 오늘 장이 크게 빠진다 | 주가가 마이너스 12퍼센트대로 밀림 |
| 2단계 | 봇은 어제 가격표를 편다 | 전날 마감 뒤 만들어 둔 파일 |
| 3단계 | 아직 여유 있다고 판단한다 | 어제 기준으로는 마이너스 3.7퍼센트 |
| 4단계 | 다음날에야 잘린다 | 그 사이 손실은 더 커진다 |
고친 방법은 단순합니다. 판정할 때 증권사에서 그 순간의 시세를 직접 불러오도록 바꿨습니다. 시세를 못 받아 오면 예전처럼 종가를 쓰되, 어떤 값으로 판정했는지 기록에 남기게 했고요.
그런데 이건 헛돈 안전장치 네 개 중 하나일 뿐이었습니다.
표시등은 켜져 있는데, 전선이 연결돼 있지 않았습니다
두 번째가 제일 부끄럽습니다. 개발기⑧에서 자랑스럽게 소개했던 그 서킷 브레이커 — 연달아 잃으면 그날 매수를 멈추는 장치 말입니다.

이 실험 트랙에서는 그게 아예 작동하지 않는 상태였습니다.
정확히 말하면, 연속 손실 횟수를 세기는 하고 있었습니다. 그런데 그 숫자를 가져다 쓰는 곳이 한 군데도 없었습니다. 세 번을 연달아 잃든 다섯 번을 잃든, 봇은 다음 날 아무 일 없다는 듯 또 샀습니다.
더 웃긴 건 화면이었습니다. 성과 화면에는 “서킷: 정상”이라는 표시가 떠 있었는데, 그 글자는 실제 상태를 읽어 온 게 아니라 그냥 박아 놓은 글자였습니다. 어떤 상황에서도 “정상”이라고만 나오는 표시등이었죠.
자동차 계기판에 엔진 경고등이 달려 있는데, 전구까지만 있고 엔진에 선이 연결돼 있지 않은 상태와 같습니다. 계기판은 늘 평온합니다. 엔진이 타고 있어도요.

표로 보기
| 서킷 브레이커 | 믿고 있던 것 | 실제로 확인한 것 |
|---|---|---|
| 연속 손실 세기 | 정확히 세고 있다 | 정확히 세고 있었다 |
| 그 숫자를 쓰는 곳 | 손실이 쌓이면 매수를 멈춘다 | 읽는 코드가 한 군데도 없었다 |
| 화면의 상태 표시 | 지금 상태를 보여준다 | 늘 같은 글자가 박혀 있었다 |
고친 방법은 세 번 연속 손실이 나면 그 뒤 3영업일간 새 매수를 실제로 잠그도록 배선을 연결한 겁니다. 그리고 잠긴 동안에도 파는 건 정상으로 돌아가게 했습니다 — 사는 걸 막는 장치가 파는 것까지 막아 버리면, 그게 더 위험하니까요. 화면의 표시등도 진짜 상태를 읽어 오게 바꿨습니다.
그리고 며칠 뒤, 방금 연결한 그 장치를 제 손으로 껐습니다
배선을 연결하자 서킷은 그날 바로 발동했습니다. 그날 청산이 줄줄이 이어지면서 연속 손실이 쌓였거든요. 장치는 설계대로 정확히 작동했습니다. 그래서 한 번은 손으로 풀어 줬습니다.
그런데 연결하고 나흘째 되던 날, 세 번 연속 손실로 또 걸렸습니다. 이번엔 풀어 주는 대신 아예 껐습니다.
이유는 이 트랙의 목적에 있습니다. 여기는 실제 돈이 0원인 실험용 장부입니다. 실험의 목적은 돈을 지키는 게 아니라 데이터를 쌓는 것이죠. 그런데 서킷이 진입을 막아 버리면 매매가 안 일어나고, 매매가 없으면 잴 것도 없습니다. 브레이크가 너무 잘 들어서 실험차가 아예 안 굴러가는 상황이 된 겁니다.
그래서 “당분간 끄자”고 결정했습니다. 스위치 한 줄로 껐고, 같은 스위치 한 줄로 언제든 되돌릴 수 있게 두었습니다. 지금도 이 실험 트랙의 서킷은 꺼져 있습니다.
여기서 꼭 짚고 넘어가야 할 게 있습니다. 실제 계좌를 지키는 서킷 브레이커는 이것과 완전히 다른 장치이고, 그건 손대지 않았습니다. 파일도 설정값도 별개거든요. 실험차의 브레이크를 뺀 것이지, 도로를 달리는 차의 브레이크를 뺀 게 아닙니다.

표로 보기
| 시점 | 사건 | 설명 |
|---|---|---|
| 고친 날 | 배선을 실제로 이었습니다 | 세 번 연속 손실이면 신규 매수를 잠급니다 |
| 켠 당일 | 한 번 걸렸습니다 | 신규 매수 정지 |
| 나흘 뒤 | 또 한 번 걸렸습니다 | 다시 신규 매수 정지 |
| 그다음 | 다시 껐습니다 | 매매가 멈추면 잴 데이터도 안 쌓입니다 |
그런데 아직 이상한 게 더 남아 있었습니다. 들고 있던 12종목 중 8종목은, 애초에 청산 규칙 자체가 평생 발동할 수 없는 상태였습니다.
이름표가 달라서, 명단에서 못 찾고 있었습니다
봇에는 “이 종목이 속한 테마가 힘을 잃으면 판다”는 규칙이 있습니다. 그러려면 먼저 이 종목이 어느 테마인지 알아내서, 테마 성적표 명단에서 찾아봐야 합니다.
문제는 이름표였습니다. 뉴스 이벤트를 보고 산 종목에는 봇이 `이벤트:반도체` 같은 이름표를 붙였는데, 정작 테마 성적표 명단에는 `섹터:반도체` 형식으로만 적혀 있었습니다. 이름표 형식이 서로 달랐던 겁니다.
그러니 봇은 명단을 아무리 뒤져도 그 종목의 테마를 못 찾았고, 못 찾으면 “판단 보류”로 넘어갔습니다. 결과적으로 12종 중 8종은 테마 약세 청산이 영원히 발동하지 않는 상태였습니다.

반 아이들 출석부에는 “3반 김철수”라고 적혀 있는데, 손에 든 명찰에는 “이벤트반 김철수”라고 쓰여 있는 격입니다. 이름을 아무리 불러도 명단에서 안 나오죠.

표로 보기
| 단계 | 내용 | 설명 |
|---|---|---|
| 1단계 | 이벤트를 보고 산다 | 봇이 이벤트 이름표를 붙임 |
| 2단계 | 명단에서 찾는다 | 성적표에는 다른 형식으로 적혀 있음 |
| 3단계 | 못 찾으니 판단 보류 | 테마 약세 청산이 발동 안 함 |
| 4단계 | 12종 중 8종이 사각지대 | 그대로 계속 보유됨 |
고친 방법은 이름표를 두 단계로 찾아보게 한 겁니다. 첫 번째 명단에서 못 찾으면 두 번째 명단에서 다시 찾고, 그마저도 자료가 10거래일 넘게 묵었거나 표본이 모자라면 억지로 팔지 않고 그냥 보유합니다. 오래된 자료로 잘못 파는 것보다는 낫다고 봤거든요.
이틀 만에 현금을 다 써 버렸습니다
네 번째는 좀 다른 결의 문제입니다. 급락 첫날, 봇은 하루에 8종목을 한꺼번에 샀습니다. 그리고 이틀 만에 가진 현금의 94퍼센트를 써 버렸습니다.

시장이 계속 빠지는 국면에서 현금이 없다는 건, 더 좋은 자리가 와도 아무것도 못 한다는 뜻입니다. 봇은 이틀 만에 손발이 묶인 상태로 하락을 그냥 맞았습니다.
그래서 하루에 새로 살 수 있는 종목 수에 상한을 뒀습니다. 상한에 걸린 후보는 그날 사지 않고, 다음 날 조건이 그대로면 자연스럽게 다시 후보에 오릅니다.
여기서 걱정이 하나 있었습니다. “나눠 사면 좋은 기회를 놓치는 것 아닌가?” 그래서 과거 데이터로 확인해 봤습니다. 3천 건 넘는 사례를 되짚어 보니, 하루에 몰아 사나 며칠에 나눠 사나 성과 차이는 거의 없었고, 오히려 손절선에 닿는 비율은 살짝 줄었습니다. 나눠 사는 건 거의 공짜로 얻는 분산 장치였던 셈입니다.

표로 보기
| 무엇이 헛돌았나 | 무슨 일이 있었나 | 그래서 어떻게 됐나 |
|---|---|---|
| 늦은 눈 | 어제 종가로 오늘을 판정 | 손절이 뒤늦게 걸렸다 |
| 끊긴 배선 | 서킷 숫자를 쓰는 곳이 없음 | 연속 손실에도 계속 매수 |
| 안 맞는 이름표 | 테마 명단에서 종목을 못 찾음 | 12종 중 8종 청산 사각지대 |
| 몰아 사기 | 하루 8종목 일괄 매수 | 이틀 만에 현금 94% 소진 |
그런데 네 개를 다 고치고 닷새 뒤, 이 트랙은 또 한 번 크게 밀렸습니다. 이번엔 마이너스 8.3퍼센트였습니다.
진범은 파는 쪽이 아니라, 사는 쪽이었습니다
같은 자리에서 두 번 넘어졌으니 이번엔 원인을 다시 뜯어봤습니다. 그리고 처음 생각과 정반대의 답을 만났습니다.

크게 밀린 종목들의 공통점은 “산 바로 다음 날 갭 하락”이었습니다. 갭 하락은 장이 열리자마자 전날보다 훨씬 낮은 가격에서 시작하는 걸 말합니다. 어제 10,000원이던 게 오늘 아침 8,500원에서 문을 여는 식이죠. 실제로 이때 크게 밀린 종목들은 하루 만에 12에서 17퍼센트씩 빠졌는데, 전부 산 다음 날 벌어진 일이었습니다.
여기가 핵심입니다. 손절선은 장이 열려 있는 동안에만 작동합니다. 밤사이 벌어진 간격은 손절선이 손쓸 새도 없이 건너뛰어 버립니다. 손절 기준을 8퍼센트로 하든 12퍼센트로 하든 똑같이 못 막습니다.
그러니까 이번 손실은 파는 규칙이 아니라 사는 순간에 이미 상당 부분 결정돼 있었습니다. 하락이 시작되는 초입에 올라탄 종목을 뒤늦게 추격해서 담았다는 것 — 그게 이 트랙에서 확인된 원인이었습니다.
참고로 이때 제가 의심했던 다른 후보 하나는 무죄로 판명됐습니다. “손절을 너무 느슨하게 잡아 둔 게 문제 아닐까” 싶어 확인해 봤더니, 이번 청산 15건 중 그 느슨한 규칙이 적용된 건은 한 건도 없었습니다. 짚어 보기 전까지는 저도 그게 범인인 줄 알았고요.

표로 보기
| 단계 | 내용 | 설명 |
|---|---|---|
| 1단계 | 하락 초입에 추격해 산다 | 이미 오르던 종목을 뒤늦게 담음 |
| 2단계 | 다음 날 아침 갭 하락 | 전날보다 훨씬 낮은 가격에서 시작 |
| 3단계 | 손절선이 못 막는다 | 기준을 낮춰도 건너뛰어 체결됨 |
| 4단계 | 손실은 진입에서 결정됐다 | 청산 규칙을 아무리 만져도 소용없음 |
추격만 안 해도 될까요? 검증해 봤습니다
그래서 “애초에 안 사는 규칙”을 만들어 보기로 했습니다. 세 가지 후보를 놓고 과거 데이터로 검증했습니다.
- A. 추세 확인 — 개별 종목이 오르는 중일 때만 산다
- B. 추격 금지 — 며칠 새 이미 많이 오른 종목, 과열된 종목은 안 산다
- C. 섹터 전환 — 업종 자체가 꺾이는 중이면 안 산다
상식적으로는 셋 다 좋아 보이시죠? 저도 그렇게 생각했습니다. 결과는 예상과 달랐습니다.
먼저 이 검증의 범위를 밝혀 두겠습니다. 과거 데이터로 되짚을 수 있는 건 강세 테마의 대장주·중소형주를 담는 경로 하나뿐이었습니다. 뉴스 이벤트를 보고 담는 경로는 자료가 8일치밖에 없어서 아예 검증하지 못했습니다. 그러니 아래 숫자는 “모든 매수”가 아니라 “그 한 경로”의 이야기입니다.

표로 보기
| 항목 | 설명 | 값 |
|---|---|---|
| 규칙 없음 | 기준선 | 27.9% |
| A 추세 확인 | 오르는 종목만 산다 | 32.3% |
| B 추격 금지 | 과열된 종목은 피한다 | 19.6% |
| C 섹터 전환 | 꺾인 업종은 피한다 | 32.7% |
A와 C는 오히려 나빠졌습니다. 크게 밀리는 비율이 기준선보다 높아졌고요. 왜 그런지까지는 이 검증으로 알 수 없지만, 적어도 이 표본에서 “오르는 종목만 사자”는 상식적인 규칙은 방어 장치로 작동하지 않았습니다.
살아남은 건 B, 추격 금지 하나였습니다. 크게 밀리는 비율이 27.9퍼센트에서 19.6퍼센트로 줄었고, 다음 날 갭 하락으로 크게 밀린 사례는 이 표본 안에서 사라졌습니다. 게다가 안 사고 걸러 낸 종목들이 실제로 이후 성적이 나빴습니다 — 좋은 기회를 놓친 게 아니라, 나쁜 자리를 피한 것이었죠. 다만 이건 통계 검정을 통과한 결론이 아닙니다. 검증에 쓸 수 있었던 사례가 100건이 채 안 돼서, 엄격한 기준으로 다시 걸러 보니 판정 불가로 나왔거든요.
표본이 모자란데 왜 켰을까요
여기가 이 글에서 제일 하고 싶은 이야기입니다.
보통이라면 “표본 부족 = 보류”가 맞습니다. 그런데 저는 이 규칙을 바로 켰습니다. 정확히 말하면 실제 돈이 0원인 실험 트랙에만 켰습니다.
이유는 이렇습니다. 표본을 더 모으려면 실전에 쓰면서 재는 수밖에 없는데, 실전에서 재려면 진짜 돈이 걸립니다. 그런데 이 트랙은 잃을 돈이 애초에 없죠. 틀려도 잃는 게 없는 자리라면, 창고에 두고 고민하는 것보다 켜서 실제로 재는 편이 데이터를 빨리 모읍니다. 그래서 실험차에만 이 부품을 달아 본 겁니다.

표로 보기
| 단계 | 내용 | 설명 |
|---|---|---|
| 1단계 | 숫자는 좋았다 | 크게 밀리는 비율 27.9에서 19.6으로 |
| 2단계 | 통계로는 판정 불가 | 표본 100건 미만 |
| 3단계 | 실전 대신 실험 트랙에 켠다 | 실제 돈 0원인 장부에만 |
| 4단계 | 쓰면서 표본을 쌓는다 | 앞으로의 결과로 다시 판정 |
그리고 여기서 한 번 더 조심할 일이 생겼습니다.
“안 사길 잘했다”는 말을 아직 못 합니다
규칙을 켜 뒀으니 이제 봇이 걸러 낸 종목이 나오기 시작합니다. 그럼 그 종목이 이후에 떨어졌는지 보고 “거봐, 안 사길 잘했지” 하면 될까요?

안 됩니다. 시장 전체가 빠진 날이면 걸러 낸 종목도 당연히 떨어집니다. 그걸 규칙의 공으로 돌리면 비 오는 날 우산 안 썼는데도 안 젖었다고 우기는 것과 비슷해집니다.
그래서 채점 장치를 따로 만들 때 비교 대상을 같이 넣었습니다. 걸러 낸 종목들만 보는 게 아니라, 같은 규칙을 통과해서 실제로 산 종목들과 나란히 놓고 비교하는 겁니다. 걸러 낸 쪽이 산 쪽보다 더 떨어졌을 때에만 “막은 게 도움이 됐다”고 말할 수 있으니까요.
이 설계는 사실 제가 처음부터 생각해 낸 게 아닙니다. 초안에는 걸러 낸 종목만 채점하는 구조로 짜여 있었고, 검증을 맡긴 AI가 “그건 인과 오류”라고 지적해서 비교 대상을 넣게 됐습니다.

표로 보기
| 단계 | 내용 | 설명 |
|---|---|---|
| 1단계 | 걸러 낸 종목을 따로 모은다 | 규칙이 사지 말라고 한 것들입니다 |
| 2단계 | 실제로 산 종목도 같이 모은다 | 규칙을 통과해 매수한 것들 · 비교 대상이 됩니다 |
| 3단계 | 같은 방식으로 이후를 추적한다 | 둘의 성적을 같은 잣대로 잽니다 |
| 4단계 | 표본이 쌓이면 채점한다 | 지금은 걸러 낸 종목 4개 · 아직 판정 불가 |
그래서 지금 상태를 정직하게 말씀드리면 이렇습니다. 규칙은 켜져 있고, 지금까지 걸러 낸 종목은 네 개이며, 효과가 있는지는 아직 모릅니다. 양쪽 다 30건 이상 쌓여야 판정할 계획입니다. 지금 속도라면 한참 걸리겠죠.
솔직히 이 상태가 답답합니다. 눈앞에 27.9에서 19.6으로 줄어드는 숫자가 있는데 “아직 모른다”고 말해야 하니까요. 그런데 개발기③에서 뼈아프게 배운 게 정확히 이거였습니다 — 백테스트에선 만점이었는데 실전은 낙제였던 이야기 말입니다. 과거 데이터에 잘 맞는 규칙과, 미래에도 통하는 규칙은 다릅니다.
정리 — 급락장이 알려 준 것
- 손절선은 있었지만, 그 선을 재는 자가 하루 묵어 있었습니다. 기준보다, 기준을 재는 도구가 먼저입니다.
- 서킷 브레이커는 표시등만 있고 배선이 없었습니다. “있다”와 “작동한다”는 다른 말입니다.
- 이름표가 안 맞아 12종 중 8종이 청산 사각지대였습니다. 규칙이 멀쩡해도 종목에 가 닿지 못하면 없는 것과 같습니다.
- 이번 손실의 원인은 파는 쪽보다 사는 쪽에 있었습니다. 갭 하락은 손절선이 건너뜁니다.
- 좋아 보인 해법도 “효과 있다”고 말하지 않았습니다. 실험 트랙에 켜 두고 비교 대상과 함께 재는 중입니다.
돌아보면 이 네 개의 구멍은 평온한 장에서는 하나도 보이지 않았습니다. 시장이 조용할 때 봇은 잘 굴러가는 것처럼 보였고, 화면의 표시등은 늘 “정상”이었으니까요.
급락장은 실력을 시험하는 게 아니라, 평소에 안 보이던 구멍을 한꺼번에 열어 보여 주는 날이었습니다. 그날 진짜 돈이 아니라 가상 장부에서 깨진 게 다행이었다고, 지금도 생각합니다.
※ 위 손절·서킷 기준 같은 수치는 이 시스템의 설정값을 설명하기 위한 것이며, 특정 매매를 권하는 기준이 아닙니다. 언급된 종목은 당시 시스템 동작을 설명하기 위한 사례이며 매수·매도 권유가 아닙니다.
다음 글 예고 — AI가 짠 것을, 다른 AI가 물어뜯게 했습니다
이번 편 마지막에 잠깐 나왔죠. 제 설계의 허점을 검증을 맡긴 AI가 지적했다는 이야기 말입니다.
사실 이건 우연이 아니라 일부러 만든 구조입니다. 만드는 AI와 물어뜯는 AI를 따로 두고, 서로 싸우게 한 뒤에야 반영합니다. 다음 편에서는 이 AI 교차검증 구조가 어떻게 생겼고, 실제로 무엇을 잡아냈는지 풀어 보겠습니다.
여러분의 계좌는 급락장에서 어떻게 움직였나요? 그때 미리 정해 둔 규칙이 있으셨는지 궁금합니다.
다음 편을 준비하고 있습니다 ✍️
근거: 지시문 993 — 926 청산·안전장치 오버홀 · 지시문 1038 — 926 서킷 당분간 OFF · 지시문 1044 — 진입 갭방어 게이트 백테 · 지시문 1045 — 게이트 B 진입 반영 · 지시문 1085 — 게이트B 방어효과 대조 채점 — 본 글은 개발·운영 과정의 경험 공유이며 투자 자문이 아닙니다.
이 글은 특정 종목의 매수·매도를 권유하는 글이 아니라, 개인이 만든 시스템의 개발·운영 과정을 공유하는 정보·교육·참고용 글입니다. 투자 판단과 책임은 본인에게 있습니다.
아직 댓글이 없습니다. 이 글을 읽고 떠오른 생각을 남겨 주세요.