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

Renditen/Matrix erstellen

 

student_uzh

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2010, 17:04     Titel: Renditen/Matrix erstellen
  Antworten mit Zitat      
hi zusammen,

schreibe im moment an einer arbeit im portf.mgm. und bin ein noob was matlab betrifft. Konnte bis jetzt ganz viele sachen in diesem board lernen, aber folgende probleme konnte ich nicht durch das board lösen:

Habe 19 Assets mit je 4490 daly kursen über excel in matlab importiert:

Code:

[typ, desc] = xlsfinfo('mat.xlsx')
i = length(desc);
for k=[1:i]
a{k}=xlsread('mat.xlsx',k,'B3:B4490')
end
 

soweit so gut.
nun ist zb. asset 1 abrufbar mit a{1} und man erhält alle kurse dieses assets.

jetzt probiere ich schon den ganzen nachmittag die täglichen renditen zu berechenen. für ein asset gehts auch ziemlich simpel nur dauert es ca.2min:

Code:

for n=1:4489
    R(n)=a{1}(n)/a{1}(n+1)-1
end
 


ich müsste jetzt für jedes einzelne a{2}, a{3}, usw.. diesen befehl ausführen und das würde je 2 min gehen... hat da jemand eine ahnung wie man das besser machen könnte?

2.

ich möchte eine covarianz matrix erstellen mit den 19 assets. auch das schaffe ich nicht. für 2 assets ist es kein problem

cov(a{1},a{2})

aber für a{1},....,a{19} finde ich keinen befehl, hat jemand ne idee wie man das regeln könnte?

sry für die vielen fragen, aber komme einfach nicht weiter alleine...


Harald
Forum-Meister

Forum-Meister


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

in MATLAB ist es sehr wichtig, Speicher vorzubelegen (wird im Editor durch oranges Unterringeln angezeigt) oder besser zu vektorisieren.

Am leichtesten tust du dir hier, wenn du die Daten in eine double-Matrix umwandelst:

Code:
%% Generate test data
for I=1:19
    a{I} = rand(4490,1);
end
%% Calculate returns
b = cell2mat(a);
tic; rets = b(2:end, :) ./ b(1:end-1, :) -1; toc

%% Covariance matrix
c = cov(b);


Bei mir dauert die Berechnung der returns dann 0,003 s! Smile

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
hammy
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 25.10.10
Wohnort: Schweiz
Version: ---
     Beitrag Verfasst am: 26.10.2010, 08:20     Titel:
  Antworten mit Zitat      
Hallo zusammen.

Harald, eine Frage hätte ich noch. Und zwar, für was steht hier der Befehl "rets". Ist das eine Variable in der du die Renditen speicherst? Die CovarMatrix erstellst du dann aber aus den Kursen, oder?

Zitat:

Code:
%% Calculate returns
b = cell2mat(a);
tic; rets = b(2:end, :) ./ b(1:end-1, :) -1; toc


@uni_zh: erstmal Grüsse aus der Schweiz! Smile
2. du solltest mit stetigen Renditen [Log(Preis t / Preis t-1)] rechnen. Diskrete eignen sich nicht wenn du danach ein Portfolio bilden willst. Zudem brauchst du nicht die Covarianzmatrix der Kurse sondern jene der (stetigen) Renditen!

Gruss
Hammy
Private Nachricht senden Benutzer-Profile anzeigen
 
student_uzh

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2010, 10:13     Titel:
  Antworten mit Zitat      
hi... vielen dank mal als erstes, hätte nicht gedacht das dass so schnell geht Very Happy mit den antworten. Hammy, du hast recht natürlich recht, ich hab den befehl ein wenig anpassen müssen. Aber das tut vom script her wenig zur sache. Das mit dem log habe ich von anfang an so geplant, wollte es aber im board nicht unnötig kompliziert machen:). Vielleicht noch eine frage an dich:

für die berechnung eines portfolios, brauche ich zu jedem asset eine durchschnittliche rendite. Das geometrische mittel wäre hier schon die richtige variante?
 
hammy
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 25.10.10
Wohnort: Schweiz
Version: ---
     Beitrag Verfasst am: 26.10.2010, 10:24     Titel:
  Antworten mit Zitat      
Ne, da du mit stetigen Renditen rechnest musst du das Arithmetische Mitel nehmen damit das Resultat stimmt. Das geometrische müsstest du bei diskreten Renditen verwenden.

Die Covarianzmatrix rechne ich übrigens immer so aus

(Renditematrix .- Mittelwert) / Anzahl Beobachtungsperioden
(Also von sämtlichen Renditen die du hast den Mittelwert subtrahieren)

und danach:

Renditematrix * Renditematrix'

ist jetz stark vereinfacht dargestellt.
aber zur Portfoliokonstruktion habe ich immer so gerechnet.
ev. funktioniert der Befehl cov(a) jedoch auch. habs nicht verglichen.

Gruess
Hammy

PS: Falls du dann die Lösung hast wie man den 3. + 4. Moment ins MVP integriert, lass es mich wissen Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.10.2010, 11:59     Titel: Re: Renditen/Matrix erstellen
  Antworten mit Zitat      
Hallo student_uzh,

Ich weiss nicht, was "asset" und "kurse" bedeutet.
Ich weiss auch nicht, welchen Type und welche Dinmension a{1} hat. Was Rendite hier bedeutet, weiss ich auch nicht.

Trotzdem dürfte dies nicht 2 Minuten dauern.
Code:

for n=1:4489
    R(n)=a{1}(n)/a{1}(n+1)-1
end
 

