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

constraints in richtige Form bringen

 

tomsra101
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 10.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2013, 11:33     Titel: constraints in richtige Form bringen
  Antworten mit Zitat      
Hi Leute,
ich bin ganz neu hier im Forum und nachdem ich eine Zeit lang nur im Forum gelesen hab, will ich nun auch mal eine Frage stellen. Ich hoffe sie ist verständlich undihr könnt mir dabei helfen.
Ich hab ne Frage zur Optimierung einer Funktion, genauer gesagt dazu, wie ich die constraints richtig formuliere.
Ausgangslage ist folgende: Ich habe ein Portfolio mit Bonds (Wertpapieren) und den Index (Gesamtheit aller auf dem Markt verfügbaren Bonds). Meine Funktion f berechnet das Transaktionsvolumen (die Menge an Bonds die ich insgesamt kaufe und verkaufe) und ist definiert als
Code:
f=sum(abs(x-currentweights)),

wobei x(i,1)=angibt, wieviel Bonds von Typ i ich nach allen Transaktionen habe und currentweight(i,1) wieviel davor.

So weit so gut, die Funktion und alle benötigten Datenstrukturen sind erstellt.
Mein Problem liegt jetzt bei den constraints:

Ich habe 8 Stück davon und keine ist in der Form geschrieben, wie man sie in Matlab eingeben kann (z.B. x(2)<0)
Die beiden ersten constraints sind:
1) sum(x)=1
2) f<1
Die andern 6 sind Einschränkungen für Arrays die von x abhängen.
Bsp.: [/code]
Code:
sum(YearDuration.*x)=6,672
, wobei YearDuration ein von x unabhängiges array ist

Die erste constraint würde ich formulieren indem ich Aeq=ones(1,129) und beq=1 setze. Ist das so ok? (x ist 129x1-Array)
Kann mir vielleicht jemand dabei helfen, wie man die 2 anderen constraints in Matlab eingeben kann?
Die andern sind dann ähnlich wie die dritte.

Ich bedanke mich schon im Voraus für die Hilfe Smile

tomsra101
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: 10.09.2013, 20:47     Titel:
  Antworten mit Zitat      
Hallo,

zu f < 1: du versuchst doch f zu minimieren? Ist diese Beschränkung dann nicht überflüssig?

Zu den anderen NB: zumindest das Beispiel ist linear, du kannst das dann also zu Aeq und beq unten anfügen, z.B.
Code:
Aeq=[ones(1,129); YearDuration];
beq=[1; 6672];


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 10.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.09.2013, 14:09     Titel:
  Antworten mit Zitat      
Zuerst einmal Danke für deine Antwort Harald, sie hat mir sehr geholfen.
Was das "f<1" angeht, stand da wohl echt auf dem Schlauch ^^
Das mit dem Aeq und beq kann ich für 2 NB anwenden.
Die andern 4 sind ungleichungen in der Form:
"Lower Bound< Werte <Upper Bound"
Die Werte lassen sich auch alle linear berechnen, kann das also durch Matrixmultiplikation darstellen.
Ich habs nun so gemacht, dass ich für jede dieser Ungleichungen 2 Zeilen in A und b eingefügt hab (eine für die obere und eine für die untere grenze)
Ich habe also jetzt die Funktion und alle NBs.
Nun muss ich nur noch den Optimizer aussuchen. Die Funktion ist ja eigentlich nicht linear, aber ich dachte man kann sie iwie auf 2 aufteilen um die Betragsstriche wegzukriegen und sie dann mit linprog() zu lösen.
Ist das möglich oder sollte ich einen anderen Solver wählen um mein f zu minimieren?
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: 11.09.2013, 20:37     Titel:
  Antworten mit Zitat      
Hallo,

Zielfunktionen wie deine sind an sich unüblich. Warum? abs ist im Minimum nicht differenzierbar, und die meisten Minimierer sind auf differenzierbare Funktionen ausgelegt.

Ich würde stattdessen:
Code:
f=sum((x-currentweights).^2)

minimieren.

Ein Solver, der dies direkt macht, ist lsqlin mit C = Identitätsmatrix und d = currentweights.

Aeq und beq haben wir dann ja schon, und lb und ub sind für die lower bounds bzw. upper bounds. Wenn einzelne Variablen unbeschränkt sind, kann man für diese -inf bzw. inf als Schranke angeben.

Falls du deine Originalfunktion nehmen musst, bleibt an sich nur fmincon.

