私はこれで髪を引き裂いています。
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
generated by ewstats
are 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
が言及されているため、事前に何もいじっていません