Nicht mal, wenn Du vergessen hättest R vor der Schleife zu pre-allocieren: "R = zeros(1, 4489)".
Allerdings scheinst Du auch jedesmal den Wert ins Commandwindow zu schreiben - das ist sehr langsam! Bitte versuche dochmal das:
Code:
R = zeros(1, 4489);
tmpa = a{1};
for n=1:4489
    R(n)=tmpa(n) / tmpa(n+1) - 1;
end

Ich vermute jedoch, dass a{1} einfach ein Vektor ist. Dann wäre dies schneller:
Code:
tmpa = a{1};
R= tmpa(1:4489) / tmpa(2:4490) - 1;


Gruß, Jan

PS. Die Nachricht war beim Abschicken bereits vollkommen veraltet!

Zuletzt bearbeitet von Jan S am 26.10.2010, 12:39, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
student_uzh

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2010, 12:01     Titel:
  Antworten mit Zitat      
ja die funktion cov(returns) geht super, da man mit

cell2mat(a)=B

eine gesammt matrix erstellt und dann eine matrix mit den zugehörigen returns erstellt. du musst dann nur noch

cov(returns)

eingeben und schon bist du fertig.

Was meinst du mit dem 3. und 4. moment? ich habe mal die gewichtungen mit einer formel eingegeben, ist zwar en bisschen komplex, aber funzt dafür immer:
covarianzmatrix= cvm
Code:

%% create Return vector as array
R = mean(returns)';
%% create vector of ones as array
one=ones(k,1);
%% create A
A=one'*cvm^-1*one;
%% create B
B=one'*cvm^-1*R;
%% create C
C=R'*cvm^-1*R;
%% create Delta
D=A*C-B^2;
%% create mean p by B/A
mup= B/A;
%% create lambda
lam=(C-mup*B)/D;
%% create gamma
gam=(mup*A-B)/D;
%% weight vector for mean-variance PF
meanv_w= lam*cvm^-1*one+gam*cvm^-1*R;
 
 
hammy
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 25.10.10
Wohnort: Schweiz
Version: ---
     Beitrag Verfasst am: 26.10.2010, 12:27     Titel:
  Antworten mit Zitat      
@student_uzh:
Hmm, okay, sehr schön so, dann hast du gleich noch alle Portfoliokennzahlen. Eigentich am besten.
Es gibt jedoch noch eine einfachere Möglichkeit ein MVP zu erstellen, müsste aber mal nachschauen wo ich die Formel habe (Brauchs jetzt dann eh für meine Bachelorarbeit).

Mit dem 3. + 4. Moment meine ich, dass du in diesem Falle davon ausgehst, dass die stetigen Renditen normalverteilt sind. Sind sie aber nicht Twisted Evil

Rechne mal die Skewness und Kurtosis der Verteilunga aus. Wenn du da nicht die standardwerte erhältst (was sehr wahrscheinlich ist), dann empfiehlt es sich, den 3. & 4. Moment in die Berechnung mit einzubeziehen (brauche ich auch für meine Bachelorarbeit). Markowitz ging ja von einer Standard-Normalverteilung der Rendite aus und die ganze Theorie basiert auch darauf. Nun, wenn die Grundannahme nicht stimmt, muss natürlich das Modell geändert werden. Ist aber (so wie ich bist jetzt eruieren konnte) ein ziemlich komplizierter Prozess und muss durch mehrere Optimizer durch. Darum meinte ich auch: Wenn dus rausgefunden hast wies geht, melde dich nochmal bei mir Smile

Um was gehts bei deiner Arbeit? Warum so viele Tagesdaten? wären Wochendaten nicht aussagekräftiger?

PS:
1. Moment = Mittelwert
2. Moment = Standardabweichung
3. Moment = Schiefe
4. MOment = Kurtosis (Leptokurtosis, Platikurtosis)
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: 26.10.2010, 19:15     Titel:
  Antworten mit Zitat      
Hallo,

nur kurz:
rets = Variablenname, kurz für Returns
Und ja, ich hatte die Kovarianz der Preise genommen. Kovarianz der Returns ist natürlich sinnvoller.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2010, 15:22     Titel:
  Antworten mit Zitat      
ich mach ne arbeit im bereich Portfolio mgm... habe immer noch en paar probleme bezüglich berechnung des tangential pf mit zb. short restriktion. falls du dich auskennst, sag mir bescheid Rolling Eyes
 
hammy
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 25.10.10
Wohnort: Schweiz
Version: ---
     Beitrag Verfasst am: 29.10.2010, 15:33     Titel:
  Antworten mit Zitat      
Tangentialportfolios... mit Riskfree oder Nutzenfunktion?

Das musst du (so glaube ich) durch den Optimizer von Matlab durchlaufen lassen.

Da kannst du dann ja auch Restriktionen einfügen die ja so aussehen könnten:

W(x) >0
Summe W(x) = 1

Die FinancialToolbox von Matlab hat aber glaube ich diverse Funktionen die das ermöglichen sollten. Schau doch da mal nach Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Scoob

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2012, 17:33     Titel: Neue Frage altes Thema
  Antworten mit Zitat      
hi ich hab ein ähnliches Problem, habe aus excel eine 2834,120 matrix mit aktienkursen importiert und möchte von jenen die renditen berechnen.
allerdings komme ich wenn ich versuche das programm von oben umzuschreiben immer auf den spaltenvektor mit 2834 nullen^^

könnte mir da jmd mal helfen pls Smile
 
Scoob

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2012, 17:38     Titel: edit
  Antworten mit Zitat      
versuche per laufindex direkt die komplette matrix gefüllt mit den renditen zu bekommen, allerding bisher weniger erfolgreich
 
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.