"seed 를 저장해 둔 무작위는 더 이상 그냥 무작위가 아니야. 증명할 수 있는 결과지."
재현 가능한 무작위라는 역설
Monte Carlo 는 무작위 추첨 위에 서 있으니 언뜻 재현 가능성과는 정반대로 보여. 두 번 돌리면 부챗살이 두 개 나오잖아. Keep 는 run 마다 random seed 를 같이 저장해서 이 역설을 풀어. pseudo-random generator 는 사실 deterministic 이거든. 같은 seed 를 주면 어느 머신에서든 매번 완전히 같은 '무작위' 수열을 뱉어. 그러니 seed 까지 붙잡아 둔 run 은 나중에 bit 단위로 똑같이 되살릴 수 있어. 무작위성은 가능성을 탐색할 만큼 진짜인 동시에, 재현하고 감사할 수 있을 만큼 붙들려 있는 거야.
run 이 저장해 두는 것들
재현성이란 출력을 결정한 요소의 일부가 아니라 전부를 붙잡는 거야. Keep 의 simulation run 은 자기를 결정한 완전한 목록을 저장해. mode, owner, ticker set, horizon, iteration 수, hurdle, mean-reversion 계수, calibration, seed 가격, percentile path, 결과, 그리고 random seed 까지. 이 중 하나만 빠져도 재현성은 끝장이야. 같은 seed 라도 입력이 다르면 답이 달라지고, 입력이 같아도 seed 를 잃으면 매번 다른 무작위 path 가 나와. 재현성은 전부 아니면 전무야. 레시피를 완전하게 붙잡거나, 케이크를 다시 못 굽거나.
감사 가능한 run 이 여기서 중요한 이유
학문적 결벽 때문이 아니야. 앱 전체의 차분하고 정직한 자세를 받치는 장치야. run 이 통째로 저장되고 언제든 재생되니까, 몇 달 뒤에 그 시나리오로 돌아와도 무슨 가정으로 무슨 결과를 냈는지 정확히 확인할 수 있어. "예전에 비슷한 걸 돌렸던 것 같은데" 하는 흐릿한 기억이 아니라. UI 에 아무도 출처를 설명 못 하는 유령 숫자가 떠다니는 일도 없고. 모든 시나리오가 완전한 provenance 를 갖춘, 오래가고 들여다볼 수 있는 기록이야. Keep 가 가격과 현금에 들이대던 그 정직함을 simulation 에도 똑같이 들이댄 거지.