Python量化交易進階講堂-Markowitz模型實現最優投資組合

歡迎你們訂閱《Python實戰-構建基於股票的量化交易系統》小冊子,小冊子會陸續推出與小冊內容相關的專欄文章,對涉及到的知識點進行更全面的擴展介紹,而且會有選擇地收錄至小冊中,更便於廣大讀者查閱知識點。數組

前言

股票投資中收益和風險始終存在着不肯定性,對於理性投資者來講,他們傾向於在風險和收益之間達到均衡點。對於單隻股票來講,在回測中使用夏普比率能夠很好地去綜合考慮收益與風險之間的關係。而對於多隻股票組合投資時,會引入基金經理經常須要考慮的問題——倉位如何分配?bash

本文給你們分享一個經典的模型——Markowitz均值-方差投資組合理論模型,一塊兒來了解下如何運用Markowitz模型在多種資產上肯定最優的投資比例。微信

Markowitz模型簡介

1952年,美國芝加哥大學的經濟學家Markowitz,應用了數學中的均值、方差概念來定義資產組合中收益和風險這兩個關鍵因素,從而系統地闡述了資產組合和選擇問題,標誌着現代資產組合理論(Modern Portfolio Theory,簡稱MPT)的開端。優化

該理論認爲,因爲資產投資的風險在於收益的不肯定性,所以可將收益率視爲一個隨機變量,投資組合的指望收益是該隨機變量的指望值,收益的波動率用隨機變量的方差/標準差來表示,以此衡量投資組合的風險。spa

因而,在波動率爲橫座標、收益率爲縱座標的二維平面中描繪各類優化投資組合,從而造成了一條曲線。這條曲線在最小方差點以上的部分就是著名的Markowitz投資組合「有效前沿」(Efficient Frontier,有效邊界),對應的投資組合稱爲有效投資組合。3d

根據投資組合理論,咱們能夠對多隻股票(資產)的組合配置進行如下的優化過程:code

  • 獲取多隻股票數據,分析股票的收益率和波動率
  • 生成大量隨機權重的收益/風險組合
  • 找到風險最小時的投資組合
  • 找到有效邊界(有效前沿)
  • 找到夏普率較高的隨機組合,即收益-風險均衡點

計算個股收益率

首先咱們選取002372偉星新材、000876新但願、000851高鴻股份、600797浙大網新、000651格力電器這5只股票進行分析,而且將代碼名稱以列表格式存儲。下載這5只股票的收盤價數據,而且合併至表格中。cdn

""" 002372 000876 000851 600797 000651 trade_date 2019-01-02 14.63 7.40 5.03 7.30 35.80 2019-01-03 14.25 7.42 5.12 7.26 35.92 2019-01-04 14.49 7.52 5.49 7.51 36.65 2019-01-07 14.90 7.82 5.79 7.77 36.48 2019-01-08 15.18 7.60 5.79 7.67 36.34 2019-01-09 15.30 7.73 5.80 7.69 37.51 2019-01-10 15.37 7.60 5.84 7.61 37.76 ... ... ... ... ... ... 2019-01-11 15.49 7.64 5.67 7.74 37.73 2019-01-14 15.45 7.77 5.74 7.68 37.68 2019-01-15 15.87 7.77 5.58 7.99 38.78 2019-01-16 16.07 7.64 5.46 7.86 39.31 """
複製代碼

而後計算每一個股票的收益率,此處計算的是對數收益率,具體方法可參考小冊《股票交易策略:收益與風險維度度量策略效果》這一節。blog

""" 002372 000876 000851 600797 000651 trade_date 2019-01-03 -0.026317 0.002699 0.017734 -0.005495 0.003346 2019-01-04 0.016702 0.013387 0.069774 0.033856 0.020119 2019-01-07 0.027902 0.039118 0.053204 0.034035 -0.004649 2019-01-08 0.018618 -0.028536 0.000000 -0.012954 -0.003845 2019-02-20 0.040290 0.023878 -0.009285 -0.012136 0.008258 ... ... ... ... ... ... 2019-11-18 0.015429 0.047883 0.003650 0.032485 0.002206 2019-11-19 0.034841 0.029960 0.032261 0.010899 0.007936 2019-11-20 -0.018854 -0.018676 -0.012423 -0.038679 -0.010142 """
複製代碼

咱們可視化每隻股票收益率的直方圖,瞭解一下分佈狀況。可見每支股票的分佈形狀是近視正態分佈,但仍然有「肥尾」現象。ci

固然也能夠可視化出個股的每日疊加的收益率曲線,瞭解一年中的收益率走勢狀況,以下所示:

