閒聊隨機騙局 x 蒙地卡羅風險分析 x 程式設計

James Shieh
技術保鮮盒
Published in
11 min readSep 26, 2021

在茫茫股海之中,小弟我身為一個入市不滿一年的菜雞,最近拜讀了Nassim Nicholas Taleb的《隨機騙局》(Fooled by Randomness)。於是也想試試蒙地卡羅這個作者大力吹捧的數學方法。作者很喜歡用蒙地卡羅法來分析問題,因為這個方法可以簡單而暴力地處理很多複雜問題。本文作為我的研究日記,就環繞著摩地卡羅,聊聊我的讀書心得、蒙地卡羅股價分析實驗與發想,如果你剛好對這些主題有興趣,也許本文能以理論結合實作的角度給你一些不同的見解。

Photo by Austin Distel on Unsplash

隨機騙局

談隨機騙局一定要請台灣的國民科普權威 — — 啾啾鞋,來演示一下:

影片連結:https://www.youtube.com/watch?v=1hLqLJWjsC8&ab_channel=啾啾鞋

隨機騙局的主張是股價的漲跌具有高度不確性,多數人賺錢的原因不是因為他們的分析周延、判斷精準,大抵上是因為運氣好。而賠錢也可能不是因為自己分析不周延、判斷不精準,大抵上是因為運氣差。

如果有夠多的猴子,給他們一筆資金亂選股票,遲早會出現一隻績效超越多數人的股神猴。人類天生對數字不敏感,畢竟人腦不是設計用來處理數字的,我們的大腦就像是隨機漫步的傻瓜,天真地以為自己知道了那些自己根本沒弄明白的事情。因此作者特別愛好用蒙地卡羅法來處理這種隨機性,並想辦法從中得到一些洞見。

摩地卡羅(Monte Carlo method)是什麼?

認識蒙地卡羅法的起手式,一定是要談它最生動的應用 — — 計算圓周率:

如果我們在邊長為2的灰色正方形中畫一個半徑為1的紅色靶心,會得到一個類似這樣的圖:

這時我們開始朝著這個靶心射飛鏢,如果射中紅色靶心就得1分,射了無數次後,我們知道總共有n個飛鏢在這個正方形上,其中有m個飛鏢在紅色靶心中。於是得到命中率是m/n

另外,我們知道

  1. 半徑r為1的圓面積:πr² = π
  2. 邊長l為2的正方形面積:2*2=4

所以圓面積佔了正方形面積的π/4。如果我們射飛鏢多到足以填滿整個正方形,那麼命中率m/n就會接近π/4。換言之 4*(m/n)就會近似於π。如此便能求得π了。

身為軟體工程師的小確幸就是不需要自己射飛鏢,交給程式處理就好,我們只要隨機產生n個點座標(x,y),然後計算x²+y²<1,就能知道這個點是不是在圓內了:

from random import random
n = 50000000
m = 0
for i in range(0, n):
m += ( (random()**2 + random()**2) < 1 )
print ( m/n * 4 )

所以蒙地卡羅就是利用隨機數來解決問題的一種方法。在本例中的隨機數是指飛鏢的落點座標。而投資方面的其中一種應用則是風險評估。

蒙地卡羅風險評估

蒙地卡羅風險評估是一種透過隨機變數模擬股價走勢,並計算出預期風險的方法。

本節大致介紹此方法需要的知識點。首先聲明,本人才學疏淺,數理造詣平庸,僅為了研究股市大致梳理這些知識,提供一個適合我自己的學習脈絡,以下內容部分出自我個人內化後的理解,涉足不深,難免有所偏誤,歡迎批評指教,我也會在文中附上參考資料,強烈建議大家參考更具公信力的資料來源。

橫向比較股票的風險與報酬

Python版的程式可以參考:https://www.twblogs.net/a/5b8d77b72b717718833e35d5

