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

fmincon für Anfänger

 

gnotari
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2013, 18:42     Titel: fmincon für Anfänger
  Antworten mit Zitat      
Hallo miteinander,
    Mein Problem: Portfolio optimieren mit Nebenbedingungen.
    Mein Stand: Habe mich für fmincon entschieden, bin damit aber noch Anfänger, und verstehe den Solver einfach noch nicht.
    Ziel: Einfaches Beispiel, dass ich es verstehe.

Ich habe im Netz ein Beispiel gefunden, das meinem Problem ähnlich ist. Nun hab ich das einfachste Progrämmchen erstellt, welches mir einfiel, um ein Gefühl für die Funktion zu bekommen.
Ich möchte das Minimum von y = (x - 2)^2 -2 finden.
Program:
Code:
% Test the solver

x = 0;
lbnds = -3;
ubnds = 3;
Aeq = 1;
Beq = 1;
initial_x = 2;

qoptions = optimset('Display', 'off', ...
                  'Algorithm','interior-point', ...
                  'MaxFunEvals', 50000, ...     %50000
                  'TolFun', 1e-20) ;    %optimisation options structure

minimizingFunction = @ (x) optFunc (x);
[xresult, fval, exitFlag] = fmincon(minimizingFunction, initial_x, ...  
                                     [], [], Aeq, Beq, lbnds, ubnds, [], ...
                                     qoptions)


Function:
Code:
function fval = optFunc(x)
    fval = y = (x-2).^2-2;      
end


Natürlich mach ich lauter Anfängerfehler, was hier hoffentlich den einen oder anderen amüsiert. Smile

Was ich alles nicht verstehe (auch nicht nach lesen der Hilfe usw.):

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

1. Beim function hander (x) vorn und (x) hinten. Vorne output hinten input?
2. x0: Der solver geht ja sowieso zu den upper und lower bounds. Was bringt ein Startwert?
3. A, b, Aeq, beq... Versteh ich einfach nicht. Auch wenn ichs 10x lese.
4. Machen die Optionen so Sinn? Was tue ich überhaupt?

Ich wäre froh, wenn mich jemand an der Hand nehmen würde, und danke jetzt schon von ganzem Herzen.

Liebe Grüsse,

Gnotari
Private Nachricht senden Benutzer-Profile anzeigen


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 11.11.2013, 18:52     Titel:
  Antworten mit Zitat      
Hallo,

ich hab vor ein paar Tagen fmincon benutzt, in diesem Thread; http://www.gomatlab.de/beste-konvex.....tor-zu-fitten-t31004.html. Sogar mit Kommentaren. Dafür mache ich gerne Werbung, das will ich nämlich immer noch ohne optimization toolbox lösen Smile.

Wenn du das nachvollziehen möchtest, wäre das schon ein guter Start.

Man kann bei der Optimierung in lokale Minima fallen und da nicht mehr herauskommen. Das hängt mitunter vom Startwert ab. Der solver geht eben nicht alle Kombinationen durch und landet sowieso bei den Grenzen. Das sind nur Minimal- bzw. Maixmalwerte, die nich unter- bzw überschritten werden.

Da ich hier ja leider kein fmincon habe, kann ich deinen code so nicht ausprobieren, aber bei deiner optFcn sind sowieso 2 Gleichheitszeichen, was mich vermuten lässt, dass das nicht funktioniert.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
gnotari
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2013, 18:59     Titel:
  Antworten mit Zitat      
Hallo Nras,

Toll wie schnell Du geantwortet hast. Ok, das Tut werde ich gleich machen.

fval = y = (x-2).^2-2; habe ich geändert zu fval = (x-2).^2-2;

Dann krieg ich

xresult =

1

fval =

-1

exitFlag =

2

als resultat. Was ja natürlich falsch ist. Müsste ja (2, -2) sein.
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 11.11.2013, 19:42     Titel:
  Antworten mit Zitat      
Hallo,

das Minimum ohne Constraints liegt bei 2. Du hast aber durch dein Aeq = 1 und Beq = 1 den Constraint
Aeq*x=Beq, also hier 1*x=1 also x=1 eingebaut. Da kann man so viel optimieren, wie man will, da kommt immer 1 bei raus.
Private Nachricht senden Benutzer-Profile anzeigen
 
gnotari
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2013, 21:23     Titel:
  Antworten mit Zitat      
Nras hat Folgendes geschrieben:
Hallo,

das Minimum ohne Constraints liegt bei 2. Du hast aber durch dein Aeq = 1 und Beq = 1 den Constraint
Aeq*x=Beq, also hier 1*x=1 also x=1 eingebaut. Da kann man so viel optimieren, wie man will, da kommt immer 1 bei raus.


