我必须编写一个代码,我使用均值 - 方差优化来重新平衡我的投资组合12个月(一年)。唯一的问题是我必须确定在每次重新平衡后我将如何舍入我的资产数量。当我回合时,我需要看看我的新投资组合价值(扣除交易成本后)和我的旧投资组合价值之间的差异是否为正,最高可达约3000.00美元的设定限额。
例如,我的初始资产数量为:
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
值,对每个单独数量的资产进行四舍五入和/或下调,并检查我的舍入资产是否会给我一个新的投资组合值,当我减去初始投资组合价值将满足我的标准
谢谢!
答案 0 :(得分:0)
由于通常会有多种方法来调整投资组合 符合标准,答案取决于您喜欢什么样的调整。以下方法从舍入到最接近的整数开始,然后,如果需要满足预算,则将一些股票向相反方向舍入。
让,
price
是一个与x_new
大小相同的向量,代表单位股价。 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
是符合标准的调整后的投资组合。