Clever-Excel-Forum

Normale Version: Binomial Baum in VBA
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo zusammen,

wie ich Anfangs schon geschrieben habe, hatte ich einige Modelle im Internet gefunden, an denen ich mich orientiert habe. Das Bewertungsmodell welches ich verwende ist jedoch deutlich komplexer. 

Ich habe aber einen R-Code gefunden der ziemlich ähnlich mit meinem Model in der Thesis ist und habe versucht das soweit nachzubauen.
[attachment=23314] Das ist der R-Code. Da er wie gesagt sehr Ähnlich ist, ist mein primäres Ziel wenigstens diesen erstmal zu haben und dann so anzupassen, dass es wie in meiner Thesis ist.  

Viele Grüße
Maxel
Hallo,

hier eine TEILWEISE Anpassung an VBA: Prüfe alle "End If". Dass sollte mithilfe des R-Editors relativ einfach sein.

CValue ist ein Array, auch das konnte ich nicht anpassen.

Code:
Function CRRCBV(S0 As Double, FV As Double, ttm As Double, r As Double, _
    sigma As Double, L As Double, k As Double, Callprice As Double, rho As Double, _
    C As Double, PD As Double, CallNY As Double) As Double
    
' Definieren der Variablen
Dim dt, n, u, d, p, gamma As Double

dt = 1 / 12
n = ttm / dt + 1
'>>>>>>>>>>>> n = cieling (n)
n = Round(n + 1, 0) '?????????
'Definieren der Parameter

u = Exp((r - (sigma ^ 2) / 2) * dt + sigma * Sqr(dt))
d = Exp((r - (sigma ^ 2) / 2) * dt - sigma * Sqr(dt))
p = 1 / 2


gamma = -Log(1 - PD) * S0

'Definieren der Aktie und Aktienkurse, sowie die Ausfallwahrscheinlichkeit

Dim lambda() As Integer
Dim S() As Double
ReDim S(n + 1, n + 1) As Double

S(1, 1) = S0
lambda(1, 1) = gamma / S(1, 1)

For j = 2 To n
    For i = 1 To j

        If i = j Then

            S(i, j) = S(i - 1, j - 1) * d * Exp(lambda(i - 1, j - 1) * dt)
        Else
            If i < j Then
                S(i, j) = S(i, j - 1) * u * Exp(lambda(i, j - 1) * dt)
                lambda(i, j) = gamma / S(i, j)
            Else
                S(i, j) = 0
                lambda(i, j) = 0
    
            End If
        End If
Next i
Next j


'Wert der Anleihe Berechnen (Rückwärtsschleife):

Dim CCValue As Double
Dim NoCall As Double
Dim Y As Double
Dim Call2 As Double


For j = n To 1 Step -1
    For i = 1 To j


        If j = n Then
            CCValue = WorksheetFunction.Max(FV, k * S(i, j))

        Else
            NoCall(i, j) = Exp(-r * dt) * (Exp(-lambda(i, j) * dt) * (p * CCValue(i, j + 1) + (1 - p) * CCValue(i + 1, j + 1)) + (1 - Exp(-lambda(i, j) * dt)) * (1 - L) * FV)

            Coupon = Exp(-(r + lambda(i, j)) * dt) * C * FV * (ttm / n)

            If CALLYN = 1 Then

                Call2(i, j) = Max(k * S(i, j), Callprice)
                Y(i, j) = (NoCall(i, j) / Call2(i, j) - 1)
            Else
                If Y(i, j) < 0 Then
                   Y(i, j) = 0
                Else

            If Call2(i, j) = 0 Then
                Y(i, j) = 0

        End If


CCValue(i, j) = Coupon + Exp(-(rho * Y(i, j) * dt) * NoCall(i, j) + (1 - Exp(-rho * Y(i, j) * dt))) * Call22(i, j)


CCValue = CCValue(1, 1)

End Function

mfg
Vielen Dank!

Das hilft mir wirklich weiter. 

Der CCValue soll auch eigentlich kein Array sein, sondern es soll in jedem Knoten verglichen werden was größer ist. Also der Nennwert (FV) oder der Aktienkurs (s) mal Wandelverhältnis (k). Der größere soll dann in jedem Knoten jeweils in die Formel eingesetzt werden. 

Und der Wert CCValue (1, 1)  ist dann der Wert der Wandelanleihe zum jetzigen Zeitpunkt.

Beste Grüße
Maxel
Seiten: 1 2