이 글은 특정 종목의 매수·매도를 권유하는 글이 아니라, 개인이 만든 시스템의 개발·운영 과정을 공유하는 정보·교육·참고용 글입니다. 투자 판단과 책임은 본인에게 있습니다.

“손실이 마이너스 8퍼센트에 닿으면 무조건 판다.” 봇에게 이렇게 못을 박아 뒀습니다. 그런데 시장이 무너진 그날, 실제로 잘린 자리는 마이너스 12에서 15퍼센트였습니다.

지난 개발기⑧에서는 봇에게 심어 둔 규칙들이 사실은 사람이 못 지키는 것들이더라는 이야기를 했습니다. 오늘은 그 규칙들이 진짜 시험대에 오른 날 이야기입니다.

결론부터 말씀드리면, 봇은 잘 버티지 못했습니다. 그리고 무너지고 나서야 저는 안전장치가 있다는 것과, 그게 실제로 작동하는 것은 완전히 다른 문제라는 걸 알았습니다.

시장이 무너지는 날
Photo: RDNE Stock project / Pexels

그날의 성적표부터 보겠습니다

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

그러니 이건 돈을 잃은 이야기가 아니라, 돈을 잃기 전에 미리 깨져 본 이야기입니다.

급락 이틀의 성적표
머니노트 · 정보·교육·참고용

이틀 사이 실험 트랙 전체가 마이너스 7.37퍼센트, 들고 있던 12개 종목이 전부 마이너스였습니다. 가장 크게 밀린 종목은 마이너스 15.1퍼센트였고요.

여기까지는 “시장이 빠졌으니 나도 빠졌구나”로 넘어갈 수도 있었습니다. 그런데 손실 자체보다 이상한 게 있었습니다. 분명 마이너스 8퍼센트에서 자르라고 해 뒀는데, 왜 15퍼센트까지 밀린 종목이 남아 있었을까요?

봇의 눈이 하루 늦어 있었습니다

원인을 파고들었더니 어이없는 게 나왔습니다. 봇이 어제 종가를 보고 오늘을 판정하고 있었습니다.

어제 데이터로 오늘을 판정했다
Photo: Nemuel Sereti / Pexels

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

봇이 본 값과 실제 값
머니노트 · 정보·교육·참고용

그날 봇 장부에 찍힌 이 종목의 실제 보유 손실률은 마이너스 12.4퍼센트였습니다. 그런데 봇이 손절 판정에 쓴 숫자는 전날 값인 마이너스 3.7퍼센트였고요. 마이너스 8퍼센트 기준으로 보면 아직 여유 있음 — 그래서 그냥 통과시켰습니다.

집에 화재경보기를 달아 놨는데, 그 경보기가 어제 온도를 재고 있었던 셈입니다. 오늘 불이 나도 울리지 않죠.

손절이 늦게 걸린 과정
머니노트 · 정보·교육·참고용

고친 방법은 단순합니다. 판정할 때 증권사에서 그 순간의 시세를 직접 불러오도록 바꿨습니다. 시세를 못 받아 오면 예전처럼 종가를 쓰되, 어떤 값으로 판정했는지 기록에 남기게 했고요.

그런데 이건 헛돈 안전장치 네 개 중 하나일 뿐이었습니다.

표시등은 켜져 있는데, 전선이 연결돼 있지 않았습니다

두 번째가 제일 부끄럽습니다. 개발기⑧에서 자랑스럽게 소개했던 그 서킷 브레이커 — 연달아 잃으면 그날 매수를 멈추는 장치 말입니다.

차단기는 있는데 배선이 없었다
Photo: ranjeet . / Pexels

이 실험 트랙에서는 그게 아예 작동하지 않는 상태였습니다.

정확히 말하면, 연속 손실 횟수를 세기는 하고 있었습니다. 그런데 그 숫자를 가져다 쓰는 곳이 한 군데도 없었습니다. 세 번을 연달아 잃든 다섯 번을 잃든, 봇은 다음 날 아무 일 없다는 듯 또 샀습니다.