衡量風險最直覺的方式就是看波動,如果一個股票漲跌的幅度相當大,就表示你買了之後容易大幅回調,風險相對就高。換言之,可用描述離散程度的標準差作為風險。而風險必須相對報酬率而言,同樣的報酬率,若能承擔較小的風險就是相對較好的標的物。橫向比較報酬率的方法是統計個股相較前日的漲跌幅,作為每日報酬率,進而定義指定股票的報酬率(Expected returns)為每日報酬率之平均值;定義風險(Risk)為每日報酬率之標準差。把每支股票的風險與報酬率分別畫在橫軸與縱軸上,就能比較個股間的風險報酬比。例如特斯拉TSLA在左上角,表示其報酬較高,但風險也相對較高。

這裡計算的風險與預期報酬率可當成股票的特性,風險表示股票平均上漲或下跌的幅度(如下圖Stock B所形成的紅色虛線),預期報酬率表示股票的長期趨勢(如下圖Stock B所形成的紅色實線)。

這兩個能描述個股特性的參數將會作為我們使用蒙地卡羅法模擬個股股價走勢的輸入參數。

風險價值(Value at Risk,縮寫VaR)分析

波動只是描述風險的一種方式,要做風險評估需要更嚴謹的定義:

“The VaR measure is defined as the maximum expected loss over a given time horizon, under normal market conditions, at a given level of confidence “ (Jorion 2001).

維基百科:

風險價值(Value at Risk,縮寫VaR),資產組合在持有期間內在給定的信賴區間內由於市場價格變動所導致的最大預期損失的數值。

用人話講,評估風險有三個前提:

  1. at a given level of confidence→排除最好或最差的狀況
  2. under normal market conditions→正常的市場情況下(沒有黑天鵝事件之類的)
  3. over a given time horizon→在給定的時間區間內

投資組合在這三個前提下,最大的預期虧損,就是所謂的風險。

如果我們想深究其意義,必須從統計學的角度來解釋:我們根據歷史走勢,基本上可以得到股價報酬率是遵從常態分佈的(如下圖),橫軸是盈虧,縱軸是其對應的機率,愈右邊獲利愈高(反之獲利愈低並且趨於虧損),我們通常取最差的1–5%(也就是常態分佈左邊1–5%)作為風險價值VaR。