Siehe auch hier:
http://www.mathworks.com/help/optim/ug/choosing-a-solver.html

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 10.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.09.2013, 09:35     Titel:
  Antworten mit Zitat      
Ich dachte einen Moment daran abs(x-currentweights) als sqrt((x-currentweights)^2) zu schreiben, aber das würde ja an der tatsache, dass es im minimum nicht differenzierbar ist wahrscheinlich auch nichts ändern.

Dein Vorschlag klingt gut. Der Global Minimizer x dürfte ja für sum((x-currentweights).^2) und mein f der gleiche sein (da ja für a,b>0 folgt, dass: (a>b) <=> (a^2>b^2) ). Anschliessend würde ich dann mein x in die ursprüngliche funktion f einsetzen um den wert zu erhalten.

Ich werde das jetzt mal versuchen und meld mich dann anschliessend nochmal um Bescheid zu geben ob es geklappt hat Smile

Vielen Dank schon mal soweit!
Private Nachricht senden Benutzer-Profile anzeigen
 
tomsra101
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 10.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.09.2013, 15:57     Titel:
  Antworten mit Zitat      
So , es hat eigentlich ziemlich gut geklappt, ich habe auf jeden Fall eine gültige Lösung rausbekommen. Very Happy
Danke schon mal dafür Wink
Ich würde allerdings noch gerne 2 weitere constraints einbringen, sofern ich es iwie schaffe, sie passend zu formulieren.

Zur 1.: ich weiss, dass man integer probleme optimieren kann, dass man beim ga-optimierer also angibt welche der koordinaten von x integer-werte sein sollen. nun ist es bei mir allerdings nicht so, dass x integer-werte annehmen soll, sondern dass die werte von x, multipliziert mit einem skalar und anschliessen paarweise geteilt durch werte eines anderen (konstanten) vektors integer-werte ausgeben sollen:

Code:
(TotalValue*x)./DirtyPrice=integer

so was in der art

ist das überhaupt möglich und wenn ja wie?

Zur 2.: Es gibt in meiner Simulation 129 verschiedene Wertpapierarten, die ich kaufen kann, von 23 davon besitze ich Papiere. Die Optimierung soll ja nun das Portfolio ermitteln welches die wenigsten Wertpapierkäufe und -verkäufe benötigt und trotzdem alle NBs erfüllt.
Nun ist es so, dass wenn man von einem Wertpapier nur ganz wenige Exemplare kauft (man also eine x-Koordinate hat, die verdammt nah an 0 ist), es sich meist gar nicht wirklich lohnt, diese Papiere zu kaufen, sondern dieses Geld auch lieber in andere Papiere investiert, von denen man schon welche hat.
Das heisst also, man müsste zeitgleich versuchen die Koordinaten von x, die ungleich 0 sind, zu minimieren.

Eine Möglichkeit wäre wahrscheinlich einzugeben (falls das überhaupt möglich ist), dass eine weitere NB ist, dass jede Koordinate von x ENTWEDER grösser als (z.B.) 0.001 ODER 0 sein muss

Ich weiss halt echt nicht wie ich die beiden NBs eingeben soll und hoffe, mir kann jemand da weiterhelfen..
Private Nachricht senden Benutzer-Profile anzeigen
 
tomsra101
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 10.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2013, 08:21     Titel:
  Antworten mit Zitat      
keiner hier der mir weiterhelfen kann? :/
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: 17.09.2013, 09:54     Titel:
  Antworten mit Zitat      
Hallo,

zu 1.:
Das musst du wenn anders formulieren. Was du machen kannst:
N als zu optimierende Integer-Variable(n), und dann
Code:
x = N.*DirtyPrice/TotalValue
in der Zielfunktion / den Nebenbedingungen verwenden. Ich gehe dabei davon aus, dass DirtyPrice und TotalValue fest sind.

zu 2.:
Transaktionsgebühren würde ich in der Zielfunktion mit erfassen. Alternativ kannst du binär optimieren, was du kaufst und was nicht, und dann von den ausgewählten nochmal die Gewichte optimieren.

Ich würde dir empfehlen, auch mal anzusehen, was es da schon gibt:
http://www.mathworks.com/computatio.....ptimization-analysis.html
https://www.mathworks.com/company/events/webinars/wbnr56301.html
https://www.mathworks.com/company/events/webinars/wbnr50145.html

Grüße,
Harald
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.