如何为投资组合设定几个随机权重?

时间:2019-05-31 06:15:18

标签: python python-3.x

我正在学习投资组合,但是我需要知道如何为投资组合生成许多随机权重。

要实现将它们与几个份额的收益相乘,还可以获得每个权重的波动率和收益。权重总计必须加1,以实现图像中显示的结果。

例如,在这里,我为投资组合的动作生成权重,但是我需要随机生成更多的权重,以模拟更多的投资组合并获得图像的结果。

import random
n=9
weights = [random.random() for _ in range(n)]
sum_weights = sum(weights)
weights = [w/sum_weights for w in weights]

image 1 image 2

1 个答案:

答案 0 :(得分:0)

您可以使用numpy广播来简化计算

output.xml

现在,要获取每行的总和,

import numpy as np
import pandas as pd

# Set Seed for reproducibility
np.random.seed(0)

# Set your n

n = 9
# Randomize a Numpy Array with 100 x n array
rand_nos = np.random.rand(100, n)

现在您有了一个rand_nos.sum(axis=1) 数组。要进行broadcast数组操作,必须将左数组中的列数与右数组中的行数进行匹配。因此,为了匹配,我们使用100 x n的{​​{1}}方法。这将导致一个.transpose()数组。为了将其带回到numpy.ndarray数组,我们仅对结果数组应用n x 100方法。代码如下所示:

100 x n

一旦有了n_by_one百,就很容易将其读入数据帧(因为.transpose()本质上是onehundred_by_n = rand_nos.transpose() / rand_nos.sum(axis=1) # This is a 100 x 1 array n_by_onehundred = onehundred_by_n.transpose() # This is now a n x 100 array s个)。添加一个pandas.DataFrames关键字参数,即可设置随机数据帧。

numpy.ndarray

出于完整性考虑,如果要检查columns中的每一行总计为1,请运行:

df = pd.DataFrame(
    n_by_onehundred,
    columns=[
    'AAPL weight', 'MSFT weight', 'XOM weight',
    'JNJ weight', 'JPM weight', 'AMZN weight',
    'GE weight', 'FB weight', 'T weight', 
]
)

您应该获得代表每行的100个1