Vielen Dank für die Antwort. Ok, Aeq und Beq ist für Nebenbedingungen da. Da hab ich jetzt zwei mal [] drinnen. Und siehe da -> kommt sogar (2/-2) raus. Gut soweit!

Gell, die Nebenbedingungen kann ich auch in die Funktion packen. Ansonsten ist mir irgendwie noch nicht ganz logisch wie ich meine durchaus komplizierteren Nebenbedingungen in Aeq und Beq reinpacken soll.

Hast auch eine Idee zu meinen anderen Fragen? Das wär supi.

Grüsse,

Gnotari
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.11.2013, 22:21     Titel:
  Antworten mit Zitat      
Hallo,

welche Fragen sind noch offen?
Wenn du sagst, wie deine "komplizierten Nebenbedingungen" aussehen, kann man dazu auch etwas sagen. Wenn sie nichtlinear sind, müssen sie in die nichtlineare NB-Funktion (das Argument nach lb/ub).

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2013, 15:58     Titel:
  Antworten mit Zitat      
Einfach toll die Unterstützung hier.

Harald hat Folgendes geschrieben:
Hallo,

welche Fragen sind noch offen?


Meine Optionen: Sind die Sinnvoll. Was tuh' ich da überhaupt?
1. Display off: Heisst das einfach, dass er nicht nach jedem iterations Schritt anzeigt, was er gerade tut?
2. Algo: ist der gut? Was macht er?
3. MaxFunEval: Ist das die Anzahl iterations Schritte?
4. TolFun: Könnte wohl die Toleranz sein, wann er mit dem Minimum zufrieden ist.

Ich würd einfach gern wissen was ich da mache. Smile

Harald hat Folgendes geschrieben:
Hallo,
Wenn du sagst, wie deine "komplizierten Nebenbedingungen" aussehen, kann man dazu auch etwas sagen.

Das wahre Monster werde ich euch ungefähr in ein zwei Tagen posten. Smile


Meeercie und Grüsse,

Gnotari
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2013, 16:23     Titel:
  Antworten mit Zitat      
Vielleicht helfen dir die Links?

http://www.mathworks.de/de/help/opt.....on-options-reference.html

http://www.mathworks.de/de/help/opt.....ing-a-solver.html#bsbqd7i
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

zu den Optionen:
sie sind, wie der Name schon sagt, optional. Wie man sie setzt, hängt von der konkreten Anwendung ab.

Display: es gibt verschiedene Möglichkeiten, wieviel Informationen man im Command Window haben möchte. Das geht von 'off' (sinnvoll z.B., wenn man in einer for-Schleife Optimierungen betreibt) bis zu sehr detaillierten Informationen z.B. zur Fehlerdiagnose. Siehe Thomas' 1. Link.

Algorithm: Es gibt keinen 'guten' oder 'schlechten' Algorithmus, sondern einfach verschiedene Algorithmen, die bestimmte Eigenschaften haben und für bestimmte Problemstellungen besser oder schlechter geeignet sind. Im Zweifelsfall hilft hier ausprobieren. Siehe Thomas' 2. Link

MaxFunEval: fast - es ist die Anzahl der Auswertungen der Zielfunktion. Im allgemeinen wird für einen Iterationsschritt die Zielfunktion mehrfach ausgewertet. Ich würde diese Option nur setzen, wenn im Command Window oder über exitflag die Meldung kommt, dass die Optimierung vorzeitig abgebrochen wurde.

TolFun: Genau, wobei es hier um die Toleranz im Zielfunktionswert geht. Oft arbeitet man eher mit Toleranzen bei den x-Werten, also 'TolX'.

Bottom Line: Es gibt diese und noch viele weitere Optionen, die man setzen kann, um den Optimierungsvorgang anzupassen. Ich würde typischerweise ohne Optionen anfangen und diese allmählich anpassen, bis das herauskommt, was ich möchte.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2013, 01:38     Titel:
  Antworten mit Zitat      
Harald, ich danke Dir für die super Antwort. Perfekter gehts nicht. Und auch die Struktur ist top.

Wie prophezeit gehts jetzt ans Eingemachte. Hier ein mini Auszug des Hauptprogrammes:
Code:
lbnds   = zeros(numOfStocks,1);    % Lower bound = 0 => no short selling
ubnds   = ones (numOfStocks,1);    % Upper bound = 1 => no leverage
initialWeights = repmat(1/numOfStocks, numOfStocks, 1) ; % Initial weights for solver

Aeq = ones(1,numOfStocks);         % Constraint: Weights have to be the sum of 1
Beq = 1;

%solverOptions = optimset('Display', 'off', ...           % Options for the solver
%                        'Algorithm','interior-point', ...
%                        'MaxFunEvals', 500, ...      
%                        'TolFun', 1e-20) ;                  

