본문 바로가기
C.W.K.
Stream
Lesson 03 of 04 · published

안정된 건 캐시하고, 정확해야 할 건 새로 구한다

~10 min · caching, calibration, seed-prices, trade-offs

Level 0Open Gate
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"느리게 변하는 건 캐시해. 근데 결과가 정확히 재현돼야 하는 그 하나만은 절대 캐시하지 마."

입력은 두 종류, 캐싱 규칙도 두 가지

simulation 에는 성격이 아주 다른 두 종류의 입력이 들어가고, Keep 는 둘을 정반대로 다뤄. 변동성이나 beta 나 anchor 값 같은 파생량인 calibration 은 하루 동안 캐시돼. 반면 run 이 출발하는 정확한 시작 가격인 seed 가격언제나 run 시점에 새로 resolve 하고, 캐시에서 꺼내는 일이 없어. 같은 run 에 들어가는 두 입력인데 규칙이 반대인 거지. 이 갈림은 아무렇게나 정한 게 아니야. 각 입력이 무엇을 위해 존재하는지에서 규칙이 저절로 따라 나와.

calibration 을 캐시해도 되는 이유

calibration 은 파생값이고 안정적이야. 변동성과 beta 는 과거 데이터 구간에서 계산돼 나와. 종목의 성격을 묘사하는 값들인데, 그 성격이 한 시간 사이에 의미 있게 변하진 않지. run 을 돌릴 때마다 다시 계산하는 건 순수한 낭비야. 어차피 거의 같은 숫자에 도달할 비싼 계산이니까. 하루짜리 캐시가 이 값들의 실제 박자에 딱 맞아. 어제의 calibration 은 오늘 run 의 입력으로 충분히 쓸 만하고, 캐시 덕분에 simulation 은 빠르게 유지돼.

박자에 맞춰 캐시해. 진짜로 느리게 변하는 것일수록 캐시가 안전해. 캐시 TTL 은 그 값이 얼마나 빨리 움직이는지에 대한 주장이야. 변동성처럼 파생되고 느린 양은 긴 캐시를 누릴 자격이 있어. 반대로 결과가 재현돼야 하는 정확한 순간의 입력은 그 자격이 없고. 값마다 캐시 수명을 실제 변화 속도에, 그리고 정확성이 얼마나 무거운지에 맞춰.

seed 가격이 매번 새것이어야 하는 이유

seed 가격은 정반대 성격의 입력이야. run 의 부챗살 전체가 뻗어 나가는 정확한 출발점이거든. seed 가격이 캐시에서 나온다면, '같은 시작점에서 돌렸다' 는 두 run 이 캐시 상태에 따라 슬쩍 다른 가격에서 출발할 수 있어. 그 순간 run 은 기록된 입력만으로 정확히 재현되기를 멈춰. 그래서 Keep 는 seed 가격을 매번 새로 resolve 하고, resolve 된 그 값을 run 과 함께 저장해. 출발점은 생성 순간에 정확하고, 재생을 위해 붙잡혀 있는 거지. 재현성이 걸린 값을 캐시 운에 맡기는 일은 없어.

새로 구하고, 곧바로 저장한다. 이게 핵심 수야. seed 가격은 run 시점에 live 로 resolve 되고, 동시에 run 과 함께 저장돼. 생성 시점의 live resolve 가 정확한 출발점을 보장하고, run 과 함께 저장하는 게 나중의 재생을 보장해. 어느 한쪽만으론 부족해. 캐시된 seed 는 정확하지 않고, 새로 구했지만 저장 안 한 seed 는 재생할 수 없으니까. 새로 구하고, 그다음 저장해.

Code

역할이 반대인 입력엔 캐싱 규칙도 반대 (예시)·python
def prepare_run(inputs):
    # Calibration: 파생값이고 안정적 -> 하루 캐시로 충분해.
    calib = cache.get_or_compute(
        "sim_calibration", inputs.tickers, ttl=24 * 3600,
        compute=lambda: derive_vol_beta_anchor(inputs.tickers),
    )

    # Seed 가격: 정확한 출발점 -> 절대 캐시 안 해.
    # run 시점에 새로 resolve 하고, run 과 함께 저장해서
    # run 이 자기 기록만으로 정확히 재현되게 유지해.
    seed_prices = resolve_prices_now(inputs.tickers)   # live, 캐시 없음

    return {**inputs.__dict__, "calibration": calib, "seed_prices": seed_prices}

External links

Exercise

입력이 여러 개인 계산을 하나 골라서, 입력마다 분류해 봐. '느리게 변하니 캐시해도 안전' 인지, '정확해야 하고 재현을 위해 붙잡아야 함' 인지. 양쪽에서 하나씩 골라 그 분류가 왜 맞는지 설명해 봐. 그다음 새로 구했어야 할 입력을 캐시했을 때 생기는 버그를 묘사해 봐. 특히 똑같아야 할 두 run 이 어떻게 소리 없이 갈라지는지.
Hint
위험한 실수는 결과가 매달려 있는 정확한 출발점을 캐시하는 거야. 시작값이 따뜻한 캐시에서 올 수도, 차가운 캐시에서 올 수도 있으면, '동일한' 두 run 이 타이밍에 따라 다른 자리에서 출발해. 재현성 보장이 동전 던지기가 되는 거지. 느리고 파생된 건 마음 놓고 캐시하되, 정확해야 하는 출발점은 매번 새로 구해.

Progress

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

댓글 0

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

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