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

3 년, 41 년, 한 세기 반

~12 min · licensing, data-availability, comparability, gauges

Level 0원석
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
이 대시보드의 창들은 쉰 배까지 벌어지고, 그 차이는 세 군데서 온다. 그중 네가 통제하는 건 하나뿐이고, 숫자만 봐서는 어느 쪽인지 모른다.

제각각인 창들이 어디서 오냐

창 길이가 벌어진 게 누가 내린 결정을 반영한다고 생각하는 게 합리적이야. 대부분은 아니야. 대부분은 바깥에서 서로 다른 기제로 강제된 거고, 그 기제들은 알아둘 값어치가 있어. 데이터 제품이면 어디서든 반복되거든. 근데 전부는 아니고, 그 예외가 제일 중요해. 표면에서는 안 보이고, 네 것이거든.

라이선스. 하이일드 신용 스프레드 계열은 대략 최근 3 년으로 잘려 있어. 뒤에 있는 지수가 라이선스 대상이고, 공개 배포는 창 하나만 실어. 이건 가정이 아니라 직접 확인했어. 공개 다운로드에서도 계열은 시작하는 데서 시작해. 어떤 엔지니어링도 이걸 못 늘리고, 차트만 보고 이걸 짐작할 사람도 없어.

외부 한계 옷을 입은 내 기본값. 정책금리 창은 40 년 남짓인데, 계열이 거기까지밖에 안 간다는 뻔한 설명은 거짓이야. 공개 소스는 그 금리를 1954 년부터 일간으로 발표해. 70 년 넘게. 창이 41 년인 건 이 엔진 FRED 헬퍼가 start 파라미터 기본값을 1985-01-01 로 두고 있고 아무 호출자도 그걸 안 덮기 때문이야. 같은 기본값이 1970 년대랑 1981 년부터 발표되는 환율 계열 둘도 조용히 잘라내고 있고.

이건 좀 붙들고 있을 값어치가 있어. 라이선스 경우의 정반대인데 표면에서는 구분이 안 되거든. 둘 다 "이 계열은 N 년을 들고 있다" 로 나타나. 하나는 권리자가 강제한 거고 어떤 엔지니어링으로도 못 늘려. 다른 하나는 쓰인 뒤로 아무도 다시 안 본 네 수집 계층의 한 줄이고. 숫자만 봐서는 둘을 구분 못 해. 그러니까 규율은 "창을 밝혀라" 로 안 끝나. 계열마다 그 창이 세상의 답인지 네 답인지 알고 있어야 해.

학술적 재구성. CAPE 입력은 1880 년대까지 닿아. 어느 학자가 긴 계열을 엮어서 공개했거든. 진짜로 희귀한 유물이고, 이 대시보드 게이지 하나가 한 세기 반에 대한 진술을 아예 할 수 있는 이유야.

네 창 중에 뭘 네가 골랐는지 알고 있어. 외부 소스를 모으는 시스템은 전부 그들의 불평등한 역사를 물려받아. 그리고 설계 질문은 절대 "어떻게 비교 가능하게 만들까" 가 아니라 "이미 비교 가능한 것처럼 화면이 암시하는 걸 어떻게 막을까" 지. 근데 창을 정직하게 밝히려면 그게 어디서 왔는지부터 알아야 하고, 네 수집 계층 기본값은 세상이 강제한 한계랑 똑같이 생겼어. 저장한 걸 읽지 말고 소스한테 뭘 발표하냐고 물어서 감사해.

맞춰서 자르면 되잖아?

본능적인 엔지니어링 수선은 제일 짧은 공통 창으로 전부 잘라서 모든 백분위를 같은 기간으로 계산하는 거야. 깔끔한 발상이고 여기서는 틀렸어. 내면화할 값어치가 있는 이유로.

한 세기 역사를 제일 짧은 이웃에 맞춰 3 년으로 자른다고 둘이 비교 가능해지지 않아. 이 데이터셋 전체에서 제일 값진 걸 파괴하는 거야. 진짜로 긴 계열은 희귀하고 비싸고 대체 불가능하거든. 그걸 겉모양 일관성이랑 바꾸는 거지. 독자가 얻는 건 없어. 이제 기간이 일치하고 둘 다 별말 안 하는 백분위 둘을 갖게 됐을 뿐이야.

대안은 계열마다 자기 역사를 온전히 두고 창을 데이터로 같이 싣는 거야. 그러면 화면이 그걸 보여줄 수 있고 어떤 소비자든 그걸로 따질 수 있어. 공개는 정보를 보존하고 정규화는 파괴해. 선택지가 그 둘이면 공개가 매번 이겨.