더 웃긴 건 화면이었습니다. 성과 화면에는 “서킷: 정상”이라는 표시가 떠 있었는데, 그 글자는 실제 상태를 읽어 온 게 아니라 그냥 박아 놓은 글자였습니다. 어떤 상황에서도 “정상”이라고만 나오는 표시등이었죠.

자동차 계기판에 엔진 경고등이 달려 있는데, 전구까지만 있고 엔진에 선이 연결돼 있지 않은 상태와 같습니다. 계기판은 늘 평온합니다. 엔진이 타고 있어도요.

있는 줄 알았던 장치가 없었다
머니노트 · 정보·교육·참고용

고친 방법은 세 번 연속 손실이 나면 그 뒤 3영업일간 새 매수를 실제로 잠그도록 배선을 연결한 겁니다. 그리고 잠긴 동안에도 파는 건 정상으로 돌아가게 했습니다 — 사는 걸 막는 장치가 파는 것까지 막아 버리면, 그게 더 위험하니까요. 화면의 표시등도 진짜 상태를 읽어 오게 바꿨습니다.

그리고 며칠 뒤, 방금 연결한 그 장치를 제 손으로 껐습니다

배선을 연결하자 서킷은 그날 바로 발동했습니다. 그날 청산이 줄줄이 이어지면서 연속 손실이 쌓였거든요. 장치는 설계대로 정확히 작동했습니다. 그래서 한 번은 손으로 풀어 줬습니다.

그런데 연결하고 나흘째 되던 날, 세 번 연속 손실로 또 걸렸습니다. 이번엔 풀어 주는 대신 아예 껐습니다.

이유는 이 트랙의 목적에 있습니다. 여기는 실제 돈이 0원인 실험용 장부입니다. 실험의 목적은 돈을 지키는 게 아니라 데이터를 쌓는 것이죠. 그런데 서킷이 진입을 막아 버리면 매매가 안 일어나고, 매매가 없으면 잴 것도 없습니다. 브레이크가 너무 잘 들어서 실험차가 아예 안 굴러가는 상황이 된 겁니다.

그래서 “당분간 끄자”고 결정했습니다. 스위치 한 줄로 껐고, 같은 스위치 한 줄로 언제든 되돌릴 수 있게 두었습니다. 지금도 이 실험 트랙의 서킷은 꺼져 있습니다.

여기서 꼭 짚고 넘어가야 할 게 있습니다. 실제 계좌를 지키는 서킷 브레이커는 이것과 완전히 다른 장치이고, 그건 손대지 않았습니다. 파일도 설정값도 별개거든요. 실험차의 브레이크를 뺀 것이지, 도로를 달리는 차의 브레이크를 뺀 게 아닙니다.

같은 장치를 켜고 끈 이유
머니노트 · 정보·교육·참고용

그런데 아직 이상한 게 더 남아 있었습니다. 들고 있던 12종목 중 8종목은, 애초에 청산 규칙 자체가 평생 발동할 수 없는 상태였습니다.

이름표가 달라서, 명단에서 못 찾고 있었습니다

봇에는 “이 종목이 속한 테마가 힘을 잃으면 판다”는 규칙이 있습니다. 그러려면 먼저 이 종목이 어느 테마인지 알아내서, 테마 성적표 명단에서 찾아봐야 합니다.

문제는 이름표였습니다. 뉴스 이벤트를 보고 산 종목에는 봇이 `이벤트:반도체` 같은 이름표를 붙였는데, 정작 테마 성적표 명단에는 `섹터:반도체` 형식으로만 적혀 있었습니다. 이름표 형식이 서로 달랐던 겁니다.

