我正在学习投资组合,但是我需要知道如何为投资组合生成许多随机权重。
要实现将它们与几个份额的收益相乘,还可以获得每个权重的波动率和收益。权重总计必须加1,以实现图像中显示的结果。
例如,在这里,我为投资组合的动作生成权重,但是我需要随机生成更多的权重,以模拟更多的投资组合并获得图像的结果。
import random
n=9
weights = [random.random() for _ in range(n)]
sum_weights = sum(weights)
weights = [w/sum_weights for w in weights]
答案 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