Verfasst am: 03.09.2011, 20:35
Titel: 4GB Speicher reichen bald nicht mehr :(
Hallo!
So. Jetzt hab ich mich langsam richtig in Matlab eingearbeitet, und kaum macht es ein wenig Spaß, macht mein winzig kleiner Arbeitsspeicher von 4GB(!!!) mir einen Strich durch die Rechnung...
Noch funktioniert mein kleines Programm, aber es geht stark an die Grenzen und ich bin noch lange nicht am Ende meines Programmiervorhabens...
Ich hoffe, dass man an meinem Code vielleicht einige Rechenwege etwas kürzen kann (vielleicht durch in Matlab vorgegebene Funktionen), aber ich finde einfach nichts mehr, was ich vereinfachen könnte.
Ich habe meinen Code mal angehängt. Ob alles so verständlich ist weiß ich nicht (bitte mein Kommentar-Gekritzel nicht so ernst nehmen ), aber vielleicht kann mir jemand bei der ein oder anderen Schleife/... einen Tipp geben, wie Matlab schneller rechnen kann?
Den Teil mit dem Erwartungswert habe ich noch gar nicht als Restriktion eingebunden (also dieser Teil ist in "erlaubte_Moeglichkeiten" noch gar nicht eingebunden und wird so bei der Suche nach der Minimalen Varianz von "erlaubte_Moeglichkeiten" noch gar nicht berücksichtigt)...
Ich denke mein Problem sind die vielen, vielen Schleifen und Neu-Definitionen von den großen Matrizen. Wie gesagt: vielleciht kennt jemand zumindest bei einigen Schleifen oder Berechnungen einen kürzeren/schnelleren Weg?
Lieben Dank schon mal für eure Mühe und Hilfe!!!!
Einen schönen Abend und viele Grüße!
Caro
(P.S.: VaR steht für Value at Risk und CVaR für Conditional Value at Risk; nur so zur Info )
load('workspace_Jahre_Groesse_M.mat') %enthält alle Jahre (1991-2010) und Groesse=176851 und Matrix M
Alpha=0.050; %Signifikanzniveau
c=-0.005; %CVaR_Limit
Gamma=0.000; %Intervall um den Mittelwert für bessere Schätzung (daraus wird dann das Minimum als Erwartete Rendite verwendet)
d=0.000; %Mindestrendite
%Jahr 1991 auf 1992
Hilfsvariable=Jahr1991; %DIMENSION 262x4
%kürze um NaN:
Hilfsvariable(any(isnan(Hilfsvariable),2),:) = [];
%berechne mögliche Kursentwicklungen in den verschiedenen M-Gewichtungs-Szenarien:
Moeglichkeiten_1991=NaN(length(Hilfsvariable),Groesse);
for i=1:Groesse
Moeglichkeiten_1991(:,i)=Hilfsvariable*M(i,:).'; %DIMENSION (262-NaN)x176851
end
%für CVaR-Restriktion:
%1. BerechneVaR für jede Moeglichkeit
%2. Belge Matrix nur mit Werten, die kleiner oder gleich dem VaRsind
%(pro Moeglichkeit); Rest = NaN(-->für bedingten Erw.wert!)
%3. Berechne CVaR als nanmean und setze die Werte, die kleiner oder
%gleich der CVaR-Grenze c sind gleich NaN
%4. erlaubte Möglichkeiten definieren, also Moeglichkeiten_1991 mit CVaR <= c durch NaN ersetzen
VaR_1991_Alpha=NaN(1,Groesse);
for i=1:Groesse
VaR_1991_Alpha(1,i)=quantile(sort(Moeglichkeiten_1991(:,i)),Alpha);
end
%2.
Hilfsmatrix=Moeglichkeiten_1991;
for i=1:Groesse
for j=1:length(Hilfsvariable) if Moeglichkeiten_1991(j,i)>=VaR_1991_Alpha(1,i)
Hilfsmatrix(j,i)=NaN;
end end end clear Hilfsvariable
%3.
CVaR_1991_Alpha=NaN(1,Groesse);
for i=1:Groesse
CVaR_1991_Alpha(1,i)=nanmean(Hilfsmatrix(:,i));
if CVaR_1991_Alpha(1,i)<=c
CVaR_1991_Alpha(1,i)=NaN;
end end clear Hilfsmatrix
%4.
erlaubte_Moeglichkeiten=Moeglichkeiten_1991;
for i=1:Groesse
ifisnan(CVaR_1991_Alpha(1,i))==1
erlaubte_Moeglichkeiten(:,i)=NaN;
end end
%für Mindestrenditen-Restriktion
Mittelwert_1991=NaN(1,Groesse);
for i=1:Groesse
Mittelwert_1991(1,i)=mean(Moeglichkeiten_1991(:,i));
end
%Mittelwert habe ich jetzt --> suche das Minimum des Intervalls um
%den jeweiligen Mittelwert (Intervallgröße gegeben durch Gamma)
%(vgl. Garlappi, Uppal, Wang) ifGamma > 0 for i=1:Groesse
Hilfsmatrix(:,i)=sort(Moeglichkeiten_1991(:,i));
end for i=1:Groesse
for j=1:size(Hilfsmatrix,1) if Hilfsmatrix(j,i)>Mittelwert_1991(1,i)
Hilfsmatrix(j,i)=NaN;
end end end for i=1:Groesse
shrinkage_Erwartungswert_1991(1,i)=quantile(Hilfsmatrix(:,i),1-Gamma);
end else shrinkage_Erwartungswert_1991=Mittelwert_1991;
end
%Berechne die Varianzen für die erlaubten Moeglichkeiten:
erlaubte_Moeglichkeiten_Varianz=var(erlaubte_Moeglichkeiten,0,1);
%Suche minimale Varianz und das zugehörige Portfolio:
MINVAR_1991=min(erlaubte_Moeglichkeiten_Varianz);
[Nummer]=find(erlaubte_Moeglichkeiten_Varianz==MINVAR_1991);
OPTGEWICHT_1991=M(Nummer,:);
CVAR_1991=CVaR_1991_Alpha(1,Nummer);
%*** IN-SAMPLE ***
%tatsächliche Wertentwicklung und damit auch Turnover:
Hilfsvariable=Jahr1991;
%kürze um letzte NaN-Zeile(n):
Hilfsvariable(any(isnan(Hilfsvariable),2),:) = [];
Hilfsvariable_plus1=1+Hilfsvariable;
n=length(Hilfsvariable);
%Ausgangspunkt
Anfangsvermoegen=1; %DEFINIERBAR!!!
%*** BEACHTE: DA ICH RELATIVE RENDITE UND NICHT ABSOLUTEN
%WERTZUWACHS BETRACHTE, IST ES EGAL, OB ICH JEDES JAHR DASSELBE
%INVESTIERE (Anfangsvermoegen) ODER DAS GESAMTE VERMÖGEN
%REALLOKIERE!!!
Wertentwicklung=NaN(n,4);
Wertentwicklung(1,:)=Anfangsvermoegen*OPTGEWICHT_1991;
for i=2:n+1
Wertentwicklung(i,:)=Hilfsvariable_plus1(i-1,:).*Wertentwicklung(i-1,:);
end
%Wertentwicklung (Summe der 4 Assets-Klassen):
IN_SAMPLE_Wertentwicklung_1991=NaN(n+1,1);
for i=1:n+1
IN_SAMPLE_Wertentwicklung_1991(i,1)=sum(Wertentwicklung(i,:));
end
IN_SAMPLE_Rendite_1991=IN_SAMPLE_Wertentwicklung_1991(n+1,1);
%für Turnover (kann natürlich erst berechnet werden, wenn ich
%opt_Gewicht_1992 für das Jahr 1993 habe!!):
IN_SAMPLE_Endgewichte_1991=NaN(1,4);
for i=1:4
IN_SAMPLE_Endgewichte_1991(1,i)=Wertentwicklung(n+1,i)/sum(Wertentwicklung(n,:));
end clear Hilfsvariable Hilfsvariable_plus1 n Wertentwicklung
%*** OUT-OF-SAMPLE ***
%tatsächliche Wertentwicklung und damit auch Turnover:
Hilfsvariable=Jahr1992;
%kürze um letzte NaN-Zeile(n):
Hilfsvariable(any(isnan(Hilfsvariable),2),:) = [];
Hilfsvariable_plus1=1+Hilfsvariable;
n=length(Hilfsvariable);
%Ausgangspunkt
Anfangsvermoegen=1; %DEFINIERBAR!!!
%*** BEACHTE: DA ICH RELATIVE RENDITE UND NICHT ABSOLUTEN
%WERTZUWACHS BETRACHTE, IST ES EGAL, OB ICH JEDES JAHR DASSELBE
%INVESTIERE (Anfangsvermoegen) ODER DAS GESAMTE VERMÖGEN
%REALLOKIERE!!!
Wertentwicklung=NaN(n,4);
Wertentwicklung(1,:)=Anfangsvermoegen*OPTGEWICHT_1991;
for i=2:n+1
Wertentwicklung(i,:)=Hilfsvariable_plus1(i-1,:).*Wertentwicklung(i-1,:);
end
%Wertentwicklung (Summe der 4 Assets-Klassen):
OUT_OF_SAMPLE_Wertentwicklung_1992=NaN(n+1,1);
for i=1:n+1
OUT_OF_SAMPLE_Wertentwicklung_1992(i,1)=sum(Wertentwicklung(i,:));
end
OUT_OF_SAMPLE_Rendite_1992=OUT_OF_SAMPLE_Wertentwicklung_1992(n+1,1);
%für Turnover (kann natürlich erst berechnet werden, wenn ich
%opt_Gewicht_1992 für das Jahr 1993 habe!!):
OUT_OF_SAMPLE_Endgewichte_1992=NaN(1,4);
for i=1:4
OUT_OF_SAMPLE_Endgewichte_1992(1,i)=Wertentwicklung(n+1,i)/sum(Wertentwicklung(n,:));
end clear Hilfsvariable Hilfsvariable_plus1 n Wertentwicklung
clear CVaR_1991_Alpha VaR_1991_Alpha i j erlaubte_Moeglichkeiten erlaubte_Moeglichkeiten_Varianz
clear Moeglichkeiten_1991
Hallo Caro,
also dein Code ist echt speicherfressend. Matlab kann sehr gut mit Matrizen arbeiten.
Ich habe jetzt deinen Code nur mal kurz überflogen, und stelle fest, dass man deinen Code um einiges kurzen und optimieren könnte.
Beispielsweise um eine der vielen for-Schleife zu beseitigen:
CaroCS hat Folgendes geschrieben:
Code:
... for i=1:Groesse
ifisnan(CVaR_1991_Alpha(1,i))==1
erlaubte_Moeglichkeiten(:,i)=NaN;
end end
Wie und schon richtig erkannt hast, ist das neudefinieren der Großen Matrizen ebenfalls sehr Speicherintensiv.
Den ganzen Code zu überarbeiten, würde ein wenig dauern und dir keinen Lerneffekt bringen. Versuche dich in den Matrixoperationen, die Matlab sehr großzügig anbietet. (In der Hilfe zu den jeweiligen Befehlen sind oft auch gute Beispiele für Matrixoperationen.)
Ich hoffe das hilft dir ein wenig weiter.
_________________
zudem wird es hilfreich sein, in der Hilfe über "logical indexing" zu lesen. Peter hat dir ja schon ein Beispiel gegeben.
Dann schau dir an, was alles in deinem Speicher liegt und was du davon wirklich brauchst.
Beispiel: Hilfsvariable_plus1 wird einmal definiert, später nur kurz verwendet, liegt aber lange im Speicher herum.
Es wäre hilfreich, wenn du dir konkrete Code-Teile heraussuchst, bei denen du Optimierungsmöglichkeiten siehst, und diese dann mit allen verfügbaren Informationen (wie z.B. Variablengröße) postest.
Hallo!
Danke schon mal für eure Tipps!
Da kann man ja wirklich viel verkürzen. Die ganzen kleinen for-Schleifen hab ich ja wirklich viel zu kompliziert geschrieben und hätte sie komplett weglassen können... Gut zu wissen
Jetzt hätte ich noch eine Frage zu der Komination aus for- und if-Schleife:
Code:
for i=1:Groesse
if Erwartungswert_1991(1,i)<d
Erwartungswert_1991(1,i)=NaN;
end end
Kann man diese denn auch "in einer Zeile" schreiben, bzw. verkürzen?
(Gedanke dahinter: ich habe einen Vektor Erwartungswert (Dimension 1 x ca. 170.000 [=Groesse]!!) und möchte aus diesem alle Werte, die kleiner als d sind durch NaN ersetzen)
Wie bringe ich dann aber die Prüfung auf "<d" mit hinein? Alles was ich probiert habe läuft immer wieder auf die Kombination von for und if hinaus...
Eigentlich hatte ich ja ein ähnliches Vorgehen schon mit den NaN-Werten... Aber bis der Kopf kapiert, dass das ja auch für andere Werte geht als NaN, brauchts einen kleinen Schubser
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.