我正在把头发扯下来。
我有一组 4 种资产的每日回报,使用 10 天的窗口循环遍历整个数据集(从i= 1 到 50),执行大量计算并构建最佳投资组合。这涉及使用portopt.
[PortRisk(:,i), PortReturn(:,i), PortWts(:,:,i)] = portopt(ExpReturn(i,:), ExpCovariance(:,:,i), [], [], ConSet);
输入,ExpReturn并ExpCovariance使用生成ewstats
[ExpReturn(i,:), ExpCovariance(:,:,i)] = ewstats(RetSeries, 0.94)
现在,在最后的第 50 次迭代中(并且只有第 50 次 - 所有之前的工作都很好),我收到以下错误:
??? Subscripted assignment dimension mismatch. Error in ==> Script at 10
[PortRisk(:,i), PortReturn(:,i), PortWts(:,:,i)] = portopt(ExpReturn(i,:), ExpCovariance(:,:,i), [], [], ConSet);
请注意,我认为RetSeriesasExpReturn和ExpCovariancegenerate by ewstatsare size<50x4>和<4x4x50>分别没有问题。
我已经尝试了我能想到的所有方法来查找错误,包括检查size()、使用断点、预分配矩阵等。奇怪的是,如果我删除循环,设置i = 50它就可以了。此外,如果不是ewstats我简单地使用mean()and cov()- 它们在第 50 次迭代中工作。ExpReturn例如,如果我用 a 替换一个mean(RetSeries),它就可以工作。同样,用ExpCovariance-代替也cov(RetSeries)可以。但是两者ExpReturn并ExpCovariance在一起总是失败。
是什么导致了错误?
编辑:
使用dbstop if error,我可以看到:
PortRisk <10x50>
PortReturn <10x50>
PortWts<10x4x49>
ExpReturn <50x4>
ExpCovariance<4x4x50>
所以问题是PortWts,但我不明白为什么现在它在其他 49 次迭代中不是正确的尺寸。此外,有问题的错误行是PortWts提到循环中的第一个点,所以事先没有弄乱它