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

일부러 굴리는 주사위

~11 min · monte-carlo, simulation, numpy, percentiles

Level 0Open Gate
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"미래 하나를 알아맞힐 순 없어. 대신 그럴듯한 미래 수천 개를 굴려서, 그것들이 모여 만드는 모양을 볼 순 있지."

Monte Carlo simulation 이 뭐냐면

포트폴리오의 미래는 불확실해. 이러면 막다른 길 같지. 알 수 없는 걸 갖고 무슨 계산을 해? Monte Carlo simulation 이 그 물음에 대한 정직한 답이야. path 하나를 예측하는 대신 여러 개를 만들어 내. 가격이 움직이는 방식에 대한 명시된 가정에 맞게 무작위로 뽑아낸, 있을 법한 미래 수천 개를. 그리고 그것들이 이루는 분포를 보는 거야. Keep 는 이걸 numpy 로 포트폴리오에 돌려. 무작위 시행을 잔뜩 하고, 하나하나가 그럴듯한 궤적이 되고, 그걸 모아 추측 숫자 하나가 아니라 가능성의 그림으로 집계해.

선 하나가 부챗살이 되는 순간

순진한 projection 은 선 하나를 그어. "연 7% 씩 벌면 10년 뒤 잔고는 이만큼." 그 한 줄이 정작 중요한 걸 다 숨겨. 좋았던 해와 나빴던 해, 순서가 만드는 위험, 그리고 일이 험하게 풀리는 꼬리 쪽까지. Monte Carlo 는 그 선을 부챗살로 바꿔. 10년짜리 궤적을 수천 번 돌리되 기간마다 다른 무작위 추첨을 섞으면 퍼짐이 생기지. 이제 percentile path 를 읽으면 돼. 중앙값이 걷는 길, 비관적인 10 percentile, 낙관적인 90 percentile. 듣기 좋은 중간값 하나가 아니라, 있을 법한 범위 전체가 보이는 거야.

분포가 점 추정보다 정직해. 예상 숫자 하나를 딱 내미는 건 존재하지도 않는 확실성을 연기하는 거야. 퍼짐을 보여주는 것, 그러니까 좋은 꼬리와 나쁜 꼬리가 어디에 떨어지고 불확실성이 실제로 얼마나 넓은지 보여주는 것이, 미래는 값이 아니라 범위라는 진실을 존중하는 길이야. 부챗살은 선 하나가 숨기던 걸 말해 줘.

가정은 입력이지 진실이 아니야

simulation 은 딱 가정만큼만 의미가 있어. 그래서 Keep 는 가정을 전부 run 의 명시적 입력으로 만들었어. horizon, iteration 수, hurdle, mean-reversion 계수, 그리고 실제 데이터에서 뽑아낸 calibration(변동성, beta, anchor)까지. 가정을 바꾸면 다른 부챗살이 나와. 그게 정확히 의도된 동작이야. "세상이 이렇게 굴러간다면 어떻게 되지?" 를 탐색하는 거니까. simulation 은 제 가정이 참이라고 우기지 않아. 가정을 훤히 보여주고, 그 결과를 보게 해 줄 뿐이야. 이 투명함이 정직한 시나리오 도구와 블랙박스 점집을 가르는 선이야.

mean reversion 도 그런 가정 중 하나야. 명시적으로 노출된. mean-reversion 계수는 극단적인 움직임이 시간이 지나며 중심 쪽으로 당겨지는 경향이 있다는 믿음을 숫자로 담은 거야. 법칙이 아니라 돌릴 수 있는 손잡이지. Keep 가 이걸 입력으로 꺼내 둔 이유도 정확히 그거야. 시나리오의 동작이 엔진 속에 구워 넣은 마법이 아니라, 눈에 보이는 선택의 결과여야 하니까.

Code

무작위 path 여러 개를 percentile 로 읽기 (예시)·python
import numpy as np

def simulate(seed_price, horizon, iterations, vol, drift, rng):
    # iteration 하나하나가 그럴듯한 미래 path 하나야.
    paths = np.empty((iterations, horizon))
    for i in range(iterations):
        price = seed_price
        for t in range(horizon):
            shock = rng.normal(drift, vol)     # 이번 기간의 무작위 한 걸음
            price = price * (1 + shock)
            paths[i, t] = price
    # 출력은 숫자 하나가 아니라 분포야.
    return {
        "p10": np.percentile(paths, 10, axis=0),   # 비관 band
        "p50": np.percentile(paths, 50, axis=0),   # 중앙값 path
        "p90": np.percentile(paths, 90, axis=0),   # 낙관 band
    }
# 정직한 답은 부챗살(p10..p90)이야. 선 하나는 꼬리를 숨겨.

External links

Exercise

미래를 향해 선 하나만 긋는 projection 을 아무거나 골라 봐. 저축 성장 계산기, 프로젝트 타임라인, 인원 계획 뭐든. 그 선 하나가 뭘 숨기고 있는지 묘사해 봐. 그다음 Monte Carlo 버전을 스케치해 봐. 기간마다 뭘 무작위로 흔들 거고, 어떤 percentile band(p10/p50/p90)를 보고할 거야? 의사결정자가 부챗살에서 배울 수 있는 것 중에서, 선 하나가 적극적으로 감추는 게 뭔지 설명해 봐.
Hint
선 하나는 언제나 현실에 없는 매끄러움을 약속해. 부챗살이 드러내는 건 선이 지워 버린 가장 중요한 두 가지야. 불확실성이 얼마나 넓은지, 그리고 나쁜 꼬리가 얼마나 나쁜지. 중앙값은 괜찮아 보이는데 p10 이 무시무시한 상황은, 중앙값 같아도 band 가 좁은 상황과 완전히 다른 이야기거든.

Progress

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

댓글 0

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

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