Zum Inhalt springen
Melde dich an, um diesem Inhalt zu folgen  
wpm

Effizienzlinie mit Solver erzeugen?

Empfohlene Beiträge

wpm

Hallo Forumsmitglieder,

 

ich stehe vor Problem, wo ich nicht mehr weiter weiß und brauche Eure Hilfe.

 

Es geht darum, eine Effizienzlinie nach Markowitz zu bauen. (mit Hilfe von Solver) dabei die Einstellungen für Solver bekannt, aber das Problem ist, wie bekomme ich die Datenreihe, wonach ich dann die Effizienzlinie basteln kann? User Nrbert54 hat so ein Tool zur Verfügung gestellt, das Problem allerding, dass ich mit dem Code nicht klar komme und zum Teil nicht lesen kann.

 

Kann mir jemand vielleicht eine kleine Step-By-Step-Beschreibung machen, wie ich diese Schleife mit DO erzeuge, damit ich diese Datenreihe bekomme? Dabei ist folgende Ausgansstellung bekannt

 

Ich habe 21 Assets, die Kovar/Var-Matrix ist auch da, Solver ist für einen Fall fertig, maximiert sollte die Rendite beim gegebenen Risiko und die Anzahl der Punkte sollte von mir aus 30 betragen, kann auch 50 sein, ist Wurst.

 

 

Diesen Beitrag teilen


Link zum Beitrag
wpm

Vielleicht die frage etwas andrees Formuleirt, hier ist der Code und ich wäre nur freu, wenn mir jemand die Fuktionen schreibt

 

Sub Effizienzlinie50()

' schaltet Bildschirmaktualisieung aus:

'updateMode = Application.ScreenUpdating

' Application.ScreenUpdating = False

'loescht alte Auswertung:

Range("S9:AQ10000").Select

Selection.ClearContents

' Maximale Rendite plus Ausgabe der maximalen Rendite:

Range("R9").Select

Schritte = Cells(ActiveCell.Row + 21, ActiveCell.Column - 4).Value ' Anzahl Schritte

m = 0 ' Zaehler fuer Dateneintragsreihen

SolverReset

SolverOk SetCell:="$N$16", MaxMinVal:=1, ValueOf:="0", ByChange:="$I$14:$I$36"

SolverAdd CellRef:="$N$24", Relation:=2, FormulaText:="1" ' Summe Anteile = 100% (1)

SolverAdd CellRef:="$I$14:I$36", Relation:=1, FormulaText:="$K$14:$K$36"

SolverAdd CellRef:="$I$14:I$36", Relation:=3, FormulaText:="$L$14:$L$36"

'SolverOptions MaxTime:=100, Iterations:=10000, Precision:=0.0001, _

AssumeLinear:=False, StepThru:=False, Estimates:=1, Derivatives:=1, _

SearchOption:=1, IntTolerance:=6, Scaling:=False, Convergence:=0.0001, _

AssumeNonNeg:=False

Range("R9").Select

SolverOk SetCell:="$N$16", MaxMinVal:=1, ValueOf:="0", ByChange:="$I$14:$I$36"

SolverSolve userFinish:=True

rendmax = Cells(ActiveCell.Row + 7, ActiveCell.Column - 4).Value

volmax = Cells(ActiveCell.Row + 6, ActiveCell.Column - 4).Value

Cells(ActiveCell.Row + m, ActiveCell.Column + 2).Value = rendmax ' Eintrag Rendite

Cells(ActiveCell.Row + m, ActiveCell.Column + 3).Value = Cells(ActiveCell.Row + 5, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 4).Value = Cells(ActiveCell.Row + 6, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 5).Value = Cells(ActiveCell.Row + 7, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 6).Value = Cells(ActiveCell.Row + 8, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 7).Value = Cells(ActiveCell.Row + 9, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 8).Value = Cells(ActiveCell.Row + 10, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 9).Value = Cells(ActiveCell.Row + 11, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 10).Value = Cells(ActiveCell.Row + 12, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 11).Value = Cells(ActiveCell.Row + 13, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 12).Value = Cells(ActiveCell.Row + 14, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 13).Value = Cells(ActiveCell.Row + 15, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 14).Value = Cells(ActiveCell.Row + 16, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 15).Value = Cells(ActiveCell.Row + 17, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 16).Value = Cells(ActiveCell.Row + 18, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 17).Value = Cells(ActiveCell.Row + 19, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 18).Value = Cells(ActiveCell.Row + 20, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 19).Value = Cells(ActiveCell.Row + 21, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 20).Value = Cells(ActiveCell.Row + 22, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 21).Value = Cells(ActiveCell.Row + 23, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 22).Value = Cells(ActiveCell.Row + 24, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 23).Value = Cells(ActiveCell.Row + 25, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 24).Value = Cells(ActiveCell.Row + 26, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 25).Value = Cells(ActiveCell.Row + 27, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 1).Value = volmax 'Eintrag Volatilitaet

