몬테카를로 시뮬레이션 계산식과 1,000개 경로의 오차
적립식 투자 몬테카를로 시뮬레이션의 계산을 수식으로 풉니다. 잔액의 점화식, 백분위수와 성공률을 구하는 법, 1,000개 경로의 결과가 얼마나 흔들리는지를 50번 실행한 실측과 비교합니다.
업데이트
적립식 투자 몬테카를로 시뮬레이션의 계산을 수식으로 풉니다. 잔액의 점화식, 백분위수와 성공률을 구하는 법, 1,000개 경로의 결과가 얼마나 흔들리는지를 50번 실행한 실측과 비교합니다.
업데이트
몬테카를로 시뮬레이션은 난수를 쓴 시행을 여러 번 되풀이하고, 결과가 어떻게 분포하는지 세어서 답을 구하는 방법입니다.[1] 투자 계획에서는 시행 한 번이 잔액을 한 달씩 갱신하는 식(점화식)을 마지막 달까지 따라가는 것이고, 각 달의 수익률은 난수로 뽑습니다. compoundsim에서는 20년 계획이라면 경로 하나가 이 한 달 단위 계산을 240번 거치고, 시뮬레이터는 이런 경로를 1,000개 만듭니다. 1,000개 경로에서 구한 중앙값은 난수를 바꿔도 몇 % 정도만 움직이고, 비율의 변동도 작습니다. 결과를 훨씬 크게 바꾸는 것은 월 수익률을 어떻게 뽑느냐입니다.
이 글에서는 수익률 모델은 제쳐 두고, 어떤 모델에든 공통인 계산을 수식으로 적습니다. 같은 내용을 수식 없이 보려면 "몬테카를로 시뮬레이션이란"을 참고하십시오.
달에 로 번호를 매기고, 번째 달 말의 잔액을 , 월 적립액을 라고 하겠습니다. 고정 수익률 복리 계산기는 연 수익률 을 실효 수익률로 보고 한 달 동안의 증가 배율로 바꾼 뒤, 매달 같은 배율을 적용합니다.
몬테카를로 시뮬레이션은 이 대신 매달 난수로 뽑은 증가 배율 를 씁니다. 는 그 달의 로그 수익률입니다(다음 절).
적립액은 그 달의 수익률이 반영된 뒤 달 말에 들어갑니다. 고정 수익률 계산과 같은 순서이므로, 무작위성을 없애면 두 계산은 일치합니다. 20년 계획이면 이고, 240개월 전체를 한 번 따라간 것이 경로 하나입니다. 시뮬레이터는 이를 1,000개 계산합니다.
인출 시뮬레이터는 순서가 반대입니다. 매달 초에 인출액을 빼고 남은 돈을 불립니다. 인출액 는 첫해 연간 금액의 12분의 1에서 시작해 매달 물가에 맞춰 늘어납니다.
인출로 잔액이 처음 0 이하가 되는 달에 그 경로는 돈이 바닥난 것으로 보고, 이후로도 0에 머뭅니다.
몬테카를로 시뮬레이터에서 실질을 선택했을 때, 그리고 인출 시뮬레이터에서는 항상, 잔액을 그 시점의 물가 수준으로 나눕니다. 가정한 연 물가상승률을 (기본값 2%)라고 하면 번째 달의 실질 잔액은 입니다. 물가는 이 일정한 비율로 오르며, 여기에는 난수를 쓰지 않습니다.
그 달의 단순 수익률을 (5%면 0.05)라고 하면 로그 수익률은 입니다. 시뮬레이터의 모델은 과거 월 수익률을 로그로 바꾼 값에 맞춘 것입니다. 로그로 바꾸면 여러 달에 걸친 증가가 덧셈이 됩니다. 적립 없이 초기 투자금만 있을 때는
입니다. 의 합은 달 수가 늘수록 좌우 대칭인 분포에 가까워집니다. 를 기댓값(평균)이라고 하면 이 합의 중앙값은 약 이고, 잔액의 중앙값은 약 입니다. 그런데 는 위로 휘는 함수이므로 잔액의 평균은 이보다 커집니다(). 아주 좋은 소수의 경로가 평균을 끌어올려도 중앙값은 거의 움직이지 않습니다.
중앙값은 이런 소수의 경로에 잘 흔들리지 않는 숫자입니다. 단순 평균 수익률과 돈이 실제로 불어나는 속도의 차이(변동성 드래그, volatility drag)는 "평균 수익률은 돈이 불어나는 속도가 아니다"에서 다룹니다. 매달 적립하면 식이 이런 형태가 되지 않지만, 같은 이유로 평균은 여전히 중앙값보다 높게 나옵니다.
어느 달의 1,000개 경로의 잔액을 작은 것부터 늘어놓은 것을 ()이라고 하겠습니다. 백분위수는 순위 위치의 값입니다. 가 정수가 아니면 앞뒤 두 경로 사이를 직선으로 이어 읽습니다(는 의 소수점 아래를 버린 정수입니다). 통계 소프트웨어마다 다른 백분위수 계산법을 정리한 분류에서 '정의 7'에 해당하는 방법입니다.[2] 식으로 쓰면 다음과 같습니다.
중앙값은 입니다. 차트의 바깥 띠는 부터 까지, 안쪽 띠는 부터 까지입니다. 띠는 달마다 따로 계산하므로, 띠의 경계선이 특정한 경로 하나를 따라가지는 않습니다.
비율은 조건을 만족한 경로의 개수를 으로 나눈 값입니다. 인출 시뮬레이터의 성공률은 끝까지 돈이 버틴 경로의 비율입니다.
드로다운은 잔액이 그때까지 도달한 최고치보다 얼마나 아래에 있는지입니다. 최고치는 초기 투자금에서 시작하고, 잔액에는 적립한 돈도 포함됩니다(실질로 볼 때는 실질 잔액으로 잽니다).
한 경로에서 가장 깊었던 가 그 경로의 최대 드로다운입니다.
여기서 구한 와 는 모두 모델이 만든 1,000개 경로에 대한 값입니다. 모델이 현실에 맞는지는 경로를 아무리 늘려도 알 수 없습니다.
경로(시행)의 수가 유한하므로, 난수의 출발점(시드)을 바꾸면 결과도 조금 달라집니다. 그 크기는 식으로 가늠할 수 있습니다.
비율 는 확률 로 일어나는 일을 번 시도해 센 값이므로, 그 표준편차(표준오차)는 다음과 같습니다.
성공률이 90%라면 로, 표준오차는 약 0.95%포인트입니다. 그 두 배쯤 위아래, 즉 대략 88%에서 92%까지는 우연만으로도 움직일 수 있습니다.
백분위수에도 비슷한 식이 있습니다. 를 그 백분위수 위치에서 잔액 분포의 밀도(그 금액 근처에 경로가 얼마나 몰려 있는지)라고 하면
입니다. 경로가 드문 꼬리 쪽일수록 가 작아 오차가 커집니다. 두 식 모두 에 비례해 줄어들므로, 오차를 절반으로 줄이려면 경로가 4배 필요합니다.
실제 크기를 보기 위해 몬테카를로 시뮬레이터와 같은 계산을 시드만 바꿔 50번 실행했습니다. 조건은 S&P 500(SPY, 배당 재투자, 1993년 이후 전체 기간에 맞춘 모델), 미국 달러 기준 명목, 매달 1달러씩 20년(원금 240달러)입니다.
| 20년 후 잔액 | 50번 실행의 평균(원금 대비 배수) | 1,000개 경로의 변동 폭 | 250개 경로의 변동 폭 |
|---|---|---|---|
| 하위 10% | 1.7배 | 3.0% | 4.1% |
| 중앙값 | 3.5배 | 2.5% | 5.5% |
| 상위 10% | 7.6배 | 3.1% | 6.5% |
변동 폭은 50번 결과의 표준편차를 평균으로 나눈 값입니다. 1,000개 경로에서 20년 후 중앙값은 실행할 때마다 2.5% 정도 움직입니다. 그러니 1,000개 경로의 중앙값은 그만큼의 오차를 안고 있는 값으로 읽는 것이 좋습니다.
비율로도 같은 확인을 했습니다. 최대 드로다운이 −30% 이하까지 간 경로의 비율은 50번 평균 21.3%였습니다. 다음 표의 표준편차는 그 비율 자체가 움직이는 폭이며, 단위는 %포인트입니다.
| 최대 드로다운 −30% 이하인 비율 | 1,000개 경로 | 250개 경로 |
|---|---|---|
| 50번 실행에서 잰 표준편차 | 1.5% | 2.8% |
| 식 의 값 | 1.3% | 2.6% |
비율에서는 실측한 변동 폭과 식의 값이 거의 일치합니다. 경로를 4분의 1로 줄이면 대부분의 지표에서 변동 폭은 대략 두 배가 됩니다. 다만 50번 실행으로 잰 표준편차에는 그 자체로 10% 안팎의 오차가 있고 두 값의 비에는 오차가 더 커서, 첫 번째 표의 하위 10% 행처럼 두 배에서 크게 벗어나는 행도 나옵니다.
각 경로는 모델의 평균 수익률과 국면이 바뀔 확률을 먼저 저마다 다시 뽑은 뒤 달을 뽑습니다. 그래도 경로끼리는 서로 독립이므로 관계는 그대로 성립합니다.
시뮬레이터의 시드는 페이지를 연 날짜(UTC)를 8자리 정수 로 만든 것입니다. mulberry32라는 작은 의사 난수 생성기가 이 수에서 구간의 균등 난수를 만들고, 첫 번째 경로부터 차례로 씁니다. 같은 날 같은 설정으로 페이지를 열면 누가 열든 같은 1,000개 경로가 나옵니다.
다른 날 페이지를 열면 시드가 바뀌어 1,000개 경로를 새로 뽑습니다(페이지를 열어 둔 채라면 자정이 지나도 시드는 그대로입니다). 위 실험도 50번 모두 시드만 바꿨으므로, 날이 바뀌어 중앙값이 몇 % 움직이는 것은 거기서 잰 변동 폭 안에 들어갑니다. 그보다 훨씬 큰 차이는 설정이나 모델을 맞추는 과거 데이터를 바꿨을 때, 또는 데이터 갱신으로 모델이 다시 맞춰졌을 때 생깁니다.
자산이 하나라면 점화식의 는 그 자산의 월 로그 수익률 에서 나옵니다. 여러 자산을 섞을 때는 자산 의 비중을 (합계 1)로 두고, 매달 그 비중으로 리밸런싱한다고 보면 증가 배율은 다음과 같습니다.
포트폴리오 시뮬레이터(신용 매수를 쓰지 않을 때)와 인출 시뮬레이터는 이 를 대신 점화식에 넣습니다.
달러가 아닌 통화로 보면서 '환율 변동 포함'을 켜 두면(기본값), 그 통화 1단위의 달러 가치가 그 달에 얼마나 변했는지도 자산과 함께 모델에서 뽑습니다. 그 로그 변화를 라고 하면 그 통화 기준의 증가 배율은 입니다. 는 과거 데이터에 맞춘 모델에서 환율이 장기적으로 평균 얼마나 변했는지입니다. 환율의 장기 추세가 앞으로도 이어진다는 보장은 없으므로 이를 빼고, 오르내림과 그 시기만 남깁니다.
와 를 평온 국면과 거친 국면 사이를 오가며 어떻게 뽑는지는 "몬테카를로 시뮬레이션이란"에서 설명합니다.
위의 변동 폭은 정해진 모델에서 유한한 수의 경로를 돌리기 때문에 생기며, 경로를 늘리면 작아집니다. 경로를 아무리 늘려도 그대로인 것이 두 가지 있습니다.
하나는 수익률 모델입니다. 를 어떤 모델에서 뽑느냐에 따라 분포 자체가 바뀌고, 과거 데이터에 맞춘 모델은 그 데이터에 없던 종류의 시장을 좀처럼 만들어 내지 않습니다.
다른 하나는 계산에서 빠진 것입니다. 세금, 매매 수수료, 계좌 비용은 빼지 않습니다(ETF 자체의 보수는 수익률에 들어 있습니다). 적립액은 기간 내내 같고, 물가는 일정한 비율로 오릅니다.
이런 가정은 1,000개 경로가 흔들리는 몇 %보다 결과를 훨씬 크게 움직입니다. 위 실험과 같은 설정에서 모델을 맞추는 과거 데이터만 바꾸고 같은 시드로 1,000개 경로를 한 번씩 돌리면, 20년 후 중앙값은 전체 기간으로는 원금의 3.4배, 최근 5년으로는 4.1배였습니다. 경로 수에서 오는 변동 폭(2.5%)보다 훨씬 큰 차이입니다.