그러니 봇은 명단을 아무리 뒤져도 그 종목의 테마를 못 찾았고, 못 찾으면 “판단 보류”로 넘어갔습니다. 결과적으로 12종 중 8종은 테마 약세 청산이 영원히 발동하지 않는 상태였습니다.

이름표가 어긋난 실제 코드
머니노트 · 정보·교육·참고용

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

이름표가 안 맞아 생긴 사각지대
머니노트 · 정보·교육·참고용

고친 방법은 이름표를 두 단계로 찾아보게 한 겁니다. 첫 번째 명단에서 못 찾으면 두 번째 명단에서 다시 찾고, 그마저도 자료가 10거래일 넘게 묵었거나 표본이 모자라면 억지로 팔지 않고 그냥 보유합니다. 오래된 자료로 잘못 파는 것보다는 낫다고 봤거든요.

이틀 만에 현금을 다 써 버렸습니다

네 번째는 좀 다른 결의 문제입니다. 급락 첫날, 봇은 하루에 8종목을 한꺼번에 샀습니다. 그리고 이틀 만에 가진 현금의 94퍼센트를 써 버렸습니다.

하루 만에 현금이 빠져나갔다
Photo: Yan Krukau / Pexels

시장이 계속 빠지는 국면에서 현금이 없다는 건, 더 좋은 자리가 와도 아무것도 못 한다는 뜻입니다. 봇은 이틀 만에 손발이 묶인 상태로 하락을 그냥 맞았습니다.

그래서 하루에 새로 살 수 있는 종목 수에 상한을 뒀습니다. 상한에 걸린 후보는 그날 사지 않고, 다음 날 조건이 그대로면 자연스럽게 다시 후보에 오릅니다.

여기서 걱정이 하나 있었습니다. “나눠 사면 좋은 기회를 놓치는 것 아닌가?” 그래서 과거 데이터로 확인해 봤습니다. 3천 건 넘는 사례를 되짚어 보니, 하루에 몰아 사나 며칠에 나눠 사나 성과 차이는 거의 없었고, 오히려 손절선에 닿는 비율은 살짝 줄었습니다. 나눠 사는 건 거의 공짜로 얻는 분산 장치였던 셈입니다.

헛돌던 네 가지
머니노트 · 정보·교육·참고용

그런데 네 개를 다 고치고 닷새 뒤, 이 트랙은 또 한 번 크게 밀렸습니다. 이번엔 마이너스 8.3퍼센트였습니다.

진범은 파는 쪽이 아니라, 사는 쪽이었습니다

같은 자리에서 두 번 넘어졌으니 이번엔 원인을 다시 뜯어봤습니다. 그리고 처음 생각과 정반대의 답을 만났습니다.

손실은 파는 자리가 아니라 사는 자리에서 정해졌다
Photo: Artem Podrez / Pexels

크게 밀린 종목들의 공통점은 “산 바로 다음 날 갭 하락”이었습니다. 갭 하락은 장이 열리자마자 전날보다 훨씬 낮은 가격에서 시작하는 걸 말합니다. 어제 10,000원이던 게 오늘 아침 8,500원에서 문을 여는 식이죠. 실제로 이때 크게 밀린 종목들은 하루 만에 12에서 17퍼센트씩 빠졌는데, 전부 산 다음 날 벌어진 일이었습니다.

여기가 핵심입니다. 손절선은 장이 열려 있는 동안에만 작동합니다. 밤사이 벌어진 간격은 손절선이 손쓸 새도 없이 건너뛰어 버립니다. 손절 기준을 8퍼센트로 하든 12퍼센트로 하든 똑같이 못 막습니다.

그러니까 이번 손실은 파는 규칙이 아니라 사는 순간에 이미 상당 부분 결정돼 있었습니다. 하락이 시작되는 초입에 올라탄 종목을 뒤늦게 추격해서 담았다는 것 — 그게 이 트랙에서 확인된 원인이었습니다.

