私はこれで髪を引き裂いています。
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とExpCovariancegenerated by ewstatsare size<50x4>と<4x4x50>それぞれに問題は見られないことに注意してください。
のチェック、ブレークポイントの使用、行列の事前割り当てなど、エラーを突き止めるために考えられるすべてのことを試しましたsize()。奇妙なことに、ループを削除するとi = 50、それは機能します。ewstatsさらに、単純にmean()andを使用する代わりに、cov()それらは 50 回目の反復で機能します。ExpReturnたとえば、1つを に置き換えるとmean(RetSeries)、機能します。同様に、 - に置き換えるExpCovarianceと機能しcov(RetSeries)ます。しかし、両方ExpReturnとExpCovariance一緒に常に失敗します。
エラーの原因は何ですか?
編集:
を使用するdbstop if errorと、次のことがわかります。
PortRisk <10x50>
PortReturn <10x50>
PortWts<10x4x49>
ExpReturn <50x4>
ExpCovariance<4x4x50>
問題はPortWts、他の49回の反復の場合に正しい寸法ではない理由がわかりません。また、問題のあるエラー行はループの最初のポイントであることPortWtsが言及されているため、事前に何もいじっていません