WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Rollierendes Zeitfenster in der Portfoliooptimierung

 

phantason
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 11.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.07.2015, 12:27     Titel: Rollierendes Zeitfenster in der Portfoliooptimierung
  Antworten mit Zitat      
Hallo,

ich möchte die optimale Portfolioallokation für verschiedene Zeitpunkte berechnen und hierbei ein "rolling window" verwenden.

Ich habe ca. 2500 Beobachtungen, das rollierende Zeitfenster soll 504 Beobachtungen entahlten und jeweils nach einem Durchgang um 21 Tage verschoben werden. Als Erstes schätze ich das Portfolio für die Zeit 1:504:

Code:
Returns = tick2ret(data(1:504))
m=mean(Returns)
cv=cov(Returns)
st=std(Returns)
p = Portfolio;
p = setAssetMoments(p, m, cv);
p.AssetList = datanames;
p = setDefaultConstraints(p);
r0 =   ...
p = Portfolio('RiskFreeRate', r0);
p = setAssetMoments(p, m, cv);
p = setDefaultConstraints(p);
pwgt = estimateMaxSharpeRatio(p);
display(pwgt);


Das Resultat ist der Vektor pwgt der in der neuen Matrix PWGT gespeichert wird.

Code:
PWGT(:,1) = pwgt


Soweit stellt dies kein Problem dar. Nun möchte ich diesen Prozess jedoch automatisieren, sodass als PWGT(:,2), PWGT(:,3) etc. die Analyse für die Werte 22:525, 43:546 usw. erfolgen, bis ich bei dem letzten Wert der über 2.500 Beobachtungen angekommen bin.

Leider bin ich überfragt was das erstellen der Schleife angeht. Hat hier vielleicht jemand einen simplen Ansatz bzw. Code?

Vielen Dank bereits im Voraus für eure Hilfe! Smile
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.07.2015, 13:35     Titel:
  Antworten mit Zitat      
Hallo,

wie wäre es mit...

Code:
ende = 504:21:numel(data);
start = ende - 503;
for k = 1:numel(start)
Returns = tick2ret(data(start(I):ende(I)));
...
PWGT(:,k) = pwgt;
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
phantason
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 11.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.07.2015, 17:08     Titel:
  Antworten mit Zitat      
Hallo,

ich habe 2563 Beobachtungen und das Fenster entsprechend angepasst.

Zusätzlich habe ich noch einen Zähler für die jeweiligen Spalten des PWGTmarkowitz-Vektors eingebaut. Die For-Schleife läuft sauber durch und mein Stichprobentest hat auch ergeben, dass die Werte korrekt sind Smile

Ohne deine Hilfe wäre ich natürlich niemals auch nur annähernd auf diese Idee gekommen, also vielen Dank!!!

Code:
ende = 504:21:2563;
start = ende - 503;
j=0;

for i = start:ende
Returns = tick2ret(data(start(i):ende(i)));

m=mean(Returns);
cv=cov(Returns);

m1 = [m.Adidas, m.Allianz, m.BASF, m.Bayer, m.Beiersdorf, m.BMW, m.Commerzbank, m.Continental, m.Daimler, m.DtBank, m.DtBoerse, m.DtPost, m.DtTelekom, m.EON, m.FreseniusMedicalCare, m.FreseniusSE, m.HeidelbergCement, m.Henkel, m.Infineon, m.KundS, m.Lanxess, m.Linde, m.Lufthansa, m.Merck, m.MunichRe, m.RWE, m.SAP, m.Siemens, m.Thyssenkrupp, m.VW];
 
p = Portfolio;
p = setAssetMoments(p, m1, cv);
p.AssetList = datanames;
p = setDefaultConstraints(p);
r0 =   0; %Beispiel
p = Portfolio('RiskFreeRate', r0);
p = setAssetMoments(p, m1, cv);
p = setDefaultConstraints(p);
pwgt = estimateMaxSharpeRatio(p);

j=j+1; %Variable j soll von 1 bis 99 zählen

PWGTmarkowitz(:,j) = pwgt;