참고로 이때 제가 의심했던 다른 후보 하나는 무죄로 판명됐습니다. “손절을 너무 느슨하게 잡아 둔 게 문제 아닐까” 싶어 확인해 봤더니, 이번 청산 15건 중 그 느슨한 규칙이 적용된 건은 한 건도 없었습니다. 짚어 보기 전까지는 저도 그게 범인인 줄 알았고요.

급락 손실이 결정되는 자리
머니노트 · 정보·교육·참고용

추격만 안 해도 될까요? 검증해 봤습니다

그래서 “애초에 안 사는 규칙”을 만들어 보기로 했습니다. 세 가지 후보를 놓고 과거 데이터로 검증했습니다.

상식적으로는 셋 다 좋아 보이시죠? 저도 그렇게 생각했습니다. 결과는 예상과 달랐습니다.

먼저 이 검증의 범위를 밝혀 두겠습니다. 과거 데이터로 되짚을 수 있는 건 강세 테마의 대장주·중소형주를 담는 경로 하나뿐이었습니다. 뉴스 이벤트를 보고 담는 경로는 자료가 8일치밖에 없어서 아예 검증하지 못했습니다. 그러니 아래 숫자는 “모든 매수”가 아니라 “그 한 경로”의 이야기입니다.

세 가지 진입 규칙 검증 결과
머니노트 · 정보·교육·참고용

A와 C는 오히려 나빠졌습니다. 크게 밀리는 비율이 기준선보다 높아졌고요. 왜 그런지까지는 이 검증으로 알 수 없지만, 적어도 이 표본에서 “오르는 종목만 사자”는 상식적인 규칙은 방어 장치로 작동하지 않았습니다.

살아남은 건 B, 추격 금지 하나였습니다. 크게 밀리는 비율이 27.9퍼센트에서 19.6퍼센트로 줄었고, 다음 날 갭 하락으로 크게 밀린 사례는 이 표본 안에서 사라졌습니다. 게다가 안 사고 걸러 낸 종목들이 실제로 이후 성적이 나빴습니다 — 좋은 기회를 놓친 게 아니라, 나쁜 자리를 피한 것이었죠. 다만 이건 통계 검정을 통과한 결론이 아닙니다. 검증에 쓸 수 있었던 사례가 100건이 채 안 돼서, 엄격한 기준으로 다시 걸러 보니 판정 불가로 나왔거든요.

표본이 모자란데 왜 켰을까요

여기가 이 글에서 제일 하고 싶은 이야기입니다.

보통이라면 “표본 부족 = 보류”가 맞습니다. 그런데 저는 이 규칙을 바로 켰습니다. 정확히 말하면 실제 돈이 0원인 실험 트랙에만 켰습니다.

이유는 이렇습니다. 표본을 더 모으려면 실전에 쓰면서 재는 수밖에 없는데, 실전에서 재려면 진짜 돈이 걸립니다. 그런데 이 트랙은 잃을 돈이 애초에 없죠. 틀려도 잃는 게 없는 자리라면, 창고에 두고 고민하는 것보다 켜서 실제로 재는 편이 데이터를 빨리 모읍니다. 그래서 실험차에만 이 부품을 달아 본 겁니다.

보류 대신 실험 트랙에 켠 이유
머니노트 · 정보·교육·참고용

그리고 여기서 한 번 더 조심할 일이 생겼습니다.

“안 사길 잘했다”는 말을 아직 못 합니다

규칙을 켜 뒀으니 이제 봇이 걸러 낸 종목이 나오기 시작합니다. 그럼 그 종목이 이후에 떨어졌는지 보고 “거봐, 안 사길 잘했지” 하면 될까요?

아직은 재는 중입니다
Photo: Keysi Estrada / Pexels

안 됩니다. 시장 전체가 빠진 날이면 걸러 낸 종목도 당연히 떨어집니다. 그걸 규칙의 공으로 돌리면 비 오는 날 우산 안 썼는데도 안 젖었다고 우기는 것과 비슷해집니다.

