马科维茨的均值方差模型(MPT)粒子群优化--Python实现
MPT
MPT, modern portfolio theory。現在資產配置理論。
理論很簡單。
假設每個資產的收益率是一個隨機變量xix_ixi?。既然是隨機變量,當然就會有均值和標準差。
如果資產數量不是只有一個的話(一個的話,做什么資產配置),也就是存在有多個隨機變量,隨機變量之間當然就會有協方差。
資產配置的目的就是,找到一種較好的資產配置組合,使得達到預期的收益率的情況下,風險最小。
這句話其實就已經告訴了我們這個模型該如何建立。
建模
E(rw)=∑i=1nwiriE(r_w) = \sum_{i=1}^{n}{w_ir_i}E(rw?)=i=1∑n?wi?ri?
Var(rw)=∑i=1n∑j=1nwiwjCov(ri,rj)Var(r_w) = \sum_{i=1}^{n}{\sum_{j=1}^{n}{w_iw_jCov(r_i,r_j)}}Var(rw?)=i=1∑n?j=1∑n?wi?wj?Cov(ri?,rj?)
我們根據上面的加粗文字就可以知道模型應該為:
min?wVar(rw)s.t.E(rw)=μ∑i=1nwi=1\min_{w}{Var(r_w)}\\ \mathrm{ s.t. } \qquad E(r_w) = \mu \\ \sum_{i=1}^{n}{w_i} = 1wmin?Var(rw?)s.t.E(rw?)=μi=1∑n?wi?=1
- 上面的模型中的約束如果不加上w應該大于等于0的話,就表示可以賣空,做負的配置。但是做負的配置的時候一般也是有保證金什么的。模型會復雜點。
- 最簡單的情況是,考慮到w大于等于0
優化
優化的話,這里使用粒子群優化的方式。
其實一般最常用的是拉格朗日乘子法。
(拉格朗日乘子法是優化的最基礎的算法啦,大家直接查就好了。這里我直接截的附件中的圖)
- 最后用的是下面這個來解出拉格朗日算子。
- 代入到使得梯度為0的方程解出來的方程中。
粒子群優化
粒子群的思路很簡單,就是給一個初始化的向量。然后,每個粒子記住自己的歷史最優解和全局的最優解。每次的迭代往這兩個方向上加權的偏移就好了。
項目代碼
假設有n個產品。cor是它們之間的協方差矩陣。然后,很明顯在這個社會中風險越高(方差越大),那么這個產品的收益率越高。
給一個預期的期望收益。由于數據都是隨機生成的。這里我們就直接取用在最大和0之間的alpha比例的數值(資產配置不可能高過最高均值收益)
- 給定α\alphaα,表示在最大和0之間的百分比。alpha取1表示最大值。0表示0。
- 添加下面這兩個函數,是為了保證生成的分配方式會使得期望收益達到目標設置的值。
- m表示有m個粒子來做探索。對其做初始化
- MTime 表示最大迭代周期
- 計算數值(Objective function)
- 粒子群迭代(解釋思路)
- 一開始先算出每種分配所對應的總風險
- 然后最初的話,局部最優的結果當然就是初始化的結果。
- 目前已知的全局最優解,一樣也就是這些局部最優解的最優解
- 迭代更新速度向量v。這個向量一開始也是隨機初始化的。
- 有一個慣性因子w,即表示保持原來的方式飛行。
- c1是局部最優因子;c2是全局最優因子
- 更新好速度向量后。再和原來相加。最后判斷對應的數值有沒有超過設置的預期均值。
效果檢驗(和蒙特卡洛方法對比)
蒙特卡洛采用完全隨機的方式。這里同樣的設置總的次數相等。然后再通過不滿足對應的期望收益標準的方案就去掉的方式。
random_por = np.random.random((m * MTime, n)) random_por = random_por / np.sum(random_por, axis=1)[:, np.newaxis] # 歸一random_- check and abandon
- 畫圖
- 發現其實存在有不少數結果都比粒子群的方式要好。畢竟粒子群在這里關于粒子移動的速度的設定其實在這種求和受限制的空間的搜索效果并不太好。當然可以適當改進下。(歡迎大家提供改進方案,一起討論~)
總結
以上是生活随笔為你收集整理的马科维茨的均值方差模型(MPT)粒子群优化--Python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VSCode输出框中文乱码问题
- 下一篇: 超松弛迭代法求方法组的解(Python实