end
Private Nachricht senden Benutzer-Profile anzeigen
 
phantason
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 11.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2015, 10:15     Titel:
  Antworten mit Zitat      
Hallo,

nun habe ich doch noch einmal eine Frage. Ich möchte nach der optimalen Ermittlung der Allokation die jeweiligen Portfoliorenditen ermitteln. Hierfür habe ich ebenfalls versucht das Fenster entsprechend zu verschieben. Die erste Überprüfung soll für die folgenden 21 Tage, also die Beobachtungen 505:525 erfolgen, die zweite Überprüfung für die Beobachtungen 526:546 usw..

Hierfür habe ich den folgenden Code geschrieben:

Code:
checkende = 525:21:2562;
checkstart = checkende - 20;

n = 1:20
l = 1

returnsmarkowitz = nan

for i = checkstart:checkende
   
Returns = tick2ret(data(checkstart(i):checkende(i)));
tsmat = fts2mat(Returns);

returnsmarkowitz(n,1) = tsmat*PWGTmarkowitz(:,l);

n=n+20;
l=l+1;

end


Als Endergebnis würde ich hier einen Vektor 'returnsmarkowitz' mit 98x20 = 1960 Einträgen erwarten (98 Durchläufe mal 20 Portfoliorenditen).

Wenn ich den Code eingebe, erhalte ich jedoch die folgende Fehlermeldung:

Code:
Index exceeds matrix dimensions.


Nun verstehe ich nicht, wieso ich diese Meldung auf einmal angezeigt bekomme, wenn die vorherige Rechnung doch einwandfrei funktionierte?

Weiß in diesem Zusammenhang jemand, wo mein Fehler liegt?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.07.2015, 17:14     Titel:
  Antworten mit Zitat      
Hallo,

in welcher Zeile bekommst du genau die Fehlermeldung?
Mit dem Debugger sollte das Problem lösbar sein.

Ich würde die Ergebnisse in einer Matrix sammeln und diese nachträglich mit reshape in einen Vektor umwandeln.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
phantason
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 11.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.07.2015, 10:32     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe den Code jetzt umgeschrieben und die Laufvariable i angepasst. Nun scheint es zu funktionieren.

Code:
checkende = 525:21:2562;
checkstart = checkende - 20;

returnsmarkowitz = zeros(20,98)

l = 1

 
for i = 1:98
   
Returns = tick2ret(data(checkstart(i):checkende(i)))
tsmat = fts2mat(Returns)

returnsmarkowitz(:,l) = tsmat*PWGTmarkowitz(:,l)

l=l+1


end


Ich danke dir!
Private Nachricht senden Benutzer-Profile anzeigen
 
Vesela

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2016, 23:38     Titel:
  Antworten mit Zitat      
Hallo,

ich habe ein sehr ähnliches Problem und zwar möchte ich die optimale VaR hedge ratio nach der CF-Methode für ein rolling window von 250 Tage ausrechen.
In-sample sieht das so aus:
Code:

function VaR = VaRcf(alpha_vec,h_VaRcf,P1,SP500)
H1=P1-h_VaRcf*SP500;
muL = mean(H1);
stdL = std(H1);
skewL = skewness(H1);
kurtL = kurtosis(H1);
Nu = norminv(1-alpha_vec);
xkurtL = kurtL - 3;
CFu = Nu ...
    + 1/6 * (Nu.^2 - 1) *skewL ...
    + 1/24 * (Nu.^3 - 3*Nu) * xkurtL ...
    - 1/36 * (2 * Nu.^3 - 5 * Nu) * skewL^2;
VaR(:,1) = muL + stdL * CFu;


end
 


Mein Versuch für Out-of-sample:
Code:

function VaR = VaRcf_d(alpha_vec,h_VaRcf_d,P1,SP500)
ende = 250:1:7000;
start = ende - 249;
 