짧은 창이 쓸모없는 쪽인 게 아니야. 3 년짜리 백분위는 계산할 값어치가 없다고 결론 내리기 쉬워. 근데 그 계열은 진짜로 여러 해 주기로 움직이는 뭔가를 재고 있고, 그 3 년은 지금 값이 최근 국면 안 어디쯤인지에 대한 진짜 정보야. 실수는 짧은 창 자체가 아니야. 짧은 창 숫자랑 긴 창 숫자를 아무 주석 없이 같은 활자로 나란히 놓는 거지.

덧: 이 규율을 가르치는 독스트링이 자기 창을 틀리게 적고 있었어

아래 코드 블록은 이 엔진의 span_years 를 인용해. 창을 정확히 밝히는 게 주제 전부인 함수야. 그런데 그 독스트링이 3 주 넘게 장기 계열을 "155 년" 이라고 적어놨어. 자기가 얹혀 있는 함수가 145.7 을 돌려주는 동안. 열네 줄 아래야. 한쪽을 고치는 사람 화면에 다른 쪽이 같이 떠 있을 거리. 이 레슨은 그 오류를 그대로 인용한 채로 배포됐고, 2026-08-31 에 고쳐졌어.

고친 방향이 요점이야. 145.7 로 안 바꿨어. 그것도 내년이면 틀리거든. 155 가 틀렸던 거랑 정확히 같은 이유로 — 창은 자라니까. 고친 독스트링은 "~146 년, 계속 늘어남" 이라고 하고, 숫자를 다시 적는 대신 window_years 로 보내. 바로 그 함수가 계산하는 값이야.

계산되는 값을 산문으로 다시 적으면, 주인 없는 두 번째 진실 원본이 생겨. 그리고 그건 항상 져. 코드 쪽은 굴러가면서 갱신되는데 산문 쪽은 안 그러거든. 이 레슨 앞부분이 "창이 세상의 답인지 네 답인지 알고 있어야 해" 라고 했잖아. 여기 세 번째 종류가 있어. 한때는 네 답이었는데 지금은 아무의 답도 아닌 창. 숫자를 문서에 박고 싶어질 때마다 물어봐. 이거 어디선가 계산되고 있나? 그러면 박지 말고 가리켜.

Code

창을 한 번 계산해서 행에, 이유까지 붙여서·python
def span_years(first: str | None, last: str | None) -> float | None:
    """How much history stands behind a percentile, in years.

    Not decoration. These windows are wildly unequal -- HY OAS
    carries ~3 years (FRED trims the ICE BofA licence), CAPE ~146
    and rising (this docstring said 155 while the function it
    documents returned 145.7), fed funds 41 -- and a percentile
    says nothing without the ruler
    it was measured against. p12 over three years and p12 over a
    century are different claims, and a surface that prints them
    identically is asserting a commensurability it does not have.
    """
    ...


# This docstring read "CAPE 155" from 2026-08-06 to 2026-08-31 --
# (14e2586, the commit that introduced span_years itself; an
#  earlier draft of this note said 08-05, which git disagreed
#  with -- in a passage about checking claims) --
# off by a decade, in a docstring whose entire subject is stating
# your window accurately, about the very function that returns the
# right answer fourteen lines further down. The stored series
# starts 1881
# (CAPE needs ten years of earnings before its first point, so the
# ~1871 dataset yields a ~146-year window), and the live read model
# reported 145.7 the day it was corrected.
#
# Note what the fix is NOT: another hardcoded number. 145.7 would
# be wrong by next year for the same reason 155 was wrong -- the
# window GROWS. The corrected text says "~146 and rising" and
# points at window_years, which is computed. A constant restating
# a computed value is a second source of truth with no owner, and
# it always loses.


# Attached to every read-model row, next to the percentile itself:
#   row["first_date"]   = first[key]
#   row["window_years"] = span_years(first[key], row["data_date"])
#
# Two extra fields. They are the difference between publishing a
# measurement and publishing a number that looks like one.

External links

Exercise

팀이 대시보드에서 서로 비교하는 지표 셋을 골라서, 각각 실제로 갖고 있는 제일 이른 데이터 포인트를 찾아봐. 기간이 두 배 넘게 벌어지면, 지금까지 비교는 은근히 역사 제일 긴 지표를 제일 믿을 만한 걸로 가중하고 있었거나 — 더 나쁘게 — 셋을 동등하게 다뤄온 거야. 기간을 대시보드에 적어 넣고 누구 해석이 달라지는지 봐.
Hint
현실에서 제일 흔한 판은 이웃보다 늦게 계측이 붙은 지표야. 아무 표시도 없고, 차트는 데이터가 시작하는 데서 시작하고, 그래서 조용히 '이 지표는 평평하다가 움직이기 시작했다' 로 읽혀. 진실은 '우리가 재기 시작했다' 인데.

Progress

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

댓글 0

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

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