Verfasst am: 29.04.2020, 18:19
Titel: Fehler: Unary operator '-' is not supported for operand
Hallo zusammen,
ich versuche im Zuge meiner Masterarbeit ein Expected Shortfall Estimation and Backtesting durchzuführen. Das folgende Skript habe ich über die offizielle Mathwork Website bezogen. Ich habe dieses jediglich um meine Finanzwerte ergänzt. Leider bekomme ich bei dem Coding immer die gleichen Fehler.
Sobald ich den markierten Bereich ausführe bekomme ich entweder den Fehler:
Unary operator '-' is not supported for operand of type 'cell'.[/code]
Error in ExpectedShortfallBacktestingExample2>hHistoricalVaRES (line 238) Sample = -Sample;
oder
Error using sum Invalid data type. First argument must be numeric or logical.
Error in ExpectedShortfallBacktestingExample2>hHistoricalVaRES (line 248) ES = ((k - N*VaRLevel)*z{k} + sum(z(k+1:N)))/(N*(1 - VaRLevel));
die entsprechenden Lines habe ich auch markiert.
Ich wäre sehr über jegliche Hilfe dankbar.
Code:
%
H = readtable('CAPM2');
symbol = {'PBIT'};
nAsset = numel(symbol);
Convert prices to returns
Returns = (H{:,symbol});
Select assets into portfolio
symbol2 = {'Datum'};
Datum = H{:,symbol2};
DateReturns = Datum(1:end);
SampleSize = length(Returns);
The following plot shows the daily returns, and the VaR and ES estimated with the historical method.
figure;
plot(DatesTest,ReturnsTest,DatesTest,-VaR_Hist,DatesTest,-ES_Hist) legend('Returns','VaR','ES','Location','southeast') title('Historical VaR and ES') grid on
% Sigma (standard deviation parameter) for normal distribution = Volatility
SigmaNormal = Volatility;
% Sigma (scale parameter) for t distribution = Volatility * sqrt((DoF-2)/DoF)
SigmaT10 = Volatility*sqrt((10-2)/10);
SigmaT5 = Volatility*sqrt((5-2)/5);
% Estimate VaR and ES, normal [VaR_Normal,ES_Normal] = hNormalVaRES(Mu,SigmaNormal,VaRLevel);
% Estimate VaR and ES, t with 10 and 5 degrees of freedom [VaR_T10,ES_T10] = hTVaRES(10,Mu,SigmaT10,VaRLevel);
[VaR_T5,ES_T5] = hTVaRES(5,Mu,SigmaT5,VaRLevel);
The following plot shows the daily returns, and the VaR and ES estimated with the normal method.
figure;
plot(DatesTest,ReturnsTest,DatesTest,-VaR_Normal,DatesTest,-ES_Normal) legend('Returns','VaR','ES','Location','southeast') title('Normal VaR and ES') grid on
subplot(2,1,2) bar(categorical(s.VaRID),[s.Expected,s.Failures]) ylim([4070]) legend('Expected','Observed','Location','southeast') title('Number of VaR Failures')
% Optional: Add the first user-defined traffic light test described above
TLValue = (tRolling.UnconditionalNormal=='reject')+(tRolling.UnconditionalT=='reject');
tRolling.TrafficLight = categorical(TLValue,0:2,{'green','yellow','red'},'Ordinal',true);
Display the results, one model at a time. The "T 5" model has the best performance in these tests (two "yellow"), and the "Normal" model the worst (three "red" and one "yellow").
disp(tRolling(tRolling.VaRID=="Historical",:)) disp(tRolling(tRolling.VaRID=="Normal",:)) disp(tRolling(tRolling.VaRID=="T 10",:)) disp(tRolling(tRolling.VaRID=="T 5",:))
subplot(2,1,1)
FailureInd = ReturnsTest<-VaR_Hist;
plot(DatesTest,ReturnsTest,DatesTest,-VaR_Hist,DatesTest,-ES_Hist) hold on
plot(DatesTest(FailureInd),ReturnsTest(FailureInd),'.') hold off
legend('Returns','VaR','ES','Location','best') title('Historical VaR and ES') grid on
subplot(2,1,2) bar(1995:2002,[sH.ExpectedSeverity,sH.ObservedSeverity]) ylim([11.8]) legend('Expected','Observed','Location','best') title('Yearly Average Severity Ratio, Historical VaR')
subplot(2,1,1) plot(DatesTest,ReturnsTest,DatesTest,-VaR_Hist,DatesTest,-ES_Hist) hold on
plot(DatesTest(FailureInd),ReturnsTest(FailureInd),'.') hold off
legend('Returns','VaR','ES','Location','best') title('Historical VaR and ES') grid on
subplot(2,1,2) bar(1995:2002,[sH.Expected,sH.Failures]) legend('Expected','Observed','Location','best') title('Yearly VaR Failures, Historical VaR')
The runtests function shows the final accept or reject result.
t = runtests(ebts);
disp(t)
Additional details on the test results are obtained by calling the individual test functions.
[t,s] = conditional(ebts);
disp(t)
The following figureis a visualization of the significance of the tests. The histogram shows the distribution of simulated test statistics, and the asterisk shows the value of the test statistic for the actual portfolio returns.
For the conditional test, this is a visualization of the standalone conditional test (ConditionalOnly result in the table above). The final conditional test result (Conditional column) depends also on a preliminary VaR backtest (VaRTestResult column).
figure;
histogram(s);
hold on;
plot(t.TestStatistic,0,'*');
hold off;
Title = sprintf('Conditional: %s, p-value: %4.3f',t.VaRID,t.PValue);
title(Title)
xLS = 0:0.05:30;
pdfLS = chi2pdf(xLS,t.NumLags);
histogram(s,'Normalization',"pdf") hold on
plot(xLS,pdfLS) hold off
ylim([00.1]) legend({'Simulation','Large-Sample'}) Title = sprintf('Conditional Test Distribution\nVaR Level: %g%%, Sample Size = %d',VaRLevel*100,t.Observations);
title(Title)
Local Functions
function[VaR,ES] = hHistoricalVaRES(Sample,VaRLevel) % Compute historical VaR and ES % See [5] for technical details
% Convert to losses [color=yellow][b] Sample = -Sample;[/b][/color]
function[VaR,ES] = hTVaRES(DoF,Mu,Sigma,VaRLevel) % Compute VaR and ES for t location-scale distribution % See [4] for technical details
VaR = -1*(Mu-Sigma*tinv(VaRLevel,DoF));
ES_StandardT = (tpdf(tinv(VaRLevel,DoF),DoF).*(DoF+tinv(VaRLevel,DoF).^2)./((1-VaRLevel).*(DoF-1)));
ES = -1*(Mu-Sigma*ES_StandardT);
die Fehlermeldung sagt ja recht klar, was das Problem ist. Schau dir doch mal im Debugger an, was
Returns(EstimationWindow)
ergibt. Es muss numerisch sein, ist aber ein Cell.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
ja das stimmt, danke schon einmal dafür!! Sorry aber ich gucke seit mehreren Wochen auf diese Codings etc...
laut google funktioniert die Umwandlung wie folgt:
H = readtable('CAPM2');
symbol = {'PBIT'};
nAsset = numel(symbol);
Convert prices to returns
ret = (H{:,symbol});
Returns = str2double(ret)
leider bekomme ich dann folgenden Fehler ( dazu sei gesagt, dass mit der Änderung ein anderes Coding jetzt funktioniert )
nächster Schritt: Haltepunkt in die Zeile setzen und schauen, was mit k ist. Ich kann dir dabei leider nicht helfen, da ich den Code ja nicht laufen lassen kann.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
das erklärt den Fehler nicht.
Du hast ja eine for-Schleife. Möglicherweise schaust du in eine Iteration und der Fehler passiert in einer anderen. Also immer "Continue", bis das problematische k kommt.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.