내 코드가 이렇게 돈다고 확신했는데, 아니었습니다

자동매매를 1년 넘게 돌리면서 가장 아찔했던 순간은 주문이 틀렸을 때가 아니었습니다.

내 시스템이 어떻게 도는지 내가 잘못 알고 있었다는 걸 알았을 때였습니다.

[30초 요약] 전략 파일을 직접 열어 확인하고 “변동성 조절 기능이 꺼져 있다”고 판단했습니다. 그 전제로 설계를 다시 검토하기까지 했는데, 실제로는 켜져 있었습니다. 코드가 아니라 실행 환경(크론의 환경변수)에서 켜지고 있었거든요. 그리고 그 사실은 제가 반년 전에 쓴 시스템 문서에 이미 적혀 있었습니다.

무슨 일이 있었나

레버리지 ETF를 다루는 전략을 점검하던 중이었습니다. 변동성이 커지면 노출을 자동으로 줄이는 기능이 있는데, 이게 지금 도는 버전에 들어 있는지가 궁금했습니다.

방법은 간단했습니다. 전략 파일을 열어서 관련 키워드를 검색했습니다. 안 나왔습니다.

그래서 결론을 내렸습니다. “지금 라이브는 이 기능 없이 돌고 있다.”

여기까지 30초쯤 걸렸습니다. 문제는 그다음이었습니다. 저는 그 전제 위에서 “그럼 이 기능을 넣을지 말지 다시 정하자”는 논의를 시작했고, 비교 분석까지 돌렸습니다. 존재하지 않는 문제를 푸느라 반나절을 썼습니다.

코드에 없는데 어떻게 켜져 있었나

전략 파일에는 정말로 없었습니다. 대신 매일 이 프로그램을 실행시키는 스케줄러 설정에 값이 하나 들어 있었습니다. 실행할 때 환경변수로 기능을 켜고, 전략 코드는 그 값을 읽어 동작을 바꾸는 구조였습니다.

즉 이렇게 됩니다.

  • 전략 파일만 보면 → 기능 없음
  • 실제 실행 명령까지 보면 → 기능 켜짐

같은 시스템인데 어디를 보느냐에 따라 정반대 결론이 나옵니다. 저는 앞쪽만 보고 판단했고요.

더 부끄러운 건 따로 있습니다. 시스템 구조를 적어둔 제 문서에 이 내용이 이미 한 줄로 적혀 있었습니다. 읽지 않았을 뿐입니다.

실행 환경이 코드를 덮어씁니다

이 사고를 겪고 나서 정리한 게 있습니다. 코드는 라이브의 절반이라는 것.

나머지 절반은 이런 것들입니다.

  • 환경변수 — 같은 코드가 다른 설정으로 돌 수 있습니다
  • 실행 명령 — 어떤 옵션을 붙여 실행하는지
  • 배포 시점 — 내 노트북의 코드와 서버의 코드가 같다는 보장이 없습니다
  • 설정 파일 — 코드 밖에 있는 값들

특히 마지막 두 개가 무섭습니다. 저는 예전에 서버에 배포되지 않은 수정본을 보면서 “고쳤다”고 믿은 적도 있습니다. 파일 하나만 비교해봤으면 30초에 드러날 일이었습니다.

그래서 만든 규칙

이제 라이브 동작을 말하기 전에 세 가지를 확인합니다.

첫째, 실행 명령 전체를 본다. 스케줄러 설정을 열어 환경변수와 옵션까지 확인합니다. 코드만 보지 않습니다.

둘째, 서버의 파일과 내 파일이 같은지 확인한다. 파일 해시를 비교하면 한 줄로 끝납니다.

셋째, 이미 적어둔 문서를 먼저 읽는다. 이게 제일 어렵습니다. 문서를 쓰는 것보다 자기가 쓴 문서를 읽는 습관을 들이는 게 몇 배 어렵더군요.

세 개 다 30초짜리입니다. 반나절을 날리기 전에 하면 30초이고, 날린 다음에 하면 그것도 30초입니다.

그래서 그 기능은 어떻게 됐나

정밀하게 다시 비교해보니 두 방식의 성과 차이는 박빙이었습니다. 다만 2020년 코로나 급락 구간에서 이 기능이 낙폭을 눈에 띄게 줄인 게 확인돼서, 그대로 두기로 했습니다.

애초에 바꿀 필요가 없는 결정이었습니다. 잘못된 전제 하나가 없었으면 시작도 안 했을 논의였고요.

자주 묻는 질문

개인이 만든 자동화에도 이런 게 생기나요? 오히려 개인 쪽이 더 심합니다. 회사 시스템은 배포 절차가 있지만, 혼자 만든 건 급할 때 서버에서 바로 고치고 노트북에 반영을 잊는 일이 흔합니다.

문서를 쓰는 게 도움이 되나요? 씁니다. 다만 읽히는 구조로 써야 합니다. 저는 이 사고 뒤로 “지금 라이브에서 유효한 설정”만 모은 짧은 절을 따로 만들어 맨 앞에 뒀습니다. 길게 쓰면 저부터 안 읽더라고요.

틀린 걸 어떻게 알아챘나요? 사용자, 그러니까 제 자신이 이상하다고 느껴서 다시 확인한 게 아니라 다른 작업을 하다 우연히 발견했습니다. 그게 제일 무섭습니다. 우연히 못 만났으면 계속 틀린 그림을 들고 있었을 테니까요.

함께 읽으면 좋은 글

이런 시스템을 집에서 굴리는 구조는 라즈베리파이 투자 자동화 서버에, 증권사 API를 쓰며 만난 함정들은 한국투자증권 API 함정 모음에 적어뒀습니다.

코드를 읽고 시스템을 안다고 말하는 건, 악보를 보고 연주를 들었다고 하는 것과 비슷합니다.

Leave a Comment