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,
 
ich bin blutiger Anfänger was VBA bzw. Programmieren an sich angeht. Ich muss jedoch in 2 Wochen meine Thesis abgeben und bin langsam sehr verzweifelt, da ich dafür einen Binomial Baum zur Bewertung von Wandelanleihen schreiben muss. Ich hoffe daher, dass ihr mir helfen könnt.
Kurz worum es geht. Im ersten Schritt sollen Aktienkure simuliert werden. Es geht in jedem Punkt einmal hoch (u) und runter (d) unter Berücksichtigung des Risikos (Lambda).
Im zweiten Schritt soll entschieden werden was am Ende am größten ist. Der Wert der Wandelanleihe oder der Aktienkurs multipliziert mit dem Wandelverhältnis der Anleihe und entsprechend wird nun Schritt für Schritt mit den größeren Wert von beidem zurück gerechnet.
 
Beispielsweise zeigt er mir bei  (1) Next J und (1) Next IFehler beim Kompilieren: next ohne for“ obwohl ich das vorher gemacht habe.
 

Bei der Rückwärtsschleife zeigt er mir bei „For I = n To step – 1“ und  „For J = 1 To I“ zeigt er mir als Fehler " For-Steuervariable wird bereits verwendet" an.
 
Am Ende könnt ihr sehen, dass ich Call mit Call2 und in der letzten Formel mit Call22 beschrieben habe, weil er mir sonst immer "Fehler beim kompilieren: Erwartet: Ausdruck" angezeigt hat, was für mich überhaupt kein Sinn macht und ich dadurch auch nicht die Funktion nutzen kann, da Call22 nicht definiert ist.
 
Mit sicherheit fällt euch bestimmt noch so einiges auf.

Schonmal vielen vielen Dank im Voraus!!!!!

 
Ich hab das Sheet auch angehangen.[attachment=23297]
 
Der Komplette Code lautet: 

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
'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 = 1 To step + 1
For I = 1 To step + 1

   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

(1) Next I
(1) 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 I = n To step - 1
For J = 1 To I


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
Hallo,

den Code wollte ich jetzt nicht analysieren, aber offensichtlich hat die "For-Schleife" eine falsche Syntax:

Code:
Anfang = 10
Ende = 20
n = 2
for i = Anfang to Ende Step n
'machwas
next i

Falls n = 1 ist, kann "Step" entfallen.

Das sollte aber in jeder VBA-Einführung auf einer der ersten Seiten stehen.

mfg
Verwende 'indentation':


Code:
    For j = 1 To step + 1
        For jj = 1 To step + 1
            If j = jj Then
                S(jj, j) = S(jj - 1, j - 1) * d * Exp(lambda(jj - 1, j - 1) * dt)
            ElseIf jj < j Then
                S(jj, j) = S(jj, j - 1) * u * Exp(lambda(jj, j - 1) * dt)
                lambda(jj, j) = gamma / S(jj, j)
            Else
                S(jj, j) = 0
                lambda(jj, j) = 0
            End If
        Next
    Next
Hallo Maxel,

ohne Dir zu Nahe treten zu wollen, aber Du hast bisher noch nicht Programmiert oder? Jedenfalls nicht mit VBA. Dein Code strotzt vor Fehlern.

Einige Beispiele:
  • Die For-Schleifen sind falsch aufgebaut (hat Fennek schon geschrieben)
  • Du deklarierst n als Double und redimensionierst dann mit n das Array s(). Das geht nicht, denn für die Redimensionierung funktionieren nur ganze Zahlen, also Integer-Werte. Double sind Fließkommazahlen
  • Du hast nur s() als Array deklariert. Aber Du verwendest auch NoCall und Call2 als Arrays. Beide sind jedoch als einfache Variablen vom Typ Double deklariert
  • ...
Dann eine weitere Frage zum Verständnis. Da ich auf die Schnelle nicht durchschaue, was Dein Code macht, Du aber schreibst, Du musst einen Binomialbaum programmieren, wie baust Du mit Arrays und zwei For-Schleifen einen Baum beliebiger Tiefe auf? Eine Baum-Struktur kann man in VBA über Dictionaries aufbauen. Wir reden doch von der gleichen Sache oder meinst du etwas anderes? https://de.wikipedia.org/wiki/Binomial-Heap

Viele Grüße,

Zwenn
Schonmal Danke für die Antworten!
 
@Zwenn: Ja ich habe kaum Ahnung vom Programmieren, um genau zu sein habe ich vor 2 Wochen erstmals damit begonnen.
 
Wegen den Arrays und den for-Schleifen: Ich habe das von einem R-Code abgeleitet, den ich gefunden habe und im Prinzip das gleiche Modell abbildet. 