그래서 채점 장치를 따로 만들 때 비교 대상을 같이 넣었습니다. 걸러 낸 종목들만 보는 게 아니라, 같은 규칙을 통과해서 실제로 산 종목들과 나란히 놓고 비교하는 겁니다. 걸러 낸 쪽이 산 쪽보다 더 떨어졌을 때에만 “막은 게 도움이 됐다”고 말할 수 있으니까요.

이 설계는 사실 제가 처음부터 생각해 낸 게 아닙니다. 초안에는 걸러 낸 종목만 채점하는 구조로 짜여 있었고, 검증을 맡긴 AI가 “그건 인과 오류”라고 지적해서 비교 대상을 넣게 됐습니다.

막았다고 잘 막은 건 아니다
머니노트 · 정보·교육·참고용

그래서 지금 상태를 정직하게 말씀드리면 이렇습니다. 규칙은 켜져 있고, 지금까지 걸러 낸 종목은 네 개이며, 효과가 있는지는 아직 모릅니다. 양쪽 다 30건 이상 쌓여야 판정할 계획입니다. 지금 속도라면 한참 걸리겠죠.

솔직히 이 상태가 답답합니다. 눈앞에 27.9에서 19.6으로 줄어드는 숫자가 있는데 “아직 모른다”고 말해야 하니까요. 그런데 개발기③에서 뼈아프게 배운 게 정확히 이거였습니다 — 백테스트에선 만점이었는데 실전은 낙제였던 이야기 말입니다. 과거 데이터에 잘 맞는 규칙과, 미래에도 통하는 규칙은 다릅니다.

정리 — 급락장이 알려 준 것

돌아보면 이 네 개의 구멍은 평온한 장에서는 하나도 보이지 않았습니다. 시장이 조용할 때 봇은 잘 굴러가는 것처럼 보였고, 화면의 표시등은 늘 “정상”이었으니까요.

급락장은 실력을 시험하는 게 아니라, 평소에 안 보이던 구멍을 한꺼번에 열어 보여 주는 날이었습니다. 그날 진짜 돈이 아니라 가상 장부에서 깨진 게 다행이었다고, 지금도 생각합니다.

※ 위 손절·서킷 기준 같은 수치는 이 시스템의 설정값을 설명하기 위한 것이며, 특정 매매를 권하는 기준이 아닙니다. 언급된 종목은 당시 시스템 동작을 설명하기 위한 사례이며 매수·매도 권유가 아닙니다.

다음 글 예고 — AI가 짠 것을, 다른 AI가 물어뜯게 했습니다

이번 편 마지막에 잠깐 나왔죠. 제 설계의 허점을 검증을 맡긴 AI가 지적했다는 이야기 말입니다.

사실 이건 우연이 아니라 일부러 만든 구조입니다. 만드는 AI와 물어뜯는 AI를 따로 두고, 서로 싸우게 한 뒤에야 반영합니다. 다음 편에서는 이 AI 교차검증 구조가 어떻게 생겼고, 실제로 무엇을 잡아냈는지 풀어 보겠습니다.

▶ 다음 편 예고
AI가 짠 것을 다른 AI가 물어뜯게 했습니다 — AI 교차검증
혼자 쓰고 혼자 검토하면 같은 맹점을 두 번 통과시킵니다. 그래서 팀을 만들었습니다.

다음 편을 준비하고 있습니다 ✍️


근거: 지시문 993 — 926 청산·안전장치 오버홀 · 지시문 1038 — 926 서킷 당분간 OFF · 지시문 1044 — 진입 갭방어 게이트 백테 · 지시문 1045 — 게이트 B 진입 반영 · 지시문 1085 — 게이트B 방어효과 대조 채점 — 본 글은 개발·운영 과정의 경험 공유이며 투자 자문이 아닙니다.