Erstmal zum technischen Problem. Es geht darum, die implizite Volatilität aus Optionen zu schätzen. Gegeben sind einige Variablen, die man als bekannt erachtet. Der Preis der Option ist also sozusagen eine Funktion der Volatilität (Sigma). Es ist also ein iterativer Prozess indem man so lange die Volatilität einsetzen muss bis man den gegebenen Preis bekommt.
Da ich aber 80 verschiedene Optionen mit zufälligen fiktiven Preisen habe würde ich gerne eine VBA Code haben in dem ich den Solver ausführe. Ich habe es jetzt für nur eine Option geschafft, dass er mir die implizite Volatilität ausrechnet:
Wie schaffe ich es nun, dass ich sozusagen das Setcell, valueof und bychange variable halte. Das "Valueof" muss sich auf eine Zelle beziehen und zwar auf die Zelle des gegebenen Preises. Wie kriege ich sozusagen eine Schleife hin für 80 Szenarien?
über Range().Select arbeiten Programmier fast nie. Für fortlaufende Zellen eignet sich eine For Next Schleife und Cells() oder Range mit Offset. s. unten
Man kann die For Next Schleife von 1-80 aufbauen, oder von Zeile 19 bis Zeile 79 bei Cells. Die 2. Angabe bei Cells ist die Spalte als Buchstabe Cells(j,"C") oder als Zahl Cells(j,3). Beides klappt. Der Wert J kann durch +/- geaendert werden: Cells(j+2, 3). J ist dabei der aktuelle Wert der For Next Schleife. Einfach mal ein wenig experimentieren. Ich hoffe ich konnte helfen.
mfg Gast 123
Code:
Sub SolverMakro() ActiveWindow.ScrollWorkbookTabs Sheets:=1 Sheets("Estimating Implied Volatility").Select
For j = 19 To 99 'solverok setcell:="$c$17", maxminval:=3, valueof:=Cells(j, "F"), bychange:="$f$17" solverok setcell:=Cells(j - 2, "C"), maxminval:=3, valueof:=Cells(j, "F"), bychange:=Cells(j - 2, "F") solversolve Next j End Sub
Sub SolverMakro_2() ActiveWindow.ScrollWorkbookTabs Sheets:=1 Sheets("Estimating Implied Volatility").Select
For j = 1 To 80 'solverok setcell:="$c$17", maxminval:=3, valueof:=Cells(j, "F"), bychange:="$f$17" solverok setcell:="$c$" & 16 + j, maxminval:=3, valueof:=Range("xx").Offset(0, j), bychange:="$f$" & 16 + j solversolve Next j End Sub
So. Endlich sind die Prüfungen vorüber und ich kann mich dem nächsten Thema widmen.
Ich denke, dass es mit dem Solver zu erledigen ist wie mit einem Panzer auf Mäuse schießen. Ich denke mit der Zielwertsuche bin ich besser dran.
Aus einem anderen Forum habe ich folgenden Code kopiert und angepasst:
Public Sub Zielwert() '------------------------------------------------------' 'CONSTANTS '------------------------------------------------------' Const iMaxIterations = 10 'Anzahl der zu durchlaufenden Iterationen Const strStartRng = "c72" 'erster Zellbezug, ab welcher gearbeitet wird Const strGoalRng = "B72" 'erster Zellbezug des Goal-Wertes Const strChngRng = "F72" ' erster Zellbezug des ChangingCell-Wertes '------------------------------------------------------' 'VARIABLES '------------------------------------------------------' Dim i As Integer Dim rStartCell As Range Dim rGoalCell As Range Dim rChngCell As Range '------------------------------------------------------' 'DEFINIERE RANGES '------------------------------------------------------' Set rStartCell = Range(strStartRng) Set rGoalCell = Range(strGoalRng) Set rChngCell = Range(strChngRng) '------------------------------------------------------' 'SCHLEIFE '------------------------------------------------------' For i = 1 To iMaxIterations 'teste auf Abbruchbedingung VOR Ausführung des Codes If rStartCell.Offset(i - 1, 0).Value = "" Then Exit For 'Starte GoalSeeker rStartCell.Offset(i - 1, 0).GoalSeek Goal:=rGoalCell.Offset(i - 1, 0), ChangingCell:=rChngCell.Offset(i - 1, 0) Next i End Sub
Die Zellbezüge 72 habe ich nur gewählt weil es dort eine Lösung gibt. Für die anderen gibt es auch über die manuelle Suche keine Lösung.
So das Problem ist. Für die Zeile 72 findet er eine lösung, aber springt nicht zur nächsten Zeile. Er sagt, dass es dort ein Bezugsproblem gibt und ich weiß nicht woran es liegt.