"[2608] 실거래 전환과 두 번째 증권사 연동, 그 사이 조용히 죽어있던 버그들"
이번 달 가장 큰 진전은 실거래 시작과 두 번째 증권사 병행운영이었고, 그 사이사이에서 며칠씩 티 안 나게 실패하고 있던 버그를 반복해서 걷어냈습니다
조용한 회귀 사고로 시작해서, 실거래 직전 전면 점검으로 이어졌다
8월은 지난달부터 이어오던 알림 체계 정비를 마무리하는 것으로 시작했습니다.
그 과정에서 모의계좌 성과 리포트가 실제 잔고와 미묘하게 안 맞는다는 걸 발견했습니다.
원인은 수수료·세금이 제대로 반영되지 않은 계산 방식이었고, 바로 다음 날엔 그 수정의 여파로 캐시 타이밍 문제가 겹치는 작은 회귀 사고까지 겪었습니다.
다행히 매매가 안전하게 멈췄을 뿐 잘못된 주문은 나가지 않았지만, "코드를 고치면 그걸 쓰는 상주 프로세스는 전부 같이 재시작한다"는 교훈을 다시 한번 되새겼습니다.
주말엔 오래 미뤄뒀던 전략 질문 세 가지(매매 주기 변경, 장중 상시 매매, 미국 시장 전환)를 한꺼번에 검토하고 전부 접었습니다.
새로운 걸 벌이기보다 지금의 하루 세 번 배치 실행과 국내 시장 집중을 더 다지는 방향이 맞다는 확인이었습니다.
대신 오프라인 재현 도구를 다듬다가 스스로 냈던 결론 세 개가 틀렸다는 걸 발견해 뒤집었는데, 그중 하나는 버그가 우연히 급락일 매매를 피해가면서 실제보다 좋은 성과처럼 보이게 만들고 있었습니다.
이 주말의 핵심은 실거래를 앞두고 벌인 전면 점검이었습니다.
문서상으로는 이미 연결됐다고 돼 있던 실주문 경로가 실제로는 여전히 모의투자로 이어져 있었고, 안전장치 테스트는 겉보기엔 초록불이었지만 정작 확인해야 할 안전장치 자체가 꺼진 채로 통과하고 있었습니다.
셋 다 "돌아가고는 있는데 아무것도 확인하지 않고 있었던" 유형의 문제라, 이 점검을 하지 않았다면 계속 몰랐을 뻔한 것들이었습니다.
실거래를 시작하고, 승인 절차를 없앴다
이런 점검을 마친 뒤 실거래를 시작했습니다.
첫 라운드는 텔레그램 승인 방식으로 진행됐는데, 주문이 나간 뒤 "왜 매번 승인을 눌러야 하냐"는 질문이 나오자 그 자리에서 승인 절차를 없앴습니다.
기계적으로 확인 가능한 조건이 갖춰지면 자동으로 진행하고, 결과는 반드시 사후에 알리는 방식으로 바뀌었습니다.
같은 날 오후엔 현금을 확보하려고 계좌에서 손으로 정리한 거래를, 시스템이 승인 안 된 체결로 오인해 안전장치가 두 번이나 매매를 강제로 멈추는 소동도 있었습니다.
이후 사람이 직접 매매한 내역을 시스템에 정식으로 알려주는 절차를 새로 만들어 재발을 막았습니다.
실계좌 주문 실행과 안전장치 설계(새 창)에 대한 배경은 별도로 정리해뒀습니다.
며칠 뒤엔 계좌의 고점 대비 낙폭 기준값이 실거래 시작 시점 잔고를 그대로 "역대 최고점"으로 잘못 저장하고 있었다는 것도 발견해 고쳤고, 서킷브레이커나 킬스위치가 발동해도 다음 거래일엔 자동으로 풀리도록 정책을 정리했습니다.
사람이 옆에서 계속 지켜보지 않는 무인 운영으로 넘어가기 직전에 마무리해둬야 할 항목이었습니다.
GPU 판정이 두 번 뒤집히고, 검증 도구들이 숨어있던 구멍을 드러냈다
셋째 주엔 그래픽카드를 다른 브랜드로 교체하는 큰 작업이 있었습니다.
정식 배포 뒤엔 "카드 한 장이 예전 두 장 몫을 한다"는 결론이 나왔지만, 추가로 카드를 더 살지를 두고 실측 자료를 다시 조사하는 과정에서 판정이 하루 사이 두 번이나 뒤집혔습니다.
결국 아무것도 사지 않기로 했다가, 이후 실험용으로 한 장을 더 두고 기존 카드와 나눠 쓰는 쪽으로 다시 결정을 번복하기도 했습니다.
같은 주에 새로 만든 리포트 수치 자동 검증 도구를 실제 운영에 배선했더니, 매일 리포트 절반이 넘는 종목에서 표기 오류가 나오고 있었다는 게 드러났습니다.
과거 45일치를 되짚어보니 하루도 빠짐없이 같은 오류가 있었는데, 이 도구를 배선하기 전까지는 아무도 몰랐던 문제였습니다.
모델 재현성을 매일 확인하는 계기도 이틀 연속 죽었는데, 원인은 다른 야간 작업이 GPU를 쥐고 있는데도 순간적인 판독만으로 "지금 비어 있다"고 착각하는 구조였습니다. 점유 여부를 직접 확인하는 방식으로 바꿔 사고 지점을 없앴습니다.
실계좌에서도 안전장치 자체가 두 번 문제를 일으켰습니다.
하루 매매 한도를 배분하는 규칙 때문에 소액 매도 주문이 며칠째 대기열 맨 끝으로 밀리고 있던 걸 발견해 규칙을 고쳤고, 반대로 누적 손실 안전장치가 장중 일시적 하락에도 반응해 정상적인 매수 2건을 잘못 차단한 것도 "그날 마감 대 전날 마감" 기준으로만 반응하도록 구조를 바꿨습니다. 두 경우 모두 막혀 있던 주문은 사람이 직접 집행했습니다.
같은 주엔 블로그 발행 인프라도 크게 바뀌었습니다.
열흘 넘게 개발일지가 조용했던 원인이 저장 단계가 권한 승인 대기에 막혀 조용히 끝나고 있었던 것으로 드러났고, 이 참에 발행처를 오래전에 글쓰기 API가 끊긴 티스토리에서 GitHub Pages와 Dev.to로 옮겼습니다.
"조용히 실패하는 지점을 찾아 소리 나게 만드는" 흐름은 이 주 내내 반복됐습니다.
A/B 테스트 판정에서 더 좋아 보이는 표본 쪽으로 기준을 옮기고 싶은 유혹을 다른 AI 자문으로 눌러 전체 표본 기준을 지켰고, 모의계좌 완전자동 검증 트랙(새 창)의 주문 실행 유닛이 사후에야 알아챈 타임아웃 사고 두 건을 계기로 사전 경고 계측을 추가했으며, "검출 0건"이 문제없음인지 검출기 고장인지 구별 못 하던 안전장치에도 관측 장치를 새로 달았습니다.
두 번째 증권사 연동이 실계좌 검증을 지나 병행운영까지 나아갔다
넷째 주의 가장 큰 진전은 새 증권사 연동이었습니다.
기존 증권사 클라이언트와 완전히 동일한 인터페이스로 새 클라이언트를 만들어, 나중에 갈아끼울 때 상위 코드는 손댈 필요가 없도록 했습니다.
소액 한도 안에서 실계좌 매수→매도→미체결 취소 전 과정을 직접 검증했고, 다른 AI에게 검토를 맡겼더니 "지금 상태로는 바로 갈아끼울 수 없다"는 결론이 돌아와 지적받은 항목을 거의 전부 고친 뒤 다시 검증했습니다.
바로 다음 날 이 증권사를 모의검증 트랙 위에 별도 슬리브로 얹어 병행운영을 시작했고, 기존 증권사는 그대로 주력으로 유지했습니다.
봇 전용 계좌를 새로 만드는 대신, 사람과 자동매매가 함께 쓰는 기존 계좌를 안전하게 공유하는 쪽으로 방향을 잡았습니다.
이 주에도 며칠씩 티 안 나게 실패하던 버그가 계속 나왔습니다.
작업 목록을 처음부터 끝까지 다시 훑는 전수 재분류 작업에서, 특정 값 조회 기능이 필요한 라이브러리가 빠진 채로 8일 내내 빈 값만 돌려주고 있던 걸 발견했습니다.
다른 캐시 하나는 서로 다른 실행 환경의 라이브러리 버전이 어긋나 사흘째 깨진 채로 돌고 있었고, 반복 실행 검증 작업 하나는 이전 실행이 중간에 멈춘 걸 "완료"로 잘못 판정해버리고 있었습니다.
주 마지막 날엔 자정을 넘어가는 시간대 비교 로직이 날짜 경계에서 어긋나 매일 밤 후반부 전체가 감시 범위 밖에 있었던 것도 발견했는데, 예전에 겪었던 감시 공백 사고와 같은 유형이 세 번째로 재발한 것이었습니다.
매번 사람이 손으로 확인하던 것들을 자동 감시나 AI 재검토로 옮기는 작업도 이 주에 여러 건 있었습니다.
GPU 실험이 정산 시간대와 겹쳐 스스로 멈추는 문제를 표준화된 스케줄 계산 함수로 정리했고, 몇 달째 성립을 못 하고 있던 새 AI 모델 앙상블 채택 조건을 매번 손으로 확인하는 대신 조건이 다 채워지는 순간에만 알림이 오는 자동 센서로 바꿨습니다.
프로세스 강제 종료 규칙이 모델 이름만으로 대상을 찾아 실험용 서버까지 잘못 종료시킬 수 있는 구조였다는 것도 다른 AI의 전체 재검토로 찾아내 포트 번호까지 확인하도록 좁혔습니다.
몇 주 끌어온 로컬 모델 비교도 이 주에 마무리해 새 후보 모델로 정식 전환했고, 은퇴시킨 모델은 AI 추천 파이프라인(새 창)에 가중치 0으로 얹어 두 모델이 종목을 얼마나 비슷하게 평가하는지 조용히 기록하기 시작했습니다.
마지막 날, 하루에 두 장애가 겹쳤다
한 달의 마지막 날엔 두 장애가 겹쳤습니다.
순위를 산출하는 상주 프로세스 하나가 최근 코드 수정 이후 재시작되지 않은 채 며칠째 구버전으로 돌면서, 새로 붙인 모델 계열을 인식하지 못해 정기 갱신이 조용히 실패하고 있었습니다.
같은 시스템의 다른 프로세스가 우연히 최근 재시작된 덕분에 전체가 며칠씩 묵은 것처럼 보이지 않아 더 늦게 발견됐습니다. 같은 날 낮엔 모의계좌 완전자동 검증 트랙의 라운드 하나가 흔적도 없이 통째로 빠지는 일이 있었습니다.
원인을 파고드니 증권사 API가 체결 평균단가 필드를 실제 값의 1000분의 1로 축소해서 보내고 있었고, 이 왜곡된 값이 원장에 쌓이면서 장 시작 기준값 재설정 로직이 이를 외부 자금 이동으로 오판해 손익 기준점이 오염됐습니다.
그 결과 낮 동안의 드로다운이 실제보다 훨씬 크게 계산돼 킬스위치가 허위로 발동했습니다.
수선은 오염되지 않은 다른 필드로 단가를 역산하는 방식으로 우회했고, 원장 정정처럼 되돌릴 수 없는 작업은 다른 AI에게 미리 자문을 구해 정확한 순서와 검증값을 받아뒀습니다.
받은 자문은 처음 세운 3단계 정정 계획으로는 부족하다는 걸 짚어줬고, 백업 → 원장 정정 → 시계열 정정 → 기준값 재생성 → 킬스위치 해제 순서로 진행한 정정 결과는 자문이 미리 예측한 값과 소수점까지 일치했습니다.
이번 달을 관통한 건 두 갈래였습니다.
하나는 실거래를 실제로 시작하고, 승인 없는 자동 실행과 무인 운영으로 넘어가고, 두 번째 증권사까지 실계좌 검증을 거쳐 병행운영에 올린, 눈에 보이는 전진이었습니다.
다른 하나는 그 전진 곳곳에서 며칠씩, 어떤 건 몇 주씩 조용히 실패하고 있던 지점들 — 재시작 안 된 프로세스, 값이 축소돼 오던 API 필드, 감시 범위 밖에 있던 자정 이후 시간대 — 을 반복해서 찾아 고친 과정이었습니다.
한 달 내내 "돌아는 가는데 아무것도 확인하지 않고 있었던" 유형의 문제가 계속 나왔다는 게, 이 시스템이 아직 스스로를 완전히 믿을 단계는 아니라는 걸 계속 일깨워준 셈입니다.