내 손으로 안전장치를 꺼버린 날
내 첫 실거래 봇의 히스토리 어딘가에는 자랑스럽지 못한 커밋이 하나 있다. 길이는 단 두 단어다. 돌아가고 있는 시스템 한복판에서, 문제를 없애버리려고 나는 계좌를 보호하기로 되어 있던 안전 장치에 손을 뻗어 이렇게 썼다. if False.
그건 화재경보기를 꺼버리는 것이 “작동”하는 방식 그대로 작동했다. 경보는 멈췄다. 경보가 감시하고 있던 그 대상은 멈추지 않았다.
멈추지 않고 계속 울리던 가드
초기에 나는 한 가지는 제대로 했다. 실거래 봇에 일일 손실 한도를 줬던 것이다. 계좌가 하루 동안 너무 많이 떨어지면 시스템은 거래를 멈추고 나를 기다리도록 되어 있었다. 가장 기본적인 형태의 서킷 브레이커이고, 서류상으로는 초보자에게 만들라고 권해지는 바로 그런 종류의 규율이었다.
문제는 실제로는 아무 이상이 없는데도 그게 계속 트립(작동)된다는 것이었다. 봇이 포지션에 현금을 투입할 때마다 가드는 현금 잔고가 떨어지는 것을 보고는 그걸 손실로 읽었다. 그래서 가드는 자기 일을, 요란하게 그리고 끊임없이 해냈다. 가드가 주장하는 손실 조건을 겪고 있지도 않은 시스템을 멈춰 세우면서. 몇 분마다 아무 이유 없이 울려대는 경보는 안전 기능이 아니다. 소음이다. 그리고 소음은 결국 입막음당한다.
두 단어짜리 핫픽스
그래서 나는 그것을 입막음했다. 세션 도중, 봇이 돌아가고 있는 상태에서, 나는 일일 손실 검사를 비활성화하고 — if False — 배포했다. 멈춤은 멎었다. 봇은 다시 자유롭게 거래했다. 몇 분 동안은 마치 수정된 것처럼 느껴졌다.
그건 수정이 아니었다. 그건 그 프로젝트 전체에서 내가 내린 가장 위험한 결정 중 하나였고, 그 이유를 정확하게 짚어둘 가치가 있다.
내가 실제로 한 일
가드가 트립된 것은 잘못된 정보를 먹고 있었기 때문이다. 가드는 포지션에 현금을 쓰는 것과 돈을 잃는 것을 혼동했다. 그건 실제 버그였고, 실제 수정 방법이 있었다. 가드에게 사는 것과 잃는 것의 차이를 가르치는 것.
나는 그렇게 하지 않았다. 나는 가드를 꺼버렸다. 나는 측정 문제를 마치 가드 문제인 것처럼 다뤘고, 가드를 제거하는 것으로 그것을 해결했다. 그건 화재 감지기가 자꾸 삑삑거린다고 거기서 배터리를 빼버리는 것과 엔지니어링적으로 동일하다. 삑삑거림은 멈춘다. 보호도 멈춘다.
비활성화된 가드는 복리로 불어나는 빚이다
여기서부터가, 당시의 나를 실제로 그랬던 것보다 훨씬 더 무섭게 했어야 할 부분이다. 핫픽스 이전에 내 문제는 그저 성가셨을 뿐이었다. 나를 너무 자주 멈춰 세우는 가드. 핫픽스 이후 내 문제는 보이지 않고 무한히 열려 있었다 — 실거래 봇이, 진짜 돈으로 거래하면서, 작동하는 손실 한도가 아예 하나도 없는 상태로.
거짓 경보에는 내가 볼 수 있는 비용이 있었다. 중단된 거래. 비활성화된 가드에는 내가 볼 수 없는 비용이 있었다 — 진짜 손실이 도착해서 자기 앞을 막아서는 것이 아무것도 없다는 걸 발견하게 될 그날까지는. 나는 눈에 보이고 살아남을 수 있는 짜증을, 눈에 보이지 않고 끝이 열려 있는 위험과 맞바꿨다. 그것도 빨간불을 조금 더 빨리 초록불로 바꾸려고 그렇게 했다.
그것이 안전장치를 비활성화하는 일의 유혹이다. 비용이 뒤로 미뤄진다. 당장은 나쁜 일이 아무것도 일어나지 않는다. 청구서는, 온다면, 나중에 한꺼번에 온다 — 가능한 가장 최악의 순간에. 그 순간이야말로 정확히 그 가드가 처리하려고 존재했던 순간이다.
올바른 수: 가드를 입막음하지 말고 고쳐라
올바른 대응은 지루한 쪽이었다. 의도된 안전장치는 유효했지만, 그것의 측정과 회계 입력이 망가져 있었다. 그러니 입력을 고쳐라. 가드에 들어가는 신호들을 분리해서, 가드가 실제 손실에 반응하도록 만들고, 현금이 포지션으로 들어가는 평범한 움직임에는 반응하지 않게 하라. 일단 가드가 진짜 손실과 정상적인 매수를 구분할 수 있게 되자, 가드는 양치기 소년 짓을 멈췄다 — 그리고 실제로 중요할 손실들을 위해, 온전한 채로 그 자리에 있어 줬다.
여기서 내가 얻은 규칙은 거의 부끄러울 만큼 단순하고, 나는 이제 그것을 절대적인 것에 가깝게 취급한다. 안전 장치를 꺼둔 채로 거래를 계속하지 마라. 가드가 잘못 발동하면, 그것을 바꾸거나 비활성화하기 전에 먼저 그 입력과 그 자신의 로직을 진단하라 — 그리고 보호 없이 돌리는 대신, 재개하기 전에 고치거나 교체하라.
가드의 존재 이유는 바로 당신이 그 자리에 없는 순간이다
이것이 손으로 운영하는 거의 무엇보다도 자동화 시스템에서 더 중요한 데는 이유가 있다. 실거래 봇은 당신이 자는 동안, 당신이 일하는 동안, 당신이 그게 존재한다는 사실을 반쯤 잊고 있는 동안 돌아간다. 그 안전 장치들은 사실 당신이 지켜보고 있는 순간을 위한 것이 아니다 — 그때는 그게 거의 필요 없다. 그것들은 당신이 없는 순간을 위한 것이다. 새벽 4시의 급격한 움직임, 휴일에만 발동하는 버그, 당신이 책상을 떠나 있던 90초 동안 펼쳐지는 연쇄 붕괴.
오늘의 짜증을 넘어서려고 가드를 비활성화할 때, 당신은 바로 그 순간들을 담보로 빚을 내고 있는 것이다. 당신은 그 지켜보지 않은 시간이 잔잔한 시간일 거라는 데 베팅하고 있다. 시장은 그 베팅을 공정한 조건으로 제안하지 않는다.
나는 그 두 단어짜리 커밋을 일종의 경고 라벨로 마음에 새겨둔다. if False는 세상에서 가장 쉬운 수정이고, 흔히 그것은 수정이 전혀 아니다 — 그것은 당신이 볼 수 있는 문제를 당신이 볼 수 없는 재앙으로 바꿔버리는 방법이다.
— 시그널도 없고, 수익도 없고, 투자 자문도 아닙니다.