我有一個包含 40 只股票的投資組合,我正在嘗試計算總投資組合的標準差,同時每次計算此標準差時都會更改每只股票的權重。我知道如何創建一個總和為 1 的亂數串列,但是如何添加每只股票的最大和最小權重..
我使用的最大值是 4.5%,最小值是 0.5%。
我用于創建總和為 1 的亂數串列的代碼是:
import numpy as np, numpy.random
random = np.random.dirichlet(np.ones(10), size=1)
但是我怎樣才能讓這個串列的值只在 0.005 到 0.045 之間呢?
uj5u.com熱心網友回復:
考慮使用以下內容:
import numpy as np
first_half = np.random.random(size=20)*0.04 0.005
second_half = 0.05-first_half
這是正確的范圍,均勻分布,全部隨機,但是,第二半與第一半(反)相關。您可以合并兩半:
tot40elems = np.concatenate((first_half,second_half))
uj5u.com熱心網友回復:
也許使用 np.random.normal 會得到更好的結果。您可以使用 80% 的可變比例(高于 0.005)將分布縮小到 0.005-0.045 范圍。因為正態分布仍然可能有例外值,如果值超出范圍,則有必要“重試”計算(但這不應該發生得太頻繁,除非您給出很大的標準偏差):
將 numpy 匯入為 np
def randStock(count=40,minR=0.005,maxR=0.045,sd=3):
iterations = 0
while True:
iterations = 1
r = np.random.normal(1,sd,count) #normal distribution
r -= min(r) # offset to zero
r /= max(r) # scale to 0..1
r = minR r/sum(r)*(maxR-minR)/(maxR minR) # scale to range
if min(r)>=minR and max(r)<=maxR: return r, iterations
輸出:
for _ in range(10):
s,i = randStock()
print(*map("{:6.4f}".format,(sum(s),min(s),max(s))),i,"iterations")
[sum] [min] [max] [mean]
1.0000 0.0050 0.0404 0.0250 1 iterations
1.0000 0.0050 0.0409 0.0250 2 iterations
1.0000 0.0050 0.0395 0.0250 1 iterations
1.0000 0.0050 0.0411 0.0250 4 iterations
1.0000 0.0050 0.0410 0.0250 2 iterations
1.0000 0.0050 0.0428 0.0250 1 iterations
1.0000 0.0050 0.0433 0.0250 1 iterations
1.0000 0.0050 0.0424 0.0250 1 iterations
1.0000 0.0050 0.0371 0.0250 1 iterations
1.0000 0.0050 0.0446 0.0250 1 iterations
請注意,這可以改進以隨機化下限,并且您可以選擇不同的標準偏差
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/397440.html