Und ja wir sprechen über das gleiche, also von jedem Knoten steigt und fällt jeweils einmal der Aktienkurs und am Ende wird Rückwärts bis zum Startzeitpunkt wieder zurück gerechnet. Bei der Rückrechnung gilt jedoch die Bedingung in jedem Knoten, dass jeweil der größerere Wert (Anleihewert welcher gegeben ist) oder der simulierte Aktienwert genommen wird
 
Also an sich eine relativ simple Sache aber mir fehlt einfach das Verständnis der Logik bzw. des Syntax. Ich habe auch leider bisher nichts hilfreiches bei im Internet oder bei Youtube o.Ä. gefunden.


Gruß
Maxel
Hallo,

Vielleicht helfen die Excel Beispiele hier weiter:
http://www.sulprobil.com/Get_it_done/Con...tions.html

Viele Grüße,
Bernd P
Hallo Maxel,

jetzt habe ich mal etwas über die Simulation von Aktienkursen recherchiert. Monte Carlo Simulation und anderes habe ich dabei überflogen. Ich habe zwar nix mit Wandelanleihen in der Simulation gefunden und auch Binomial als Suchbegriff dazu hat mich nicht weiter gebracht, aber soweit ich es überblicke, sind immer Zufallszahlen mit von der Partie. Wandelanleihen selbst habe ich zwar nachgesehen und obwohl Binomial schon auch auftaucht, fehlt mir insgesamt zu viel Hintergrundwissen zu der Materie, die Du beackerst. Ich gehe davon aus, dass z.B. PD eine der genannten Zufallszahlen ist. Ich weiß aber nicht wirklich, ob das stimmt und ich weiß schon gar nicht, wofür PD steht.

Nun hast Du insgesamt in Deinem Beispiel (fast) nur feste Werte mit für Außenstehende kryptischen Bezeichnungen vorgegeben. Um Dir helfen zu können wäre es sehr hilfreich zu wissen, was die ganzen Variablen eigentlich bedeuten und wie sie zusammen hängen. Ja, ich weiß ... Wie sie zusammen hängen steht eigentlich im Code. Aber es wäre wirklich gut, wenn Du das Vorgehen mal in Worten beschreibst. Welche Werte gibt es, welche Bedeutungen haben sie, woher kommen sie und wie arbeiten sie zusammen? Du hast das Ansatzweise in Deinem Eingangsposting erläutert, aber zumindest ich brauche da detailliertere Infos, denn ich bin kein BWLer oder VWler.

In Deinem Code verwendest Du mehrere Variablen als seien es Arrays. Ich steige da aber nicht wirklich durch, weil ich mich mit der Materie wie gesagt einfach nicht auskenne, die Du abbilden willst. Also frage ich mich, ob die Arrays notwendig sind und wenn ja, wie die Größen der benötigten Datenfelder zu bestimmen sind.

Du musst Deine Thesis in 14 Tagen abgeben? Ich hoffe Du hast die eigentliche Ausarbeitung schon fertig. (Text und Grafiken, etwa 40 Seiten?) Denn das, was Du hier vor hast, klingt für mich einigermaßen ambitioniert, wenn Du noch nie programmiert hast. Grade deshalb solltest Du so viele Infos zum Sachverhalt geben, wie möglich. In diesem und anderen Foren gibt es viele Köpfe, die echt viel drauf haben. Aber bei "Nischen-Themen", also nicht IT-lastig, wirds dann schnell dünn mit Antworten.

Falls Du Deine Frage noch in anderen Foren gestellt hast oder das vor hast, verlinke die Forenbeiträge unbedingt untereinander! Crossposting ohne Kenntlichmachung wird von den meisten Leuten negativ aufgenommen, die ihre Zeit in eine Antwort und damit ihren Hirnschmalz investieren. Hintergrund ist, dass man sich den Kopf über Dinge zerbricht, die Andernorts vielleicht bereits (teil)gelöst wurden. Ich habe Deine Frage bisher in keinem anderen Forum gesehen und schreibe diesen Absatz nur vorsichtshalber.

Viele Grüße,

Zwenn
Hi Zwenn,

ich habe das bei keinem weiteren Forum reingesellt da, wie du schon gesagt hast, ich auch vermeiden will, dass da jemand umsonst die Arbeit macht. Und ein Bekannter hat mir dieses Forum empfohlen und meinte ich solle mal bei euch vorbeischauen, da ich mich eh mit VBA tiefer beschäftigen will und laut ihm hier auch viele Leute sind die einem auch helfen. Und ja hätte nicht gedacht, dass so viele, so schnell mir helfen. Danke Leute!