for mth = 1 : numOfMonths - rollingWindowSize
    display(mth)
    % Initializing the month
    w = zeros (numOfStocks,1);   % Container for the weights
   
    % Rolling window
    rollingWindow = returns( startOfMonth(mth) : startOfMonth(mth + rollingWindowSize) -1 , : );
   
    % Covariance matrix of rolling window
    covMatrix = cov(rollingWindow);

    % Risk of each stock for the rolling window
    for i = 1: numOfStocks,
        stockRisk(i) = std(rollingWindow(:,i));
    end    

    % Optimization function
    optimFunction = @(w) optimFunction_MDP(w,covMatrix, stockRisk) ;

    [w, fval, exitFlag] = fmincon(optimFunction, initialWeights, ...  
                                    [], [], Aeq, Beq, lbnds, ubnds, [], ...                                    
                                   []);
                                %solverOptions) ;
end
 

Und hier die Optimierungsfunktion:
Code:
function fval = optimFunction_MDP(w, covMatrix, stockRisk)
    fval = -((w'*stockRisk')/sqrt(w' * covMatrix * w));      
end


Mit Aeq und Beq lege ich fest, dass die Summe aller Gewichte 1 ist. Macht es auch. Bin aber immer noch unsicher ob das richtig so ist.

Jetzt kommt die Meldung des Solvers. Klingt irgendwie gar nicht so schlecht, aber warum wechselt der einfach den Algo?

Hier die Solver Meldung:
Code:
Warning: The default trust-region-reflective algorithm does not solve
problems with the constraints you have specified. FMINCON will use the
active-set algorithm instead. For information on applicable algorithms, see
Choosing the Algorithm in the documentation.
> In fmincon at 486

Local minimum possible. Constraints satisfied.

fmincon stopped because the predicted change in the objective function
is less than the default value of the function tolerance and constraints
are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>

Active inequalities (to within options.TolCon = 1e-06):
  lower      upper     ineqlin   ineqnonlin
    4                                
    6                                
    7                                
    9                                
   14                                
   17                                
   19                                
   20                                
   24  

Ich freu mich jetzt schon auf wieder so eine tolle Antwort.

Merci,

Gnotari
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.11.2013, 10:05     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
aber warum wechselt der einfach den Algo?

Weil der Trust-Region-Reflective Algorithmus diese Problemklasse nicht lösen kann. Für mehr Informationen dazu siehe
http://www.mathworks.de/help/releas.....ing-a-solver.html#bsbwxm7

Ansonsten sieht's gut aus. Ich würde, wenn fmincon in einer for-Schleife läuft, in jeder Iteration exitflag analysieren um zu sehen, ob einzelne Optimierungen nicht erfolgreich ausgeführt werden konnten.

Übrigens: Funktionen wie std operieren spaltenweise. Statt
Code:
   for i = 1: numOfStocks,
        stockRisk(i) = std(rollingWindow(:,i));
    end  

kannst du also
Code:
stockRisk = std(rollingWindow);
schreiben (unter der Annahme, dass die Anzahl der Spalten von rollingWindow numStocks ist).
Nur aus Neugierde: die Zielfunktion sieht nach Sharpe Ratio aus. Sollte dann im Zähler nicht der Return stehen?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2013, 19:43     Titel:
  Antworten mit Zitat      
Der Stand der Dinge soweit:

Code:
solverOptions = optimset('Display', 'on', ...           % Options for the solver
                        'Algorithm','interior-point', ...
                        'MaxFunEvals', 5000, ...      
                        'TolFun', 1e-20) ;                  

for mth = 1 : numOfMonths - rollingWindowSize
    display(mth)
    % Initializing the month
    w = zeros (numOfStocks,1);          % Container for the weights
   
    % Rolling window
    rollingWindow = returns( startOfMonth(mth) : startOfMonth(mth + rollingWindowSize) -1 , : );
   
    % Covariance matrix of rolling window
    covMatrix = cov(rollingWindow);
   
    % Risk of each stock for the rolling window
   stockRisk = std(rollingWindow);     % std works column by column
 
    % Optimization function
    optimFunction = @(w) optimFunction_MDP(w,covMatrix, stockRisk) ;

    [w, fval, exitFlag] = fmincon(optimFunction, initialWeights, ...  
                                [], [], Aeq, Beq, lbnds, ubnds, [], ...                                    
                                solverOptions); %[]);
   
   exitFlagChecker(mth) = exitFlag;    % here we check every single optimization
   
    % Now we have the weights we realize the portfolio for the following mth
    % Daily return of portfolio
    for day = startOfMonth(mth + rollingWindowSize) : ...
            startOfMonth(mth + rollingWindowSize + 1) -1 % hats noch nen Fehler drin
        dailyPFreturn(dailyPFCount) = sum(w'.* returns(day,:));
        dailyPFCount = dailyPFCount + 1;
    end
end

Danke für den Tipp mit "std" schon eingebaut! Smile

Interior-point macht die Dinge IMHO ganz gut. Der spuckt bei jedem mal folgendes aus:

Code:
Local minimum possible. Constraints satisfied.

fmincon stopped because the size of the current step is less than
the default value of the step size tolerance and constraints are
satisfied to within the default value of the constraint tolerance.


Der exit flag checker gibt mir für alle 2 aus, was ich gut finde. Jetzt habe ich noch Bedenken, dass die Lösung nur ein lokales Minimum ist. Kann ich dem Solver irgendwie sagen er soll mir ein globales Minimum geben?

Zitat:
Nur aus Neugierde: die Zielfunktion sieht nach Sharpe Ratio aus. Sollte dann im Zähler nicht der Return stehen?

Du bist auf der richtigen Fährte. Ich analysiere in meiner Master Thesis 4 verschiedene Portfolio Techniken, die als einzige Inputvariablen das Risiko und Kovarianz benötigen. Es geht darum vom "Rendite raten" weg zu kommen, und besser zu diversifizieren. Diese Zielfunktion is das "Diversification Ratio". Es werden noch drei weitere Zielfunktionen folgen, wo ich mich auch über Hilfe freuen würde. Falls noch Nerven hast. Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.11.2013, 20:45     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Kann ich dem Solver irgendwie sagen er soll mir ein globales Minimum geben?

Es gibt keinen Solver, der ein globales Minimum garantiert. Es gibt verschiedene Strategien, wie man es deutlich wahrscheinlicher macht, dass man ein globales Minimum findet.

Ohne Global Optimization Toolbox:
1. wähle verschiedene Startpunkte
2. führe ausgehend von jedem (oder einer Auswahl) die Optimierung durch
3. das beste Ergebnis ist das Endergebnis.

Mit Global Optimization Toolbox:
- multistart / globalsearch --> wie obiges vorgehen, nur mit verschiedenen Feinheiten
- patternsearch --> Direktsuche-Algorithmus
- ga --> genetischer Algorithmus


Wenn du das für eine Zielfunktion geschafft hast, sollte es für die anderen nicht mehr schwer sein.

Meine persönliche Ansicht: es ist ja gut, dass man das "Renditeraten" lässt - ob "Risikoraten" aber nun soviel besser ist als sei dahingestellt. Bei beidem macht man meines Wissens ja nur eine Vorhersage aufgrund historischer Daten? Eine Garantie, dass diese Vorhersagen eintreffen, gibts nunmal nicht.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 09.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2013, 00:33     Titel:
  Antworten mit Zitat      
Irgendwie kapiere ich nicht ganz wie ich multistart / globalsearch benutze. Die Hilfe ist mir wieder mal zu kryptisch. Dem werde ich mich widmen, sobald die Nebenbedingungen funktionieren. Drei Stück habe ich schon implementiert. Die 4. macht mir etwas Ärger.
Ist eigentlich gar nicht so schwer. Das ganze heisst Equal Risk Budget und soll nichts anderes tun, als

Code:
w1*q1 = w2*q2 = w3*q3 = wn*qn

Also, die Gewichtung jeder Aktie multipliziert mit ihrem Risiko. Aus dem habe ich mir ein Minimierungsproblem zusammen gebaut wie folgt:

Code:
function fval = optimFunction_ERB(w, covMatrix, stockRisk)
    function fval = optimFunction_ERB(w, covMatrix, stockRisk)
    budget = w'.*stockRisk;
    for i = 1 : length(w)-1
        difference(i) = budget(i)-budget(i+1);
    end
    fval = sum(difference);      
end

Also minimiere mir die Differenz der einzelnen Risk Budgets. Als Resultat gibt er mir für jeden Monat 1.0 für eine einzige Aktie und natürlich 0 für alle anderen an.
Hat jemand das Lösung für das Rätsel?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.11.2013, 10:24     Titel:
  Antworten mit Zitat      
Hallo,

das Problem ist, dass du wenn die betragsmäßigen Differenzen summieren musst. Mit diff geht das übrigens einfacher:
Code:
fval = sum(abs(diff(budget)));


Oder was noch üblicher wäre: die quadrierten Differenzen.
Code:
fval = sum((diff(budget)).^2);


Nachteil ist so oder so, dass im Verlauf des Vektors ansteigende oder fallende Einträge zu niedrig gewichtet würden. Wie wäre es stattdessen mit
Code:
fval = sum( (budget - mean(budget)).^2)


Wo genau liegt das Problem mit der Hilfe von MultiStart / GlobalSearch? Das Beispiel ist doch recht klar, man muss sich nur auch noch eben mit der Syntax von createOptimProblem auseinandersetzen.

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

Gehe zu Seite 1, 2  Weiter

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.