4

前の質問Random numbers that add to 100: Matlab を注意深く読んだ後

同様の、しかし少し複雑な問題を解決するのに苦労しています。

合計が 1 になる n 要素の配列を作成したいのですが、各要素の最小増分 (または有効数字の数が必要な場合) が固定されているという追加の制約が必要です。

たとえば、制約なしで合計が 1 になる 10 個の数値が必要な場合は、次のようにすると完全に機能します。

 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);

しかし、これはさらに悪いことで、最初と最後の重みの平均は 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 回のシミュレーションを実行したいことを考えると重要でした。1,000 株で 10,000 回のシミュレーションを実行するには、シングル コアで 2 秒強かかります。並列ツールボックスを使用して 8 コア マシンでコード全体を実行しています。

それはまた、私が探していた平均の分布を正確に示しており、1 株で 100% のポートフォリオを取得する可能性は、すべての株で 0.1% のポートフォリオを取得する可能性と同じであると思います (ただし、訂正していただけると幸いです)。

私の問題は、1,000株と0.1%の増分で機能し、100株と1%の増分で機能すると思いますが、銘柄数が減少すると、各ピックが非常に大きな割合になります(極端に言えば) 2 つの株式を使用すると、常に 50/50 のポートフォリオが得られます)。

事実上、この解はフローリスが提案する二項解に似ていると思います(ただし、より限定されています)

しかし、私のアプローチをより柔軟にし、現在のコードが正しく処理できない 3 つの株式と 1% の増分を言う可能性があるため、私の質問が発生しました。

Floris の再帰的アプローチは正しい答えに到達しますが、問題の規模を考えると速度が大きな問題になります。

オリジナル研究の一例はこちら

http://www.huffingtonpost.com/2013/04/05/monkeys-stocks-study_n_3021285.html

私は現在、インデックスのポートフォリオの重みと株式数をより柔軟に拡張することに取り組んでいますが、私のプログラミングと確率論の能力が制限要因になっているようです........

4

3 に答える 3