Meine Thesis ist soweit gut Fortgeschritten, dass ich mir darum keine Sorgen machen muss nicht rechtzeitig fertig zu werden (noch ca. 10-15 Seiten). Allerdings brauche ich für die Bewerbung für den Master eine gute Note in der Thesis (es studieren halt gefühlt alle BWL) und der Prof meint, er will dann auch sowas wie den Algo zur Bewertung sehen und ich soll mir dann halt ein Kopf machen wie ich‘s hinkriegt.
 Da ich eh immer Programmieren lernen wollte finde ich das sogar ganz gut mich damit zu beschäftigen (müssen) aber die Zeit ist jetzt leider begrenzt und die Panik/Verzweiflung setzt langsam ein. Ich sehe halt langsam keinen Stich mehr.

Zum Thema: eine Monte Carlo Simulation bzw. Zufallsvariablen sind nicht im Modell enthalten. Das Prinzip ist aber Ähnlich im ersten Schritt, da lediglich mögliche Aktienkurse simuliert werden sollen.  Und ja das stimmt hätte noch schreiben sollen was die Variablen bedeuten. Der „BWL-Begriff“ für ein Binomial Model ist Cox-Ross-Rubinstein.

Die einzelnen Variablen bedeuten:

S0 ist der Initiale Aktienkurs

FV ist der Wert der Anleihe (die Anleihe kann am Ende in Aktien getauscht werden, wenn die Anleihe 100€ Wert ist, das Wandelverhältnis 10 ist und der Aktienkurs 9 also 90€ würde man nicht wandeln und die 100 wären der Max. Wert)

Ttm: ist die Laufzeit der Anleihe bzw. 5 Jahre

r ist der risikolose Zins (ohne den geht in BWL nichts, da er zur Risiko Einschätzung dient)

sigma ist die Volatilität was die Schwankung des Aktienkurses ist. (daraus leitet sich die Aufwärtsbewegung (u) und die Abwärtsbewegung (d) ab)

p = ½ ist die Wahrscheinlichkeit der jeweiligen Bewegung (jeweils 50 % der Einfachheit halber)

L ist die Verlustrate bei Ausfall der Anleihe (fester Wert). Wenn das Unternehmen pleitegeht hat die Anleihe trotzdem noch ein Wert. Dient der Risiko Schätzung.

K ist das Wandelverhältnis (Anstatt Anleihe, x Aktien)

CallPrice ist was man bezahlt, wenn man vor dem Laufzeitende die Anleihe wandelt. (also auch ein fester Wert. Im Modell lass ich  ihn bei 0.
Rho ist ein Parameter im Bezug zum CallPrice. Man kann die Anleihe au vor Laufzeit ende (ttm) in Aktien tauschen, jedoch muss man oft dafür eine Gebühr bezahlen.

C sind die Kouponzahlungen der Anleihe die bei den Knoten auf den Anleihewert addiert werden.

PD ist die Ausfallwahrscheinlichkeit der Anleihe (auch ein fester Wert)

CallNY ob die Anleihe gewandelt werden soll oder nicht.
 
Der Wert lambda ist die Ausfallintensität und die Verändert sich mit jeder Aktienbewegung.

In der Excel habe ich ein vereinfachtes Model mal „nachgebaut“. Durch Parameter wie Rho, L, CallYN und PD wird die ganze Sache so komplex, dass das eigentlich nur noch mit einem Computer zu berechnen ist. Daher habe ich diese hier rausgelassen aber am Prinzip ändert sich überhaupt nicht.[attachment=23310]
 
Beste Grüße
Maxel
Hallo,

Ist das Problem nicht längst zigfach gelöst?
Wenn ich nach "convertible bond binomial tree valuation filetype:pdf" google, dann sieht es mehr nach Literaturrecherche als nach Programmentwicklung aus.

Es ist ja nicht so, dass man Japanisch lernen müsste. Englisch und richtig googeln scheint zu reichen. Wie man so etwas dann z. B. mit Excel umsetzt, habe ich oben erwähnt. Das Schöne an den deterministischen Modellen ist dann noch, dass man die Beispiele exakt nachstellen kann. Bei Monte Carlo liegt man immer etwas daneben.

Viele Grüße,
Bernd P
Hallo,

ich hatte mir den gezeigten Code angesehen, ob ich ihn umschreiben könnte. Aber es fehlte zu viel ohne lange Recherchen einen Vorschlag zu machen.

Wenn Du so erklärst, dass das als Basis für eine Code - Korrektur reicht, sehe ich mir es noch einmal an.

mfg
Seiten: 1 2