본문 바로가기
C.W.K.
Stream
Lesson 01 of 05 · published

Snapshot 이라는 베팅

~11 min · data-model, domain-modeling, scope-discipline, non-goals

Level 0Open Gate
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"ledger 는 네가 걸어온 걸음을 전부 기억하려 들어. snapshot 은 네가 지금 어디 서 있는지만 말해 주고. 네 진짜 질문에 답하는 쪽을 골라."

돈을 모델링하는 두 가지 방법

포트폴리오를 모델링하는 방법은 뿌리부터 다른 두 갈래가 있어. ledger 는 이벤트를 전부 기록해. 매수, 매도, 배당, 수수료, 분할 하나하나를 남겨 두고, 그 이력을 재생해서 현재 포지션을 다시 만들어 내지. snapshot 은 현재 상태를 그냥 직접 저장해. 이 종목 몇 주, 현금 얼마. 거기까지 어떻게 왔는지는 안 남겨. Keep 는 일부러 snapshot 시스템을 골랐어. owner 마다 ticker 당 포지션 하나, seed 금액, stored cash 잔고. 모델의 모양은 이게 전부야.

왜 snapshot 쪽이었을까

실제 질문에 맞으니까. Keep 가 존재하는 이유는 "가족이 지금 뭘 갖고 있고, 어떻게 되고 있나?" 에 답하기 위해서야. "모든 거래를 재구성해서 세금까지 계산해 줘" 가 아니라. 완전한 ledger 를 지으려면 딸려 오는 게 어마어마해. tax lot, cost-basis 계산 방식, wash-sale 규칙, 배당 재투자, 수수료 회계까지. 하나하나가 버그가 자랄 자리인데, 그중 어느 것도 low-trigger monitoring 이라는 목표에 봉사하지 않아. 그래서 Keep 는 전부 명시적인 non-goal 로 못박았어. tax-lot 회계 없음, 배당/수수료 ledger 없음, 거래 이력 없음. 여기선 scope 를 좁힌 것 자체가 기능이야.

상상 가능한 가장 일반적인 질문 말고, 실제로 갖고 있는 질문을 모델링해. ledger 가 추상적으로는 더 '완전' 하지. 근데 필요 없는 완전함은 버그가 자랄 땅을 넓혀 줄 뿐이야. snapshot 은 진짜 질문 하나에 정확하게 답하는 작고 날카로운 모델이고, 애초에 묻지도 않던 질문 열 개는 정중히 거절해.

포기하는 것도 정직하게

공짜 선택은 아니야. 순수한 snapshot 은 거래를 저장한 적이 없으니, 올해 실현 이익이 얼마인지 말해 줄 수 없고 cost basis 가 왜 그 값인지 되짚어 줄 수도 없어. Keep 는 이 trade-off 를 알고 받아들였어. 그게 바로 scope 밖이라고 선언한 ledger 기능들이거든. 만약 tax-lot 회계가 진짜로 필요하다면 snapshot 은 틀린 모델이야. 짓기 전에 그걸 알아야 하고. snapshot 을 고른다는 건, 열 가지 질문에 어중간하게 답하는 대신 한 가지 질문에 지독하게 잘 답하기로 정하는 거야.

scope-creep 의 함정, "하는 김에 거래도 기록하자." 언제나 그럴듯하게 들려. 어차피 포지션도 저장하는데 그걸 만든 거래라고 왜 못 해? 근데 그 하나를 들이는 순간 tax lot 과 수수료와 reconciliation 과 회계 엔진 전체가 따라 들어와. 차분한 snapshot 도구가, 애초에 피하려던 trading ledger 로 조용히 변해 버리는 거지. non-goal 목록이 그걸 막는 가드레일이야.
snapshot 에도 이력은 있어. 거래 로그가 아닐 뿐이야. Keep 는 현재에 얼어붙어 있지 않아. append-only 로 쌓이는 일일 value 스냅샷이 시간축을 만들어 줘서, 총합이 어떻게 움직여 왔는지 볼 수 있어. 다음 레슨들에서 다룰 텐데, 이건 거래의 이력이 아니라 상태의 이력이야. '과거가 아예 없음' 과 '완전한 ledger' 사이의 차분한 중간길이지.

Code

모델 둘, 모양 둘 (예시)·python
# LEDGER 모델: 이벤트를 저장하고, 재생해서 현재 포지션을 얻어.
transactions = [
    {"date": "2026-01-05", "action": "buy",  "ticker": "TICK", "qty": 10, "price": 100},
    {"date": "2026-03-02", "action": "sell", "ticker": "TICK", "qty": 4,  "price": 130},
    # ... 모든 이벤트를 영원히. 그다음 재구성 + tax lot + 수수료 계산
]

# SNAPSHOT 모델 (Keep): 현재 상태를 직접 저장. 끝.
position = {"owner": "owner_a", "ticker": "TICK", "shares": 6, "seed": 1000}
cash = {"owner": "owner_a", "balance": 250.00}   # 저장된 값, 권위 있음

# Keep 는 두 번째 모양으로 '지금 뭘 가졌나?' 에 답하고,
# 첫 번째 모양이 요구하는 기계는 일부러 안 지어.

External links

Exercise

모델링해 볼 도메인을 하나 골라 봐. 식료품 저장고든 책 컬렉션이든 저축 목표든. ledger 버전과 snapshot 버전을 둘 다 그려 봐. ledger 는 이벤트를 전부 저장하는 쪽이야. 샀다, 먹었다, 빌려줬다, 돌려받았다. snapshot 은 지금 선반에 뭐가 있는지만 저장하는 쪽이고. 각 버전이 어떤 질문에 강한지 적어 본 다음, 네 실제 용도에 뭐가 필요한지 정해. 그리고 ledger 를 고르면 뭘 짓겠다고 서명하는 건지도 짚어 봐.
Hint
ledger 는 더 강력해 보여서 끌려. 근데 스스로한테 물어봐. 과거를 재구성할 일이 진짜 있어? 아니면 현재만 알면 돼? 정직한 답이 '나는 지금 가진 것만 봐' 라면, ledger 는 하지도 않을 질문을 위해 사들이는 비싼 기계야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.