ref: How do you calculate VaR? (https://www.futurelearn.com/info/courses/risk-management/0/steps/39304)

所以我們的蒙地卡羅法最終就是要畫出這張圖,來評估股票的風險與報酬是不是符合我們的預期。

幾何布朗運動的股價模型

如何模擬股價走勢是第一個要被討論的問題,這就必須提到一個很有趣的理論 — — 隨機漫步理論(Random Walk Theory)。這個理論主張股價的變動是一條隨機且不可預測的路徑。

我們可以想像一下,股價就如同一粒落在水中的灰塵,當一堆水分子從四面八方撞擊灰塵時,灰塵總是往力道最小的方向移動,而溫度愈高時,水分子撞擊的力道愈大,灰塵移動地愈快。人類就像這些水分子一樣,有的認為要往東走,有的認為要往西走,市場情緒就如同溫度一樣,愈高昂股價移動愈劇烈。一堆水分子在瞬間同時撞擊灰塵時,我們無法判斷灰塵會往哪個方向走,股價也是如此,灰塵在水分子中的移動特性就是所謂的布朗運動。就此論點而言,用布朗運動來模擬股價的移動似乎是個簡單而合理的方法。

參考維基百科對幾何布朗運動的定義:

我們要讓股價做布朗運動,大致可把公式作以下代換:

股價愈高,市值通常愈高,因此等式左邊我們關心的是變動率,畢竟同樣漲10元,對於原本100元的股票而言只漲了10%,但對於原本10元的股價卻是漲了100%。而等式右邊剛好呼應前面提到的個股特性:由固定的預期回報組成的長期趨勢和漲跌幅形成的波動(風險)組成。

模擬風險價值

參考以下模型之定義:

https://www.investopedia.com/articles/07/montecarlo.asp

我們可將歷史資料的最後一天價格代入S_t,每日平均回報率代入之前算出的預期回報μ,而波動增幅率,則定義為每日回報率之標準差、隨機變數及dt的平方根三者之乘積。就可以求得隔日的價格差dS_t了。

因此這個蒙特卡羅法,主要就是透過前一日的價格加上一個隨機變數幾何布朗運動的公式來產生隔日的價錢,不斷重複計算,就能推演出未來n天的價格走勢了。

Python的程式參考如下:https://www.twblogs.net/a/5b8d77b72b717718833e35d5

用此方法模擬未來一年內,一萬種Tesla股價的走勢:

然後再把最後一天(第365天)的一萬筆特斯拉的價格畫成機率分布圖:

我們定義99%信賴區間為風險價值(VaR),就可以得到圖中的特斯拉的風險價值是59.59美元,一般情況下特斯拉不會低於694.05美元,最終平均價值是754.72美元。

談蒙地卡羅風險評估之價值

我們用這種方式預測出股價的常態分佈圖後,也許會有不少韭菜朋友們像我一樣,興奮地用它來當買賣點位或未來股價的參考。畢竟本來我們只是在圖上畫畫趨勢線、拉個費波納西數列之類的。相較之下,蒙地卡羅似乎高大尚了些。但實際上,你如果有做回測,你會發現用這種方法預測美股價格極為不精準,根本沒有參考意義。那這個方法的價值究竟是什麼?

顯然這個方法並不是用來預測股價的,《隨機漫步》的作者説:

數學主要是用來沈思的工具,不是拿來計算的。

那我們能從這個結果中思考什麼?

《隨機漫步》一書提到了一個觀念 — — 另類歷史:

不管你談的是什麼領域,例如戰爭、政治、醫療、投資,都不能以成果去論斷一個人的表現是好或壞。反過來說,應該以另類結果(以不同的方式開展的歷史)的成本去評判。

風險可被當成一種不確定性,當我們關閉倉位的時候,這個不確定性(許多的另類歷史)就收斂成了一個確定的結果(盈或虧),當結果是盈時,我們就完全忽略了還沒收斂前存在的潛在虧損,傾向於好大喜功的宣揚自己的分析精確、果決。這種心態就是造成我們長期獲利無法穩定的主因之一。

時間寶石:跳脫歷史來衡量不確定性

波動、風險價值讓我們在同個時間軸下衡量不確定性,蒙地卡羅則讓我們能比較不同時間軸的不確定性。蒙地卡羅就是奇異博士的時間寶石。

ref:https://all-alone-he-turns-to-stone.tumblr.com/post/177825560211/thisismarvelus

蒙地卡羅法讓我們可以從平行宇宙的上帝視角看到股價的各種走法,有的倒霉地走向了最大虧損,有的幸運地走向了超高報酬率:

另一方面,道氏定理認為所有的資訊,都反映在股價指數上了。如果股價已經充分反應了所有的事情了,那麼蒙地卡羅的風險價值分析表達的另一種意涵是:如果我適當地利用歷史數據所表現的個股特徵(例如本例的波動、長期趨勢),那麼它預測的走勢基本上已經包含了散戶、大戶、機構的心理,以及其他可能影響股價的基本因素了。蒙地卡羅只是把這些事件隨機排列順序來產生各種另類歷史。

讓我們把無數種另類歷史的結果做統計,計算出風險價值,這樣的數字顯然是有一定的參考意義的:

因此使用幾何布朗運動來作蒙地卡羅風險評估的好處是,可以跳脫出單一歷史的限制,盡可能衡量各種潛在的可能性,將這些可能性量化,所得到的風險價值。

用另類歷史作回測

另一個顯而易見的用法,是把蒙地卡羅模擬出的股價走勢拿來作交易策略的回測,以便評估其績效。

後記

我個人還蠻好奇有沒有更適合分析美股的蒙地卡羅模型可以用的,歡迎大家留言分享與討論,文中若有疏漏與錯誤之處也請大家不吝指教。

--

--

James Shieh
技術保鮮盒

Find something more important than you are and dedicate your life to it.