for i=start:ende
H1=P1-h_VaRcf_d*SP500;
muL = mean(H1);
stdL = std(H1);
skewL = skewness(H1);
kurtL = kurtosis(H1);
Nu = norminv(1-alpha_vec);
xkurtL = kurtL - 3;
CFu = Nu ...
    + 1/6 * (Nu.^2 - 1) *skewL ...
    + 1/24 * (Nu.^3 - 3*Nu) * xkurtL ...
    - 1/36 * (2 * Nu.^3 - 5 * Nu) * skewL^2;
VaR(:,i) = muL + stdL * CFu;


end
end

 


Dabei bekomme ich folgende Fehlermenldung:
function VaR = VaRcf_d(alpha_vec,h_VaRcf_d,P1,SP500)

Error:
Function
definitions
are not
permitted in
this context.

Vermute aber, das auch der Rest nicht komplett stimmt. Könnte mir jemand dabei helfen?

Viele Grüße
Vesela
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.06.2016, 00:01     Titel:
  Antworten mit Zitat      
Hallo,

die Fehlermeldung bedeutet, dass über der Funktion etwas steht, das dort nicht hingehört.

Zudem verwendest du innerhalb der Schleife vor der Indizierung in die Spalte nie den Index i, du berechnest also immer das gleiche.

Auch wirst du dir leichter tun, wenn du
Code:

schreibst und dann
Code:
start(i):ende(i)

als Indizierung verwendest.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Vesela

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2016, 09:04     Titel:
  Antworten mit Zitat      
Hallo,

jetzt sieht es so aus:

Die Funktion (separate m.Datei):

Code:


function VaR = VaRcf_d(alpha_vec,h_VaRcf_d,P1_complete,SP500_complete)
ende = 250:1:7000;
start = ende - 249;
 
for i=1:numel(start)
H1=P1_complete(start(i):ende(i))-h_VaRcf_d*SP500_complete(start(i):ende(i));
muL = mean(H1);
stdL = std(H1);
skewL = skewness(H1);
kurtL = kurtosis(H1);
Nu = norminv(1-alpha_vec);
xkurtL = kurtL - 3;
CFu = Nu ...
    + 1/6 * (Nu.^2 - 1) *skewL ...
    + 1/24 * (Nu.^3 - 3*Nu) * xkurtL ...
    - 1/36 * (2 * Nu.^3 - 5 * Nu) * skewL^2;
VaR(:,1) = muL + stdL * CFu;

end
end

 


Um das hedge portfolio zu berechnen (Code.m):

Code:


h_VaRcf_d_H1=fminsearch(@(h_VaRcf_d)VaRcf_d(alpha_vec,h_VaRcf_d,P1_complete,SP500_complete),0.0)

 


Ich habe plausible Antwort bekommen, habe aber das Gefühl, dass irgendwas falsch ist. Wird in dem Fall das hedge ratio tatsächlich jeden Tag optimiert? Eigentlich müsste ich ein Vektor von 6750 unterschiedliche hedge ratios bekommen, oder?

Viele Grüße
Vesela
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.06.2016, 09:47     Titel:
  Antworten mit Zitat      
Hallo,

du hattest vorher das sinnvolle
Code:
VaR(:,i) = muL + stdL * CFu;


Jetzt schreibst du
Code:
VaR(:,1) = muL + stdL * CFu;


Damit wird aber in jeder Iteration die erste Spalte überschrieben.

Meiner Ansicht nach musst du eine Schleife über fminsearch-Aufrufe machen, bei denen du das Fenster mit übergibst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Vesela

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2016, 22:05     Titel:
  Antworten mit Zitat      
Hallo,

dann lass ich den Code so:

Code:


function VaR = VaRcf_d(alpha_vec,h_VaRcf_d,P1_complete,SP500_complete)
ende = 250:1:7000;
start = ende - 249;
 
for i=1:numel(start)
H1=P1_complete(start(i):ende(i))-h_VaRcf_d*SP500_complete(start(i):ende(i));
muL = mean(H1);
stdL = std(H1);
skewL = skewness(H1);
kurtL = kurtosis(H1);
Nu = norminv(1-alpha_vec);
xkurtL = kurtL - 3;
CFu = Nu ...
    + 1/6 * (Nu.^2 - 1) *skewL ...
    + 1/24 * (Nu.^3 - 3*Nu) * xkurtL ...
    - 1/36 * (2 * Nu.^3 - 5 * Nu) * skewL^2;
