Python新手教學(Part 5):如何衡量風險與報酬?夏普比率告訴你

今天我們來看一下市場上常見的風險與報酬指標:夏普比率(sharpe ratio),這是一個風險跟報酬的比例,有了夏普比率,你就知道為什麼要投資美股而不是台股了!

thumbnail 9

sharp ratio 簡單講,就是「報酬 / 風險」!

以這著比率,可以想像,sharp ratio 越高,代表獲利大於風險,
而sharp ratio 越低,代表風險大於獲利,那就會有點危險了!
所以找一個sharp ratio 越高的指數,就等於找出了「獲利大且風險相對小」的指數喔!

如何定義獲利?

獲利可以用每天平均的漲跌來代表,也就是今天漲1%,明天跌1%,平均獲利就是0%,
接下來我們就用python來計算每天平均獲利吧

首先,記得回去前一個單元,找出上次的adjclose:

1 5

接下來,我們就可以來計算獲利:

pct_change = close.pct_change()
profit = pct_change.mean()
profit.sort_values()

上方的程式碼,
第一行,有好用的功能,叫做adjclose.pct_change(),這個函示會計算今天漲了x%,並且以x/100來表示,將整個table中的每一條時間序列都進行計算喔!
第二行,針對每一檔指數,將每一天的漲跌都平均起來,
第三行,進行由小到大的排序

2 6

以平均獲利來說,看到台股(TSEC weighted index)竟然排在倒數第三位,
可以見台灣投資人多麼可憐XDD

如何衡量風險

風險通常會用標準差(standard deviation)來計算,標準差,可以想像是股票震盪的程度,例如金融海嘯的時候,股票上上下下的比較劇烈,標準差很大。今天就不折磨各位了,有興趣請參考wiki介紹,我們直接用 python 當中現有的程式碼來計算即可:

risk = pct_change.std()

計算sharpe ratio

這個就更簡單了,直接相除即可

sharpe = profit / risk * (252 ** 0.5)
sharpe.sort_values()

可以看到上述程式,我們額外乘了一個「252 ** 0.5」
因為我們希望算年化 annual sharpe ratio,
其中的252是一年大約的交易天數,
而「**」是「次方」的意思。
為什麼要乘這個常數?最主要是因為大家幫自己的歷史回測計算sharpe ratio時候,都有乘上這個數字,要乘了才有辦法跟別人比較XD,
當然這背後可能有更深層的數學邏輯,但我傾向於這樣理解(懶)。

6 4

你會發現

台股竟然倒數第三名!

註:2020年更新,台灣排名第六名!超級前面~~~

可以發現台股真的好慘,慘不忍睹,為什麼會這樣呢,我們可以將歷史圖表畫出來:

3 5

可以發現因為我們是從1998年開始計算的,那個時候剛好也上萬點,跟現在的萬點是同一個萬點,反觀我們來看美股:

4 5

可以看到從1998年開始,直到現在漲了將近3倍!
可見台股的獲利不理想是導致於sharpe ratio比較低的很大的因素。

我們目前計算的sharpe ratio,是所有歷史資料的平均值,
然而我們知道,雖然台股總平均來說很爛,但是應該有時也有可圈可點之處,
我們希望用時間移動窗格,每日都計算252天以前的sharpe值,

來找出台股表現比較好的時段

移動窗格

你以為這個很難嗎?其實超簡單,跟上面幾乎一樣,只要做一點小更改:

# before
profit = pct_change.mean()
risk = pct_change.std()
sharpe = profit / risk * (252 ** 0.5)

# after
profit = pct_change.rolling(252).mean()
risk = pct_change.rolling(252).std()
sharpe = profit / risk * (252 ** 0.5)

幾乎長的一模一樣對吧?唯一不一樣的是rolling(252)這個功能,
這是移動窗格252天的意思。
額外要注意的是,之前的寫法中,sharpe是一個series,index為指數名稱,而在現在的寫法中,sharpe變成了一個dataframe(table),其index代表日期,而columns代表每檔指數,其中的數值是 252 天的 sharpe ratio,神奇吧!

這就是python跟R最強大的資料處理功能!

有了這個移動窗格版的sharpe ratio,我們做圖後,就可以來看一些端倪:

做圖看端倪

close['TSEC weighted index'].plot()
sharpe['TSEC weighted index'].plot(secondary_y=True)

以上的代碼可以繪出下面這張圖,其中藍色的為加權指數,而黃色的為sharpe ratio,由於這兩個時間序列的數值差非常多,台股可能是在4000~10000左右,而sharpe可能是在-2~2左右,所以上方第二行程式中,我們用secondary_y=True這個參數,來將兩個數值的座標分開,所以下方的圖中,可以看到sharpe ratio的大小標示在右邊。

以上所有程式碼,都可以在 colab 範例中找到喔!

5 5

可以看到,sharpe ratio (黃)在台股加權指數(藍)高點時,會比較大,而台股低點時,會比較低
圖中還可以看出,在大盤高點時,sharpe ratio會領先大盤往下落,接下來我們就可以利用這個特點,來模擬一些買賣的實驗。

下次我們就來創造一個夏普策略吧!
其實程式碼已經寫好了,但還沒時間寫文章
接下來就可以進入下一單元,我們利用sharpe ratio來寫一個策略吧!

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!