0

私はこれで髪を引き裂いています。

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);

RetSeriesasExpReturnExpCovariancegenerated by ewstatsare size<50x4><4x4x50>それぞれに問題は見られないことに注意してください。

のチェック、ブレークポイントの使用、行列の事前割り当てなど、エラーを突き止めるために考えられるすべてのことを試しましたsize()。奇妙なことに、ループを削除するとi = 50、それは機能します。ewstatsさらに、単純にmean()andを使用する代わりに、cov()それらは 50 回目の反復で機能します。ExpReturnたとえば、1つを に置き換えると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は、エラーが発生した正確なポイントでデバッグモードに入ります。

これは、DougHullによるスクリーンキャストです。


編集

問題のある行を次のように変更します。

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

次に、それぞれを個別に割り当てます。

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

これで失敗すると、どの出力が期待されたサイズではなかったかが正確に表示されます。上記のトリックと組み合わせることで、エラー発生時にワークスペース内の変数を調べて、何が問題なのかを突き止めることができるようになりました。


EDIT2

さらに、2つの間に次のテストを追加します(割り当てる前)。

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