matlab 增量设置,matlab - 以最小增量添加到1的随机数:Matlab - 堆栈内存溢出

我正在努力解决类似但稍微复杂的问题。

我想创建一个n个元素的数组,总和为1,但是我想要一个附加约束,即每个元素的最小增量(或者如果你喜欢有效数字的数量)是固定的。

例如,如果我希望10个数字总和为1而没有任何约束,则以下工作完美:

num_stocks=10;

num_simulations=100000;

temp = [zeros(num_simulations,1),sort(rand(num_simulations,num_stocks-1),2),ones(num_simulations,1)];

weights = diff(temp,[],2);

我愚蠢地认为通过缩放这个我可以添加约束如下

num_stocks=10;

min_increment=0.001;

num_simulations=100000;

scaling=1/min_increment;

temp2 = [zeros(num_simulations,1),sort(round(rand(num_simulations,num_stocks-1)*scaling)/scaling,2),ones(num_simulations,1)];

weights2 = diff(temp2,[],2);

然而,尽管这适用于n和小增量值的小值,但是如果例如n = 1,000并且增量为0.1%,那么在大量试验中,第一个和最后一个数字具有始终低于0.1%的平均值。

我相信这有一个合乎逻辑的解释/解决方案,但我一直在试着找到它并且想知道任何人都会非常友好地指出我正确的方向。 将问题置于上下文中创建随机股票投资组合(因此总和为1)。

提前致谢

感谢您到目前为止的回复,只是为了澄清(因为我认为我的初步问题可能是措辞不当),权重的固定增量为0.1%,因此0%,0.1%,0.2%等。

我最初尝试使用整数

num_stocks=1000;

min_increment=0.001;

num_simulations=100000;

scaling=1/min_increment;

temp = [zeros(num_simulations,1),sort(randi([0 scaling],num_simulations,num_stocks-1),2),ones(num_simulations,1)*scaling];

weights = (diff(temp,[],2)/scaling);

test=mean(weights);

但更糟糕的是,第1次和最后一次重量的平均值远低于0.1%.....

编辑以反映Floris的优秀答案并澄清

我用来解决这个问题的原始代码(在找到这个论坛之前)是

function x = monkey_weights_original(simulations,stocks)

stockmatrix=1:stocks;

base_weight=1/stocks;

r=randi(stocks,stocks,simulations);

x=histc(r,stockmatrix)*base_weight;

end

这个运行速度非常快,考虑到我想要运行总计10,000,000次模拟,1000个模拟的10,000个模拟只用了2个单独的核心,并且我使用并行工具箱在8核心机器上运行整个代码,这非常重要。

它还提供了我在平均值方面所寻求的分布,而且我认为它的可能性就是获得100%的1种股票的投资组合,因为对于每种股票的0.1%的geta投资组合(尽管我很高兴得到纠正)。

我的问题是,虽然它适用于1,000只股票和0.1%的增量,我猜它适用于100只股票和1%的增量,随着股票数量减少,那么每个股票变得非常大的百分比(在极端拥有2只股票,您将获得50/50的投资组合)。

实际上我认为这个解决方案就像Floris建议的二项式解决方案(但更有限)

但是我的问题很复杂,因为我想让我的方法更灵活,有可能说3股票和1%的增量我当前的代码无法正确处理,因此我如何在stackoverflow上遇到原始问题。

Floris的递归方法将得到正确的答案,但考虑到问题的严重性,速度将是一个主要问题。

原始研究的一个例子就在这里

我目前正在努力扩展它,在指数中更加灵活地投资组合权重和股票数量,但看来我的编程和概率理论能力是一个限制因素.......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值