計算協方差矩陣

在構建最優的投資組合過程當中,計算投資組合的協方差矩陣是很是關鍵的一步。咱們能夠運用Pandas內置的cov()方法計算協方差矩陣。以下所示:

""" 002372 000876 000851 600797 000651 002372 0.180281 0.040032 0.042272 0.022727 0.030380 000876 0.040032 0.293750 0.046080 0.085311 0.013274 000851 0.042272 0.046080 0.282092 0.161818 0.052123 600797 0.022727 0.085311 0.161818 0.245785 0.034793 000651 0.030380 0.013274 0.052123 0.034793 0.113990 """
複製代碼

投資組合風險與收益

投資組合的風險取決於投資各組合中資產收益率的相關性。所以除了計算協方差矩陣以外,還須要計算年化收益率。以下所示:

""" 002372 -0.118489 000876 0.939151 000851 0.015777 600797 0.273381 000651 0.490995 dtype: float64 """
複製代碼

根據理論,風險須要分散,每一個股票都會有必定比例的投資權重。一個資產組合的收益率(均值),爲組合中個股收益率(均值)的權重之和。

當咱們給定相應的投資比例以後,計算投資組合的指望收益率時,首先要將每隻股票的收益率乘上對應的權重,而後加權、求和再平均後便可計算所得該組合投資的指望收益。

接下來咱們能夠用蒙特卡洛法隨機生成多組權重,並根據權重計算出組合收益率和組合波動率。須要注意到此處的權重係數範圍在0-1之間,而且權重係數總和爲1。

設定此過程重複5000次,即獲得5000種組合收益率和波動率,當樣本數越多就越能覆蓋到各類權重組合,包括經常使用的等權重投資組合、市值加權投資組合。而後將數據可視化爲散點圖。以下所示:

圖中橫座標是表明風險的標準差,縱座標是收益率,每個點都表明着一種投資組合的狀況。Markowitz投資組合理論認爲,理性的投資者最終是在風險和收益之間作出選擇,老是在給定風險水平下追求指望收益最大化,或者是在給定收益水平下追求指望風險作最小化。所以只有在有效邊界上的點纔是最有效的投資組合。

最優的投資組合

接下來咱們做爲理性的投資者來選擇有效邊界上的某一點做爲投資組合。

首先咱們找到最小風險組合(GMV portfolio),並繪製在收益-風險的散點圖中。以下所示:

接下來介紹一個可以同時對收益與風險加以綜合考慮的經典指標——夏普比率(Sharpe Ratio)。

夏普比率計算的是每承受一單位的風險所產生的超額回報,它是基金績效評價標準化指標。

接下來咱們計算上述蒙特卡洛模擬的組合所對應的夏普比率,並將之做爲第三個變量繪製在收益-風險的散點圖中,此處採用顏色這一視覺線索來表徵夏普比率。以下所示:

咱們發現散點圖上越往左上方,越具備較高的夏普比率,而越高夏普率,說明該組合的權重分配越優。接着開始找到夏普比率最大的組合(MSR),將其繪製在收益-風險的散點圖中。以下所示:

咱們提取出最大夏普比率投資組合對應的權重,並轉化爲Numpy數組,以下所示: [0.12617847 0.74273907 0.04905298 0.00580558 0.07622391]

由此處5只股票組成的例子可知。12.6%的權重買002372偉星新材,74.3%的權重買000876新但願,4.9%的權重買000851高鴻股份,0.5%的權重買600797浙大網新,7.6%的權重買000651格力電器。這樣的組合,根據以往數據,能夠分析得出組合年化收益率爲72%,波動率爲42.6%,夏普率爲1.61。

總結

雖然Markowitz的投資組合理論中涉及到不少假設狀況,但重要的是它揭示了「資產的指望收益由其自身的風險的大小來決定」這個結論。同時有效邊界上也印證了風險與收益成正比,要想更高的收益率就須要承擔更大的風險,但投資組合在有效邊界上,則是性價比最高的組合。

以上策略及涉及到的股票僅用於教學,不構成任何投資建議!投資需謹慎,入市有風險!!!

正在考慮是否要把本專欄內容加推到小冊子中(包括實現的源碼),感興趣的朋友們歡迎給我留言建議!人數多的話就加推!

更多的量化交易內容歡迎你們訂閱小冊閱讀!!

同時也歡迎你們關注個人微信公衆號【元宵大師帶你用Python量化交易】瞭解更多Python量化交易相關內容

相關文章
相關標籤/搜索