VaR(:,i) = muL + stdL * CFu;

end
end
 


Kannst du mir bitte schreiben wie diese fminsearch-Schleife aussehen soll und wo ich sie zufügen muss? Ich bin mit dem Zeug komplett überfordert...

Viele Grüße
Vesela
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.06.2016, 23:19     Titel:
  Antworten mit Zitat      
Hallo,

insgesamt etwas schwierig, da ich weder die Daten noch ein genaues Verständnis der Anwendung habe. Prinzipiell so:

Code:
ende = 250:1:7000;
start = ende - 249;
h_VaRcf_d_H1 = zeros(size(start));
for i = 1:numel(start)
interval = start(i):ende(i);
h_VaRcf_d_H1(i)=fminsearch(@(h_VaRcf_d)VaRcf_d(alpha_vec,h_VaRcf_d,P1_complete,SP500_complete, interval),0.0)
end

mit
Code:
function VaR = VaRcf_d(alpha_vec,h_VaRcf_d,P1_complete,SP500_complete, interval)
%ende = 250:1:7000;
%start = ende - 249;

%for i=1:numel(start)
H1=P1_complete(interval)-h_VaRcf_d*SP500_complete(interval);
muL = mean(H1);
stdL = std(H1);
skewL = skewness(H1);
kurtL = kurtosis(H1);
Nu = norminv(1-alpha_vec);
xkurtL = kurtL - 3;
CFu = Nu ...
+ 1/6 * (Nu.^2 - 1) *skewL ...
+ 1/24 * (Nu.^3 - 3*Nu) * xkurtL ...
- 1/36 * (2 * Nu.^3 - 5 * Nu) * skewL^2;
VaR = muL + stdL * CFu;

%end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Vesela

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2016, 23:20     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank! So haben die unterschiedliche Methoden zur Ermittlung von VaR und CVaR funktioniert. Blöderweise hab ich ne Fehlermeldung bei der Varianz:

Code:

ende = 250:1:7000;
start = ende - 249;
h_SD_d_H1 = zeros(size(start));
for i = 1:numel(start)
interval = start(i):ende(i);
h_SD_d_H1(i)=fminsearch(@(h_SD_d)SD_d(h_SD_d,P1_complete,SP500_complete,interval),0.0);
end

 


Code:


function SD = SD_d(h_SD_d,P1,SP500,interval)


SD_d=var(P1(interval))+h_SD_d^2*var(SP500(interval))-2*h_SD_d*corr(P1(interval),SP500(interval))*std(P1(interval))*std(SP500(interval));

end

 


Warning:
Colon operands must be real scalars.
> In @(h_SD_d)SD_d(h_SD_d,P1_complete,SP500_complete,interval)
In fminsearch (line 189)
Warning:
Colon operands must be real scalars.
> In @(h_SD_d)SD_d(h_SD_d,P1_complete,SP500_complete,interval)
In fminsearch (line 189)
Error using SD_d
Too many input arguments.

Error in
@(h_SD_d)SD_d(h_SD_d,P1_complete,SP500_complete,interval)

Error in
fminsearch
(line 189)
fv(:,1) =
funfcn(x,varargin{:});
>>

Weißt du woran es liegt und wie ich es zum Laufen bringen kann?

Besten Dank und viele Grüße
Vesela
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.06.2016, 23:37     Titel:
  Antworten mit Zitat      
Hallo,

auf den ersten Blick kann ich das Problem nicht nachvollziehen. Die Funktion fordert 4 Variablen an und übergibt 4.

Ein Problem ist aber auf jeden Fall, dass du das Ausgabeargument SD in der Funktion nicht belegst. Das sollte dir übrigens auch der Code Analyzer anzeigen.

Mehr lässt sich ohne die Daten schlecht nachvollziehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.