0

我正在把头发扯下来。

我有一组 4 种资产的每日回报,使用 10 天的窗口循环遍历整个数据集(从i= 1 到 50),执行大量计算并构建最佳投资组合。这涉及使用portopt.

[PortRisk(:,i), PortReturn(:,i), PortWts(:,:,i)] = portopt(ExpReturn(i,:), ExpCovariance(:,:,i), [], [], ConSet);

输入,ExpReturnExpCovariance使用生成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);

请注意,我认为RetSeriesasExpReturnExpCovariancegenerate by ewstatsare size<50x4><4x4x50>分别没有问题。

我已经尝试了我能想到的所有方法来查找错误,包括检查size()、使用断点、预分配矩阵等。奇怪的是,如果我删除循环,设置i = 50它就可以了。此外,如果不是ewstats我简单地使用mean()and cov()- 它们在第 50 次迭代中工作。ExpReturn例如,如果我用 a 替换一个mean(RetSeries),它就可以工作。同样,用ExpCovariance-代替也cov(RetSeries)可以。但是两者ExpReturnExpCovariance在一起总是失败。

是什么导致了错误?

编辑:

使用dbstop if error,我可以看到:

PortRisk <10x50>
PortReturn <10x50>
PortWts<10x4x49>
ExpReturn <50x4>
ExpCovariance<4x4x50> 

所以问题是PortWts,但我不明白为什么现在它在其他 49 次迭代中不是正确的尺寸。此外,有问题的错误行是PortWts提到循环中的第一个点,所以事先没有弄乱它

4

1 回答 1

3

尝试设置dbstop if error,然后再次运行您的代码。MATLAB 将在发生错误的确切位置进入调试模式。

这是Doug Hull的截屏视频,展示了如何


编辑

将违规行更改为:

[a,b,c] = portopt(ExpReturn(i,:), ExpCovariance(:,:,i), [], [], ConSet);

然后分别分配:

PortRisk(:,i)  a;
PortReturn(:,i) = b;
PortWts(:,:,i) = c;

现在,当它失败时,它将准确地向您显示哪个输出没有达到预期的大小。结合上面的技巧,您现在可以在出错时检查工作区中的变量,并找出问题所在。


编辑2

此外,在两者之间添加以下测试(分配之前):

if isempty(a) || isempty(b) || isempty(c)
    keyboard          %# enter debug mode. Or issue an error
end
于 2012-07-04T10:41:38.713 回答