2017-02-04 5 views
0

Мне нужно написать код, в котором я использую Среднюю дисперсию, чтобы перебалансировать мое портфолио на 12 месяцев (один год). Единственное, что я должен определить, как я обойду свое количество активов после каждого перебалансирования. Когда я раунд, мне нужно выяснить, положительна ли разница между моей новой стоимостью портфеля (после вычитания транзакционных издержек) и моей старой стоимостью портфеля до установленного лимита около 3000 долларов США.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 (после того, как я округлил весь свой номер актива вверх).

Есть ли способ пройти через мои значения x_new, округлить и/или вниз по каждому отдельному количеству активов и проверить, будут ли мои округленные активы давать мне новое значение портфеля, которое, когда я вычитаю из первоначального портфеля значение будет соответствовать моим критериям

Спасибо!

+1

Как округление делает такую ​​огромную разницу? Я думаю, вы не говорите об этой функции ['round'] (https://www.mathworks.com/help/matlab/ref/round.html), потому что' round (2490.67) = 2491'. –

+0

Да, округление может иметь огромное значение в зависимости от цены запаса. Если бы акция стоила 250 долларов за акцию, то наличие 1000 или 1001 акций было бы значительной разницей в ценах. Я использовал функции ceil и floor, поскольку функция round будет округлена или уменьшена в зависимости от десятичного значения (чего я не хочу) –

+0

Я не уверен, что вы ищете, может быть, это: sum (round (x_new)) - sum (x_new) '? –

ответ

0

Поскольку, как правило, существует более чем один способ корректировки портфеля до , отвечающий критерию, ответ будет зависеть от того, какие настройки вы предпочитаете. Следующий подход начинается с округления до ближайшего целого числа, а затем, если требуется для удовлетворения бюджета, округляет некоторые из запасов в противоположном направлении.

Пусть,

  1. price быть вектором того же размера, как x_new и представляют собой цену акции единицы.
  2. budget быть верхним пределом нового значения портфеля (то есть старое значение портфеля + 3000 + транзакционные издержки).

Во-первых, давайте рассмотрим новые портфельные запасы до ближайшего целого и вычислим стоимость.

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

В зависимости от того, cost_rnd выше или ниже budget мы бы настроить количество отдельных акций. Если 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 долларов, оставляет меня ниже моего бюджета. Здесь что-то не так?? –

+0

Извините, я сделал небольшую ошибку, моя сбалансированная стоимость портфеля (с использованием x_final) составляет около 1,006,988.31 –

+0

. Каков был бюджет в этом примере? В чем был разрыв между значением x_final и бюджетом? Вы могли бы поделиться этим примером? – aksadv