蒙地卡羅模擬的計算公式,與1,000條路徑的誤差
用公式說明定期定額的蒙地卡羅模擬在算什麼:餘額的遞迴式、對數報酬率、百分位數與成功率的算法,以及1,000條路徑的結果會差多少,並與實際跑50次的結果對照。
更新
用公式說明定期定額的蒙地卡羅模擬在算什麼:餘額的遞迴式、對數報酬率、百分位數與成功率的算法,以及1,000條路徑的結果會差多少,並與實際跑50次的結果對照。
更新
蒙地卡羅模擬是把一個隨機試驗重複很多次,再統計結果怎麼分布,藉此求出答案的方法。[1]用在投資計畫上,一次試驗就是用一條逐月更新餘額的公式(遞迴式)往前推,每個月的報酬率用亂數抽出,一直推到最後一個月。在compoundsim中,20年的計畫每條路徑要把這個月度步驟走240次,模擬器一共跑1,000條路徑。用1,000條路徑算出的中位數,換一組亂數也只會變動幾個百分比,比例的變動同樣不大。真正讓結果大幅改變的,是每個月的報酬率怎麼抽。
本文先不談報酬率模型,而是用公式寫出所有模型共用的計算。不用公式的說明,請見蒙地卡羅模擬是什麼。
把月份編號為 ,第 個月月底的餘額記為 ,每月投入記為 。固定報酬率的複利計算機把年報酬率 當作有效年利率,換算成每個月的成長倍數,每個月都套用同一個數:
蒙地卡羅模擬則把其中的 換成每個月用亂數抽出的成長倍數 , 是當月的對數報酬率(見下一節):
每月投入在月底、當月漲跌之後才加入,順序和固定報酬率的計算相同;把隨機性拿掉,兩者的結果就一致。20年的計畫 ,把這240個月走完一次就是一條路徑。模擬器計算1,000條。
提領模擬器的順序相反:月初先提領,剩下的再成長。提領金額 從第一年金額的十二分之一開始,每個月依通膨調高:
某個月提領後餘額降到零或以下,這條路徑就算資金用完,之後一直維持零。
蒙地卡羅模擬器選擇「實質」時,以及提領模擬器在任何時候,都會把餘額除以當時的物價水準。設預期通膨率為每年 (預設2%),第 個月的實質餘額就是 。物價按這個固定比率上漲,不使用亂數。
設 為當月的簡單報酬率(5%記為0.05),它的對數報酬率是 。模擬器的模型,是把過去的月報酬率換成對數後估計出來的。換成對數之後,好幾個月的成長就能寫成加法。只有初始投資額、沒有每月投入時:
月數越多, 的總和越接近左右對稱的分布。記 為期望值(平均),這個總和的中位數約為 ,所以餘額的中位數約為 。但 是向上彎的曲線,所以餘額的平均會比這個數高()。少數表現非常好的路徑會把平均往上拉,中位數卻幾乎不動。
中位數就是不太受這幾條路徑左右的數字。簡單平均報酬率和資金實際成長速度之間的差距(波動拖累),在平均報酬率不等於資金成長的速度中說明。有每月投入時,公式就不是這個形式,但基於同樣的原因,平均仍然會高於中位數。
把1,000條路徑在某個月的餘額由小到大排列,記為 ,。第 百分位數取排名 處的值; 不是整數時,就在兩側的兩條路徑之間用直線內插( 表示把 無條件捨去成整數)。統計軟體計算百分位數的方法有好幾種,依照常見的分類,這是「定義7」的算法。[2]寫成公式:
中位數是 。圖表上外側的區間是 到 ,內側的區間是 到 。每個月的區間都是分開計算的,所以區間的邊線並不是沿著某一條路徑走。
比例是符合某個條件的路徑數除以 。提領模擬器的成功率,就是資金撐到最後的路徑比例:
回撤是餘額比先前達到的最高點低了多少。最高點從初始投資額開始算,餘額也包含已經投入的錢(看實質金額時,以實質餘額衡量):
一條路徑上最深的 ,就是這條路徑的最大回撤。
這裡的 和 ,描述的都是模型產生的1,000條路徑。模型符不符合現實,路徑再多也看不出來。
路徑(試驗次數)有限,所以換一個亂數的起點(種子),結果就會稍有不同。變動有多大,可以用公式估計。
比例 是把機率為 的事件試了 次後數出來的,所以它的標準差(標準誤)是
成功率為90%時,這個值是 ,標準誤約0.95個百分點。在上下約兩倍的範圍內,也就是大約88%到92%,成功率可能只因為偶然而變動。
百分位數也有類似的公式。設 為餘額分布在該百分位數處的密度(路徑在這個金額附近聚集得有多密),則
在路徑稀疏的尾端, 較小,誤差就較大。兩個公式都按 縮小,所以要讓誤差減半,路徑數必須變成四倍。
為了看出實際的大小,我們把和蒙地卡羅模擬器相同的計算跑了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% |
| 第90百分位 | 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% |
就比例而言,實測的變動和公式幾乎一致。路徑減為四分之一,大多數指標的變動約變成兩倍。不過,用50次結果算出的標準差本身就有大約一成的不確定性,兩個標準差的比值更不確定,所以有些列會明顯偏離兩倍,例如第一張表的第10百分位那一列。
每條路徑會先自行重新抽出模型的平均報酬率和狀態切換的機率,再抽各個月份。路徑之間仍然彼此獨立,所以 的關係照樣成立。
模擬器的種子,是開啟頁面當天的日期(UTC)寫成的八位數 。一個叫mulberry32的小型虛擬亂數產生器,把它轉成 上均勻分布的亂數,從第一條路徑開始依序使用。同一天、同樣的設定,不管誰開啟頁面,都會得到同樣的1,000條路徑。
換一天開啟頁面,種子就跟著改變,頁面會重新抽出1,000條路徑(頁面一直開著的話,過了午夜種子也不會變)。上面的實驗在50次之間也只改變了種子,所以中位數在兩天之間變動幾個百分比,仍在那裡測到的變動範圍內。比這大得多的差異,來自改變設定、改變模型估計所用的歷史資料,或是資料更新後模型重新估計。
單一資產時,遞迴式中的 來自該資產的月對數報酬率 。資產組合則設資產 的比例為 (比例合計為1),每個月再平衡回這些比例,成長倍數為
投資組合模擬器(不使用融資買進時)和提領模擬器,都把這個 代替 放進遞迴式。
以美元以外的貨幣計算、並開啟「計入匯率波動」(預設)時,該貨幣一單位的美元價值在當月的變化,會和各資產一起從模型中抽出。把它的對數變化記為 ,以該貨幣計的成長倍數就是 ,其中 是以歷史資料估計的模型中,匯率長期的平均變化。匯率的長期趨勢不一定會延續,所以把它扣掉,只留下波動和波動發生的時間。
和 如何在平靜狀態與動盪狀態之間切換著抽出,請見蒙地卡羅模擬是什麼。
上面的變動,來自用給定的模型跑有限條路徑,路徑越多就越小。但有兩件事,不管跑多少條路徑都不會改變。
一是報酬率模型。 從哪一種模型抽出,會改變分布本身;以歷史資料估計的模型,很少產生和歷史上任何行情都不像的市場。
二是計算中沒有納入的東西。稅金、交易手續費和帳戶費用都沒有扣除(ETF本身的費用率已反映在報酬中)。每月投入金額始終不變,物價也以固定比率上漲。
這些前提對結果的影響,遠大於1,000條路徑那幾個百分比的變動。在和上面實驗相同的條件下,只改變模型估計所用的歷史資料,用同一個種子各跑一次1,000條路徑,20年後的中位數在全部歷史下是投入本金的3.4倍,在最近5年下是4.1倍:差距遠大於路徑數造成的變動(2.5%)。