Ich weiß nicht, wie MATLAB auf 12 kommt und weiß deshalb nicht, wo ich ansetzen soll.
Es soll die Funktion "dist" optimiert werden, mit dem Parameter x0. x0 besteht aus zwei Spalten: Die Erste beschreibt die Rendite zu jedem Wertpapier (n=6) , die zweite Spalte die Volatilität.
Code:
%% Optimierung
% Zielfkt = distOpt
% fun = dist=distOpt(a,N,x0,mu_sam,std_sam) % a = aAnteile (6x1) % N = y ; Spalten der Renditematrix (6)
% Funktion extra abgelegt, und ja: das geht sicher eleganter
function dist=distOpt(a,N,x0,mu_sam,std_sam)
sumMu=0;
sumStd=0;
for i=1:N
sumMu=sumMu+((x0(i,1)-mu_sam{i})/std_sam{i})^2;
sumStd=sumStd+((x0(i,2)-std_sam{i})/std_sam{i})^2;
end
ich würde immer einen Vektor anzupassender Variablen verwenden, in deinem Fall also ein x0 der Länge 12.
So oder so, du hast 6*2 = 12 anzupassende Variablen. Daher muss Aeq auch 12 Spalten haben, die zu den anzupassenden Variablen gehören.
Wenn bestimmte Variablen nicht in den Gleichungen vorkommen sollen, dann kannst du für diese Spalten mit Nullen einfügen.
In der Hoffnung, dich richtig verstanden zu haben:
Ich habe folgendes verändert:
Code:
x0=[aMu aSig]; % von 6x2 zu 12x1
Aeq=(x0(1:(y-1))'-arz); % y=7, Die ersten 6 Zeilen bleiben mu - arz
Aeq(y:(2*y-2))=1; % die nächsten 6 Zeilen mit 1en auffüllen (Habe es auch mit 0en versucht), ergibt 12x1
beq = aKov*aAnteile';
beq(y:(2*y-2))=1; % die nächsten 6 Zeilen mit 1en füllen, ergibt 12x1
% Anpassung an Funktion function dist=distOpt(a,N,x0,mu_sam,std_sam)
sumMu=0;
sumStd=0;
for i=1:N %N=7
sumMu=sumMu+((x0(i)-mu_sam{i})/std_sam{i})^2; % Veränderung x0(i)
sumStd=sumStd+((x0(N+i)-std_sam{i})/std_sam{i})^2; % Veränderung x0(N+ii) end
Jetzt habe ich Aeq und beq als 12x1, wie in der Ausgangssituation laut Matlab-Instruktion. Als Fehlercode kommt der Gleiche wie davor. (An den Spalten hat sich ja auch nichts verändert).
Wenn ich nun Aeq und beq transponieren und zwei 1x12 Vektoren erhalte kommt die Meldung
Es muss mit Nullen aufgefüllt werden. Einsen verfälschen die Gleichungen.
Wenn du m lineare Gleichungen hast, muss A eine mx12 -Matrix sein und b ein mx1 - Vektor. Um dir bei der Aufstellung der Matrizen weiter zu helfen, müsste ich wissen, welche Gleichungen du überhaupt umsetzen willst.
Erste Frage wäre: Wie viele Gleichungen hast du eigentlich?
Mir sind heute morgen noch zwei Fehler aufgefallen: alpha in meiner Zelfunktion (siehe unten) sind nicht meine Anteile sondern "0 ≤α ≤1 is a parameter determining the relative weight assigned to deviations of the means relative to deviations of the standard deviations."Kannst du damit etwas anfangen? Und in meiner Ausgangsfrage hatte ich fälschlicherweise Aeq und beq umgedreht.
Das ist die Zielfunktion:
Die Zielvariablen sind mu_i und sigma_i, N die N Anzahl meiner Wertpapiere (=6), mu_sam und sigma_sam meine mu´s und sigma´s von Wertpapier i.
Und das die Bedingung Aeq=beq:
q wird zur Vereinfachung =1 gesetzt (soll "constant of proportionality" sein ?!), x_m_i sind die Marktanteile von Wertpapier i zum Zeitpunkt m und r_z der risikofreie Zins.In meinem Auszug habe ich 6 Spalten = Wertpapiere, also m=6?
Was soll denn eigentlich variiert werden? Die sigmas und mus, oder die x_i?
Falls es die sigmas und mus sind: die Gleichungen sind dann überhaupt nicht linear, da die sigmas quadratisch eingehen. Sieht man, wenn man das mal gedanklich ausmultipliziert.
Die Anzahl der Gleichungen hängt von der Anzahl der Zeitpunkte ab. Für jeden Zeitpunkt hast du 6 Gleichungen.
das ist nicht die klassische Portfolio-Optimierung, bei der man die Anteile x_i optimieren möchte. Das habe ich zum Üben der "fmincon"-Funktion, dank deiner Hilfe bei einem anderen Beitrag hier, benutzt. Jetzt geht es um einen besseren Schätzer als die historischen mu_sample und sigma_sample.
Das es eine nichtlineare Opt. ist, wusste ich. Muss ich dann etwas umstellen?
Die Frage ist, ob nur die Zielfunktion nichtlinear ist oder auch die Nebenbedingungen. Ich gehe jetzt davon aus, dass auch die Nebenbedingungen nichtlinear sind.
Zitat:
Muss ich dann etwas umstellen?
Ja ;)
Du kannst hierfür nicht Aeq, beq verwenden, sondern musst das stattdessen als Function Handle übergeben (Argument nonlcon in der Doku).
function dist=distOpt(a,N,x0,mu_sam,std_sam)
sumMu=repelem(0,6);
sumStd=repelem(0,6);
for i=1:N
sumMu=sumMu+((x0{i}-mu_sam{i})/std_sam{i})^2;
sumStd=sumStd+((x0{N+i}-std_sam{i})/std_sam{i})^2;
end
bei Fehlermeldungen immer darauf achten, wo sie herkommen. Ich weiß nicht, warum du auf einmal mit { } statt mit ( ) indizierst, aber das hat ja nichts mit den Nebenbedingungen zu tun.
Wirf mal noch mal einen Blick auf die Doku-Seite:
Zitat:
[c,ceq] = nonlinconstr(x)
The function c(x) represents the constraint c(x) <= 0. The function ceq(x) represents the constraint ceq(x) = 0.
Die nichtlinearen Gleichungen haben also eine ganz andere Form als die linearen. Wenn du keine Ungleichungen hast, setze c = [].
der Löser ist nicht innerhalb der vorgegebenen Anzahl Funktionsauswertungen konvergiert. Du kannst wie in der Meldung beschrieben die Anzahl der Funktionsauswertungen erhöhen.
Grundsätzlich ist es hilfreich, wenn Codebeispiele reproduzierbar sind. Dann kann ich ggf. auch damit herumexperimentieren. Hier fehlen z.B. y und aMu sowie aSig.
fmincon stopped because the size of the current stepis less than
the default value of the stepsize tolerance but constraints are not
satisfied to within the default value of the constraint tolerance.
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.