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