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

4GB Speicher reichen bald nicht mehr :(

 

CaroCS
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.09.2011, 20:35     Titel: 4GB Speicher reichen bald nicht mehr :(
  Antworten mit Zitat      
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... Sad

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 Wink ), 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 Wink )


Code:

clear
clc

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. Berechne VaR für jede Moeglichkeit
        %2. Belge Matrix nur mit Werten, die kleiner oder gleich dem VaR sind
        %(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
            if isnan(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)
        if Gamma > 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
 
Private Nachricht senden Benutzer-Profile anzeigen


_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 04.09.2011, 19:08     Titel:
  Antworten mit Zitat      
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
 if isnan(CVaR_1991_Alpha(1,i))==1
  erlaubte_Moeglichkeiten(:,i)=NaN;
 end
end
 


Kannst du diesen Code ohne for-Schleife verwenden:
Code:

erlaubte_Moeglichkeiten(:,isnan(CVaR_1991_Alpha(1,:))) = NaN;
 


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.
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

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.

Hier wird z.B. eine .mat-Datei geladen:
Code:
load('workspace_Jahre_Groesse_M.mat')  

Die Forumsteilnehmer können aber nicht wissen, welche Matrizen darin enthalten sind und wie groß sie sind.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.09.2011, 08:29     Titel:
  Antworten mit Zitat      
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 Wink

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...
Private Nachricht senden Benutzer-Profile anzeigen
 
CaroCS
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.09.2011, 08:31     Titel:
  Antworten mit Zitat      
P.S.:

"Viel Grüße" vergessen... Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.09.2011, 08:38     Titel:
  Antworten mit Zitat      
Hallo,

Code:
Erwartungswert(Erwartungswert < d) = NaN;


Siehe auch
Code:
docsearch 'using logicals in array indexing'


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.09.2011, 20:01     Titel:
  Antworten mit Zitat      
Super!
Danke Smile

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 Wink
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.