2017-05-03 3 views
0

Goodmorning. Ich bin neu hier. Vor dem Posten habe ich ähnliche Fragen durchsucht, aber ich habe etwas Ähnliches nur mit einer anderen Programmiersprache gefunden, und die gefundene Frage war jedoch unvollständig.Plotten von Trägern von GBM mit VBA

Ok, mein Problem ist es, einen VBA-Code zu finden, der, sobald er in Excel aufgerufen wurde, von mir nur die geometrischen Brownian Motions (GBM) -Parameter benötigt (Anfangsbestandswert s, Fälligkeit t, Volatilität z, risikofreie Rate) r, Dividend q, Anzahl der Schritte n), die Anzahl m der Trajektorien, die ich reproduzieren muss. Als Ausgang möchte ich keine Zahlen sehen, nur eine Grafik der überlagerten m Trajektorien.

Das Problem ist, dass ich es nicht direkt Zelle für Zelle (dann tragend) schreiben kann, weil es auf diese Weise vom Standpunkt der Rechenleistung aus zu komplex wäre; es würde erlauben, ungefähr 15 Trajektorien zu machen, nicht viel mehr. Die Lösung ist also in VBA zu arbeiten.

Mein erster Schritt war

Function GBMSimulation(s As Double, t As Double, z As Double, r As Double, q As Double, n As Double) As Variant 
Dim dt, e, dlns, SimVar() As Double 
ReDim SimVar(n + 1) 
dt = t/n 
SimVar(0) = s 
For i = 1 To n 
Randomize 
    e = WorksheetFunction.NormSInv(Rnd()) 
    dlns = (r - q - z^2/2) * dt + z * e * dt^0.5 
     SimVar(i) = SimVar(i - 1) * Exp(dlns) 
Next i 
GBMSimulation = SimVar(n) 
End Function 

Dieser Code funktioniert; Ich meine, es gibt eine Nummer, die der n-te Schritt von ONE gbm ist.

Ändern

GBMSimulation = SimVar(n) 

mit

GBMSimulation = SimVar(i) 

würde ich den i-ten Schritt des dass insbesondere GBM erhalten.

So werden alle Schritte im Speicher gespeichert und das ist gut.

Mein Problem ist: Wie kann ich m verschiedene Realisierungen eines GBM erstellen (d. H. Meinen vorherigen Schritt m mal wiederholen, m als Eingabe angegeben) und für jeden von ihnen automatisch einen Plot erstellen?

Ich denke, einige für den Zyklus sollte berücksichtigt werden, aber ich bin ein Anfänger und ich weiß nicht, wie das geht.

Ich dachte ich könnte ein n-dimensionales Array erstellen, in dem die GBM-Schritte speichern, sie plotten und m mal wiederholen; Das Problem ist, dass ich die Sprache vermisse, ich lerne sie, aber es braucht Zeit und einige Hilfe könnte nützlich sein.

NUR AUS GRAFISCHEM PUNKT, sollte das Endergebnis like this sein (Ich spezifizierte die grafische Pov, weil in der Verbindung es Zahlen gibt, und die ganze Arbeit wird Zelle um Zelle gemacht, und wie ich vorher gesagt habe, muss ich vermeiden Dies).

Vielen Dank.


UPDATE: mein Problem wurde teilweise Dank an Tehscript gelöst. Der Code, den er/sie freundlicherweise zur Verfügung gestellt hat, ermöglicht es, die n Schritte von jedem der m GBMs in einem Array von Arrays zu speichern. Also bleibt ein letzter Schritt, um mein Problem zu lösen: Wie kann ich diese Daten darstellen?

+0

Sie können die Funktion ein Array zurückgeben lassen und diese Funktion verwenden, um ein Array von Arrays zu haben. – Tehscript

+0

@Tehscript: Danke für den Hinweis; aber ich bin wirklich ein Anfänger, kann ich dich bitten, mir bitte etwas mehr zu sagen? Danke – Joe

+0

Ich weiß nicht wirklich, welche Zahlen zu verwenden, also habe ich 2 für alle von ihnen – Tehscript

Antwort

1

In Ihrer Funktion am Ende, definieren Sie Ihre Funktion als Array

GBMSimulation = SimVar() 

Sie dann den folgenden Code verwenden, und haben Ihre Funktion ein weiteres Array zu erstellen.

Bearbeiten: Sie können Ihre Variablen aus Zellen A1, B1, C1, .. eingeben und wenn Sie unten auskommentieren, haben Sie diese Ergebnisse in Ihrem Excel, genau wie Ihr Excel. Sie können auch ein Diagramm erstellen. Auch wenn Sie 0 bis 1 von 0.01 (100 (101?) Mal insgesamt) step 0.01 loop (ich sollte doppelt sein - ps: versuchen deklarieren es so lange und sehen, was passiert :)

Sub ArrayofArrays() 
Dim i As Long, j As Long, m As Long, n As Double, s As Double, t As Double, z As Double, r As Double, q As Double 
With Sheets("Sheet1") 
    m = .Range("A1").Value 
    n = .Range("B1").Value 
    s = .Range("C1").Value 
    t = .Range("D1").Value 
    z = .Range("E1").Value 
    r = .Range("F1").Value 
    q = .Range("G1").Value 
End With 
ReDim Arr(m) 
For i = 0 To m 
    Arr(i) = GBMSimulation(s, t, z, r, q, n) 
Next i 
For i = 0 To m 
    For j = 0 To n 
     Debug.Print Arr(i)(j) 
     'Cells(i + 2, j + 1) = Arr(i)(j) 
    Next j 
Next i 
End Sub 
+0

Ok, vor allem vielen Dank. – Joe

+0

Ok, ich habe das getan. Wie ich schon sagte, ich bin ein Anfänger, also bitte ich Sie, geduldig zu sein. Es scheint, dass das Endergebnis dieses Codes darin besteht, alle GBM-Schritte für jede Trajektorie zu speichern (über den Debug.Print-Befehl). Hieraus lese ich, dass ich diese Daten wiederherstellen kann, indem Sie das Direktfenster verwenden, aber wenn Sie es öffnen, wird nichts angezeigt. Wie kann ich an dieser Stelle meine Daten verwenden, um eine Handlung zu erhalten? – Joe

+0

Debug.print ist der Befehl zum Anzeigen der Ausgabe. Das Endergebnis wird in Arr() 2-dimensionaler Matrix gespeichert. So: Arr ((a1, a2, a3 ....), (b1, b2, b3 ....) und so weiter ...). Wenn Sie a1 anzeigen möchten, ist Arr (0) (0). Wenn Sie b3 anzeigen möchten, ist Arr (1) (2). Beachten Sie, dass die Zählung bei 0 statt bei 1 beginnt. Mit 2 verschachtelten for-Schleifen können Sie alle Ausgaben mit Arr (i) (j) anzeigen. Wenn Sie diese Ausgabe verwenden, können Sie sie in Zellen anzeigen und in Diagrammform darstellen, was auch immer Sie möchten. – Tehscript