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

元宵大師發表於2020-04-04

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

前言

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

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

Markowitz模型簡介

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

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

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

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

根據投資組合理論,我們可以對多隻股票(資產)的組合配置進行以下的優化過程:

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

計算個股收益率

首先我們選取002372偉星新材、000876新希望、000851高鴻股份、600797浙大網新、000651格力電器這5只股票進行分析,並且將程式碼名稱以列表格式儲存。下載這5只股票的收盤價資料,並且合併至表格中。

 """
             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
"""
複製程式碼

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

"""
              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
"""
複製程式碼

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

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

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

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

計算協方差矩陣

在構建最優的投資組合過程中,計算投資組合的協方差矩陣是非常關鍵的一步。我們可以運用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種組合收益率和波動率,當樣本數越多就越能覆蓋到各種權重組合,包括常用的等權重投資組合、市值加權投資組合。然後將資料視覺化為散點圖。如下所示:

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

圖中橫座標是代表風險的標準差,縱座標是收益率,每一個點都代表著一種投資組合的情況。Markowitz投資組合理論認為,理性的投資者最終是在風險和收益之間做出選擇,總是在給定風險水平下追求期望收益最大化,或者是在給定收益水平下追求期望風險做最小化。因此只有在有效邊界上的點才是最有效的投資組合。

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

最優的投資組合

接下來我們作為理性的投資者來選擇有效邊界上的某一點作為投資組合。

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

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

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

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

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

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

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

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

我們提取出最大夏普比率投資組合對應的權重,並轉化為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量化交易相關內容

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

相關文章