
알림이 많으면 아무도 안 본다 — 소음에 침묵하는 감시 시스템 만들기
10분마다 위험을 점검하지만 대부분은 알리지 않는 감시 서비스를 만들었다. 등급이 오를 때만 경고하도록 설계한 이유를 정리했다.
특정 종목을 장기 보유 중인데, 전략을 깨뜨릴 만한 큰 위험이 새로 생겼는지 계속 확인하고 싶었다. 그래서 10분마다 자동으로 점검하는 감시 서비스를 만들었다.
만들면서 가장 중요했던 결정은 “무엇을 감시할까”가 아니라 **“언제 알리지 않을까”**였다.
알림 피로는 실패 모드다
모니터링 시스템을 만들면 처음에는 많이 알리게 된다. 놓치는 것보다 낫다고 생각하기 때문이다.
그 결과는 예측 가능하다. 알림이 하루에 스무 번 오면 안 읽는다. 안 읽다 보면 정말 중요한 알림도 같이 묻힌다. 결국 알림이 많은 시스템은 알림이 없는 시스템과 같아진다. 오히려 나쁘다. 감시하고 있다고 착각하게 만들기 때문이다.
주식에서는 부작용이 하나 더 있다. 알림이 자주 오면 매매 유혹이 생긴다. 장기 보유 전략인데 하루에 몇 번씩 “3% 하락”이라는 알림을 받으면 손이 근질거린다. 시스템이 오히려 전략을 깨는 데 기여한다.
그래서 목적을 이렇게 못박았다.
“내일 오를까?“가 아니라 “장기보유를 깨뜨릴 큰 조정 위험이 새로 생겼는가?” 단기 소음에는 침묵하고, 구조적 위험에만 경고한다.
등급을 만들고, 등급이 바뀔 때만 알린다
핵심 장치는 상태 등급이다. 위험 수준을 Green / Yellow / Orange / Red 네 단계로 유지한다.
이 등급은 웹 대시보드에 항상 떠 있다. 궁금하면 언제든 볼 수 있다. 그런데 알림은 등급이 올라갈 때만 보낸다.
이 구분이 핵심이다.
- 상시 정보 — 대시보드에서 당겨 본다 (pull)
- 변화 — 메신저로 밀어준다 (push)
Yellow 상태가 사흘 내내 유지되면 알림은 처음 한 번만 온다. 상태가 궁금하면 대시보드를 보면 된다. 매일 “아직 Yellow입니다”라고 보내는 건 소음이다.
알림을 보내는 조건은 결국 세 가지로 정리됐다.
- 등급이 올라갔을 때
- 새로운 구조적 악재가 생겼을 때
- 같은 등급이라도 새로운 정책·수급 사건이 발생했을 때
3번이 실무적으로 필요했다. 이미 Orange인 상태에서 성격이 다른 새 악재가 생기면 등급은 그대로여도 알아야 한다. “등급 변화”만으로는 이걸 놓친다.
여기에 더해 매일 아침 7시에 정기 브리핑을 한 번 보낸다. 아무 일 없어도 온다. 아무 알림도 안 오는 상태와 시스템이 죽은 상태를 구분하기 위해서다.
느린 분석이 빠른 점검을 막지 않게
구조를 다섯 계층으로 나눴는데, 여기서 성능 문제가 생겼다.
- 정량층 — 실현변동성, 낙폭, ETF 추적 괴리를 결정론적으로 계산
- 뉴스층 — 검색으로 신규 악재 수집
- 정책·수급 위험층 — 연기금, 정치 이벤트, 외국인 매도 추이 평가
- 구조신호층 — 재무 성장성, 경기·산업 신호
- LLM 분석층 — 소음과 구조 위험을 해석
문제는 5번이었다. LLM 호출은 느리고 가끔 아주 느리다. 이걸 파이프라인에 직렬로 넣으면 10분 주기가 지켜지지 않는다. LLM이 3분 걸리면 그동안 정량 지표 점검도 멈춘다.
그래서 분리했다. 결정론적 계산(1~4번)은 10분마다 무조건 돈다. LLM 분석은 별도로 돌고, 끝나면 결과를 반영한다. LLM이 오래 걸려도 빠른 경로는 계속 돈다.
최종 등급은 이렇게 합친다.
최종 등급 = max(정량 등급, 정책·수급 등급, LLM 등급)
max를 쓴 이유는 어느 하나라도 위험하다고 보면 위험으로 취급하기 위해서다. 평균을 내면 LLM이 “괜찮다”고 할 때 정량 지표의 경고가 희석된다. 위험 감지에서는 낙관적인 쪽으로 섞으면 안 된다.
검증 못 한 정보는 등급에 넣지 않는다
뉴스층에서 배운 게 있다. 정책이나 수급 관련 토픽은 검색 결과가 부정확한 경우가 많다. 오래된 기사가 최신처럼 나오거나, 같은 사건이 여러 날짜로 잡힌다.
그래서 여러 검색축에서 나온 결과의 날짜, URL, 수집 경로(provenance)를 서로 대조한다. 검증이 불완전하면 그 항목을 partial 또는 unknown으로 닫는다. 억지로 등급에 반영하지 않는다.
이게 중요한 이유는, 불확실한 정보가 등급을 올리면 알림이 오고, 그 알림이 틀리면 시스템 전체를 안 믿게 되기 때문이다. 한 번 “또 헛소리네”가 되면 진짜 경고도 무시한다.
비슷한 이유로 기관 전체 수급을 연기금 데이터로 추론하지 않기로 했다. 그럴듯한 추정은 가능하지만, 근거가 다른 것을 같은 것처럼 다루면 나중에 왜 틀렸는지 알 수 없다.
비밀값이 없어도 죽지 않게
운영상 작은 결정 하나. LLM 프록시 토큰이나 디스코드 웹훅 URL이 설정되지 않아도 크래시 없이 동작한다. 해당 기능만 비활성화되고 대시보드에 그렇게 표시된다.
설정이 빠졌을 때 시작조차 안 되면, 새 환경에서 뭐부터 해야 할지 알 수 없다. 일단 뜨고 “이건 안 켜져 있다”고 보여주는 편이 낫다.
앞서 포트 바인딩에서는 반대로 “잘못된 값이면 아예 안 뜨게” 만들었다. 기준은 틀렸을 때의 손해다. 바인딩이 틀리면 열지 말아야 할 걸 여는 것이라 위험하다. 알림 채널이 없으면 알림이 안 올 뿐이다.
정리
- 알림이 많은 시스템은 알림이 없는 시스템이 된다. 무엇을 안 알릴지가 설계의 핵심이다
- 상시 상태는 대시보드에서 당겨 보게 하고, 변화만 메신저로 밀어준다
- “등급 변화”만 알리면 같은 등급 안의 새 사건을 놓친다. 조건을 나눠야 한다
- 아무 일 없어도 정기 브리핑을 보낸다. 조용한 것과 죽은 것을 구분해야 한다
- 느린 분석(LLM)을 빠른 점검과 분리한다. 직렬로 두면 주기가 무너진다
- 위험 등급을 합칠 때는
max를 쓴다. 평균은 경고를 희석한다 - 검증 못 한 정보로 알림을 보내면 시스템 전체의 신뢰를 잃는다