[카테고리:] AI봇 개발기

  • 저절로 메워지는 고장은 영영 안 고쳐집니다 — 개발기 ⑯ 한 곳만 바꾼 계좌에서 돈이 조용히 새기 시작합니다

    저절로 메워지는 고장은 영영 안 고쳐집니다 — 개발기 ⑯ 한 곳만 바꾼 계좌에서 돈이 조용히 새기 시작합니다

    제 자동매매 봇 기록을 뒤지다 이상한 걸 봤습니다. 8일 연속으로, 매일 같은 시각에 같은 자리가 무너져 있었습니다.

    그런데 그 8일 동안 저는 아무것도 못 느꼈습니다. 십여 분이면 저절로 메워졌기 때문입니다. 여러분 통장에도 아마 같은 자리가 하나쯤 있습니다.

    더 이상한 건 그다음입니다. 그 자리는 제가 이미 고쳤다고 믿고 있던 자리였습니다.

    월급 통장을 바꾸면서 자동이체를 옮겼는데, 옛 통장에 잔액이 남아 있어서 아직 아무 일도 안 일어난 자리. 딱 그겁니다.

    한 줄을 고쳤는데 왜 매일 다시 무너질까요?

    제 봇은 아침마다 시장 자료를 받아 옵니다. 새 자료가 들어오면 전에 저장해 둔 요약본은 지웁니다. 낡은 요약을 들고 판단하면 안 되니까요.

    몇 달 전에 이 지우는 동작이 문제를 일으켰습니다. 지운 다음 새 요약을 만들기까지 몇 분이 비는데, 그 사이에 봇이 요약을 찾으면 빈손이 됩니다. 그래서 그 줄을 지웠습니다. 고쳤다고 적었고, 왜 지웠는지 옆에 메모까지 붙였습니다.

    그런데 똑같은 줄이 네 곳에 있었습니다.

    같은 명령이 네 곳에 있었다
    머니노트 · 정보·교육·참고용

    쉽게 말하면 이런 겁니다. 집에 수도꼭지가 네 개인데 하나만 잠그고 물을 다 잠갔다고 적어 둔 거죠.

    그런데 나머지 셋에서 물이 계속 흘렀는데도 한동안 아무 소리가 안 났습니다. 저절로 메워졌기 때문입니다.

    저절로 메워지는데 왜 그게 문제일까요?

    남은 세 곳은 각자 자기 시간에 돌았습니다. 아침 여섯 시 사십 분에 한 번, 오후 네 시 십 분과 이십 분에 각각 한 번씩요.

    그래서 하루가 이렇게 흘렀습니다.

    하루가 이렇게 되풀이됐다
    머니노트 · 정보·교육·참고용
    표로 보기
    고장은 11분 만에 저절로 메워졌습니다
    시점 사건 설명
    06시 40분 요약본이 지워진다 남겨 둔 세 곳 중 하나가 돈다
    06시 50분 자료 없음 경고 감시 장치가 문제를 정확히 잡아낸다
    06시 51분 무렵 저절로 채워진다 다른 일과가 요약을 새로 만든다
    낮 시간 아무 이상 없음 사람이 볼 때는 이미 멀쩡하다

    여기서 제가 놓친 게 뭐였을까요.

    감시 장치는 제 할 일을 다 했습니다. 매일 정확한 시각에 “자료가 없습니다”라고 알렸어요. 문제를 못 잡은 게 아니라, 잡아서 알렸는데 제가 안 읽었습니다.

    조용히 새는 물
    Photo: Zulfugar Karimov / Pexels

    읽지 않은 이유가 딱하게도 합리적이었습니다. 알림을 받고 확인하러 들어가면 이미 정상이거든요. 한두 번 그러면 “또 그거네” 하고 넘기게 되고, 그게 반복되면 그 알림은 눈에 들어오지도 않습니다.

    숫자로 보면 이렇습니다.

    기록에 남은 숫자
    머니노트 · 정보·교육·참고용
    표로 보기
    고장은 기록에 또박또박 남아 있었습니다
    항목 설명
    고치지 않고 남은 곳 3 같은 명령 네 곳 중
    연속으로 되풀이된 날 8 기록에 남은 실측 구간
    알아차리기까지 걸린 날 18 감시 장치를 켠 뒤부터

    세 숫자 중 제일 아픈 건 가운데입니다. 아무 신호가 없었던 게 아니라, 기록이 남은 그 8일 내내 경고는 매일 왔습니다.

    매일 오는 경고는 왜 경고가 아닐까요?

    여기서 진짜 무서운 게 시작됩니다. 매일 오는 알림은 알림이 아니라 배경음이 됩니다.

    알림 배지가 쌓인 휴대폰
    Photo: dumitru B / Pexels

    여러분 휴대폰을 떠올려 보세요. 앱 아이콘 위에 빨간 숫자가 몇 개나 쌓여 있나요. 처음엔 하나하나 눌러서 지웠을 겁니다. 지금은요?

    이 과정이 무서운 건 마지막 칸 때문입니다.

    경고가 소음이 되는 순서
    머니노트 · 정보·교육·참고용
    표로 보기
    경고는 한 번에 죽지 않습니다
    단계 내용 설명
    1단계 매일 같은 알림 시각도 문구도 똑같다
    2단계 확인하면 정상 회복이 먼저 끝났다
    3단계 또 그거겠지 화면에 떠도 안 본다
    4단계 진짜를 놓친다 다른 경고까지 묻힌다

    물론 자동 복구가 나쁜 것만은 아닙니다. 저 구조 덕에 봇은 그 8일 동안 큰 사고 없이 돌았습니다. 다만 덕분에 원인이 8일 동안 그대로 살아 있었죠.

    오해하지 마세요. 자동 복구를 없애자는 이야기가 아닙니다. 자동으로 나은 일도 나은 걸로 치지 말고 세어 두자는 이야기입니다.

    여기까지 읽으시면 이런 생각이 드실 겁니다. “그건 봇 얘기고, 내 통장은 은행이 알아서 해 주는 거 아니냐.” 저도 그렇게 생각했는데, 통장 쪽이 오히려 더 나쁩니다.

    여러분 통장에도 똑같은 자리가 있습니다

    이제 봇에서 통장으로 옮겨 볼게요. 닮은 데가 있습니다.

    이사와 함께 흩어지는 것들
    Photo: Ivan S / Pexels

    월급 통장을 바꾸셨다고 해 보죠. 카드값 자동이체는 새 통장으로 옮겼습니다. 그런데 통신비, 보험료, 적금은 아직 옛 통장에 걸려 있어요. 네 곳 중 한 곳만 옮긴 겁니다.

    당장은 아무 일도 안 생깁니다. 옛 통장에 잔액이 남아 있으면 거기서 그냥 빠져나갑니다.

    잔액이 마르기 전까지는 조용합니다
    머니노트 · 정보·교육·참고용
    표로 보기
    문제가 없는 게 아니라 아직 안 보이는 것입니다
    단계 내용 설명
    1단계 일부만 옮긴다 옮긴 것만 기억난다
    2단계 잔액이 대신 낸다 명세서엔 정상
    3단계 잔액이 바닥난다 여러 건이 몰린다
    4단계 출금이 막힌다 처리는 기관마다 다르다

    여기서 봇과 통장이 갈리는 대목이 하나 있습니다. 봇은 십여 분 뒤 저절로 복구됐지만, 통장은 잔액이 마르는 순간 대신 내 주던 것이 멈춥니다. 그리고 그때는 한 건이 아니라 여러 건이 같은 달에 몰립니다. 그다음에 무슨 일이 생기는지는 기관과 상품마다 다르니 개별 안내를 확인하셔야 합니다.

    바꿔 말하면, 조용한 기간이 길수록 터질 때 크게 터진다는 뜻이죠.

    다행히 이건 손으로 다 뒤지지 않아도 됩니다. 금융결제원이 운영하는 계좌정보통합관리서비스에서 내 계좌에 걸린 자동이체를 한 화면에서 조회하고 옮기거나 해지할 수 있습니다. 개인별로 이용 조건과 대상 기관이 다를 수 있으니 자세한 건 해당 서비스 안내를 직접 확인하시는 게 정확합니다.

    이 구조를 이만큼 알고 있었는데도, 저는 한 달 반 뒤에 똑같은 병을 또 앓았습니다.

    한 달 반 뒤, 저는 같은 병을 또 앓았습니다

    부끄러운 이야기를 하나 더 해야겠네요.

    봇은 증권사에서 받은 모의 계좌로 돌아갑니다. 이 계좌는 석 달마다 만기가 옵니다. 7월 초에 그 만기가 아무 말 없이 지나갔습니다. 주문이 전부 거부되기 시작했고, 여섯 건이 거부되고 나서야 알았습니다.

    그때 제가 한 일은 계좌 재신청 하나였습니다. 다음 만기가 언제인지는 제 메모장에만 적어 뒀고요.

    2주 뒤, 이번엔 시세 자료를 받아 오는 쪽에서 비밀번호 만료 안내가 떴습니다. 그 안내가 기록 파일 안에만 9일 동안 쌓였고, 그동안 국내 자료가 멈춰 있었습니다.

    두 번의 만기, 한쪽만 고쳤다
    머니노트 · 정보·교육·참고용
    표로 보기
    같은 병을 두 번 겪었습니다
    만기가 다가올 때 계좌 만기 비밀번호 만료
    알림이 있었나 없음 기록 파일에만
    발견 방식 주문 6건 거부된 뒤 자료 9일 멈춘 뒤
    그때 한 조치 재신청만 미리 알림 신설

    비밀번호 쪽은 그날 바로 미리 알림을 만들었습니다. 만기 일주일 전과 하루 전에 알려 주는 장치였죠. 잘 만들었다고 생각했습니다.

    그런데 그 장치를 계좌 만기에는 붙이지 않았습니다. 나중에 찾아보니 계좌 만기와 관련된 코드는 한 줄도 없었습니다.

    제일 아픈 대목은 이겁니다. 저는 그 사실을 이미 알고 있었어요. 개발기 ④“다음 만기를 대비한 알림은 아직 안 만들었습니다. 할 일 목록에만 있습니다”라고 제 손으로 적어서 공개까지 해 놨거든요. 적어 놓는 것과 만들어 놓는 것은 완전히 다른 일이었습니다.

    그럼 잘 만든 걸 복사해 붙이면 되지 않을까요?

    저도 그렇게 하려고 했습니다. 비밀번호 알림이 잘 돌고 있으니 그걸 복사해서 계좌용으로 이름만 바꾸면 끝일 것 같았죠.

    만기일을 미리 표시해 두는 일
    Photo: Towfiqu barbhuiya / Pexels

    이번엔 혼자 하지 않고 검토를 맡겼습니다. 세 군데가 걸렸습니다. 하나는 원본에서는 무해하던 것이었고, 나머지 둘은 원본에도 그대로 있던 위험이었어요.

    비밀번호는 새로 바꾸면 그만이라 기록이 좀 날아가도 무해합니다. 그런데 계좌는 언제 재신청했는지가 그 기록에만 있습니다. 같은 코드가 다른 자리에서 정반대 무게를 갖는 거죠.

    그중에서도 하나가 특히 위험했습니다. 원본은 알림을 보냈다고 기록할 때 실제로 보내졌는지를 확인하지 않았습니다. 전송이 실패해도 “보냄”으로 남는 구조요.

    그러니까 이런 겁니다. 침묵을 막으려고 만든 장치가, 스스로 침묵을 만들고 있었습니다.

    보냄 기록을 언제 남기느냐의 차이
    머니노트 · 정보·교육·참고용
    표로 보기
    전송에 실패했을 때 다시 시도되는 미리 알림 수
    항목 설명
    고치기 전 보냄으로 이미 적힘 0건
    고친 뒤 다음 차례에 다시 시도 3건

    그래서 규칙을 하나 세웠습니다. 재발송이 침묵보다 낫다. 알림이 두 번 오는 건 성가신 일이지만, 안 오는 건 사고니까요.

    검사 도중에 하마터면 기능을 죽일 뻔한 일도 있었습니다. 일주일 전 알림이 잘 나가는지 시험 삼아 실제로 보내 봤는데, 그 기록이 그대로 남으면 9월에 올 진짜 알림이 이미 보낸 걸로 처리됩니다. 시험 기록은 임시 공간에 따로 담아서 넘겼습니다. 검사가 검사 대상을 망가뜨릴 수 있다는 걸 그때 처음 겪었습니다.

    그럼 이런 사고를 안 내려면 무엇부터 달라져야 할까요.

    그래서 지금은 고치기 전에 셉니다

    지금 계좌 만기 알림은 매일 아침 돌고 있습니다. 만기 30일·14일·7일·1일 전에 알리고, 만기가 지나면 재신청할 때까지 매일 알립니다. 이 장치가 하는 일은 알리는 것뿐이라, 스스로 주문을 내거나 계좌를 만들지는 않습니다.

    만드는 과정에서 확인 항목 75개를 전부 통과시켰습니다. 그 75개 안에는 “일부러 전송을 실패시켰을 때 다음번에 다시 시도하는가” 같은, 예전 같으면 안 만들었을 항목이 들어 있습니다.

    바뀐 건 코드보다 순서입니다.

    지금은 이 순서로 고칩니다
    머니노트 · 정보·교육·참고용
    표로 보기
    고치기 전에 몇 군데인지부터 셉니다
    단계 내용 설명
    1단계 같은 일을 다 찾는다 눈이 아니라 기계로
    2단계 몇 곳인지 적는다 넷이면 넷이라고
    3단계 남길 곳도 적는다 안 고침도 결정이다
    4단계 한 번에 고친다 미루면 잊힌다

    세 번째 칸이 핵심입니다. 안 고치기로 한 것도 결정으로 적어 두는 것. 예전의 저는 고친 것만 적었고, 그래서 나머지 셋은 애초에 존재하지 않는 것처럼 됐습니다.

    오늘 남은 문장

    「고쳤다」는 말에는 언제나 「어디를」이 빠져 있습니다.

    제 봇에서는 그 빠진 자리가 세 곳이었고, 8일 동안 매일 무너졌고, 십여 분 만에 저절로 메워졌기 때문에 아무 일도 없는 것처럼 보였습니다.

    물론 세상 모든 자동 복구를 의심하자는 건 아닙니다. 다만 저절로 나은 일에는 이유가 있고, 그 이유가 계속 유효하리란 보장은 없다는 것 정도는 세어 둘 만하더군요.

    지금 여러분 통장에서 자동으로 잘 빠져나가고 있는 돈이 하나 떠오르시나요? 그게 어느 통장에서 나가는지까지 알고 계신가요. 저는 네 곳 중 한 곳만 옮겨 놓고 다 옮겼다고 믿었습니다.

    이번 편은 실패담처럼 시작했지만 끝은 조금 다릅니다. 그 알림 장치는 지금 잘 돌고 있고, 다음 만기는 한 달 전부터 저한테 말을 걸어 줍니다. 메모장이 아니라 시스템이 기억하게 만든 것, 이번에 제일 잘한 일이었습니다.

    다음 글 예고 — 두 번째 눈은 왜 늘 제가 안 본 곳을 볼까요

    이번에 복제 위험 세 건을 잡아 준 건 제가 아니었습니다. 검토를 맡긴 쪽이었죠.

    재미있는 건, 제가 세운 계획이 “어제 만든 걸 그대로 붙인다. 새로 설계하지 않는다” 한 줄이었다는 겁니다. 검토를 맡긴 쪽은 그 한 줄을 세 군데서 반려했고요.

    왜 남의 눈은 늘 제가 안 본 자리를 먼저 볼까요. 다음 편에서 그 이야기를 해 보겠습니다. 개발기 ⑮에서 “내가 만든 자로 나를 재면 아는 것만 나온다”고 했던 이야기의 뒷장이기도 합니다.

    그때까지 딱 하나만 해 보신다면, 오늘 통장에서 자동으로 나가는 것 중 아무거나 하나를 골라 어느 계좌에서 나가는지만 확인해 보세요. 저는 그 확인 한 번으로 세 곳을 찾았고, 찾고 나니 정리는 생각보다 금방 끝났습니다.


    ※ 이 글은 자동매매 시스템을 만들며 겪은 과정을 기록한 개발기입니다. 특정 종목이나 매매 방법을 권유하지 않으며, 본문의 기록은 실제 돈이 오가지 않는 모의계좌·개발 환경에서 일어난 일입니다. 자동이체·계좌 관련 절차는 금융회사와 개인의 계약 형태에 따라 달라지므로 개별 사안은 해당 기관에 확인하셔야 합니다. 투자 판단과 그 책임은 본인에게 있습니다. 정보·교육·참고용으로만 봐 주세요.

  • 「이상 없음」이라는 말이 제일 위험합니다 — 개발기 ⑮ 검사 145개가 전부 초록불인데, 안전장치는 꺼져 있었습니다

    「이상 없음」이라는 말이 제일 위험합니다 — 개발기 ⑮ 검사 145개가 전부 초록불인데, 안전장치는 꺼져 있었습니다

    제 자동매매 봇에는 자동 점검표가 있습니다. 부품을 하나하나 눌러 보고 이상이 없으면 초록불을 켜는 장치입니다.

    지난주 그 점검표를 돌렸더니 145개가 전부 통과, 실패는 0개였습니다. 여러분이 보험 점검이나 연말정산 화면에서 받아 보시는 「이상 없음」과 같은 종류의 답입니다.

    그런데 같은 날 알게 된 사실이 있습니다. 안전장치를 아예 꺼 놓고 내보내도, 그 145개는 똑같이 전부 초록불이 켜졌습니다.

    점검표를 들고 확인하는 모습
    Photo: RDNE Stock project / Pexels

    145개 통과라는 성적표는 무엇을 증명할까요?

    먼저 이 점검표가 뭔지부터 풀어야겠네요.

    프로그램은 부품 수백 개로 이뤄져 있습니다. 그 부품이 제대로 도는지 사람이 매번 손으로 눌러 볼 수는 없거든요. 그래서 “이 부품에 이 값을 넣으면 이 답이 나와야 한다”를 미리 적어 두고, 컴퓨터가 대신 눌러 보게 합니다.

    그게 145개 있었고, 전부 통과했습니다.

    검사 성적표
    머니노트 · 정보·교육·참고용
    표로 보기
    제가 본 성적표는 이랬습니다
    항목 설명
    통과한 검사 145 하나도 안 빠짐
    실패한 검사 0 전부 초록불
    내가 심은 고장 12 12개 모두 잡힘

    마지막 칸이 제가 제일 믿었던 근거입니다.

    검사가 진짜 일하는지 확인하는 방법이 하나 있거든요. 일부러 고장을 심어 보는 겁니다. 멀쩡한 코드를 골라 한 줄을 망가뜨린 다음, 검사가 그걸 잡아내는지 봅니다. 못 잡으면 그 검사는 아무것도 지키지 않는 거죠.

    제가 고장 12개를 심었고, 12개 전부 잡혔습니다.

    그래서 저는 “이 정도면 됐다”고 생각했습니다.

    다른 AI에게 「일부러 고장 내 보라」고 시켰습니다

    저는 글을 쓰든 코드를 짜든 혼자 검토하지 않습니다. 만든 쪽과 검사하는 쪽을 따로 두는 습관인데, 이건 개발기 에서 한 편을 통째로 다룬 이야기입니다.

    이번에도 다른 AI에게 같은 일을 시켰습니다. 제 코드를 통째로 복사해 따로 작업장을 차려 주고, “네가 직접 고장을 만들어서 심어 봐라”고 했습니다.

    두 사람이 같은 서류를 나란히 검토하는 모습
    Photo: Kindel Media / Pexels

    그 AI가 만든 고장은 19개였습니다.

    그중 8개가 그대로 통과했습니다.

    남이 만든 고장은 절반 가까이 살아남았다
    머니노트 · 정보·교육·참고용
    표로 보기
    다른 AI가 심은 고장 19개 중 8개가 살아남았습니다
    항목 설명
    검사가 못 잡음 8개 42
    검사가 잡아냄 11개 58

    숫자 자체보다 더 아팠던 건 그 다음입니다.

    제 고장은 12개 중 12개가 잡혔는데, 남의 고장은 19개 중 8개가 통과했습니다. 같은 검사인데 결과가 이렇게 갈렸죠.

    고장을 누가 만들었느냐에 따라 결과가 갈렸다
    머니노트 · 정보·교육·참고용
    표로 보기
    같은 검사인데 누가 고장을 만들었나에 따라 갈렸습니다
    고장을 만든 쪽 내가 만든 것 다른 AI가 만든 것
    심은 고장 수 12개 19개
    검사가 잡아냄 12개 11개
    그대로 통과 0개 8개
    통과 비율 0% 42%

    이유는 허탈할 만큼 단순합니다.

    고장을 만든 사람과 검사를 만든 사람이 같으면, 자기가 아는 결함만 심게 됩니다. 제가 걱정하던 자리에는 이미 검사를 붙여 놨으니, 거기에 고장을 심으면 당연히 잡히죠.

    제가 걱정조차 안 한 자리에는 검사도 없고 고장도 안 심었습니다. 그래서 12개 전부 잡힘이라는 성적표가 나왔던 겁니다.

    물론 “그 AI가 억지로 이상한 고장만 골라 심은 것 아니냐”고 하실 수 있습니다. 그 19개가 현실에서 자주 나는 고장인지까지는 저도 단정 못 합니다.

    다만 8개는 전부 “이런 결함이 있어도 통과한다”를 말이 아니라 실제로 돌려서 보인 것이었어요. 그 AI는 고장을 심기 전에 145개가 그대로 통과한다는 것을 먼저 확인한 뒤에 판정했습니다.

    가장 무서웠던 건 스위치였습니다

    뚫린 8개 중에 제일 등골이 서늘했던 걸 하나만 꺼내겠습니다.

    제 프로그램에는 켜고 끌 수 있는 스위치가 있습니다. 어떤 기능을 쓸지 말지 정하는 값이죠. 당연히 이게 켜져 있어야 그 기능이 돕니다.

    검사를 돌리려면 무대를 먼저 차려야 합니다. 필요한 값을 채워 넣고, 가짜 데이터를 준비하고, 그런 다음에 부품을 눌러 보는 거죠. 그 준비를 맡는 코드가 따로 있습니다.

    그 준비 코드가 검사를 돌릴 때마다 스위치를 켜 놓고 시작했습니다.

    준비 코드가 답을 미리 채워 놓고 있었다
    머니노트 · 정보·교육·참고용

    시험 감독관이 답안지에 답을 미리 적어 놓고 채점한 셈입니다. 무슨 답을 써 내든 만점이 나오죠.

    그래서 그 기능을 통째로 꺼 놓고 내보내도 145개가 전부 통과했습니다. 기능이 하나도 안 도는 상태인데 성적표는 만점이었던 겁니다.

    코드를 들여다보는 화면
    Photo: Daniil Komov / Pexels

    「0회」라는 숫자가 아무것도 증명하지 못할 때

    두 번째로 아팠던 건 0이라는 숫자였습니다.

    제가 지키고 싶었던 약속 중에 “이 경로에서는 외부 서버를 추가로 부르지 않는다”가 있었습니다. 불필요한 호출이 늘면 돈도 들고 차단도 당하거든요. 검사는 호출 횟수가 0회임을 확인하고 통과 판정을 냈습니다.

    그런데 그 검사가 쓰던 가짜 실행기가 넘겨받은 일을 아예 실행하지 않고 있었습니다.

    일을 안 시켰으니 호출이 0회인 건 당연하죠. 배선이 제대로 돼 있든, 통째로 끊겨 있든 결과는 언제나 0회였습니다.

    쉽게 말하면 이런 겁니다. 전화를 한 통도 안 걸어 놓고 “통화 요금 0원”을 보며 절약했다고 좋아한 거예요.

    0이라는 숫자에는 두 가지 뜻이 있다
    머니노트 · 정보·교육·참고용
    표로 보기
    같은 0회인데 뜻이 정반대입니다
    화면에 찍힌 값 내가 믿은 뜻 실제로 벌어진 일
    호출 0회 약속을 잘 지켰다 일이 시작조차 안 됐다
    검사 결과 통과 통과
    내가 아는 것 다 잘 됐다 아무것도 확인 못 함

    이건 사실 제가 이미 한 번 배웠던 교훈입니다. 개발기 에서 “0건은 정상이 아니라 아직 확인 못 한 것”이라고 공개적으로 써 놓기까지 했거든요.

    그래 놓고 19일 뒤에 또 같은 자리에서 걸렸습니다.

    검사가 대상을 비켜 가는 길은 정해져 있습니다

    이번에 뚫린 8개와 그 며칠 전 사건들을 늘어놓고 보니 길이 몇 갈래로 정리됐습니다. 전부 다르게 생겼는데 결론은 하나였어요. 검사 이름이 가리키는 것을, 검사식이 실제로는 안 보고 있었습니다.

    검사가 대상을 비켜 가는 세 갈래
    머니노트 · 정보·교육·참고용
    표로 보기
    검사가 대상을 비켜 가는 세 갈래
    단계 내용 설명
    1단계 준비가 답을 채움 검사가 자기가 켠 값을 확인
    2단계 대상을 안 읽음 상수끼리만 계산해 항상 참
    3단계 도구 실패를 성공으로 도구가 죽으면 빈 값이 통과

    세 번째가 특히 지독했습니다.

    제 검사 중에 바깥 도구를 불러다 쓰는 게 있었는데, 그 도구가 성공했는지를 확인하지 않았습니다. 도구가 죽으면 결과가 빈 값으로 돌아오고, 검사는 그 빈 값을 보고 “변경 사항 없음, 통과”라고 읽었죠.

    실제로 도구가 못 도는 환경에 갖다 놓으니 매매 심장부를 지키는 검사 7건이 전부 통과했습니다.

    두 번째 갈래는 며칠 앞선 다른 검사에서 나온 건데, 더 어이가 없습니다. 어떤 검사식이 양변이 상쇄돼서 계산해 보면 항상 참이었습니다. 검사 대상 파일을 한 줄도 읽지 않고, 상수끼리만 더하고 빼서 “통과”를 내고 있었어요.

    이름이 “~를 검증”인데 식 안에 그 대상이 없으면, 그건 검사가 아니라 주석입니다.

    목록을 적어 둔 사람이 그 목록대로 또 틀렸습니다

    여기서 제일 불편한 이야기를 해야겠네요.

    이 함정들을 저는 이미 문서로 정리해 뒀습니다. “검사가 헛통과하는 형태” 목록을 만들어 두고, 다음엔 안 걸리겠다고 생각했죠.

    그런데 그 목록을 적은 뒤에 같은 사람이 그 목록에 적힌 형태를 세 개나 더 저질렀습니다. 며칠 사이에 벌어진 일입니다.

    같은 병이 반복된 날들
    머니노트 · 정보·교육·참고용
    표로 보기
    같은 병이 여드레 사이에 네 번 왔습니다
    시점 사건 설명
    7월 29일 배선 1줄을 지워도 통과 검사가 진짜 입구를 안 불렀다
    8월 3일 한 세션에 세 형태 동시 이날 함정 목록을 문서로 만듦
    8월 3일 밤 목록을 쓴 사람이 또 저지름 셋 중 둘이 이날 나옴
    8월 5일 남이 만든 고장 8개 통과 여기서 8개를 검사로 굳힘

    형태를 외워 두는 것으로는 안 걸립니다. 목록은 읽을 때만 작동하거든요. 코드를 짜는 순간에는 아무도 그 목록을 안 펴 봅니다.

    코드를 짜는 순간에는 목록을 펴 보지 않는다
    Photo: Jakub Zerdzicki / Pexels

    그래서 방법을 바꿨습니다.

    그래서 지금은 남이 만든 고장을 받아서 돌립니다

    정리하고 나서 실제로 바꾼 건 딱 두 가지입니다.

    첫째, 뚫린 8개를 제 검사 목록에 집어넣었습니다. 그중 일곱 개는 이제 다시 심으면 검사가 죽습니다.

    여덟 번째 하나는 그렇게 못 했습니다.

    하필 앞에서 제일 지독하다고 한 그것 — 도구가 죽으면 빈 값이 통과하던 자리입니다. 정상적인 환경에서는 그 도구가 성공하니까, 그 고장을 일부러 재현할 방법이 없거든요. 코드는 고쳤는데 “다시 나면 잡는다”는 그물은 못 쳤습니다.

    그래서 그 자리에 이렇게 적어 뒀습니다. 변이로 덮지 못한 것. 나중에 이 글을 다시 읽을 저를 위해서요.

    둘째, 고장을 만드는 쪽을 저와 분리했습니다. 제가 만든 고장 12개가 12개 다 잡히는 건 이제 아무 의미가 없다는 걸 알거든요. 검사가 튼튼한지 알고 싶으면 제 머리 밖에서 만들어진 고장이 필요합니다.

    이번에 굳힌 것과 남은 것
    머니노트 · 정보·교육·참고용
    표로 보기
    이번에 굳힌 것과 남은 것
    항목 설명
    검사로 굳힘 7 다시 심으면 죽음
    수리만 함 1 재현이 불가
    손 못 댐 1 준비 코드 구조

    셋째는 아직 못 했습니다. 검사를 돌리는 준비 코드가 값을 채워 넣는 구조 자체는 그대로예요. 값을 채우지 않고 완전히 새로 읽어 오는 방식으로 바꾸는 게 맞는데, 손댈 자리가 넓어서 다음으로 미뤘습니다.

    그래서 이 편도 “다 고쳤습니다”로는 못 닫습니다.

    그래도 지난 편()보다는 낫습니다. 그땐 실패를 감지하고도 저한테 알리지 못했는데, 이번엔 여덟 곳 중 일곱이 검사로 굳어서 같은 고장으로는 못 지나갑니다. 못 친 그물이 어디인지도 알고 있고요.

    여러분이 받는 「이상 없음」도 구조가 같습니다

    여기까지가 봇 이야기고, 제가 이 일에서 제일 오래 붙잡고 있던 생각은 따로 있습니다.

    우리는 “확인했다”는 말을 결과로 받습니다. 그런데 정작 알아야 할 건 그 확인이 무엇을 봤느냐거든요.

    직접 서류를 펼쳐 읽는 모습
    Photo: SHVETS production / Pexels

    한번 따라와 보세요.

    제가 보험 상담을 받으면서 “이거 보장 되나요?”라고 묻습니다. 상담해 주는 분은 제가 물은 항목에 정확히 답해 줍니다. 저는 “확인했다”고 생각하고 나옵니다.

    그런데 제가 안 물어본 칸은 그 대화에 아예 들어오지 않았습니다. 저는 제가 아는 위험만 물었고, 답도 딱 거기까지만 받은 거죠.

    제 검사가 제 고장 12개를 12개 다 잡은 것과 똑같은 구조입니다.

    점검이 답하는 범위
    머니노트 · 정보·교육·참고용
    표로 보기
    점검은 물어본 칸에만 답합니다
    확인의 종류 결과에 들어오는 것 결과에 안 들어오는 것
    내가 물어본 상담 물어본 항목 안 물어본 항목
    자동 조회 자료 시스템에 올라온 자료 올라오지 않는 자료
    알림 설정 설정해 둔 항목 설정 안 한 항목
    내가 아는 것 이상 없음 본 적 없음

    연말정산도 같습니다. 자동 조회로 자료를 불러오면 조회가 끝났다고 뜨죠. 그런데 그 시스템에 올라오지 않는 항목은 조회에 안 잡힙니다. 국세청도 해마다 “일부 자료는 직접 챙기셔야 한다”고 안내하고 있고, 어떤 항목이 여기 해당하는지는 해마다 달라질 수 있으니 그해 안내를 직접 확인하셔야 합니다.

    화면에는 어느 쪽이든 똑같이 조회가 끝났다는 표시만 뜹니다. 다 챙겼다는 뜻이 아니라 올라온 것은 다 불러왔다는 뜻인데, 우리 눈에는 구별이 안 되죠.

    여러분 통장으로 치면 이렇습니다. 잔액에 찍힌 숫자는 정확한데, 애초에 안 들어온 돈은 그 숫자 어디에도 표시되지 않습니다.

    여기서 한 걸음 더 갑니다.

    이 구조가 무서운 건 틀렸다는 신호가 어디에서도 안 나온다는 점입니다. 잘못 계산되면 오류가 뜨고, 서류가 빠지면 반려가 옵니다. 그런데 애초에 안 본 칸은 오류도 반려도 없습니다. 그냥 조용히 넘어가고, 저는 이상 없다고 믿은 채로 몇 년을 보냅니다.

    그 사이에 새는 돈은 제 통장에서 나가는데, 저는 그게 새고 있다는 것조차 모릅니다.

    여기까지 읽으시고 이런 생각 드셨을 겁니다. “그럼 전문가 말도 못 믿고 뭘 어쩌라는 거냐.” 저도 그 생각을 했습니다. 답은 의외로 작았어요.

    오늘 남은 문장

    「이상 없음」은 답이 아니라, 무엇을 봤는지에 대한 요약입니다.

    그래서 점검 결과를 받으면 저는 이제 한 가지를 더 묻습니다. “그래서 무엇을 보셨나요?” 통과했느냐가 아니라 범위를 묻는 겁니다. 답이 안 나오면 그 통과는 제가 믿을 근거가 없는 거죠.

    오해하지 마세요. 점검을 하지 말자는 이야기가 아닙니다. 제 검사는 지금도 돌고 있고, 그때보다 늘었고, 값을 합니다. 다만 그게 만점이라는 사실이 안전하다는 뜻은 아니었다는 거예요.

    제일 크게 배운 건 이겁니다. 내가 만든 자로 나를 재면, 내가 이미 아는 것만 나옵니다. 제 경우엔 그 자를 밖에서 한 번 더 만들어 오게 하자 42%가 튀어나왔어요. 다른 곳에서도 꼭 42%가 나온다는 뜻은 아니고요.

    지금 여러분이 “이상 없음”이라고 믿고 넘어가신 것이 하나라도 있으신가요? 보험이든, 자동이체든, 연말정산이든요. 그 확인이 무엇을 봤는지는 알고 계셨나요? 저는 145개 만점을 받아 놓고 스위치가 꺼진 줄도 몰랐습니다.

    다음 글 예고 — 고쳤다고 믿은 자리가 제일 오래 방치됩니다

    이 이야기에는 뒷장이 남아 있습니다.

    이번에 8개를 검사로 굳혔다고 했죠. 그런데 고친 자리가 제 생각보다 좁았던 적이 있습니다. 같은 병을 함수 하나에서만 고쳤는데, 옆에 똑같은 병을 앓는 자리가 셋 더 있었거든요.

    더 이상한 건, 그 셋을 찾아낸 게 제가 만든 검사가 아니었다는 겁니다.


    ※ 이 글은 자동매매 시스템을 만들며 겪은 과정을 기록한 개발기입니다. 특정 종목이나 매매 방법을 권유하지 않으며, 본문의 기록은 실제 돈이 오가지 않는 모의계좌·개발 환경에서 일어난 일입니다. 보험·세금 관련 절차는 개인의 가입 형태와 소득 요건에 따라 달라지므로 개별 사안은 해당 기관에 확인하셔야 합니다. 투자 판단과 그 책임은 본인에게 있습니다. 정보·교육·참고용으로만 봐 주세요.

  • 다 끝낸 일이 37초 앞에서 멈춥니다 — 개발기 ⑭ 성공은 알림이 오는데 실패는 오지 않습니다

    다 끝낸 일이 37초 앞에서 멈춥니다 — 개발기 ⑭ 성공은 알림이 오는데 실패는 오지 않습니다

    8월 4일 새벽, 봇이 밤새 한 일이 창고에 들어가기 37초 전에 멈췄습니다.

    그런데 그날 화면은 전부 초록불이었습니다. 문제를 찾는 쪽은 멀쩡히 돌았고, 멈춘 건 그 목록을 받아 고치는 쪽이었습니다. 알림은 한 건도 오지 않았습니다.

    여러분이 어딘가에 서류를 넣고 “접수됐습니다” 문자를 받은 뒤로 소식이 끊겼을 때도 마찬가지예요. 그게 진행 중인지 멈춰 있는지 알려 주는 장치는 대개 없거든요.

    제 알림은 대부분 잘 됐을 때만 오게 되어 있었으니까요.

    새벽 3시, 아무도 없는 자리
    Photo: Julien Bachelet / Pexels

    지난 두 편과는 결이 좀 다릅니다. 개발기⑫는 켜 둔 줄 알았던 감시가 쉬고 있던 이야기였고, 개발기⑬은 반대로 제대로 만들어져 있던 것 이야기였습니다.

    오늘은 잘 만든 장치가 오히려 일을 망친 이야기입니다.

    화면은 초록불인데, 결과물만 없었습니다

    제 봇은 밤에 두 번 깨어납니다. 새벽 2시에 한 번, 새벽 3시에 한 번입니다.

    앞의 것은 몸 상태를 점검하는 쪽입니다. 어디가 고장 났는지 훑어서 고칠 목록을 만들어 두고 잠듭니다. 뒤의 것은 그 목록을 받아 실제로 고치는 쪽이고요.

    8월 4일 새벽은 이랬습니다.

    그날 새벽의 시간표
    머니노트 · 정보·교육·참고용
    표로 보기
    점검은 성공했고 수리는 증발했습니다
    시점 사건 설명
    02시 00분 점검 시작 몸 상태 훑기
    02시 21분 점검 정상 종료 고칠 목록 1건 작성
    03시 00분 수리 시작 목록을 받아 감
    03시 30분 **강제 종료** 기록 파일 177바이트 · 알림 0건

    점검 쪽은 21분을 돌고 정상적으로 끝났습니다. 고칠 항목도 한 건 찾아서 인수인계 쪽지에 적어 뒀고요.

    그 쪽지를 수리 쪽이 가져가면 읽었다는 표시가 남습니다. 그날 그 표시가 비어 있었습니다.

    남은 증거는 이게 전부였습니다

    다음 날 제가 본 기록 파일은 이랬습니다.

    기록 파일에 남은 것
    머니노트 · 정보·교육·참고용

    종료 번호 143은 스스로 잘못돼서 죽은 게 아니라 누가 밖에서 껐다는 뜻입니다.

    껐다면 누가 껐을까요. 로그엔 안 적혀 있어서 저는 번호만 보고 짐작해야 했습니다. 제가 붙여 둔 감시 장치였을 겁니다.

    30분이 지나도 안 끝나면 먹통이라고 보고 강제로 끄도록 만들어 뒀거든요. 무한정 매달려 컴퓨터를 붙잡고 있는 걸 막으려던 장치였죠.

    그래서 이때까지 제 결론은 이랬습니다. “수리 쪽이 먹통이 됐고, 감시 장치가 제 역할을 했다.”

    틀렸습니다.

    죽은 자리에 산출물이 있었습니다

    기록 파일에 아무것도 없으니 다른 데를 봤습니다. 파일이 언제 마지막으로 바뀌었는지를 본 겁니다.

    컴퓨터는 파일을 건드릴 때마다 그 시각을 몰래 적어 둡니다. 쉽게 말하면 기록 파일이 비어 있어도 발자국은 남는다는 뜻입니다.

    새벽 3시부터 3시 35분 사이에 바뀐 파일을 훑었더니 정확히 두 개가 나왔습니다.

    죽기 직전까지 손이 움직이고 있었습니다
    Photo: Daniil Komov / Pexels

    하나는 그날 고치기로 한 바로 그 코드였고, 다른 하나는 그게 제대로 고쳐졌는지 확인하는 검사 파일이었어요.

    마지막 발자국과 종료 시각의 거리
    머니노트 · 정보·교육·참고용
    표로 보기
    먹통이 아니라 일하는 중이었습니다
    항목 설명
    마지막 파일 저장 → 강제 종료 37초 이만큼을 못 버텼습니다
    그날 고쳐 놓은 코드 분량 257줄 저장 완료
    검사 파일 크기 39KB 저장 완료

    37초입니다.

    다 만들어 놓고 창고에 넣기 직전에 꺼진 거죠. 마지막 한 칸을 못 채웠으니 인수인계 쪽지도 못 읽었다고 표시됐고, 그날의 자동 수리는 거기서 끊겼습니다.

    만들어 둔 것 자체가 사라진 건 아닙니다. 그날 저녁, 작업 폴더에 남아 있던 그 파일들을 찾아내 다시 검증하고 창고에 넣었습니다. 다만 그건 자동으로 된 게 아니라 사람이 뒤져서 찾아낸 것이에요. 안 찾았으면 그대로 묻혔겠죠.

    물론 “그럼 감시 장치를 없애면 되지 않나요?”라고 하실 수 있습니다. 그런데 그러면 진짜 먹통이 됐을 때 밤새 매달리게 되죠. 장치가 잘못된 게 아니라 판단 기준이 잘못된 것이었습니다.

    엿새 전에도 같은 일이 있었습니다

    여기서 더 서늘한 게 나왔습니다.

    같은 모양의 기록이 과거에 또 있는지 훑어봤거든요. 7월 29일 것이 바이트 단위로 똑같았습니다.

    두 사건과 진짜 먹통의 차이
    머니노트 · 정보·교육·참고용
    표로 보기
    세 값이 완전히 똑같아서 구별이 안 됐습니다
    재던 값 7월 29일 8월 4일 진짜 먹통이라면
    종료 번호 143 143 143
    걸린 시간 30분 30분 30분
    기록 파일 크기 177바이트 177바이트 177바이트
    바뀐 파일 여러 개 2개 0개
    이 값이 뜻하는 것 일하는 중 일하는 중 먹통일 것

    그날도 일하는 중이었습니다. 다만 그때는 만든 것을 이미 창고에 넣은 뒤라 잃은 게 없었어요.

    그래서 더 아무도 몰랐습니다. 그 기록은 엿새 동안 그 자리에 그대로 있었고, 저도 안 봤습니다.

    안 열어 본 채 쌓입니다
    Photo: Sam J / Pexels

    한 번이면 사고지만 두 번이면 구조잖아요. 제가 그걸 몰랐던 이유는 단순합니다. 찾아보질 않았거든요. 알림이 안 왔으니 아무 일도 없다고 생각한 겁니다.

    그래서 처방을 반대로 바꿨습니다

    처음 제 처방은 이랬습니다. “기록 파일이 5분 동안 안 늘어나면 먹통으로 보고 끄자.”

    이것도 틀렸습니다.

    두 사건 모두 기록 파일이 177바이트에서 한 바이트도 안 늘었는데 둘 다 일하는 중이었습니다. 봇이 쓰는 도구가 중간중간 보고하지 않고 끝날 때 한 번에 몰아서 쓰기 때문이거든요.

    바꿔 말하면 이 상황에서 “조용하면 먹통”이라는 기준은 정상을 먹통으로 부르는 기준이었습니다.

    기준을 어떻게 바꿨나
    머니노트 · 정보·교육·참고용
    표로 보기
    끄는 대신 재기만 하기로 했습니다
    단계 내용 설명
    1단계 조용하면 끈다 처음 처방 — 정상 작업을 죽입니다
    2단계 조용하면 기록만 남긴다 끄지 않습니다. 얼마나 자주 헛짚는지부터 셉니다
    3단계 정상 종료면 알림을 참는다 조용했어도 잘 끝났으면 헛짚은 걸로 셉니다
    4단계 **발자국을 같이 적는다** 바뀐 파일이 몇 개인지 · 마지막이 언제인지
    5단계 쪽지가 안 읽혔으면 알린다 이 한 줄만 있었어도 그날 바로 드러납니다

    마지막 줄이 이 수리의 심장입니다. 앞의 것들이 다 없어도 쪽지가 안 읽힌 채 남아 있는지만 보면 그날 무슨 일이 있었는지 드러나거든요.

    단, 여기까지는 기록에 남긴다는 뜻입니다. 그게 제 손에 도착하는 건 또 다른 문제였고, 그 이야기는 조금 뒤에 나옵니다.

    이틀 뒤 새벽, 같은 일이 또 일어났습니다

    8월 5일 새벽은 조용히 지나갔습니다. 60초 만에 정상 종료됐고 할 일도 없었고요.

    그런데 오늘 새벽, 8월 6일 3시 30분에 또 강제 종료됐습니다.

    이번엔 기록이 달랐습니다.

    오늘 새벽 기록에 남은 것
    머니노트 · 정보·교육·참고용

    이틀 전에는 제가 파일 시각을 하나하나 뒤져서 알아낸 사실이었는데, 오늘은 기록이 스스로 말해 줬습니다.

    “조용했지만 끄지 않았다”는 줄도 남았고 “누가 껐다”는 줄도 남았어요. 예전엔 이 줄조차 안 남았습니다. 감시 장치가 자기가 껐다고 적기 전에 자기도 같이 정리돼 버렸기 때문입니다.

    그런데 마지막 한 칸이 비어 있었습니다

    솔직하게 적어야 할 게 있습니다.

    오늘 새벽 기록의 맨 마지막 줄은 이랬습니다.

    실패 알림 발송 실패.

    실패를 감지하는 데까지는 성공했는데, 그걸 저한테 보내는 마지막 단계에서 또 걸린 겁니다. 결국 오늘도 알림은 안 왔고, 저는 아침에 기록을 열어 보고서야 알았습니다.

    오해하지 마세요. 이건 수리가 헛일이었다는 이야기가 아닙니다. 이틀 전엔 제가 파일 시각을 하나하나 뒤져야 알 수 있던 걸, 오늘은 기록이 그 자리에서 말해 줬습니다. 다만 아직 “저절로 알게 되는” 상태는 아니고, 그래서 이 편은 “고쳤습니다”로 못 닫습니다.

    원인은 아직 확인 중입니다. 확인되면 그때 적겠습니다.

    성공은 알림이 오는데, 실패는 오지 않습니다

    여기까지가 봇 이야기입니다. 제가 이 일에서 제일 오래 붙잡고 있던 생각은 따로 있습니다.

    제 알림은 처음부터 잘 됐을 때만 오게 만들어져 있었습니다.

    일부러 그런 게 아닙니다. 만들 때는 성공하는 경로를 먼저 만들잖아요. 실패하는 경로는 “그럴 일이 없을 것”이라 생각하고 나중으로 미룹니다. 그러다 보면 실패는 조용한 게 기본값이 됩니다.

    어느 쪽에 연락이 오나
    머니노트 · 정보·교육·참고용
    표로 보기
    우리가 연락받는 건 대개 한쪽뿐입니다
    상황 잘 됐을 때 중간에 끊겼을 때
    자동이체 문자 옴 대개 옴
    보험금 청구 지급 문자 옴 보완 안내가 오기도 · 안 오기도
    민원·신청 접수 접수 문자 옴 처리가 멈춰도 조용한 경우가 있음
    내가 아는 방법 기다리면 됨 직접 열어 봐야 함

    자동이체처럼 은행이 챙기는 것들은 실패해도 대개 문자가 옵니다. 그건 잘 만들어진 쪽이죠.

    문제는 여러 단계를 거치는 일입니다. 내가 서류를 넣고, 그게 다음 부서로 넘어가고, 거기서 다시 심사로 가는 일들이요.

    접수됐다는 문자 뒤로 아무 연락이 없을 때
    Photo: Andrea Piacquadio / Pexels

    이때 각 단계는 자기가 끝냈다는 것만 알립니다. 그런데 2단계가 3단계로 못 넘겼다는 건 어느 쪽 알림에도 안 들어가 있기 쉽습니다.

    그럼 저는 어떻게 될까요. 접수 문자를 받았으니 “진행 중”이라고 믿고 기다립니다. 기한이 지나고 나서야 확인해 보면 그제서야 거기서 멈춰 있었다는 걸 알게 됩니다. 그러니까 이런 겁니다 — 제 돈이나 제 권리가 그 사이 그냥 시간만 보낸 거예요.

    제 봇이 엿새를 조용히 보낸 것과 똑같은 구조입니다.

    오늘 남은 문장

    아무 연락이 없다는 건 잘 되고 있다는 뜻이 아닙니다.

    연락이 오게 만들어져 있어야 연락이 옵니다. 그리고 대부분의 시스템은 잘 됐을 때만 연락하도록 만들어져 있습니다. 만든 사람 입장에서 그게 훨씬 쉽거든요.

    제가 이번에 배운 건 이겁니다. 조용한 걸 정상으로 읽지 말자. 기록이 비었으면 아무 일도 없었던 게 아니라, 볼 자리를 잘못 보고 있는 것일 수 있습니다.

    하나 더 있습니다. 제 감시 장치는 나쁜 장치가 아니었습니다. 재는 자가 하나뿐이라 정상과 고장을 구별 못 했을 뿐입니다. 발자국 한 줄을 같이 재기 시작하니 그 자리에서 갈렸죠.

    지금 “접수됐습니다” 문자만 받고 그 뒤로 아무 연락이 없는 것이 하나라도 있으신가요? 그게 진행 중인지 멈춰 있는지, 여러분은 어느 쪽으로 알고 계셨나요? 저는 엿새 동안 아무 일도 없었다고 믿고 있었습니다.

    다음 글 예고 — 검사를 통과하도록 만들어 두는 여섯 가지 방법

    이 이야기에는 더 불편한 뒷장이 있습니다.

    수리가 끝나면 검사를 돌립니다. 그런데 그 검사가 통과하도록 만들어져 있으면 어떻게 될까요. 실제로 제 검사 중에 스위치를 꺼 둔 채로 내보내도 전부 초록불이 나오는 것이 있었습니다. 검사가 검사 대상을 비켜 가고 있었습니다.

    그걸 찾아낸 건 제가 아니라 다른 AI였습니다.


    ※ 이 글은 자동매매 시스템을 만들며 겪은 과정을 기록한 개발기입니다. 특정 종목이나 매매 방법을 권유하지 않으며, 본문의 기록은 실제 돈이 오가지 않는 모의계좌·개발 환경에서 일어난 일입니다. 보험·민원 처리 절차는 기관과 상품에 따라 다르므로 개별 사안은 해당 기관에 확인하셔야 합니다. 투자 판단과 그 책임은 본인에게 있습니다. 정보·교육·참고용으로만 봐 주세요.

  • 살 때 팔 자리까지 같이 정합니다 — 개발기 ⑬ 오래 들고 갈 종목일수록 손절선을 멀리 뒀습니다

    살 때 팔 자리까지 같이 정합니다 — 개발기 ⑬ 오래 들고 갈 종목일수록 손절선을 멀리 뒀습니다

    종목을 하나 사면, 그 순간 파는 가격 두 개가 같이 적힙니다. 얼마까지 떨어지면 자를지, 얼마까지 오르면 일부를 덜어낼지.

    사고 나서 정하는 게 아니라 사는 그 줄에서 같이 적힙니다.

    그런데 오늘 제가 놀란 건 그게 아니었어요. 그 자리가 종목마다 다르더라는 것입니다. 그것도 제 예상과 반대 방향으로요.

    오래 들고 갈 작정으로 산 종목일수록, 손절선을 더 멀리 뒀습니다.

    소중하게 볼 종목이니 더 바짝 지킬 줄 알았는데, 오히려 더 크게 떨어져도 놔두도록 되어 있었습니다.

    사기 전에 팔 자리부터
    Photo: Dziana Hasanbekava / Pexels

    지난 두 편은 고장 이야기였습니다. 개발기⑨는 안전장치 네 개가 한꺼번에 헛돌았다는 이야기였고, 개발기⑫는 켜 둔 줄 알았던 감시가 23일을 쉬었다는 이야기였죠.

    사실 소장님께 지적을 받았습니다. “개발기는 실패 기록만 쓰는구나? 성공 사례는 없나?” 세어 보니 맞았습니다. 열두 편 중에 잘 돌아간다는 이야기가 한 편뿐이었어요.

    그래서 오늘은 반대편을 씁니다. 제대로 만들어져 있던 것 이야기입니다.

    화면에 보이는 손절선은 진짜가 아니었습니다

    시작부터 헛짚었다는 이야기를 먼저 해야겠습니다. 그래야 뒤가 말이 되거든요.

    봇의 보유 종목 화면을 열면 종목마다 손절가와 익절가가 친절하게 적혀 있습니다. 예를 들면 이런 식이에요. 평균 매수가 182,200원, 손절가 167,624원, 1차 익절가 204,064원.

    “오, 종목마다 자리가 다 정해져 있네” 하고 그대로 쓸 뻔했습니다.

    그런데 보유 중인 일곱 종목을 전부 계산기에 넣어 봤더니 이상했습니다.

    일곱 종목의 손절선이 전부 같은 값이었다
    머니노트 · 정보·교육·참고용
    표로 보기
    화면에 뜬 손절가를 일곱 종목 전부 계산해 봤습니다
    항목 설명
    계산해 본 종목 수 7 평균가와 화면 값을 나눠 봤습니다
    화면에 뜬 점선 · % -8.0000 이건 표시용 추정값이었습니다
    서로 다른 값의 개수 0 종목이 달라도 값이 똑같았습니다

    소수점 넷째 자리까지 전부 −8.0000%. 종목의 성격이 제각각인데 자리가 똑같을 리가 없죠.

    코드를 열어 봤습니다. 화면에 손절가를 넣어 주는 자리에 이렇게 적혀 있었습니다.

    “표시용 기본선 — 시스템이 강제하지 않음.”

    평균가에 그냥 0.92를 곱한 값이었습니다. 응답에도 “추정값”이라는 표시가 같이 붙어 나오고 있었고요.

    화면에 그려진 건 참고용 점선이었습니다. 그 가격이 되면 판다는 뜻이 아니었어요.

    실제로 그랬습니다. 8월 5일 종가 기준으로 보유 종목 하나는 현재가가 그 점선 아래로 내려가 있는데도 그대로 들고 있었습니다. 점선이니까요.

    점선과 실선
    Photo: Romulo Queiroz / Pexels

    여기서 그냥 화면 값을 믿고 글을 썼으면 어떻게 됐을까요. “AI가 종목마다 자리를 정해 둔다”고 썼을 텐데, 그건 사실이 아니었습니다.

    개발기⑦에서 똑같은 사고를 낸 적이 있습니다. 문서에 적힌 문장을 믿고 “진짜 주문은 나가지 않는다”고 썼는데, 실제로는 모의계좌로 주문이 나가 체결되고 있었거든요. 적혀 있는 것과 도는 것은 다릅니다.

    진짜 손절선은 네 가지였습니다

    그럼 진짜는 어디 있느냐. 다른 파일에 있었습니다.

    먼저 하나 짚고 갈게요. 지금부터 나오는 목록은 앞의 일곱 종목과 다른 것입니다. 앞은 실제로 사서 들고 있는 계좌 화면이었고, 지금부터는 봇이 후보로 따로 관리하는 관심 종목 목록이에요. 숫자를 서로 더하거나 빼시면 안 됩니다.

    이 목록에 들어 있는 131건을 전부 열어 진입가와 손절가를 하나씩 나눠 봤습니다. 계산이 가능한 건 120건이었고요.

    이번엔 값이 갈렸습니다. 두 개를 나란히 놓으면 이렇게 다릅니다.

    화면에 뜬 점선과 목록에 적힌 진짜 선
    머니노트 · 정보·교육·참고용
    표로 보기
    같은 손절가인데 둘은 다른 것이었습니다
    구분 화면에 뜬 점선 목록에 적힌 선
    어디에 있나 보유 종목 화면 봇의 관심 종목 목록
    값이 몇 가지인가 -8% 하나뿐 네 가지
    종목마다 다른가 전부 같다 갈래에 따라 다르다
    무엇으로 표시되나 추정값이라고 붙어 나옴 그 종목의 기준선
    이 값으로 정리되나 아니다 그렇다

    무엇이 갈랐을까요.

    손절선이 종목 성격에 따라 네 갈래로 갈렸다
    머니노트 · 정보·교육·참고용
    표로 보기
    진짜 손절선은 네 가지였습니다
    항목 설명
    가장 좁은 자리 24건 -6%
    가장 흔한 자리 90건 -8%
    더 넓은 자리 5건 -12%
    가장 넓은 자리 1건 -15%

    −6% · −8% · −12% · −15%. 네 자리입니다.

    그리고 이 네 자리가 아무렇게나 흩어져 있는 게 아니었어요. 종목을 어떤 이유로 샀느냐에 따라 갈렸습니다.

    봇은 종목을 세 갈래로 나눠 담고 있었습니다.

    관심 종목 131건이 세 갈래로 나뉘어 있다
    머니노트 · 정보·교육·참고용
    표로 보기
    131건이 세 갈래로 나뉘어 담겨 있었습니다
    항목 설명
    짧게 보는 종목 네 가지 발굴 방식에서 들어옴 105
    길게 보는 종목 두 가지 검증을 모두 통과한 것만 25
    아주 오래 보는 종목 가장 긴 호흡으로 분류된 것 1

    짧게 보는 종목이 105건으로 대부분이고, 길게 보는 종목이 25건, 그리고 아주 오래 보는 종목이 1건이었습니다.

    여기서 앞의 손절선과 겹쳐 보면 그림이 맞아떨어집니다.

    보는 기간이 길수록 손절선이 멀어진다
    머니노트 · 정보·교육·참고용
    표로 보기
    오래 볼수록 멀리 뒀습니다
    갈래 짧게 본다 길게 본다 아주 오래 본다
    담긴 종목 수 105건 25건 1건
    손절선을 잰 수 94건 25건 1건
    손절선 -8% 71건 -8% 19건 -15% 1건
    버티는 폭 좁다 중간 넓다

    정확히 말하면 딱 떨어지는 규칙은 아닙니다. 길게 보는 25건 중에도 −6%가 하나 섞여 있었어요. 다만 −12%와 −15%는 짧게 보는 쪽에 하나도 없었습니다. −12%는 길게 보는 쪽, −15%는 가장 오래 보는 한 건이었고요.

    퍼센트로만 보면 잘 안 와닿으시죠. 이게 무슨 뜻이냐면, 10만 원짜리 주식 한 주를 샀다고 칠 때 이렇게 됩니다.

    10만 원에 샀다면 각 갈래의 손절선이 어디인가
    머니노트 · 정보·교육·참고용
    표로 보기
    10만 원에 샀다면 자르는 자리가 여기입니다
    항목 설명
    짧게 보는 종목 94,000원 6,000원 빠지면 자릅니다
    가장 흔한 자리 92,000원 8,000원 빠지면 자릅니다
    길게 보는 종목 88,000원 12,000원까지 견딥니다
    가장 오래 보는 종목 85,000원 15,000원까지 놔둡니다

    같은 10만 원을 넣었는데 어떤 종목은 6천 원에서 잘리고, 어떤 종목은 1만 5천 원까지 놔둡니다. 두 배 넘게 차이가 나죠.

    직관과 반대죠. 저도 처음엔 “오래 들고 갈 종목이면 더 조심해야 하는 것 아닌가” 싶었습니다.

    그런데 반대로 생각해 보면 당연합니다. 오래 들고 가겠다는 건 중간에 흔들리는 걸 견디겠다는 뜻이거든요. 손절선을 −6%에 두면, 오래 볼 종목도 그냥 한 번 출렁였을 뿐인데 잘려 나갑니다.

    짧게 보는 종목은 반대입니다. 며칠 안에 결판을 볼 생각으로 샀으니, 조금만 어긋나도 빨리 접는 게 목적에 맞고요.

    기간이 다르면 견디는 폭도 달라진다
    Photo: K / Pexels

    파는 자리도 같이 적힙니다

    떨어질 때만 정해 둔 게 아니었습니다. 오를 때 어디서 일부를 덜어낼지도 같은 줄에서 정해집니다.

    이건 계산법이 조금 재미있는데, 봇은 익절가를 “얼마 오르면”으로 정하지 않습니다. 손절선까지의 거리를 자로 씁니다.

    진입가에서 손절선까지의 거리를 1칸이라고 놓고, “그 몇 칸 위에서 덜어낼지”를 정하는 방식이에요.

    쉽게 말하면 이렇습니다. 잃기로 각오한 돈만큼을 한 칸으로 잡고, 그 몇 배를 벌면 일부를 덜어낼지를 정하는 겁니다. 아까 10만 원 예시로 치면, 8천 원을 걸었으니 2칸은 1만 6천 원을 벌었을 때가 되는 거죠.

    손절선까지의 거리를 자로 쓴다
    머니노트 · 정보·교육·참고용
    표로 보기
    익절가는 손절선까지의 거리로 잽니다
    단계 내용 설명
    1단계 ① 손절선을 먼저 정한다 종목 갈래에 따라 -6%에서 -15% 사이
    2단계 ② 그 거리를 1칸으로 삼는다 진입가에서 손절선까지가 기준 자가 됩니다
    3단계 ③ 몇 칸 위에서 덜어낼지 정한다 갈래와 나라에 따라 1.8칸에서 3칸
    4단계 ④ 사는 순간 같이 기록된다 사람이 그때그때 정하지 않습니다

    이 방식의 좋은 점이 있습니다. 잃을 폭을 먼저 정하고, 벌 목표를 거기에 맞춰 잰다는 거예요.

    보통은 반대로 하기 쉽죠. “이거 30% 오를 것 같은데” 부터 정하고, 손절은 나중에 대충 붙이거나 아예 안 붙이거나.

    그럼 몇 칸 위에서 덜어내느냐. 이것도 갈래마다 다릅니다.

    갈래와 나라에 따라 익절 목표가 다르다
    머니노트 · 정보·교육·참고용
    표로 보기
    몇 칸을 벌면 덜어낼지도 갈래마다 다릅니다
    항목 설명
    짧게 본다 · 미국 빨리 결판을 본다 1.8칸
    짧게 본다 · 한국 빨리 결판을 본다 2.0칸
    길게 본다 · 미국 더 기다린다 2.5칸
    길게 본다 · 한국 더 기다린다 3.0칸

    짧게 볼 종목은 1.8칸에서 2칸, 길게 볼 종목은 2.5칸에서 3칸. 여기서도 같은 원리가 반복됩니다. 오래 볼 종목은 더 크게 벌 때까지 기다리게 되어 있습니다.

    단 이건 지금 새로 담기는 종목 기준입니다. 목록에는 규칙을 바꾸기 전에 들어온 것들도 남아 있어서, 옛 값을 그대로 달고 있는 건도 섞여 있어요.

    그리고 코드 옆에 왜 그 숫자인지가 적혀 있었습니다. 길게 보는 쪽의 2~3칸에는 마크 미너비니의 VCP 방식을 참고했다는 메모가 붙어 있었어요.

    다만 전부 그렇지는 않았습니다. 짧게 보는 쪽 숫자에는 사람 이름 없이 백테스트 결과라고만 적혀 있었거든요.

    그래도 숫자를 감으로 넣지 않고 근거를 옆에 남겨 둔 것이 도움이 됐습니다. 값이 왜 그런지 물어볼 데가 있으니까요. 근거가 안 적힌 숫자는 나중에 바꿔도 되는지 아닌지조차 알 수 없게 됩니다.

    숫자 옆에 왜 그 숫자인지를 적어 둔다
    Photo: Pixabay / Pexels

    손절선은 두 겹으로 정해집니다

    여기서 하나 더 알게 된 게 있습니다.

    짧게 보는 종목 94건을 다시 들여다보니, 같은 갈래인데도 −6%와 −8%로 갈려 있었습니다. 같은 갈래면 같아야 하는 거 아닌가 싶었죠.

    찾아보니 손절선이 한 자리에서 정해지는 게 아니었습니다. 두 겹이었어요.

    값이 따로 들어오지 않은 18건은 예외 없이 −8%, 그러니까 갈래의 기본값이 그대로 적혔습니다. 나머지에는 그 종목만의 값이 따로 들어와 있었고, 그 값이 기본값을 이겼고요.

    손절선은 지정값을 먼저 보고, 없으면 기본값을 쓴다
    머니노트 · 정보·교육·참고용
    표로 보기
    손절선은 두 겹으로 정해집니다
    단계 내용 설명
    1단계 ① 이 종목에 따로 들어온 값이 있나 본다 있으면 그 값을 씁니다
    2단계 ② 없으면 갈래의 기본값을 쓴다 짧게 보는 종목은 -8%가 기본값입니다
    3단계 ③ 진입가에 곱해 실제 가격으로 바꾼다 -8%라면 진입가의 0.92배가 됩니다
    4단계 ④ 목록에 적어 둔다 이후 감시가 이 가격을 보고 판단합니다

    그 값을 넣는 쪽이 누구냐에서 제가 또 헛짚었습니다.

    처음엔 사람이 손으로 넣는 자리인 줄 알았어요. “AI가 전부 정하는 게 아니라 사람이 개입할 자리를 남겨 뒀구나” 하고요.

    반대였습니다. 그 값은 위험을 따로 보는 AI가 종목을 보고 계산해 넘긴 값이었고, 받아서 최종 결정하는 쪽도 AI였습니다. 오히려 코드에 박혀 있는 기본값 쪽이 사람이 미리 정해 둔 규칙이었고요.

    그러니까 구조가 제 짐작과 정반대입니다. 사람이 큰 틀을 정해 두고, 그 안에서 AI가 종목마다 조정하는 모양이에요.

    기본값이 있으니 AI가 아무 값이나 넣지는 못하고, 그렇다고 전부 고정도 아닙니다. 틀은 사람이, 조정은 AI가. 자동화를 만들다 보면 자주 이 모양으로 수렴하더군요.

    그 자리가 실제로 쓰였는지 세어 봤습니다

    여기까지는 “정해 둔다”는 이야기였습니다. 당연히 다음 질문이 나오죠.

    그래서 그 자리가 실제로 쓰이긴 하느냐.

    관심 종목 목록에서 정리된 이유가 기록된 건을 세어 봤습니다. 114건이었습니다.

    114건이 정리된 이유를 전부 세어 봤다
    머니노트 · 정보·교육·참고용
    표로 보기
    정리된 이유 114건을 전부 세어 봤습니다
    항목 설명
    손절선에 닿아서 미리 정한 가격까지 떨어짐 51
    정해 둔 기간이 끝나서 기간 만료 · 이것도 미리 정한 규칙 46
    고점에서 밀려나서 따라 올라가던 선이 깨짐 8
    익절선에 닿아서 목표 가격까지 올라감 4
    그 밖 · 정리 중 이동평균 이탈 3건 · 정리 대기 2건 5

    제가 이 표에서 본 건 비율이 아니라 목록에 없는 것입니다.

    “그날 판단해서 정리했다”가 하나도 없습니다. 거의 전부 미리 정해 둔 조건에 닿아서 정리됐어요. 가격이 정해 둔 선까지 떨어졌거나, 정해 둔 기간이 지났거나, 정해 둔 목표까지 올랐거나.

    그런데 여기서 제가 하마터면 큰 사고를 낼 뻔했습니다

    이 표를 처음 보고 저는 “114번의 매도가 실제로 나갔다”고 썼습니다.

    아니었습니다.

    이 114건은 봇이 가격을 보고 자기 장부에서 정리한 기록이지, 계좌에서 주식이 팔린 게 아닙니다. 확인해 보니 장부가 손절로 정리했다고 적어 둔 종목 몇 개가 지금도 계좌에 그대로 들어 있었어요.

    여러분 가계부로 치면 이런 상태입니다. 가계부에는 “이건 정리했음”이라고 줄을 그어 놨는데, 막상 계좌를 열어 보면 그 주식이 그대로 있는 것이죠. 장부와 계좌가 서로 다른 말을 하고 있는 겁니다.

    이 글 앞부분에서 제가 한 말이 그대로 돌아왔습니다. 화면에 적힌 손절가에 속았다고 써 놓고, 몇 문단 뒤에서 똑같이 장부 기록을 실제 체결로 읽었습니다. 같은 함정에 한 글 안에서 두 번 빠진 거죠.

    그래서 이 표가 말해 주는 건 딱 여기까지입니다. “정해 둔 자리가 장부에서는 자기 몫을 했다.” 그 이상은 아닙니다.

    그리고 전부 고정된 선도 아니었습니다. 고점을 따라 올라가는 선이 따로 있어서, 8건은 그 선이 깨지면서 정리됐거든요. “한 번 적고 끝”이 아니라 따라 움직이는 것도 섞여 있습니다.

    그래서 이게 잘 돌아간다는 뜻이냐 하면

    아닙니다. 여기서는 정직하게 선을 그어야겠습니다. 앞 표를 성적표로 읽으면 안 됩니다.

    이번 편은 “자리를 미리 정해 두는 설계”에 대한 이야기입니다. 그 설계가 돈을 벌어 준다는 이야기가 아닙니다.

    앞의 표를 다시 보면 바로 보입니다. 손절선에 닿아 정리된 게 51건인데, 익절선까지 올라간 건 4건이었어요. 기간이 다 돼서 정리된 46건은 손절선에도 익절선에도 닿지 않은 채 정해 둔 기간이 지난 것이고요.

    114건 중 목표까지 올라간 건 4건입니다. 설계대로 돌았다는 것과 그 설계가 돈을 벌었다는 건 완전히 다른 이야기죠.

    그리고 이 손절들이 결과적으로 이득이었는지도 따로 확인 중입니다. 자른 게 더 나았던 경우도 있고, 자르고 나서 오히려 오른 경우도 있었습니다. 아직 표본이 모자라서 방향을 말하기 어렵고, 확실해지면 그것만 따로 한 편을 쓰겠습니다.

    그리고 오늘 확인하면서 코드와 데이터가 어긋나는 자리도 여럿 나왔습니다. 코드에는 이렇게 하라고 적혀 있는데 목록에 담긴 값은 다른 항목들이었어요. 규칙을 바꾸기 전에 들어온 것들이 그대로 남아 있는 탓으로 보이는데, 아직 제가 다 세어 보지 못했습니다. 이건 다음에 따로 파 보려고 합니다.

    모두 모의계좌 기준입니다. 실제 돈이 오간 게 아니고요.

    아직 확인 중인 것들
    Photo: RDNE Stock project / Pexels

    그래도 이 설계에서 배울 건 남습니다

    수익이 아니라 구조만 놓고 보면, 이 방식에는 분명한 성질이 하나 있습니다.

    살 때 정해지는 것들
    머니노트 · 정보·교육·참고용
    표로 보기
    사는 순간 같이 적히는 것들
    적히는 것 언제 정하나 무엇이 정하나 그 뒤
    손절선 사는 그 줄에서 종목 갈래와 지정값 처음 값 그대로
    익절선 사는 그 줄에서 손절선까지의 거리로 계산 처음 값 그대로
    고점 추적선 고점을 따라감 값이 움직인다
    그날의 기분 장부에 들어갈 자리가 없음

    제가 이 표에서 제일 눈여겨본 건 마지막 줄입니다.

    떨어지는 걸 보면서 “얼마에 팔까”를 고민할 자리가 아예 없습니다.

    주식으로 손해를 본 이야기를 들어 보면 패턴이 비슷합니다. 살 때는 오를 이유만 생각하고, 떨어지기 시작하면 그때부터 “조금만 더 기다려 보자”가 시작되죠. 그 판단을 가장 못 하는 순간에, 가장 중요한 판단을 하게 됩니다.

    미리 적어 두면 그 순간이 사라집니다. 잘 될 거라는 기대가 가장 클 때, 가장 냉정한 숫자를 같이 적어 두는 셈이니까요.

    다시 말하지만 이게 수익을 보장한다는 뜻은 아닙니다. 위에서 봤듯이 이 봇도 목표까지 올라간 건 4건뿐이었어요. 다만 “파는 판단을 언제 하느냐”는 문제는, 결과와 별개로 한 번쯤 생각해 볼 만하다고 봅니다.

    오늘 남은 문장

    살 때가 가장 냉정할 수 있는 유일한 순간입니다.

    사기 전에는 아직 아무것도 잃지 않았거든요. 그래서 “얼마까지는 견딘다”를 그때 정하면 지킬 만한 숫자가 나옵니다. 이미 20% 떨어진 다음에 정하려고 하면, 그때는 숫자가 아니라 희망을 적게 됩니다.

    봇을 만들면서 배운 게 이겁니다. 좋은 규칙은 지키기 어려운 순간에 만들어지지 않습니다. 지키기 쉬운 순간에 미리 만들어 두는 것이더군요.

    혹시 지금 들고 계신 게 있다면, 하나만 떠올려 보세요. 살 때 “여기까지”를 정해 두셨나요, 아니면 지금 정하고 계신가요? 봇에게는 그 자리가 사는 순간에 이미 적혀 있었습니다.

    다음 편은 예고했던 이야기로 돌아갑니다. 고장을 감지하는 장치는 살아 있는데 고치는 쪽이 죽어 있던 이야기예요.


    ※ 이 글은 자동매매 시스템을 만들며 겪은 과정을 기록한 개발기입니다. 특정 종목이나 매매 방법을 권유하지 않으며, 언급된 수치는 모두 모의계좌 기준 기록입니다. 투자 판단과 그 책임은 본인에게 있습니다. 참고용으로만 봐 주세요.

  • 1초 늦었다고 하루치를 버립니다 — 개발기 ⑫ 켜 둔 줄 알았던 감시가 27일 중 23일 쉬고 있었습니다

    1초 늦었다고 하루치를 버립니다 — 개발기 ⑫ 켜 둔 줄 알았던 감시가 27일 중 23일 쉬고 있었습니다

    시장을 지켜보라고 켜 둔 감시 하나가, 27일 중 23일을 쉬고 있었습니다.

    그런데 고장이 아니었습니다. 서버가 죽은 것도, 코드에 오류가 난 것도 아니에요.

    설정 한 줄이 그렇게 하라고 시킨 겁니다. 늦게 깨어났다는 이유로요. 1초.

    그 감시에는 “정해진 시각보다 1초 넘게 늦으면 이번 회차는 없던 일로 한다”는 설정이 붙어 있었습니다. 봇 전체에서 그 설정을 달고 있는 일감이 26개였고요.

    더 아픈 건 이겁니다. 서버 기록에는 27일 내내 “건너뛰었다”고 찍혀 있었습니다. 아무도 그 줄을 읽지 않았을 뿐이에요.

    걸어 두고 잊은 자동이체나 알림이 있으시다면, 이 글은 봇 이야기가 아니라 그것들 이야기이기도 합니다.

    가려진 시계
    Photo: Ruslan Sikunov / Pexels

    개발기⑨에서 안전장치 네 개가 한꺼번에 헛돌았다는 이야기를 했습니다. 그때는 달아 놓은 장치가 제 역할을 못 한 이야기였죠. 오늘은 한 칸 더 앞입니다. 장치가 아예 실행되지 않은 이야기니까요.

    25개를 만들어 놓고, 한 번도 성적표를 안 봤습니다

    이걸 파게 된 출발점은 7월 26일이었습니다. 그동안 만들어 둔 관찰 장치를 처음으로 전부 열어 봤거든요.

    관찰 장치가 뭐냐면, 매매에 바로 쓰지 않고 “이 방법이 맞는지 옆에서 조용히 재기만 하는” 장치입니다. 새 아이디어가 떠오르면 바로 돈을 걸지 않고 이걸 먼저 붙여요.

    그런 장치가 25개 있었습니다. 그리고 25개 전부에 똑같은 문장이 적혀 있었어요. “표본 30개가 쌓이면 사람이 판단한다.”

    쌓였는지 확인한 적이 한 번도 없었습니다.

    관찰 장치 25개를 열어 봤더니
    머니노트 · 정보·교육·참고용
    표로 보기
    만들기만 하고 열어 본 적이 없었습니다
    항목 설명
    이미 판단 가능 표본이 다 쌓였는데 아무도 안 봄 7개
    그중 효과 없음 확정 그런데 계속 돌고 있었음 4개
    속이 텅 빈 채 실행 매일 도는데 들어오는 게 0 4개

    일곱 개는 이미 판단할 재료가 다 쌓여 있었습니다. 그리고 그 일곱 중 네 개는 “효과 없다”가 이미 확정됐는데도 매일 계속 돌고 있었고요.

    이것들과 별개로 네 개는 매일 도는데 안에 아무것도 안 들어오고 있었습니다.

    여기서 나온 문장이 이겁니다.

    만드는 절차는 있는데, 채점하고 닫는 절차가 없었습니다.

    하나하나 열어 세어 보는 일
    Photo: Daniel Andraski / Pexels

    “안 도는 것”과 “돌 대상이 없는 것”은 다릅니다

    속이 빈 장치들을 하나씩 열어 보다가, 처음엔 완전히 틀린 결론을 냈습니다.

    악재를 맞은 종목을 걸러 내는 장치가 하나 있었는데, 배포하고 나서 결과 파일이 한 번도 안 생겼거든요. 그래서 “이건 아예 안 돌고 있구나”라고 적었습니다.

    틀렸습니다. 매일 돌았고, 설계한 그대로 정확히 작동하고 있었어요.

    들어오는 재료가 문제였습니다. 이 장치는 “몇 번 종목”이라는 종목 번호가 있어야 판정을 합니다. 그런데 실제로 들어온 건 대부분 “성장주”, “반도체” 같은 업종 이름뿐이었어요.

    들어온 재료를 세어 봤습니다
    머니노트 · 정보·교육·참고용
    표로 보기
    들어온 재료 중 종목 번호가 없는 것
    항목 설명
    종목 번호 없이 업종 이름만 이 장치가 판정할 수 없는 형태 244
    종목 번호 있음 판정 가능 123

    367건 중 244건, 그러니까 3분의 2가 종목 번호 없이 들어왔습니다. 최근 6일치 악재 목록 50건만 따로 세어 보니 국내 종목 번호는 0개였습니다.

    쉽게 말하면 이렇습니다. 우편함은 매일 정확히 열어 봤는데, 편지가 주소 없이 오고 있었던 겁니다. 우편함 잘못이 아니죠.

    그래서 규칙을 하나 새로 적었습니다. “안 도는 것”과 “돌 대상이 없는 것”을 먼저 가를 것. 둘은 화면에서 똑같이 0으로 보이거든요.

    그런데 8월 3일, 훨씬 큰 게 나왔습니다

    여기까지는 “빈 장치를 찾았다”는 이야기였습니다. 그러다 봇의 알람 시계 쪽을 열어 봤어요.

    봇에는 정해진 시각에 정해진 일을 시키는 장치가 있습니다. 새벽 2시엔 하루 정리, 오후 4시엔 살펴볼 종목 목록 갱신, 이런 식으로요. 지금 세어 보면 180개가 걸려 있습니다.

    그중 26개에 “1초 넘게 늦으면 이번 회차는 건너뛴다”가 붙어 있었습니다.

    봇의 알람 시계를 세어 봤습니다
    머니노트 · 정보·교육·참고용
    표로 보기
    1초가 하루를 가르고 있었습니다
    항목 설명
    봇에 걸린 정기 일감 전체 180개 8월 4일 서버 기준
    그중 유예 1초짜리 26개 늦으면 회차를 통째로 버림
    허용되는 지각의 한계 1초 컴퓨터에겐 아슬아슬한 시간

    컴퓨터가 정확히 그 시각에 깨어나는 건 생각보다 드문 일입니다. 다른 일을 하다 보면 1초, 2초쯤은 그냥 밀려요. 그리고 그때마다 하루치가 통째로 사라졌습니다.

    얼마나 자주 건너뛰었나
    머니노트 · 정보·교육·참고용
    표로 보기
    이 셋은 대부분의 날에 실행되지 않았습니다
    항목 설명
    미국 장 마감 감시 새벽 4시 · 시장 상태 점검 85%
    종목 목록 갱신 오후 4시 · 국내와 미국 명단 89%
    하루 정리 작업 새벽 2시 · 기록 요약 67%

    국내와 미국 종목 목록을 갱신하는 일감은 89퍼센트를 건너뛰었습니다. 고치기 전 27일 동안 실행된 기록은 40회가 넘는데, 그중 예정된 시각인 오후 4시 정각에 돈 건 세 번뿐이었어요.

    나머지는 언제 돌았을까요.

    서버를 다시 켤 때마다 돌고 있었습니다. 그러니까 명단 갱신이 사실상 “재부팅할 때만” 일어나고 있었던 거예요.

    여러분 집으로 치면 이런 겁니다. 매일 아침 7시에 울리기로 한 알람이 대부분 안 울리고, 이사하거나 정전됐다 복구될 때만 울린 셈입니다.

    기록엔 27일 내내 적혀 있었습니다

    여기가 제일 부끄러운 대목입니다.

    건너뛸 때마다 서버는 기록을 남깁니다. 실제로 이렇게 적혀 있었어요.

    “이 일감의 실행 시각을 놓쳤습니다 — 1.309초 늦음”

    기록이 남아 있는 한 달 동안 120번. 일곱 종류의 일감에서 나왔습니다.

    얼마나 늦었길래 버려졌나
    머니노트 · 정보·교육·참고용
    표로 보기
    대부분 1초 늦었을 뿐입니다
    항목 설명
    1초 늦음 가장 흔한 경우 98건
    2초 늦음 두 번째로 흔함 16건
    3초 늦음 드묾 2건
    4초 늦음 드묾 1건
    5초 늦음 관측된 최대 3건

    1초만 늦은 게 98번입니다. 조금만 더 기다렸으면 살아났을 일들이에요.

    쌓여 있는데 아무도 열지 않은 우편함
    Photo: Arti Kh / Pexels

    그런데 매일 도는 자동 점검은 이걸 못 잡았습니다. 그 점검은 “에러가 몇 건인가”“결과 파일이 오래되지 않았나”를 보는데, 건너뛴 기록은 에러보다 한 단계 낮은 “경고”로 찍히거든요.

    자동 점검은 무엇을 보고 있었나
    머니노트 · 정보·교육·참고용
    표로 보기
    초록불이 켜진 이유
    점검 항목 자동 점검이 본 것 실제로 벌어진 일
    에러 건수 0건 · 점검 기준 정상 경고로 찍혀서 안 세어짐
    결과 파일 신선도 파일 있음 · 정상 정각이 아니라 재시작 때 만들어짐
    미발화 감시 장치 항목 자체가 없음 27일 내내 매일 발생

    개발기⑩에서 “숫자 옆에 비교 대상을 안 놓아서 착시가 생겼다”는 이야기를 했는데요. 이번엔 결이 다릅니다. 숫자가 아예 화면에 없었습니다.

    바꿔 말하면 이런 겁니다. 앞의 것은 잘못 읽은 문제였고, 이건 읽을 자리를 안 만든 문제였어요.

    읽는 눈이 없는 화면
    Photo: Kevin Ku / Pexels

    알림을 붙이려다, 알림이 같은 병을 만들 뻔했습니다

    고치는 방법은 뻔해 보였습니다. 건너뛰면 휴대폰으로 알려 주게 하면 되니까요.

    그렇게 짠 설계를 적대적으로 물어뜯으라고 붙여 둔 AI에게 넘겼습니다. 그리고 “이대로 배포하면 안 된다”는 답이 왔어요.

    이유를 듣고 나니 소름이 돋았습니다.

    알림이 병을 재생산하는 경로
    머니노트 · 정보·교육·참고용
    표로 보기
    알림을 그 자리에서 보내면 같은 병이 다시 생깁니다
    단계 내용 설명
    1단계 일감이 건너뛰어짐 알림을 보내야 함
    2단계 그 자리에서 전송 최대 10초 대기
    3단계 일하는 담당 10명이 묶임 동시에 오면 전원 대기
    4단계 다음 일감도 건너뛰어짐 처리할 담당이 없어서

    봇에서 일을 처리하는 담당은 10명입니다. 알림을 그 자리에서 보내면 메시지 하나당 최대 10초를 붙잡혀요. 건너뛴 일감이 한꺼번에 여러 개 생기면 10명이 전부 알림을 보내느라 묶이고, 그 사이 다음 일감이 또 건너뛰게 됩니다.

    병을 고치려고 만든 장치가 그 병을 다시 만들어 내는 구조였습니다.

    해법은 이렇게 바꿨습니다. 건너뛴 순간에는 쪽지만 상자에 넣고(눈 깜짝할 새에 끝납니다), 그 쪽지를 꺼내 보내는 일은 따로 둔 담당 한 명이 맡습니다. 상자가 꽉 차면 버리되 몇 장을 버렸는지 세어 둡니다.

    물론 “그냥 유예 시간을 넉넉히 주면 되지 않나” 하실 수 있습니다. 실제로 그렇게 했어요. 다만 시장 상태를 보는 감시 셋에는 300초를 넘기지 못하게 막았습니다. 이 감시들은 실행되는 그 순간의 시장을 사진 찍는 방식이라, 늦게 돌면 늦은 시각의 시장을 찍거든요. 30분을 줬다면 오후 3시 감시가 장이 닫히는 시각에야 돌게 됩니다.

    고친 날 오후 4시, 11초 늦었는데도 실행됐습니다

    8월 3일에 고쳐서 올렸습니다. 그리고 그날 바로 확인됐어요.

    8월 3일 오후 4시
    머니노트 · 정보·교육·참고용
    표로 보기
    같은 날 오후에 답이 나왔습니다
    시점 사건 설명
    낮 12시 31분 고친 설정 배포 이 일감의 유예를 1초에서 300초로
    16시 00분 11초 종목 목록 갱신 실행 11초 지각 · 옛 설정이면 버려졌음
    16시 10분 00초 다음 작업이 그 명단을 사용 끊겨 있던 연결이 이어짐
    그날 밤부터 이튿날 낮 건너뜀 기록 0건 · 관측은 아직 하루치

    고치기 전 한 달 동안 일곱 종류에서 120번 나오던 건너뜀 기록이, 배포 뒤 하루 동안은 0건입니다.

    물론 하루치 관측으로 “해결됐다”고 말할 수는 없습니다. 건너뜀이 없다 보니 새로 붙인 알림이 실제로 도착하는지는 아직 못 봤어요. 알림을 만들어 놓고 울려 본 적이 없는 셈이니, 이 편의 교훈이 그대로 다음 숙제로 남았습니다.

    그래도 하나는 분명합니다. 이건 큰 기능을 새로 만든 게 아니라 숫자 몇 개를 바꾼 것인데, 27일 동안 사라지던 하루치가 돌아왔거든요.

    그리고 그 기록이 우리를 한 번 더 때렸습니다

    위 연표를 다시 보시면 실행 시각이 16시 00분 11초입니다.

    11초 늦었어요.

    이게 왜 문제냐면, 우리가 이번 수리의 근거로 쓴 문장이 이거였거든요. “지금까지 관측된 지각은 1초에서 5초 사이다.” 실제로 120건을 다 세어서 나온 값이었습니다.

    그런데 배포 당일에 11초가 나왔습니다.

    우리가 본 것과 실제
    머니노트 · 정보·교육·참고용
    표로 보기
    표본이 못 본 것은 없는 게 아닙니다
    항목 설명
    우리가 관측한 최대 지각 5초 표본 120건에서 나온 값
    배포 당일 실제 지각 11초 관측 최대의 두 배 이상
    이 일감에 새로 준 유예 300초 결론이 안 바뀐 건 운이 좋아서

    다행히 이 일감에 새로 준 유예가 300초라 11초는 아무 문제가 안 됐습니다. 오히려 옛 설정이었다면 그날도 버려졌을 테니, 수리의 정당성은 더 강해졌습니다.

    그런데 다행이었을 뿐입니다. 만약 유예 시간을 10초쯤으로 잡았다면, “행동 변화 없음”이라는 판정은 그날 바로 거짓이 됐을 거예요.

    여기서 규칙을 하나 더 적었습니다.

    관측 표본으로 상한을 말하지 마라. 우리가 본 최대치는 “여기를 넘지 않는다”는 증거가 아니라, “아직 못 본 값의 아래쪽”일 뿐이니까요.

    그래서 배운 것

    오해하지 마세요. 이번에 드러난 건 정해진 시각에 도는 일감들이고, 그중 진입 후보를 거르는 일감은 건너뛴 기록이 0건이었습니다.

    그렇다고 “나머지는 다 정상”이라는 뜻은 아닙니다. 제가 확인한 건 그 한 건이 0이었다는 것뿐이거든요. 이 편의 교훈이 정확히 그거라서, 여기서 안심을 넓히면 같은 실수를 반복하는 셈입니다.

    그래도 무게가 가볍진 않습니다. 시장 상태를 살피는 감시가 대부분의 날에 안 돌았다면, 그 판단이 낡은 사진을 보고 내려졌다는 뜻이거든요.

    세 문장으로 남깁니다.

    켜 두는 것과 도는 것은 다릅니다. 설정 파일에 이름이 적혀 있는 것과, 오늘 실제로 실행된 것은 별개입니다.

    기록이 없다는 건 안 일어났다는 뜻이 아닙니다. 반대로 기록이 있다는 것도 읽고 있다는 뜻이 아니고요. 우리 서버는 27일 내내 정직하게 적어 두고 있었습니다.

    초록불이 가장 위험합니다. 점검 항목에 없는 일은 영원히 초록으로 보이니까요.

    자동이체나 보험 특약처럼 걸어 두고 잊은 것 중에, 여러분이 마지막으로 명세서를 열어 실제 실행을 눈으로 확인한 게 언제인가요? 저는 스물다섯 개를 걸어 두고 한 번도 성적표를 안 봤습니다.

    다음 글 예고 — 감지는 살아 있는데 수리가 죽었습니다

    이 이야기에는 뒷장이 있습니다.

    8월 4일 새벽, 문제를 찾는 쪽은 정상적으로 돌아서 고칠 목록까지 만들어 놨는데, 그걸 받아서 고치는 쪽이 30분을 매달리다 강제 종료됐거든요. 그날 산출물이 통째로 사라졌고, 화면에도 알림에도 아무것도 뜨지 않았습니다.

    ▶ 다음 편 예고
    감지는 살아 있는데 수리가 죽었습니다
    찾아낸 목록이 배달되지 않은 채 사라졌습니다. 그리고 그 사실은 소장님 질문 하나가 없었으면 계속 반복됐을 겁니다.

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

    이 글은 특정 종목의 매수·매도를 권유하는 글이 아니라, 개인이 만든 시스템의 개발·운영 과정을 공유하는 정보·교육·참고용 글입니다. 본문의 기록은 실제 돈이 오가지 않는 모의계좌 환경에서 일어난 일이며, 미래 성과를 보장하지 않습니다. 투자 판단과 책임은 본인에게 있습니다.


    근거: 지시문 1113 — 스케줄러 미발화 경보 · 지시문 1113-R — 유예 시간 값 정정 · 지시문 1116 — 감지는 살아 있는데 수리가 죽었다 · 지시문 1101 — 관찰 장치 25개 전수 채점 · 지시문 1087 — 입력 형식 불일치로 영원히 0건 · 관측 표본으로 상한을 말하지 마라 — 본 글은 개발·운영 과정의 경험 공유이며 투자 자문이 아닙니다.

  • 매도 성공 0건이 6건이 된 날 — 개발기 ⑪ 계좌의 유령이 사라졌습니다

    매도 성공 0건이 6건이 된 날 — 개발기 ⑪ 계좌의 유령이 사라졌습니다

    7월 21일 아침 9시 5분. 저는 증권사 계좌 화면을 열어 두고 앉아 있었거든요.

    거기엔 제가 팔 수 없는 주식 여섯 종목이 75주 들어 있었습니다.

    9시 10분에 같은 화면을 다시 열었습니다. 아무것도 없었습니다.

    아침 장 시작 무렵, 계좌 화면을 열어 두고
    Photo: Yan Krukau / Pexels

    앞 글은 「0건」으로 끝났습니다

    개발기 ④에서 이렇게 썼습니다.

    “기록을 세어보니 매도 주문 26건 중 성공 0건.

    사는 주문은 멀쩡히 나가는데 파는 주문만 전부 거부되고 있었습니다. 그래서 더 못 알아챘습니다. 계좌엔 주식이 쌓이는데 나가는 문이 잠겨 있던 셈입니다.

    그 글은 이렇게 닫았습니다. “없는 것보다 나쁜 건, 있다고 믿는 것.”

    오늘은 그 뒤 이야기입니다. 닫아 둔 이야기에 결말이 붙었거든요.

    매도만 막혀 있던 상태
    머니노트 · 정보·교육·참고용
    표로 보기
    파는 문만 잠겨 있었습니다
    항목 설명
    시도한 매도 주문 26건 전부 거부
    성공한 매도 0건 한 건도 없음
    남아 버린 주식 6종목 75주

    「유령 물량」이 뭐냐면

    여기서 말이 하나 필요합니다. 제가 계속 유령 물량이라고 부르는 것이요.

    쉽게 말하면 팔려고 주문을 냈는데 안 팔리고 계좌에 그대로 남은 주식입니다. 봇은 “팔았다”고 생각하고 다음 판단을 하는데, 계좌에는 아직 있는 거죠.

    이게 왜 무서운지는 장바구니로 치면 이렇습니다. 계산대에서 물건을 뺐다고 생각했는데 실제로는 안 빠져 있고, 그 상태로 계속 장을 보는 겁니다. 총액이 처음부터 어긋나 있으니 그 뒤 계산이 전부 틀어지거든요.

    봇에게는 더 심각합니다. 봇은 “지금 내가 얼마를 들고 있나”를 기준으로 다음에 얼마를 살지 정하는데, 그 기준이 틀려 있으면 모든 판단이 틀린 땅 위에 서 있는 셈입니다.

    유령 물량이 만드는 문제
    머니노트 · 정보·교육·참고용
    표로 보기
    한 칸이 틀리면 뒤가 전부 틀립니다
    단계 내용 설명
    1단계 매도 주문 실패 그런데 성공으로 기록
    2단계 보유량이 어긋남 실제보다 적게 알고 있음
    3단계 다음 매수 판단 어긋난 숫자를 기준으로
    4단계 계좌는 계속 쌓임 아무도 모르는 채

    나가는 문을 다시 달았습니다

    원인을 손보는 데 시간이 걸렸습니다. 매도 명령이 증권사까지 가는 길이 온전하지 않았습니다.

    그리고 7월 21일 아침, 남아 있던 여섯 종목을 정리하는 매도 주문을 냈습니다. 오래 막혀 있던 일이 5분 만에 끝났습니다.

    그날 아침 5분
    머니노트 · 정보·교육·참고용
    표로 보기
    9시 5분에서 9시 10분까지
    시점 사건 설명
    9시 5분 정리 매도 주문 여섯 종목 75주
    주문 접수 증권사로 나감 처음으로 거부되지 않음
    체결 여섯 건 전부 성공 기록에 남음
    9시 10분 계좌 재조회 남은 유령 물량 0종목

    주문 기록에 매도 성공 여섯 건이 찍혔습니다. 이 시스템 역사상 처음입니다.

    그리고 9시 10분에 계좌를 다시 조회했습니다. 유령 물량 0종목. 전량 체결이었습니다.

    숫자로 보면 이렇게 달라졌습니다
    머니노트 · 정보·교육·참고용
    표로 보기
    고치기 전과 후, 같은 항목으로
    매도 기능 고치기 전 고친 뒤
    성공한 매도 주문 0건 6건
    계좌에 남은 유령 물량 6종목 75주 0종목
    봇이 아는 보유량 실제와 어긋남 실제와 일치

    왜 이 여섯 건이 값어치가 있냐면

    솔직히 여섯 건은 큰 숫자가 아닙니다. 금액도 크지 않았고요.

    그런데 이 시리즈에서 처음으로 한 바퀴가 완결됐거든요.

    이번에 완결된 한 바퀴
    머니노트 · 정보·교육·참고용
    표로 보기
    세 칸이 다 채워진 첫 사례
    단계 내용 설명
    1단계 발견 매도 26건 중 0건
    2단계 수리 나가는 길을 다시 깔았다
    3단계 실증 여섯 건 성공·유령 0종목

    지금까지 이 시리즈에 쓴 글을 다시 보면 대부분 첫 칸과 두 번째 칸에서 끝났습니다. “여기가 고장이었다”, “그래서 이렇게 고쳤다”까지요.

    세 번째 칸이 비어 있었습니다. 고쳤다고 말은 했는데, 고쳐졌다는 증거를 계좌에서 꺼내 보인 적이 없었거든요.

    이번엔 그 증거가 있습니다. 9시 5분과 9시 10분, 두 장의 화면이요.

    정리된 뒤의 조용한 화면
    Photo: Mikhail Nilov / Pexels

    그래서 배운 것

    바꿔 말하면 이렇습니다. 고쳤다는 말은 고쳐졌다는 증거가 아니거든요.

    저는 그동안 코드를 수정하고 “됐다”고 적었습니다. 그런데 그건 제가 짠 쪽에서 본 이야기일 뿐입니다. 증권사 계좌라는 바깥에서 본 숫자가 바뀌기 전까지는, 고쳤다는 것도 제 주장이었어요.

    이 시리즈가 실패 이야기로 자주 흐르는 이유도 여기 있었던 것 같습니다. 고친 뒤에 확인하는 칸을 자꾸 비워 뒀거든요. 그래서 다음 고장을 만나면 또 처음부터 의심하게 됐습니다.

    이번엔 세 번째 칸을 채워 놓고 갑니다. 다음에 매도가 이상해지면 비교할 정상 기록이 하나 생긴 셈입니다.

    여러분도 뭔가를 고쳤을 때, 고쳐졌다는 걸 바깥에서 확인해 보신 적 있으신가요? 저는 이번에 그 화면 두 장이 코드 수정보다 값어치가 컸습니다.

    다음 글 예고 — 만들어 놓고 한 번도 채점하지 않은 장치들

    이번에 세 번째 칸을 채워 보니, 정작 채워진 적 없는 칸이 스물다섯 개 넘게 있다는 걸 알게 됐습니다. 관찰 장치를 잔뜩 만들어 두고 한 번도 전부 모아서 채점해 본 적이 없었거든요.

    ▶ 다음 편 예고
    만들어 놓고 한 번도 채점하지 않은 장치들
    만드는 절차는 있는데 닫는 절차가 없었습니다. 매일 도는데 아무것도 안 들어오는 장치가 넷이었어요.

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

    이 글은 특정 종목의 매수·매도를 권유하는 글이 아니라, 개인이 만든 시스템의 개발 과정을 공유하는 정보·교육·참고용 글입니다. 본문의 기록은 실제 돈이 오가지 않는 모의계좌에서 일어난 일이며, 미래 성과를 보장하지 않습니다. 투자 판단과 책임은 본인에게 있습니다.


    근거: StockBot_개발_개요 · 개발기 소재 — cl1 브리지 전달분 2026-07-26 — 본 글은 개발 과정의 경험 공유이며 투자 자문이 아닙니다.

  • AI 예측 적중률 84% — 개발기 ⑩ 같은 기간 시장을 안 재면, 내 수익률도 착시가 됩니다

    AI 예측 적중률 84% — 개발기 ⑩ 같은 기간 시장을 안 재면, 내 수익률도 착시가 됩니다

    AI가 “이 종목은 타격을 받는다”고 찍은 예측 중 83.9퍼센트가 맞았습니다. 2026년 7월 26일에 채점한 결과입니다.

    열에 여덟이 넘죠. 저는 이 숫자를 한동안 우리 봇의 강점이라고 믿고 있었습니다.

    그런데 얼마 전, 그 숫자 옆에 딱 하나를 더 놓아 봤습니다. 같은 기간에 시장 전체가 몇 퍼센트 빠졌는지를요.

    시장은 6.21퍼센트 빠져 있었습니다. AI가 찍은 종목들은 6.34퍼센트.

    시장을 빼고 남은 건 0.37퍼센트포인트였습니다.

    그리고 그마저도 채점할 수 없는 숫자였고요. 이유는 뒤에서 말씀드리겠습니다.

    개발기⑨에서는 급락장에 안전장치 네 개가 한꺼번에 헛돌았다는 이야기를 했습니다. 오늘은 그보다 훨씬 조용한 사고예요. 아무것도 고장 나지 않았는데 숫자가 거짓말을 하고 있던 경우니까요.

    그리고 이걸 잡아낸 건 제가 아니었습니다. 제 결론을 물어뜯으라고 붙여 둔 다른 AI였죠.

    숫자는 맞았는데 의미가 틀렸다
    Photo: Alex Luna / Pexels

    84퍼센트는 어떻게 만들어진 숫자였나

    봇은 매일 뉴스를 읽고 “이 사건은 어느 업종에 좋고 어느 업종에 나쁘다”를 판정합니다. 좋다고 본 쪽을 수혜, 나쁘다고 본 쪽을 타격이라고 부릅니다.

    그리고 7거래일 뒤에 실제로 올랐는지 내렸는지를 채점합니다. 수혜로 찍었으면 올라야 적중, 타격으로 찍었으면 내려야 적중입니다.

    수혜 예측과 타격 예측의 적중률
    머니노트 · 정보·교육·참고용
    표로 보기
    적중률만 보면 한쪽이 압도적이었습니다
    항목 설명
    수혜 예측 69건 · 오를 거라고 찍음 26.1%
    타격 예측 31건 · 내릴 거라고 찍음 83.9%

    수혜 예측은 69건 중 26.1퍼센트, 타격 예측은 31건 중 83.9퍼센트가 맞았습니다.

    이 표를 처음 봤을 때 저는 그럴듯한 해석을 바로 만들어 냈습니다. “우리 AI는 좋은 걸 찾는 데는 약한데, 나쁜 걸 피하는 데는 강하구나.” 실제로 그 해석은 봇의 방향을 정하는 문장이 되어 있었어요. 공격보다 방어가 우리 강점이라는 쪽으로 말입니다.

    그런데 저 두 숫자를 가른 게 정말 AI의 실력이었을까요?

    같은 기간, 시장은 얼마나 빠져 있었나

    채점을 다시 했습니다. 이번엔 예측한 종목의 수익률 옆에 같은 날 산 시장 지수의 수익률을 나란히 붙였고요.

    예측 종목과 같은 기간 시장
    머니노트 · 정보·교육·참고용
    표로 보기
    같은 기간 시장도 이만큼 빠졌습니다
    항목 설명
    타격 예측 종목 31건 평균 -6.34%
    같은 기간 시장 같은 구간 지수 -6.21%
    수혜 예측 종목 69건 평균 -7.02%
    같은 기간 시장 같은 구간 지수 -7.43%

    그 기간은 시장이 통째로 무너지던 구간이었습니다. 무엇을 골라도 대부분 마이너스가 나오는 장이었죠.

    그러니까 “내릴 것”이라고 찍은 예측은 자동으로 맞았습니다. 반대로 “오를 것”이라고 찍은 예측은 자동으로 틀렸습니다.

    시장을 빼고 남은 실력
    머니노트 · 정보·교육·참고용
    표로 보기
    시장을 빼면 남는 게 없었습니다
    AI 예측 예측 종목 평균 같은 기간 시장 시장을 뺀 차이
    수혜 예측 69건 -7.02% -7.43% 0.50%p 덜 빠짐
    타격 예측 31건 -6.34% -6.21% 0.37%p 더 빠짐

    시장을 빼고 나니 수혜 예측은 시장보다 0.50퍼센트포인트 덜 빠졌고, 타격 예측은 시장보다 0.37퍼센트포인트 더 빠졌습니다.

    계산이 안 맞는다고 느끼셨다면 정확합니다. 표의 평균끼리 빼면 0.41과 0.13이 나오거든요. 실제로 쓴 값은 한 건 한 건마다 그 종목이 속한 시장과 보유 기간을 맞춰 잰 것이라 평균의 뺄셈과 다릅니다.

    두 예측군의 차이가 우연히 나올 확률도 계산해 봤습니다. 예측 이름표를 무작위로 2만 번 섞어서 같은 계산을 반복했더니, 우연으로도 이만큼은 흔하게 나왔습니다.

    그런데 이 숫자들, 애초에 채점 자격이 없었습니다

    여기가 제일 부끄러운 대목입니다.

    무엇으로 세느냐가 표본을 정한다
    Photo: Nothing Ahead / Pexels

    타격 예측 31건은 레코드 31건이지 종목 31개가 아니었습니다. 같은 종목이 여러 번 예측에 걸리고, 보유 기간이 겹치면 같은 궤적을 여러 번 세는 셈이 되거든요.

    세어 보니 고유 종목은 13개였습니다.

    저희 기준선은 30개입니다. 30건이 안 되면 판정하지 않고 “관찰 중”으로 둔다는 규칙을 스스로 만들어 뒀어요. 그 기준을 레코드가 아니라 종목 수에 걸자, 이 트랙은 판정 자격 미달이 됐습니다.

    물론 “84퍼센트가 거짓”이라는 뜻은 아닙니다. 맞았는지 틀렸는지를 말할 수 있는 표본이 아니라는 뜻이죠. 다만 “타격 84퍼센트 적중”이라는 문장 하나로 방어가 우리 강점이라고 말할 근거는 사라졌습니다. 그 문장은 봇의 방향을 정하는 데 쓰이고 있었고요.

    여기서 하나 더 배웠습니다. “판정 불가”라고 써 놓고 그 옆에 숫자를 보여주면, 사람은 결국 숫자를 읽습니다. 그래서 판정 불가일 때는 아예 계산을 막도록 바꿨어요.

    여기까지는 그래도 단순한 이야기입니다. 진짜 이상한 건 그다음에 나왔습니다.

    그럼 비교 대상만 붙이면 되는 거 아닌가요?

    저도 그렇게 생각했습니다. 시장 지수를 옆에 붙였으니 이제 정직한 채점이 됐다고 생각했죠.

    그런데 “시장”을 무엇으로 잡느냐에 따라 결론이 뒤집혔습니다.

    세 가지 잣대, 같은 7거래일
    머니노트 · 정보·교육·참고용
    표로 보기
    같은 기간인데 잣대마다 다릅니다
    항목 설명
    전 종목 등가중 1331종목 균등 매수 3.90%
    코스닥 지수 시가총액 가중 -2.37%
    코스피 지수 시가총액 가중 -8.97%

    같은 7거래일인데, 코스피 지수로 재면 마이너스 8.97퍼센트입니다. 그런데 상장 종목 1,331개를 똑같은 금액씩 담았다고 가정하고 재면 플러스 3.90퍼센트입니다.

    12.9퍼센트포인트가 벌어집니다. 같은 시장, 같은 기간인데요.

    왜 두 잣대가 갈렸나
    머니노트 · 정보·교육·참고용
    표로 보기
    왜 12.9퍼센트포인트나 갈렸나
    단계 내용 설명
    1단계 지수는 덩치로 가중 큰 종목이 지수를 좌우
    2단계 하락이 대형주에 집중 덩치 큰 종목 세 곳 -12.8에서 -21.2퍼센트
    3단계 평균 종목은 올랐다 중앙값 플러스 3.82퍼센트
    4단계 잣대가 결론을 바꾼다 같은 예측이 우수하기도 열등하기도

    그 구간의 폭락은 덩치 큰 종목에 몰려 있었습니다. 덩치가 큰 종목 세 곳만 봐도 마이너스 12.8, 마이너스 17.7, 마이너스 21.2퍼센트였는데, 평균적인 종목은 오히려 플러스였거든요.

    그래서 아까 그 수혜 예측을 다시 채점하면 이렇게 됩니다. 지수를 기준으로 하면 시장보다 0.50퍼센트 나은 성적이고, 비슷한 조건의 동료 종목들을 기준으로 하면 4.49퍼센트 못한 성적입니다.

    같은 예측, 같은 기간, 정반대 결론이에요.

    여기서 기준을 다시 잡았습니다. 이 트랙이 주장하는 건 “우리가 고른 종목이 좋았다”입니다. 그럼 비교해야 할 상대는 “아무 종목이나 골랐다면”이지, “시가총액 큰 순서대로 담았다면”이 아니죠.

    없던 신호가 생겨난 경우

    여기서 반대 방향의 사고가 나왔습니다. 그것도 세 번 왔다 갔다 했고요.

    잣대를 바꾸자 없던 차이가 나타났다
    Photo: Jakub Zerdzicki / Pexels

    외국인 순매수를 보는 다른 트랙이 있습니다. 한 신호가 켜진 종목군과 꺼진 종목군, 두 갈래로 나눠 20거래일 성적을 재는 트랙이에요.

    절대 수익률만 보면 두 갈래 차이가 0.23퍼센트포인트 — 사실상 노이즈입니다. 그래서 저는 “이 신호는 변별력이 없다”고 결론을 냈습니다. 두 번 다.

    그런데 지수를 비교 대상으로 붙였더니 차이가 3.02퍼센트포인트로 벌어졌어요. 값을 모르는 칸을 어떻게 메우느냐에 따라 2~3퍼센트포인트 사이에서 움직이는데, 어느 쪽이든 노이즈라고 부를 크기는 아니었습니다. 검증을 맡은 AI가 이걸 잡아내며 제 결론을 뒤집었습니다. “당신은 신호를 숨기고 있었다”고요.

    그리고 그 뒤집기도 틀렸습니다.

    같은 데이터를 세 가지 잣대로
    머니노트 · 정보·교육·참고용
    표로 보기
    잣대를 바꿀 때마다 답이 달라졌습니다
    무엇으로 쟀나 두 갈래의 차이 우연히 나올 확률 판정
    비교 대상 없음 0.23%p 노이즈
    지수 기준 3.02%p 4.1% 있다고 나옴
    동료 종목 기준 -0.34%p 78.1% 없음

    비슷한 조건의 동료 종목을 비교 대상으로 놓고 다시 재니, 차이는 마이너스 0.34퍼센트포인트로 돌아왔습니다. 우연으로 이만한 차이가 날 확률은 78퍼센트였고요.

    이유는 두 갈래가 서 있던 땅이 달랐기 때문입니다. 신호가 켜진 쪽은 코스닥 종목이 많았고, 꺼진 쪽은 코스피 종목이 많았거든요. 그 기간 두 시장의 낙폭이 크게 달랐습니다.

    지수를 잣대로 삼는 순간, 그 낙폭 차이가 실력처럼 보였던 겁니다.

    여기서 배운 문장은 이거였습니다. 비교 대상은 신호를 숨기기도 하고, 없는 신호를 만들어 내기도 한다. 붙였다는 것만으로는 부족하고, 어떤 걸 붙였느냐가 결론입니다.

    그런데 이 왕복 전부, 저 혼자 한 게 아닙니다.

    만드는 AI와 물어뜯는 AI를 갈라놨습니다

    이제 오늘의 진짜 주제입니다.

    저는 봇을 만들 때 AI 한 대만 쓰지 않습니다. 역할이 다른 AI를 최소 셋 붙여 놓고, 서로 싸우게 한 다음에야 반영합니다.

    같은 판을 마주 보고 앉히는 구조
    Photo: Natalia Olivera / Pexels

    이유는 단순합니다. 혼자 쓰고 혼자 검토하면 같은 맹점을 두 번 통과시킵니다. 설계할 때 못 본 걸, 그 설계를 한 머리가 다시 볼 리 없잖아요.

    세 역할을 어떻게 나눴나
    머니노트 · 정보·교육·참고용
    표로 보기
    한 대신 셋으로 나눴습니다
    단계 내용 설명
    1단계 만드는 쪽 설계와 코드를 짭니다
    2단계 물어뜯는 쪽 허점과 누락만 찾습니다
    3단계 다시 재는 쪽 원본에서 숫자를 새로 취득
    4단계 그다음 반영 양쪽을 통과한 것만

    두 검증자의 차이가 핵심입니다.

    물어뜯는 쪽은 제 설계 문서를 읽고 “여기 논리가 비었다”를 잡습니다. 강점은 설계 단계예요. 대신 제가 건네준 숫자만 봅니다.

    다시 재는 쪽은 제 결론도, 제 근거도 안 봅니다. 원래 요구사항과 원본 데이터만 주고 처음부터 다시 재게 합니다.

    이 구분이 왜 중요한지는 겪어 봐야 압니다. 제가 숫자를 잘못 뽑아 오면 물어뜯는 쪽은 그 틀린 숫자로 검산해서 저와 함께 통과시켜 버리거든요.

    앞서 나온 84퍼센트가 정확히 그 구조였습니다. 제 계산에는 오류가 없었어요. 비교 대상이 없었을 뿐이죠.

    “막았다”와 “잘 막았다”는 다른 말입니다

    물어뜯는 쪽이 결정적으로 일한 사례를 하나 보겠습니다.

    봇에는 과열된 종목을 안 사게 막는 규칙이 있습니다. 그 규칙이 실제로 도움이 됐는지 채점하는 장치를 만들려고 초안을 썼는데, 걸러 낸 종목만 추적하는 구조였습니다. 걸러 낸 종목이 이후에 떨어졌으면 “잘 막았다”고 채점하는 거죠.

    리뷰 AI가 이걸 차단 판정으로 막았습니다. 지적은 한 줄이었어요. “시장이 빠진 날이면 걸러 낸 종목도 당연히 떨어진다. 그건 인과 오류다.”

    개발기⑨ 마지막에 잠깐 나왔던, 비 오는 날 우산 안 쓰고도 안 젖었다고 우기는 그 이야기가 이겁니다.

    그래서 채점 장치에 실제로 산 종목을 대조군으로 넣었습니다. 같은 잣대로 나란히 놓고, 걸러 낸 쪽이 산 쪽보다 더 떨어졌을 때만 “막은 게 도움이 됐다”고 말하기로요.

    이 장치는 아직 아무 결론을 못 내고 있습니다. 7월 26일까지 기록에 남은, 걸러 낸 종목이 네 개거든요. 인프라만 만들어 놓고 판정은 표본이 쌓인 뒤로 미뤄 뒀습니다.

    리뷰를 건너뛴 날, 무슨 일이 있었나

    이 구조가 처음부터 지켜졌던 건 아닙니다.

    두 달 전, 올해 5월에 설계 문서를 하루에 네 개 연달아 쓴 날이 있었습니다. 그중 두 개는 리뷰를 건너뛰었어요. 간단해 보였거든요. 한 건은 파일 한 개에 열두 줄 추가가 전부였고, 다른 한 건은 조회만 하는 진단이었습니다.

    리뷰를 건너뛴 하루
    머니노트 · 정보·교육·참고용
    표로 보기
    두 건을 건너뛰자 벌어진 일
    시점 사건 설명
    오전 7시 30분 첫 문서 · 리뷰 생략 간단해 보였습니다
    오전 8시 둘째 문서 · 리뷰 생략 원인 가설을 세웠습니다
    오전 8시 15분 가설이 완전 오진단으로 판명 구현 담당이 되돌려 보냈습니다
    오전 10시 외부에서 질문이 들어옴 리뷰는 한 거냐
    오전 10시 5분 의무 복원 이후 두 건은 리뷰 통과 후 진행

    건너뛴 두 건에서 논리 오류가 그대로 나갔습니다. 특히 두 번째는 고장 원인을 짚은 문서였는데 가설이 통째로 틀렸어요. 다음 단계에서 되돌아왔고요.

    의무를 복원한 뒤에 쓴 나머지 두 건은 어땠을까요. 하나는 세 번을 반려당하고 네 번째에 통과했고, 다른 하나는 첫 리뷰에서 차단 사유 5건을 받고 두 번째에 통과했습니다.

    리뷰가 필요 없어서 건너뛴 게 아니었습니다. 필요 없어 보여서 건너뛴 거였죠.

    세 번째 AI가 찾아낸 것들

    다시 재는 쪽 이야기로 돌아가겠습니다. 이 역할은 제 결론을 아예 안 봅니다.

    원본에서 다시 재는 역할
    Photo: Nataliya Vaitkevich / Pexels

    이번 조사에서 이 AI가 한 일은 네 가지였습니다. 제 결론 한 건을 뒤집었고(앞에 나온 그 신호 이야기), 채점의 기준 자체를 지수에서 동료 종목으로 바꾸게 했고, 제 전제 두 건을 정정했고, 조용한 실패 여덟 개를 찾아냈습니다.

    조용한 실패라는 건, 에러도 안 나고 경고도 안 뜨는데 결과만 틀리는 걸 말합니다. 하나만 풀어 보겠습니다.

    날짜를 못 찾으면 오늘 값을 집어 온다
    머니노트 · 정보·교육·참고용

    목록에서 원하는 날짜를 못 찾으면 결과가 마이너스 1로 나옵니다. 그런데 이 자리 표기법에서 마이너스 1은 “맨 끝”을 뜻해요. 못 찾았다는 신호가 그대로 맨 마지막 값, 즉 오늘 종가를 가리키게 되는 거죠.

    과거 시점의 지수를 넣어야 할 자리에 미래 값이 들어갑니다. 그것도 에러 하나 없이요.

    또 하나. 채점할 때 쓰는 “7거래일”이 실은 “데이터 파일에 존재하는 행 7개”였습니다. 파일에 구멍이 있으면 7거래일이 실제로는 최대 26일까지 늘어나 있었고, 실측해 보니 1,335종목 중 5건이 그랬어요.

    그리고 여기서 예상 못 한 일이 하나 더 생겼습니다. 두 쪽의 숫자를 맞춰 보다가 그날 새로 만든 채점기의 버그 두 개가 드러난 겁니다. 봇이 그동안 잘못 채점하고 있었다는 이야기가 아니라, 내보내기 전에 잡혔다는 이야기예요.

    하나는 방향이었어요. “내릴 것”이라고 찍은 예측은 시장보다 내려야 적중인데, 저는 모든 예측을 일률적으로 “시장보다 더 올랐으면 적중”으로 세고 있었습니다. 그래서 그 예측군의 적중률이 정확히 뒤집힌 채로 나왔죠.

    다른 하나는 대상이었습니다. 이 기록에는 미국 종목도 섞여 있었는데, 비교 대상을 국내 종목으로 고정해 뒀습니다. 미국 종목을 한국 동료와 비교하고 있었던 겁니다.

    독립 대조가 잡아낸 내 계산 버그
    머니노트 · 정보·교육·참고용
    표로 보기
    대조하다 제 코드가 틀린 걸 찾았습니다
    어디가 틀렸나 제가 짜 둔 방식 맞는 방식
    적중 판정 시장보다 오르면 적중 내릴 예측은 더 내려야 적중
    비교 대상 전부 국내 종목으로 고정 미국 종목은 미국 동료와

    두 개를 고치고 나니 양쪽 숫자가 정확히 맞아떨어졌습니다. 비교 대상은 결론만 바로잡는 게 아니라, 내 계산기가 고장 났다는 것도 알려 줍니다.

    오해하지 마세요. 이건 AI 검증이 만능이라는 이야기가 아닙니다. 바로 다음 문단이 그 반대 이야기니까요.

    그 물어뜯는 AI가 하루에 세 번 멈췄습니다

    같은 날, 적대 리뷰를 맡은 AI가 응답을 안 했습니다.

    응답 없이 흘러간 시간
    Photo: Towfiqu barbhuiya / Pexels

    리뷰를 넘기면 보통 몇 분 안에 지적이 돌아옵니다. 그날은 화면에 아무것도 뜨지 않았어요.

    그날의 대기 시간
    머니노트 · 정보·교육·참고용
    표로 보기
    리뷰 AI가 멈춘 하루
    항목 설명
    첫 번째 요청 38분 응답 없이 대기
    두 번째 요청 52분 또 멈춤
    같은 날 취소 횟수 3회 전부 포기

    첫 요청은 38분, 두 번째는 52분을 기다리다 취소했습니다. 세 번째는 아예 6분 만에 접었습니다.

    그날 결론을 실제로 바꾼 건 멈추지 않은 나머지 한 쪽이었습니다.

    검증자를 하나만 두면, 그 하나가 멈춘 날은 검증 없이 나갑니다. 그리고 그런 날은 예고 없이 오죠.

    제가 이 조사에서 틀린 것 일곱 가지

    정직하게 적어 두겠습니다. 이 조사 하나에서 제 판단이 일곱 번 틀렸습니다.

    틀린 것을 그대로 적어 두는 이유
    Photo: Jahra Tasfia Reza / Pexels

    “채점기가 없다”고 보고했는데 있었습니다 — 파일 이름 규칙만 보고 찾아서 못 봤어요. “이 장치는 한 번도 안 돌았다”고 했는데 매일 돌고 있었습니다 — 들어오는 데이터가 그 형식이 아니었을 뿐이죠. 필요한 계산 도구가 서버에 없다고 전제하고 설계를 짰는데, 이미 설치돼 있었고요.

    일곱 건 중 결론을 바꾼 것
    머니노트 · 정보·교육·참고용
    표로 보기
    일곱 건 중 둘이 결론을 바꿨습니다
    항목 설명
    결론을 바꾼 오류 다시 재니 답이 반대로 2
    방향은 맞았던 오류 고쳐도 결론은 그대로 5

    일곱 건 중 다섯은 창피한 수준에서 끝났습니다. 그런데 두 건은 봇이 갈 방향 자체를 바꿨어요. 앞에서 본 그 신호 이야기와, 비교 대상을 지수에서 동료 종목으로 바꾼 것이 그 둘입니다.

    그리고 둘 다 제가 아니라 다른 AI가 잡았습니다.

    한 가지만 더 짚겠습니다. 그중 그 신호 이야기는 하루 뒤 다시 원래 자리로 돌아왔습니다. 제 최초 결론이 결과적으로는 맞았던 셈이죠.

    그럼 왕복이 헛수고였을까요. 아닙니다. 돌아오기 전의 저는 옳은 답을 틀린 이유로 갖고 있었거든요. 절대 수익률만 보고 “차이가 없다”고 한 판단은, 시장이 반대로 움직인 기간이었으면 그대로 틀렸을 겁니다.

    맞은 답과 맞는 방법은 다른 이야기입니다. 그 왕복까지가 검증이고요.

    그래서 내 계좌에는 무슨 뜻일까요

    봇 이야기로 시작했지만, 이건 계좌를 가진 사람 모두의 이야기이기도 합니다.

    적중률 84퍼센트, 수익률 플러스 30퍼센트, 여덟 번 연속 적중. 이런 숫자는 어디서든 볼 수 있죠. 상품 소개서에도, 영상 섬네일에도, 가끔은 제 계좌 앱에도요.

    그 숫자들 자체는 대체로 사실입니다. 문제는 옆자리가 비어 있다는 것이고요.

    숫자를 볼 때 물어볼 세 가지
    머니노트 · 정보·교육·참고용
    표로 보기
    숫자 앞에서 세 가지만 물어보세요
    단계 내용 설명
    1단계 같은 기간 시장은 지수가 얼마나 오르고 내렸나
    2단계 그 시장을 뭘로 쟀나 지수인지 평균 종목인지
    3단계 몇 건짜리인가 열 건과 천 건은 다른 말

    같은 기간에 시장이 25퍼센트 올랐다면, 수익률 30퍼센트는 5퍼센트짜리 성적입니다. 시장이 5퍼센트 빠진 기간이었다면 같은 30퍼센트가 35퍼센트짜리 성적이 됩니다.

    그리고 이건 남 얘기로 끝나지 않습니다. 그 숫자를 보고 사람들이 돈을 넣고, 그 돈이 들어간 만큼 값이 오르고, 뒤늦게 따라 들어간 사람이 조정을 맞습니다. 그 뒤늦은 사람이 나일 확률이 제일 높죠.

    시장이 통째로 오른 해에는 거의 모두가 좋은 성적표를 들고 있습니다. 그 시기에 판단을 잘못 배우면, 시장이 멈춘 해에 청구서가 옵니다.

    사흘 뒤, 같은 채점기를 다시 돌렸습니다

    이 글을 쓰는 사이에 사흘이 지났습니다. 그래서 7월 29일에 똑같은 채점기를 한 번 더 돌려 봤어요.

    사흘 만에 표본이 세 배가 됐습니다
    머니노트 · 정보·교육·참고용
    표로 보기
    사흘 만에 표본이 세 배가 됐습니다
    이벤트 파급 트랙 7월 26일 7월 29일
    수혜 예측 69건 · 26.1% 142건 · 22.5%
    타격 예측 31건 · 83.9% 103건 · 78.6%
    타격 고유 종목 13개 26개

    84퍼센트는 78.6퍼센트가 됐습니다. 고유 종목은 13개에서 26개로 늘었지만 기준선 30개에는 아직 못 미칩니다. 앞에서 한 이야기는 사흘 뒤에도 그대로였어요.

    그런데 표본이 쌓이면서 못 하던 판정이 가능해진 트랙이 생겼습니다. 수혜 예측 쪽이에요.

    고유 종목이 42개로 기준선을 넘었고, 비슷한 조건의 동료 종목과 견줘 보니 3.85퍼센트포인트 더 나빴습니다. 우연일 확률은 0.45퍼센트고요.

    사흘 전엔 “차이 없음”이었습니다. 지금은 “맞히지 못한 정도가 아니라 반대로 갔다” 입니다.

    이게 이 글에 날짜를 박아 둔 이유입니다. 숫자 옆에 날짜가 없으면, 그 숫자는 언젠가 거짓말이 됩니다.

    정리 — 이번 편에서 배운 것

    • 비교 대상이 없는 숫자는 아직 아무것도 증명하지 않았습니다. 84퍼센트는 실력이 아니라 그 기간 시장의 낙폭이었어요.
    • 무엇을 비교 대상으로 삼느냐가 결론을 뒤집습니다. 같은 7거래일이 잣대에 따라 마이너스 8.97에서 플러스 3.90까지 갈렸습니다.
    • 비교 대상은 신호를 숨기기도 하고, 없는 신호를 만들어 내기도 합니다. 붙였다는 것만으로는 부족했어요.
    • 표본이 몇 건인지가 아니라 몇 개인지를 세야 합니다. 레코드 31건이 실제로는 종목 13개였습니다.
    • 혼자 쓰고 혼자 검토하면 같은 맹점을 두 번 통과시킵니다. 그래서 만드는 쪽과 물어뜯는 쪽, 다시 재는 쪽을 갈라놨습니다.
    • 검증자를 하나만 두면 그가 멈춘 날은 검증 없이 나갑니다. 실제로 하루에 세 번 멈췄죠.

    돌아보면 이번 사고는 개발기④의 안전장치 이야기나 개발기⑨의 헛돈 장치들과 결이 다릅니다. 저건 고장이었고, 이건 고장이 아니었거든요.

    코드는 정확했고, 계산도 맞았고, 숫자도 진짜였습니다. 틀린 건 그 숫자 옆에 아무것도 놓지 않은 저였어요.

    혹시 지금 들고 계신 종목이나 펀드가 있다면, 본인의 수익률이 같은 기간 지수보다 나았는지 알고 계신가요? 저는 이번에 그걸 안 재고 84퍼센트를 강점이라고 부르고 있었거든요.

    다음 글 예고 — 0건이 6건이 된 날

    여기까지는 계속 “숫자가 거짓말을 했다”는 이야기였습니다. 그런데 개발기 ④에서 “매도 주문 26건 중 성공 0건”이라고 써 둔 대목이 있는데, 그게 깨졌거든요.

    다음 편은 그 이야기입니다. 계좌에 남아 있던 팔 수 없는 주식 여섯 종목이 5분 만에 정리된 날이요. 그 뒤로 관찰 장치 스물다섯 개를 전부 열어 보는 이야기도 이어서 하겠습니다.

    ▶ 다음 편 예고
    매도 성공 0건이 6건이 된 날 — 계좌의 유령이 사라졌습니다
    고쳤다는 말은 고쳐졌다는 증거가 아니었습니다. 증권사 계좌라는 바깥에서 숫자가 바뀌기 전까지는요.

    다음 글 읽기 →

    이 글은 특정 종목의 매수·매도를 권유하는 글이 아니라, 개인이 만든 시스템의 개발·검증 과정을 공유하는 정보·교육·참고용 글입니다. 본문의 수익률·적중률 수치는 시스템 검증 과정을 설명하기 위한 과거 기록이며 미래 성과를 보장하지 않습니다. 투자 판단과 책임은 본인에게 있습니다.


    근거: 지시문 1101 — 관찰 트랙 25개 전수 채점 · 지시문 1085 — 게이트B 차단군 대 매수군 대조 채점 · 지시문 953 — 이벤트 파급 적중률 · 지시문 884 — 외국인 순매수 트랙 · Codex 리뷰 누락 사고 725·726 — 본 글은 개발·운영 과정의 경험 공유이며 투자 자문이 아닙니다.

  • 시장이 무너진 날, 봇은 무엇을 했을까 — 개발기 ⑨ 안전장치 네 개가 한꺼번에 헛돌았습니다

    시장이 무너진 날, 봇은 무엇을 했을까 — 개발기 ⑨ 안전장치 네 개가 한꺼번에 헛돌았습니다

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

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

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

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

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

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

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

    급락 이틀의 성적표
    머니노트 · 정보·교육·참고용
    표로 보기
    이틀 만에 이렇게 밀렸습니다
    항목 설명
    트랙 전체 급락 구간 낙폭 -7.37%
    가장 크게 밀린 종목 보유 12종 중 최악 -15.1%

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

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

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

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

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

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

    봇이 본 값과 실제 값
    머니노트 · 정보·교육·참고용
    표로 보기
    봇이 본 손실과 진짜 손실
    항목 설명
    봇이 판정에 쓴 값 전날인 7월 1일 종가 기준 -3.7%
    그날의 실제 값 7월 2일 종가 기준 -12.4%

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

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

    손절이 늦게 걸린 과정
    머니노트 · 정보·교육·참고용
    표로 보기
    손절선은 있는데 왜 안 걸렸나
    단계 내용 설명
    1단계 오늘 장이 크게 빠진다 주가가 마이너스 12퍼센트대로 밀림
    2단계 봇은 어제 가격표를 편다 전날 마감 뒤 만들어 둔 파일
    3단계 아직 여유 있다고 판단한다 어제 기준으로는 마이너스 3.7퍼센트
    4단계 다음날에야 잘린다 그 사이 손실은 더 커진다

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

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

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

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

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

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

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

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

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

    있는 줄 알았던 장치가 없었다
    머니노트 · 정보·교육·참고용
    표로 보기
    있다고 믿었던 장치의 실제 상태
    서킷 브레이커 믿고 있던 것 실제로 확인한 것
    연속 손실 세기 정확히 세고 있다 정확히 세고 있었다
    그 숫자를 쓰는 곳 손실이 쌓이면 매수를 멈춘다 읽는 코드가 한 군데도 없었다
    화면의 상태 표시 지금 상태를 보여준다 늘 같은 글자가 박혀 있었다

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

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

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

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

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

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

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

    같은 장치를 켜고 끈 이유
    머니노트 · 정보·교육·참고용
    표로 보기
    고치자마자 다시 끈 이유
    시점 사건 설명
    고친 날 배선을 실제로 이었습니다 세 번 연속 손실이면 신규 매수를 잠급니다
    켠 당일 한 번 걸렸습니다 신규 매수 정지
    나흘 뒤 또 한 번 걸렸습니다 다시 신규 매수 정지
    그다음 다시 껐습니다 매매가 멈추면 잴 데이터도 안 쌓입니다

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

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

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

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

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

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

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

    이름표가 안 맞아 생긴 사각지대
    머니노트 · 정보·교육·참고용
    표로 보기
    청산 규칙이 닿지 않는 자리
    단계 내용 설명
    1단계 이벤트를 보고 산다 봇이 이벤트 이름표를 붙임
    2단계 명단에서 찾는다 성적표에는 다른 형식으로 적혀 있음
    3단계 못 찾으니 판단 보류 테마 약세 청산이 발동 안 함
    4단계 12종 중 8종이 사각지대 그대로 계속 보유됨

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

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

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

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

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

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

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

    헛돌던 네 가지
    머니노트 · 정보·교육·참고용
    표로 보기
    급락 하나가 드러낸 네 개의 구멍
    무엇이 헛돌았나 무슨 일이 있었나 그래서 어떻게 됐나
    늦은 눈 어제 종가로 오늘을 판정 손절이 뒤늦게 걸렸다
    끊긴 배선 서킷 숫자를 쓰는 곳이 없음 연속 손실에도 계속 매수
    안 맞는 이름표 테마 명단에서 종목을 못 찾음 12종 중 8종 청산 사각지대
    몰아 사기 하루 8종목 일괄 매수 이틀 만에 현금 94% 소진

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

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

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

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

    크게 밀린 종목들의 공통점은 “산 바로 다음 날 갭 하락”이었습니다. 갭 하락은 장이 열리자마자 전날보다 훨씬 낮은 가격에서 시작하는 걸 말합니다. 어제 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단계 쓰면서 표본을 쌓는다 앞으로의 결과로 다시 판정

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

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

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

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

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

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

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

    막았다고 잘 막은 건 아니다
    머니노트 · 정보·교육·참고용
    표로 보기
    막았다와 잘 막았다는 다른 말
    단계 내용 설명
    1단계 걸러 낸 종목을 따로 모은다 규칙이 사지 말라고 한 것들입니다
    2단계 실제로 산 종목도 같이 모은다 규칙을 통과해 매수한 것들 · 비교 대상이 됩니다
    3단계 같은 방식으로 이후를 추적한다 둘의 성적을 같은 잣대로 잽니다
    4단계 표본이 쌓이면 채점한다 지금은 걸러 낸 종목 4개 · 아직 판정 불가

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

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

    정리 — 급락장이 알려 준 것

    • 손절선은 있었지만, 그 선을 재는 자가 하루 묵어 있었습니다. 기준보다, 기준을 재는 도구가 먼저입니다.
    • 서킷 브레이커는 표시등만 있고 배선이 없었습니다. “있다”와 “작동한다”는 다른 말입니다.
    • 이름표가 안 맞아 12종 중 8종이 청산 사각지대였습니다. 규칙이 멀쩡해도 종목에 가 닿지 못하면 없는 것과 같습니다.
    • 이번 손실의 원인은 파는 쪽보다 사는 쪽에 있었습니다. 갭 하락은 손절선이 건너뜁니다.
    • 좋아 보인 해법도 “효과 있다”고 말하지 않았습니다. 실험 트랙에 켜 두고 비교 대상과 함께 재는 중입니다.

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

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

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

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

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

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

    여러분의 계좌는 급락장에서 어떻게 움직였나요? 그때 미리 정해 둔 규칙이 있으셨는지 궁금합니다.

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

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


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

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

  • 봇을 만들다, 정작 제가 바뀌었습니다 — 개발기 ⑧ 봇이 가르쳐 준 투자 심리

    봇을 만들다, 정작 제가 바뀌었습니다 — 개발기 ⑧ 봇이 가르쳐 준 투자 심리

    솔직히 고백하겠습니다. 저는 봇에게 시킨 규칙을, 정작 제 돈으로는 단 하나도 못 지키던 사람이었습니다.

    “손실이 이 선에 닿으면 무조건 팔아라.” 봇에게는 이렇게 코드로 못을 박아 두면서, 제 계좌에서는 그 선을 몇 번이고 그냥 지나쳤거든요. “조금만 더 기다리면 오르겠지” 하면서요.

    지난 개발기⑦에서는 봇에게 어디까지 맡기고 어디는 끝까지 안 맡기는지, 그 경계를 이야기했습니다. 오늘은 조금 부끄러운 이야기입니다 — 봇을 가르치다가, 거꾸로 봇이 저를 가르친 이야기.

    거울 앞의 투자자
    Photo: cami / Pexels

    봇에게 시킨 규칙이, 전부 제가 못 하던 것이었습니다

    봇을 만들며 안전장치를 하나씩 넣다 보니 이상한 걸 깨달았습니다. 제가 봇에게 시키는 규칙이 하나같이 “사람이라면 흔들릴 바로 그 순간에 지켜야 하는 것”이더군요.

    봇에게 시킨 세 가지 규칙
    머니노트 · 정보·교육·참고용
    표로 보기
    봇에게 시킨 세 가지 규칙
    항목 설명
    손실이 정해진 선에 닿으면 손절 무조건 판다
    이익이 났을 때 익절 서둘러 팔지 않는다
    연달아 잃으면 멈춤 새로 사는 걸 멈춘다

    세 가지 다 어렵습니다. 그런데 어려운 방향이 사람마다 정반대라는 게 오늘 이야기의 핵심입니다. 하나씩 볼게요.

    규칙 ① 손절 — 사람은 손실을 못 자릅니다

    첫 번째는 손절입니다. 봇은 손실이 정해진 선에 닿으면 봐주는 것 없이 팝니다. 종목 크기에 따라 대략 마이너스 6에서 10퍼센트 선이죠. 여기엔 “이번엔 좀 봐줄까?” 하는 칸이 아예 없습니다.

    사람은 정확히 그 반대입니다. 손실이 난 종목일수록 더 못 팝니다. “팔면 손해가 확정되니까, 오를 때까지 버티자”는 마음이 들거든요. 심리학에서는 이걸 손실 회피라고 부릅니다 — 100을 잃는 아픔이 100을 버는 기쁨보다 훨씬 크게 느껴지는 성질입니다.

    사람의 버릇과 봇의 규칙
    머니노트 · 정보·교육·참고용
    표로 보기
    손실 앞에서, 사람과 봇은 정반대입니다
    단계 내용 설명
    1단계 손실이 선에 닿는다 정해 둔 손절 가격에 도달
    2단계 사람은 망설인다 조금만 더 기다리면 오를 것 같다
    3단계 봇은 그냥 판다 규칙이 즉시 실행한다

    봇에게 이 규칙을 심으면서, 저는 제가 그동안 손절을 못 해서 작은 손실을 큰 손실로 키워 왔다는 걸 인정하게 됐습니다. 봇은 그냥 시킨 대로 자를 뿐인데, 그 담담함이 저에겐 없던 거죠.

    그런데 여기서 반전이 하나 나옵니다. 손절은 그렇다 치고, 봇은 정말 사람보다 늘 현명했을까요? 아니었습니다. 봇도 사람과 똑같은 실수를 하고 있었습니다.

    규칙 ② 익절 — 봇조차 이익을 너무 빨리 팔고 있었습니다

    두 번째는 익절, 즉 이익을 실현하는 문제입니다.

    여기서 저는 제 손으로 만든 봇에게 뒤통수를 맞았습니다. 초기의 봇은 이익이 어느 정도 나면 가진 물량의 대부분을 서둘러 팔아 치우도록 짜여 있었거든요. “이익 났을 때 얼른 챙기자”는, 딱 사람이 하는 생각 그대로였습니다. 제가 무심코 제 조급함을 코드에 심어 둔 겁니다.

    그런데 이 봇의 매매를 가상으로 되짚어 검증해 봤더니, 뜻밖의 방향이 드러났습니다.

    봇도 이익을 서둘러 잘라먹고 있었다
    머니노트 · 정보·교육·참고용
    표로 보기
    봇의 조기익절이 이익을 갉아먹고 있었습니다
    단계 내용 설명
    1단계 이익이 조금 난다 목표에 닿자마자
    2단계 대부분 서둘러 판다 남길 몫까지 함께 정리
    3단계 더 오를 자리를 놓친다 상방을 스스로 접는다

    검증에서 분명해진 건 딱 한 방향이었습니다 — 이익을 서둘러 자르는 습관은 손해 쪽에 가깝다는 것. 반대로 이익을 서두르지 않고 일부는 남겨 추세를 더 태우는 쪽이 나았습니다. 그래서 봇의 청산 원칙을 이 방향으로 잡았습니다 — 목표에 닿아도 전부 팔지 않고, 일부는 남겨 추세가 살아있는 동안 더 들고 가도록요.

    다만 이건 과거 데이터로 되짚은 검증이라 미래 수익을 보장하는 공식이 아닙니다. 실제 적용도 한 번에 확 바꾸지 않고, 데이터를 더 쌓아 가며 조심스럽게 다듬는 중입니다.

    여기서 저는 두 번째 교훈을 얻었습니다. 사람이 이익 앞에서 조급해지는 건 기분 탓이 아니라 뿌리 깊은 습관이라, 코드를 짜는 제 손끝에도 그대로 묻어났다는 것. 봇의 검증이 그 습관을 거꾸로 저에게 비춰 준 셈입니다.

    사람과 봇, 방향이 정확히 반대였습니다

    손절과 익절을 나란히 놓으면 재밌는 그림이 그려집니다.

    사람의 본능과 봇의 규칙은 정반대
    머니노트 · 정보·교육·참고용
    표로 보기
    사람과 봇은 정반대 방향입니다
    항목 설명
    이익은 빨리 판다 사람의 본능 손실은 늦게 자른다
    이익은 늦게까지 들고 간다 봇의 규칙 손실은 빨리 자른다
    본능을 뒤집은 규칙 봇의 설계 감정을 계산에서 뺐다

    사람은 이익은 빨리 챙기고 손실은 오래 붙듭니다. 봇의 규칙은 그 반대죠 — 이익은 늦게까지 들고 가고, 손실은 빨리 자릅니다. 행동경제학에서 사람의 이 버릇을 처분 효과라고 부르는데, 봇을 만들며 저는 이 이름을 머리가 아니라 제 계좌로 이해하게 됐습니다.

    그런데 아직 규칙이 하나 남았습니다. 손절도 익절도 아닌, 잃고 난 직후의 마음에 관한 겁니다.

    규칙 ③ 멈춤 — 잃으면 사람은 흥분합니다

    세 번째는 서킷 브레이커입니다. 봇은 연달아 잃거나 하루에 크게 빠지면, 그날은 새로 사는 걸 멈춥니다. 구체적으로는 세 번 연속 손실이 나거나 하루 손실이 마이너스 3퍼센트에 닿으면 새 매수를 잠급니다.

    왜 이런 걸 넣었을까요? 사람은 잃고 나면 차분해지는 게 아니라 흥분하기 때문입니다. “방금 잃은 걸 당장 만회해야겠다”는 마음에 평소보다 더 크게, 더 급하게 베팅하게 되죠. 잃을수록 판돈을 키우는 이 습관이 계좌를 가장 빨리 망가뜨립니다.

    잃은 직후, 멈추게 만드는 장치
    머니노트 · 정보·교육·참고용
    표로 보기
    잃은 직후에 강제로 멈추는 장치
    단계 내용 설명
    1단계 연달아 잃는다 세 번 연속 손실 또는 하루 마이너스 3퍼센트
    2단계 새 매수를 잠근다 그날은 더 사지 않는다
    3단계 흥분을 식힌다 만회 매매를 규칙이 막는다

    봇에게는 이게 그냥 한 줄의 조건문입니다. 하지만 사람에게 “잃었을 때 오늘은 더 사지 마”라고 말하면, 그 말을 지키기가 얼마나 어려운지 저는 잘 압니다. 봇은 감정이 없어서 쉽게 멈추는 게 아니라, 감정을 아예 계산에 넣지 않도록 설계돼서 멈추는 겁니다.

    정리 — 봇을 가르치다, 제가 배웠습니다

    • 손절: 봇은 정해진 선에서 무조건 자릅니다. 사람은 손실을 못 잘라 작은 손실을 키웁니다.
    • 익절: 봇조차 처음엔 이익을 서둘러 팔았고, 검증해 보니 그게 손해 쪽에 가까웠습니다. 서두르지 않는 방향으로 다듬는 중입니다.
    • 멈춤: 봇은 연달아 잃으면 그날 매수를 멈춥니다. 사람은 잃을수록 흥분해 판돈을 키웁니다.

    돌아보면 저는 봇에게 좋은 투자 습관을 가르치려 했는데, 정작 그 규칙들을 코드로 옮겨 적으면서 제가 그동안 얼마나 그 반대로 살아왔는지를 마주하게 됐습니다. 봇은 감정이 없어서 규칙을 지키는 게 아니라, 규칙을 지키도록 감정을 뺀 자리에 만들어졌을 뿐입니다.

    그러니 이 규칙들은 사실 봇을 위한 게 아니었는지도 모릅니다. 흔들리는 사람을 대신해, 흔들리지 않는 손 하나를 옆에 두는 것 — 제가 봇을 만들며 진짜로 배운 건 그거였습니다.

    ※ 위 손절·서킷 기준 같은 수치는 이 시스템의 설정값을 설명하기 위한 것이며, 특정 매매를 권하는 기준이 아닙니다.

    다음 글 예고 — 시장이 무너진 날, 봇은 무엇을 했을까

    규칙과 심리 이야기는 여기까지입니다. 그런데 이 모든 안전장치가 진짜 시험대에 오르는 날이 있습니다. 바로 시장 전체가 하루아침에 무너지는 급락장이죠.

    다음 편에서는 시장이 크게 빠진 어느 날, 이 봇이 실제로 어떻게 움직였고 무엇을 놓쳤는지를 솔직하게 풀어보겠습니다.

    여러분은 스스로 정한 투자 규칙을 지키고 계신가요? 저는 봇에게는 시키면서 정작 제가 못 지켰습니다.

    ▶ 다음 편 예고
    시장이 무너진 날, 봇은 무엇을 했을까 — 급락장 대응
    모든 안전장치가 한꺼번에 시험대에 오른 날. 봇은 잘 버텼을까요, 아니면 또 넘어졌을까요.

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


    근거: V2_진화루프_조기익절_누수 · 4대_안전_백스톱 · AI와_규칙의_역할분담 — 본 글은 개발·운영 과정의 경험 공유이며 투자 자문이 아닙니다.

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

  • AI에게 조금씩 더 맡기고 있습니다 — 개발기 ⑦ 단, 이 선만은 안 넘깁니다

    AI에게 조금씩 더 맡기고 있습니다 — 개발기 ⑦ 단, 이 선만은 안 넘깁니다

    질문 하나로 시작하겠습니다. 이 봇은 새로 주식을 살 때, 열 번 중 몇 번을 AI가 결정할까요?

    지금은 아홉 번입니다. 그런데 처음 이 시스템을 만들 때는, 단 한 번도 안 맡겼습니다. 0번이었죠.

    지난 개발기⑥에서는 이 봇을 한 달 굴리는 데 돈이 어디서 새는지를 뜯어봤습니다. 오늘은 조금 다른 이야기입니다 — 0번에서 9번으로, 봇에게 맡기는 경계를 어떻게 옮겼는지. 그리고 아무리 시간이 흘러도 절대 안 옮긴 선은 무엇인지.

    사람과 로봇이 함께 손잡이를 잡다
    Photo: Tara Winstead / Pexels

    처음엔 한 번도 안 맡겼습니다

    시스템을 만들기 시작할 때 제 원칙은 딱 한 줄이었습니다. “AI는 참고만. 결정은 규칙이.”

    이유는 개발기 에서 자세히 풀었습니다. AI는 똑똑하지만 변덕을 부리고, 모르는 것도 그럴듯하게 지어내니까요. 그런 성격에 내 돈의 결정을 통째로 맡기는 건 무서웠습니다.

    그래서 초기의 봇은 AI에게 “이 종목 어때?”라고 물어보긴 해도, 그 대답을 참고 자료로만 썼습니다. 실제로 사고파는 결정은 처음부터 끝까지 사람이 짠 규칙이 내렸죠. AI는 회의실에 앉아 의견을 내는 사람이었을 뿐, 방아쇠는 만지지 못했습니다.

    그런데 시간이 지나면서, 저는 이 선을 조금씩 옮기게 됩니다.

    지금은 아홉 번을 맡깁니다 — 경계가 움직였습니다

    먼저 지금 상태부터 숫자로 보여드릴게요.

    처음엔 0번, 지금은 9번
    머니노트 · 정보·교육·참고용
    표로 보기
    처음엔 0번, 지금은 9번 맡깁니다
    항목 설명
    처음에 AI가 내린 결정 수 0번 참고만 하고 결정은 규칙이
    지금 AI가 내리는 결정 수 9번 열 번 중 아홉 번입니다
    AI가 판단하는 구간의 비율 94퍼센트 시장은 대부분 애매하다

    왜 이렇게 바뀌었을까요? 개발기 에서 다뤘듯, 실제 시장은 대부분 “사도 될 것 같기도, 아닌 것 같기도 한” 애매한 얼굴을 하고 있었습니다. 딱 떨어지게 좋거나 딱 떨어지게 나쁜 종목은 드물었죠.

    그 애매한 구간에서 “이건 살 만하고, 저건 넘기자”를 가려주는 일 — 그게 제가 AI에게 맡겨 보기로 한 자리였습니다. 그래서 애매한 판단만 AI에게 넘기다 보니, 어느새 새 진입의 열에 아홉이 AI 손을 거치게 된 겁니다.

    여기서 궁금한 게 하나 생깁니다. AI가 그렇게 쓸모 있다면, 왜 한꺼번에 “이제부터 다 네가 결정해”라고 안 했을까요?

    그런데 왜 한꺼번에 안 맡겼을까요?

    이게 이 봇을 만들며 가장 조심한 부분입니다. 저는 경계를 한 번에 확 옮기지 않았습니다. 계단을 오르듯 한 칸씩 옮겼습니다.

    경계는 한 번에 안 옮겼습니다
    머니노트 · 정보·교육·참고용
    표로 보기
    경계는 한 칸씩 옮겼습니다
    단계 내용 설명
    1단계 0단계 AI는 참고만·결정은 규칙이
    2단계 1단계 지금 애매한 구간의 판단을 AI에게
    3단계 2단계 다음 타이밍과 비중까지 맡길 후보
    4단계 먼 단계 사람 대신 팀처럼 주도하는 목표

    이렇게 나눈 데는 이유가 있습니다. 저는 이미 봇을 너무 믿었다가 데인 적이 여러 번 있거든요. 개발기 에서는 첫 모의투자 성적표가 처참했고, 개발기 에서는 봇이 멀쩡히 체결된 주문을 “실패”라 우겼습니다. 개발기 에서는 사람이 안 보는 사이 봇이 조용히 몇 주씩 고장 나 있기도 했죠.

    그런 경험이 저를 겁쟁이로 만든 게 아니라 신중하게 만들었습니다. 그래서 다음 단계로 올라가는 조건을 기분이 아니라 데이터로 정했습니다.

    증거가 쌓여야 다음 칸을 엽니다
    머니노트 · 정보·교육·참고용
    표로 보기
    증거가 쌓여야 다음 칸을 엽니다
    항목 설명
    다음 단계 전 필요한 매매 기록 수 20건 이상 충분히 겪어봐야 안다
    그 기록이 넘어야 할 문턱 승률 55퍼센트 운에만 기대지 않았는지 본다
    백테스트와 실측을 대조 검증 통과 숫자로 확인된 뒤에만

    “매매를 스무 건은 넘겨 보고, 그중 절반을 웃도는 성적(승률 55퍼센트)을 냈는지 확인한 다음에야 다음 칸을 연다.” 이런 식입니다. 성급하게 건너뛰지 않는 것 — 그게 봇에게 권한을 주는 첫 번째 규칙이었습니다.

    그리고 여기에 하나가 더 있습니다. 데이터가 그 조건을 채웠다고 해서 봇이 스스로 다음 칸을 열지는 않습니다. 조건이 갖춰져도, 실제로 단계를 한 칸 올릴지는 마지막에 사람이 결정합니다. 자동화된 시스템이지만, “이제 더 맡겨도 되겠다”는 그 판단만은 사람 몫으로 남겨 둔 거죠.

    그런데 여기서 더 중요한 게 있습니다. 경계가 아무리 위로 올라가도, 아예 손대지 않기로 못 박은 선이 따로 있거든요.

    아무리 똑똑해져도 못 넘는 선

    봇이 앞으로 훨씬 똑똑해져서 언젠가 사람처럼 주도적으로 판단하게 되더라도, 끝까지 AI에게 안 넘기기로 한 안전장치가 있습니다.

    아무리 똑똑해져도 못 넘는 선
    머니노트 · 정보·교육·참고용
    표로 보기
    아무리 똑똑해져도 못 넘는 선
    항목 설명
    시장이 위기면 새로 안 산다 거시 신호등 유가·환율·금리·공포지수 임계값
    연달아 잃으면 멈춘다 서킷 브레이커 3연속 손실 또는 하루 마이너스 3퍼센트
    정해진 선에 닿으면 판다 손절 하드캡 종목 크기별 마이너스 6에서 10퍼센트
    위기·손절을 작동시키는 핵심 코드 안전장치 코드 사람이 짠 규칙이 관리한다

    이 넷은 어느 단계로 올라가든 절대 안 바꾸기로 한 것들입니다.

    • 거시 신호등 — 유가·환율·금리·공포지수가 위험한 선을 넘으면, 시장 전체가 위기라는 뜻이라 새로 사는 걸 규칙이 막습니다.
    • 서킷 브레이커 — 연달아 잃거나 하루에 크게 빠지면, 봇이 흥분해 폭주하지 못하게 규칙이 멈춰 세웁니다.
    • 손절 하드캡 — 손실이 정해진 선에 닿으면, 봐주는 것 없이 규칙이 팝니다.
    • 안전장치 코드 — 위 세 안전장치를 실제로 작동시키는 핵심 코드는, AI가 아니라 규칙이 관리합니다.

    이유는 개발기 에서 말한 것과 같습니다 — 안전장치가 상황을 봐가며 변덕을 부리면, 그건 이미 안전장치가 아니니까요. 흔들릴 만한 순간일수록, 판단은 빼고 규칙만 남겨야 합니다.

    AI가 고르고, 방아쇠는 규칙이 당깁니다

    그래서 지금 이 봇의 경계는 정확히 이렇게 생겼습니다.

    AI가 고르고 방아쇠는 규칙이 당깁니다
    머니노트 · 정보·교육·참고용
    표로 보기
    AI가 고르고, 방아쇠는 규칙이 당깁니다
    단계 내용 설명
    1단계 AI가 후보를 고른다 애매한 구간을 판단
    2단계 안전 백스톱을 통과한다 위험 신호가 없어야 다음
    3단계 규칙이 실제 주문을 낸다 마지막 방아쇠는 알고리즘

    사실 지금 AI의 판단은 실제 돈이 0원인 모의계좌에서 검증받는 중입니다. 다만 종이 위에서 “이렇게 샀다면 어땠을까”를 세어보기만 하는 건 아닙니다. 증권사로 진짜 주문이 나가고 실제로 체결됩니다 — 돈만 가짜일 뿐, 주문이 오가는 길은 실전과 똑같이 씁니다. 그래서 실전에서야 터졌을 사고를 미리 겪어볼 수 있고, 방아쇠를 당기는 마지막 손은 여전히 규칙 쪽에 있습니다.

    말하자면 AI는 회의실에서 “이거 삽시다”라고 손을 드는 참모이고, 그 결정이 안전장치를 다 통과해야 실제 주문으로 이어집니다. 참모에게 점점 더 많은 판단을 맡기더라도, 위기에 브레이크를 밟는 손만은 끝까지 규칙 쪽에 둡니다.

    정리 — 경계는 움직이되, 선은 남깁니다

    • 처음엔 AI에게 결정을 0번 맡겼습니다. “AI는 참고만, 결정은 규칙”이었죠.
    • 지금은 애매한 구간이 시장의 대부분이라, 새 진입의 열에 아홉을 AI 손이 거칩니다.
    • 그 경계를 한 번에 옮기지 않고, 매매 기록과 승률 같은 데이터가 쌓여야 한 칸씩 올렸습니다.
    • 그래도 거시 신호등·서킷·손절 같은 안전장치는 어느 단계에서도 AI에게 안 넘깁니다. 지금은 실제 주문을 내는 일까지 규칙이 맡고 있고요.

    돌아보면 “AI에게 맡길까 말까”는 애초에 반쪽짜리 질문이었습니다. 진짜 질문은 “경계를 어디까지, 얼마나 천천히 옮기고, 무엇은 끝까지 안 옮기느냐” 였습니다. 봇에게 판단을 점점 더 맡기면서도, 위기에 멈춰 세우는 안전장치만은 끝까지 규칙에게 남겨 두는 것 — 그 아슬아슬한 균형을 지금도 계속 다듬고 있습니다.

    다음 글 예고 — 봇을 만들다, 정작 내가 바뀐 이야기

    봇에게 규칙을 가르치다 보니, 이상하게도 제 자신의 투자 습관이 먼저 부끄러워졌습니다. “손실이 이 선에 닿으면 무조건 판다”를 봇에게는 시키면서, 정작 저는 그걸 한 번도 못 지켰거든요.

    다음 편에서는 봇을 만들며 제가 사람의 투자 심리에 대해 새로 배운 것들을 풀어보겠습니다.

    여러분이라면 사람과 기계의 경계를 어디에 그으시겠어요? 저는 그 선을 몇 번이나 다시 그었습니다.

    ▶ 다음 편 예고
    봇을 만들다, 정작 내가 바뀐 이야기 — 사람의 투자 심리
    봇에게는 시키면서 나는 못 지킨 규칙들. 봇이 거꾸로 사람을 가르친 이야기입니다.

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


    근거: 스톡봇_진화_로드맵 · AI와_규칙의_역할분담 · 4대_안전_백스톱 — 본 글은 개발·운영 과정의 경험 공유이며 투자 자문이 아닙니다.

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