日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

马科维茨的均值方差模型(MPT)粒子群优化--Python实现

發(fā)布時(shí)間:2025/4/16 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 马科维茨的均值方差模型(MPT)粒子群优化--Python实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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=1n?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=1n?j=1n?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=1n?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。
n = 10 alpha = 0.8 cor = np.random.random((n, n)) mu = np.diag(cor) EV = alpha * max(mu)
  • 添加下面這兩個(gè)函數(shù),是為了保證生成的分配方式會(huì)使得期望收益達(dá)到目標(biāo)設(shè)置的值。
def randOne(n):a = np.random.random(n)return a / np.sum(a)def ReCheck(newData, n=10, oriData=None):for i in range(len(newData)):if oriData is None:while np.matmul(newData[i], mu.T) < EV:newData[i] = randOne(n)elif np.matmul(newData[i], mu.T) < EV:newData[i] = oriData[i]return newData
  • m表示有m個(gè)粒子來做探索。對(duì)其做初始化
  • MTime 表示最大迭代周期
m = 30 por = np.random.random((m, n)) por = por / np.sum(por, axis=1)[:, np.newaxis] # 歸一por = ReCheck(por) w, c1, c2 = 0.6, 2, 2 v = np.random.random((m, n)) MTime = 500
  • 計(jì)算數(shù)值(Objective function)
def CalVal(por):tmp = 0for i in range(len(por)):for j in range(len(por)):tmp += por[i] * por[j] * cor[i][j]return tmp
  • 粒子群迭代(解釋思路)
    • 一開始先算出每種分配所對(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ù)期均值。
t = 0 while t < MTime:t += 1val = np.zeros(m)for i, p in enumerate(por):val[i] = CalVal(p)if t == 1:local_Min_por = por.copy()local_Min_val = val.copy()else:for i in range(m):if val[i] < local_Min_val[i]:local_Min_val[i] = val[i]local_Min_por[i] = por[i]global_Min_index = np.argmin(local_Min_val)global_Min_por = local_Min_por[global_Min_index]global_Min_val = local_Min_val[global_Min_index]for i in range(m):v[i] = w * v[i] + c1 * np.random.rand() * local_Min_por[i] + c2 * np.random.rand() * global_Min_pornew_por = por + v[i]new_por = new_por / np.sum(new_por, axis=1)[:, np.newaxis]por = ReCheck(new_por, oriData=por)

效果檢驗(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
def ReCheck_abandon(newData):ansData = newData.copy()i, j = 0, 0 while i < len(newData):if np.matmul(newData[i], mu.T) >= EV:ansData[j] = newData[i]j += 1i += 1return ansData[:j] random_por = ReCheck_abandon(random_por) val = np.zeros(m * MTime)[:len(random_por)] for i, p in enumerate(random_por):val[i] = CalVal(p)
  • 畫圖
plt.plot(val) plt.plot([global_Min_val for i in range(len(val))])
  • 發(fā)現(xiàn)其實(shí)存在有不少數(shù)結(jié)果都比粒子群的方式要好。畢竟粒子群在這里關(guān)于粒子移動(dòng)的速度的設(shè)定其實(shí)在這種求和受限制的空間的搜索效果并不太好。當(dāng)然可以適當(dāng)改進(jìn)下。(歡迎大家提供改進(jìn)方案,一起討論~)
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的马科维茨的均值方差模型(MPT)粒子群优化--Python实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。