我正在把头发扯下来。
我有一组 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);
请注意,我认为RetSeries
asExpReturn
和ExpCovariance
generate by ewstats
are 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
提到循环中的第一个点,所以事先没有弄乱它