' minimale Rendite:

SolverReset

SolverOptions MaxTime:=100, Iterations:=100000, Precision:=0.000000000001, _

AssumeLinear:=False, StepThru:=False, Estimates:=1, Derivatives:=1, _

SearchOption:=1, IntTolerance:=5, Scaling:=False, Convergence:=0.0001, _

AssumeNonNeg:=False

Range("R9").Select

SolverOk SetCell:="$N$16", MaxMinVal:=2, ValueOf:="0", ByChange:="$I$14:$I$36"

SolverAdd CellRef:="$N$24", Relation:=2, FormulaText:="1" ' Summe Anteile = 100% (1)

SolverAdd CellRef:="$I$14:$I$36", Relation:=1, FormulaText:="$K$14:$K$36"

SolverAdd CellRef:="$I$14:$I$36", Relation:=3, FormulaText:="$L$14:$L$36"

SolverOk SetCell:="$N$16", MaxMinVal:=2, ValueOf:="0", ByChange:="$I$14:$I$36"

SolverSolve userFinish:=True

rendmin = Cells(ActiveCell.Row + 7, ActiveCell.Column - 4).Value

inkrem = (rendmax - rendmin) / Schritte

'restliche Renditen:

m = m + 1

Range("R9").Select

SolverReset

SolverOk SetCell:="$N$15", MaxMinVal:=2, ValueOf:="0", ByChange:="$I$14:$I$36"

SolverAdd CellRef:="$N$24", Relation:=2, FormulaText:="1"

SolverAdd CellRef:="$N$16", Relation:=2, FormulaText:="$N$23"

SolverAdd CellRef:="$I$14:$I$36", Relation:=1, FormulaText:="$K$14:$K$36"

SolverAdd CellRef:="$I$14:$I$36", Relation:=3, FormulaText:="$L$14:$L$36"

SolverOptions MaxTime:=100, Iterations:=100000, Precision:=0.00001, _

AssumeLinear:=False, StepThru:=False, Estimates:=1, Derivatives:=1, _

SearchOption:=1, IntTolerance:=10, Scaling:=False, Convergence:=0.0001, _

AssumeNonNeg:=False

Range("R9").Select

SolverOk SetCell:="$N$15", MaxMinVal:=2, ValueOf:="0", ByChange:="$I$14:$I$36"

Do

rendmax = rendmax - inkrem ' - 0.005 reduziert Rendite

If rendmax < rendmin Then Exit Do

Cells(ActiveCell.Row + 14, ActiveCell.Column - 4).Value = rendmax

Range("R9").Select

SolverSolve userFinish:=True

rend = Cells(ActiveCell.Row + 7, ActiveCell.Column - 4).Value

vol = Cells(ActiveCell.Row + 6, ActiveCell.Column - 4).Value

Cells(ActiveCell.Row + m, ActiveCell.Column + 2).Value = rend ' Eintrag Rendite

Cells(ActiveCell.Row + m, ActiveCell.Column + 3).Value = Cells(ActiveCell.Row + 5, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 4).Value = Cells(ActiveCell.Row + 6, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 5).Value = Cells(ActiveCell.Row + 7, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 6).Value = Cells(ActiveCell.Row + 8, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 7).Value = Cells(ActiveCell.Row + 9, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 8).Value = Cells(ActiveCell.Row + 10, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 9).Value = Cells(ActiveCell.Row + 11, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 10).Value = Cells(ActiveCell.Row + 12, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 11).Value = Cells(ActiveCell.Row + 13, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 12).Value = Cells(ActiveCell.Row + 14, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 13).Value = Cells(ActiveCell.Row + 15, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 14).Value = Cells(ActiveCell.Row + 16, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 15).Value = Cells(ActiveCell.Row + 17, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 16).Value = Cells(ActiveCell.Row + 18, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 17).Value = Cells(ActiveCell.Row + 19, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 18).Value = Cells(ActiveCell.Row + 20, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 19).Value = Cells(ActiveCell.Row + 21, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 20).Value = Cells(ActiveCell.Row + 22, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 21).Value = Cells(ActiveCell.Row + 23, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 22).Value = Cells(ActiveCell.Row + 24, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 23).Value = Cells(ActiveCell.Row + 25, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 24).Value = Cells(ActiveCell.Row + 26, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 25).Value = Cells(ActiveCell.Row + 27, ActiveCell.Column - 9).Value * 100

Cells(ActiveCell.Row + m, ActiveCell.Column + 1).Value = vol

m = m + 1

Loop

' schaltet Bildschirmaktualisieung ein

' Application.ScreenUpdating = True

End Sub

 

Kann mir jemand einfach die Beschreibung geben , was die ienzelne Funktionen machen, also wofür die gut sind?

 

 

 

Diesen Beitrag teilen


Link zum Beitrag

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
Melde dich an, um diesem Inhalt zu folgen  

×
×
  • Neu erstellen...