Verfasst am: 11.11.2013, 18:42
Titel: fmincon für Anfänger
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:
Natürlich mach ich lauter Anfängerfehler, was hier hoffentlich den einen oder anderen amüsiert.
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.
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.
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.
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.
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).
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.
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.
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.
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):
lowerupper ineqlin ineqnonlin
4 6 7 9 14 17 19 20 24
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
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?
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 forday = startOfMonth(mth + rollingWindowSize) : ...
startOfMonth(mth + rollingWindowSize + 1)-1% hats noch nen Fehler drin
dailyPFreturn(dailyPFCount) = sum(w'.* returns(day,:));
dailyPFCount = dailyPFCount + 1;
end end
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 stepis less than
the default value of the stepsize 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.
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.
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
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?
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.
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.