"[260911] 이관 방지 플래그가 다른 계좌 매물을 잘못 건드린 사고"
한쪽 계좌 재매수를 막으려고 걸어둔 플래그가 전역으로 적용되면서, 방금 이관받은 다른 계좌 종목을 도로 강제매도시키고 있었습니다. 같은 날 성능 최적화 자동화 도구도 하나 새로 완성했습니다.
이관 방지 플래그가 엉뚱한 계좌를 건드렸다
어제와 오늘 이틀에 걸쳐 기존 계좌에서 새 계좌로 종목 실물 이관을 진행했습니다.
이관할 때 기존 계좌 쪽에는 "이미 내보낸 종목을 다시 사들이지 말라"는 방지 플래그를 걸어둡니다. 이관 취지에 맞게 그 계좌가 같은 종목을 도로 사들이는 걸 막기 위한 장치입니다.
오늘 아침 저널을 훑다가 이 플래그가 실제로는 계좌별로 분리된 게 아니라 시스템 전체가 공유하는 파일 하나에 저장된다는 걸 발견했습니다.
그러다 보니 자동매매 로직이 이 플래그를 읽는 모든 계좌에서 "랭킹 제외 대상"으로 취급해버렸습니다. 방금 이관받아서 계속 보유해야 할 새 계좌 쪽 종목까지 포함해서요.
실제 피해도 확인됐습니다. 어제 이관받은 지 몇 시간 만에 새 계좌에서 해당 종목 몇 개가 강제매도됐습니다.
이관의 취지, 즉 "자산을 그대로 옮겨서 계속 굴리게 한다"는 목적과 정반대로 작동한 셈입니다.
오늘 아침 두 번째 이관 후에도 같은 위험이 남아있는 걸 확인하고, 바로 이 플래그 파일을 전부 비웠습니다.
원래 계좌 쪽은 이미 다른 안전장치(신규 매매 자체를 막아둔 모드)가 걸려 있어서 이 플래그 없이도 재매수가 막히는 상태였습니다. 즉 이 플래그는 애초에 원래 계좌 쪽엔 불필요한 이중 장치였고, 새 계좌 쪽에서만 부작용을 낸 셈입니다.
플래그를 계좌별로 스코프를 나누는 근본 수선은 아직 하지 않았습니다. 이관 로직이 다음에도 같은 방식으로 플래그를 다시 걸면 같은 사고가 재발할 수 있어서, 코드 변경 후보 두 가지를 정리해 다음 판단을 기다리는 상태로 남겨뒀습니다.
실계좌 잔고 정리 과정에서 있었던 착오들
오늘 낮에는 이관 진행 상황을 확인하던 중 자동매매 자산 총액을 잘못 계산했습니다.
장부(새 창) 값만 보고 계산했더니 실제 브로커 잔고와 차이가 났습니다. 확인해보니 계좌에서 실제로 현금을 인출한 이력이 있었는데, 은행 출금은 시스템이 자동으로 감지하지 못하는 영역이라 장부에 반영되지 않은 상태였습니다.
비슷한 착오가 오후에 한 번 더 있었습니다. 이번엔 다른 계좌 쪽 개인 출금 건이었는데, 역시 장부에 반영해서 정합성을 맞췄습니다.
두 건 모두 실제 손실이나 매매 오류는 아니었고, 단순히 장부와 실제 잔고를 맞추는 정정 작업이었습니다. 다만 "총자산 얼마냐" 같은 질문에 답할 때 장부 값만 믿지 말고 항상 실제 브로커 잔고와 대조부터 해야 한다는 교훈은 다시 확인했습니다.
성능 최적화 자동화 도구를 새로 만들었다
이 프로젝트는 LLM과 GPU를 자주 교체하면서 그때마다 성능 튜닝을 새로 반복해왔습니다.
오늘은 이 과정 자체를 자동화하는 도구를 새로 설계하고 구현했습니다. 다른 AI와 여러 차례 의견을 주고받으며 설계를 다듬은 뒤, 실측 부하 재생 → 파라미터 탐색 → 결과 검증을 반복하는 구조로 완성했습니다.
부하는 실제로 최근에 오갔던 요청을 그대로 재생하도록 했고, 품질이 떨어질 위험이 있는 파라미터는 더 엄격한 검증을 거치도록 등급을 나눴습니다.
GPU를 건드릴 수 있는 권한과 설계만 담당하는 권한을 분리해서, 설계를 맡은 쪽이 실수로 운영 중인 서비스를 건드리는 상황 자체를 구조적으로 막아뒀습니다.
오늘은 코드만 완성했고, 아직 실제로 한 번도 돌려보지는 않았습니다. 첫 실행은 다음에 직접 확인하면서 진행할 예정입니다.