2017-02-04 1 views
0

平均分散を最適化して12ヶ月間(1年間)ポートフォリオのバランスを調整するコードを書く必要があります。唯一のことは、各リバランスの後に自分の資産の数をどのように丸めるかを決定する必要があることです。私がラウンドすると、新しいポートフォリオ価値(取引コストを差し引いた後)と私の古いポートフォリオ価値との差額が正の値であるかどうか、約3000.00ドルの上限に達しているかどうかを確認する必要があります。MATLAB:ベクトルをループして上または下に丸める方法

例えば、資産の私の最初の数だった:最初の期間のための資産の

x_int = [4500, 6000, 0, 0, 0, 500, 1550, 0, 1000, 0]; 

私の新しいリバランス数はでしたが:

x_new = [2490.67, 4401.78, 1502.30, 0, 1010.45, 2803.85, 3489.77, 0, 650.98, 1001.87]; 

私の最初のポートフォリオ価値は$ 1,897,560.30

ました私のバランスのとれたポートフォリオの価値は、最初の期間では1,658,923.76ドル(私の資産総数を丸めた後)、2,001,876.95ドル(私の資産総数を四捨五入した後sアップ)。

私のx_new値をループして、個々の資産数を切り上げたり下げたりする方法はありますか?丸めた資産が私に新しいポートフォリオ価値を与えるかどうかをチェックします。値は私の基準を満たすでしょう

ありがとう!

+1

丸みはどうやって大きな違いになりますか? 'round(2490.67)= 2491'なので、あなたはこの' round'(https://www.mathworks.com/help/matlab/ref/round.html)関数について話していないと思います。 –

+0

はい、丸めは株式の価格によって大きな違いを生むことがあります。株式が250.00ドルの株式に相当する場合は、1000株または1001株の株式が重要な価格差になります。私はceilとfloor関数を使用しました。なぜなら、丸め関数は10進数値に応じて丸めたり下がったりするからです。 –

+0

あなたは何を探しているのか分かりません: 'sum(round(x_new)) - sum (x_new) '? –

答えて

0

ポートフォリオを調整する方法が複数あるため、回答はどのような調整が望ましいかによって異なります。次のアプローチは、最も近い整数への丸めから始まり、予算を満たすために必要な場合は、株式の一部を反対の方向に丸めます。

レッツ、

  1. priceベクトルx_newと同じ大きさと単位株価を表します。
  2. budgetは、新しいポートフォリオの価値の上限(つまり、古いポートフォリオの値+ 3000 +取引コスト)になります。

まず、新しいポートフォリオを最も近い整数に丸めて、コストを計算しましょう。 cost_rndが上か、我々は、個々の株式の数を調整しまうbudgetを下回っているかどうかに応じて、

x_rnd = round(x_new); 
cost_rnd = x_rnd * price'; 

cost_rndが予算超過の場合、切り捨てられた株式の一部を切り上げようとします。同様に、cost_rndが予算超過の場合、丸めの一部を上から下に変更します。

cost_rnd = x_rnd * price'; 
if (cost_rnd > budget) % exceeds budget, so we need to round a few of them down 
    x_adjust_dir = floor(x_new)-x_rnd; 
    cum_adjust_cost = cost_rnd + cumsum(x_adjust_dir .* price); 
    n_adjust = find(cum_adjust_cost < budget, 1, 'first'); 
elseif (cost_rnd < budget) % under-budget, so we should round a few of them up 
    x_adjust_dir = ceil(x_new)-x_rnd; 
    cum_adjust_cost = cost_rnd + cumsum(x_adjust_dir .* price); 
    n_adjust = find(cum_adjust_cost < budget, 1, 'last'); 
else % by some miracle the budget is exactly met 
    n_adjust = []; 
end 

x_adjust_dirのいくつかの要素はゼロになることに注意してください。彼らはすでに正しい方向に丸められた株式を表します。残りの要素は、予算超過の場合は-1、予算超過の場合は1となります。 cum_adjust_costは、丸め調整による累積変更です。 n_adjustは、調整されたコストを予算のすぐ下に置く累積調整の指標です。

は今残っているのは、調整を適用することです:

x_final = x_rnd; 
if ~isempty(n_adjust) 
    x_final(1:n_adjust) = x_final(1:n_adjust) + x_adjust_dir(1:n_adjust); 
end 

x_finalが基準を満たす調整ポートフォリオです。

+0

ちょっと@aksadv、丸めコードのおかげで、それは動作します!しかし、私は新しいポートフォリオの価値が常に間違っているように見えるという点で、予算の側面に問題があります。たとえば、私の「古いポートフォリオ価値」= 1,000,000.00(再調整前)および取引費用合計が7,500.00ドル(取引コストは、売却または購入された各資産の単価の0.5%).....再調整されたポートフォリオ価値(x_newを使用)は約1,006,988.31です。再計算された取引コストと3000.00ドルの上限を取り除くと、私の予算を下回ります。何か間違っていますか? –

+0

申し訳ありませんが、私は少し間違いを犯しました。バランスのとれたポートフォリオ価値(x_finalを使用)は約1,006,988.31です。 –

+0

この例では予算は何ですか? x_final値と予算の間のギャップは何ですか?例を共有することは可能でしょうか? – aksadv

関連する問題