Valutazione opzioni Europee: Formula per valutazione Call Europea su albero binomiale: Put Europea:
Call Europea Function EurCall(S, X, T, rf, sigma, n) delta_t = T / n up = Exp(sigma * Sqr(delta_t)) down = Exp(-sigma * Sqr(delta_t)) R = Exp(rf * delta_t) q_up = (R - down) / (R * (up - down)) q_down = 1 / R - q_up EurCall = 0 For Index = 0 To n EurCall = EurCall + Application.Combin(n, Index) * q_up ^ Index * _ q_down ^ (n - Index) * Application.Max(S * up ^ Index * down ^ _ (n - Index) - X, 0) Next Index End Function
Valutazione opzioni Americane Procedimento backward Ad ogni nodo il valore dell’opzione è pari al massimo tra: Il payoff se esercitata Il valore attuale atteso sotto la probabilità risk-neutral dei payoff nei due nodi collegati al tempo successivo
Call Americana Function AmericanCall(S, X, T, rf, sigma, n) delta_t = T / n up = Exp(sigma * Sqr(delta_t)) down = Exp(-sigma * Sqr(delta_t)) R = Exp(rf * delta_t) q_up = (R - down) / (R * (up - down)) q_down = 1 / R - q_up Dim OptionReturnEnd() As Double Dim OptionReturnMiddle() As Double ReDim OptionReturnEnd(n) For State = 0 To n OptionReturnEnd(State) = Application.Max(S * _ up ^ State * down ^ (n - State) - X, 0) Next State Dichiarazione variabili ed assegnazione valori Assegnazione valori ai nodi finali
Call Americana (continua) Ciclo che sconta i payoff fino al tempo 0 For Index = n - 1 To 0 Step -1 ReDim OptionReturnMiddle(Index) For State = 0 To Index OptionReturnMiddle(State) = Application.Max(S * _ up ^ State * down ^ (Index - State) - X, _ q_down * OptionReturnEnd(State) + _ q_up * OptionReturnEnd(State + 1)) Next State ReDim OptionReturnEnd(Index) OptionReturnEnd(State) = OptionReturnMiddle(State) Next Index AmericanCall = OptionReturnMiddle(0) End Function Assegna dimensione e valori al vettore dei nodi centrali Assegna dimensione e valori al vettore dei nodi finali uguali a quelli del vettore dei nodi centrali
Proprietà opzioni Call E Put E Call A Put A S + - X T ? sigma R Div
La Distribuzione Lognormale Assunzione centrale del modello di Black & Scholes Proprietà ragionevoli dei prezzi delle azioni Esaminiamo i prezzi ed i rendimenti dell’S&P500 Usiamo la funzione matrice FREQUENZA(matr dati;matr classi) per i rendimenti e notiamo che si distribuiscono normalmente.
La Distribuzione Lognormale St+Dt=SterDt Assumiamo che il tasso di rendimento abbia una distribuzione normale, allora il prezzo dell’azione ha una distribuzione lognormale St+Dt=Ste(mDt+sZradq(Dt)) Estraiamo una serie di numeri casuali da una distribuzione normale standard ed usiamo l’equazione precedente per simulare il sentiero di prezzo dell’azione
Generazione numeri casuali Strumenti / Analisi dati / generazione numero casuale Stimiamo il valore dell’azione a fine anno utilizzando la serie di numeri casuali Usiamo la funzione frequenza e facciamo un istogramma che illustra la forma della distribuzione lognormale
Simulazione in VBA Sub simula() Dim vettore(1 To 1000) As Double For i = 1 To 1000 z = Application.NormSInv(Rnd) vettore(i) = z Cells(i, 1).Value = vettore(i) Next i End Sub
Black & Scholes Call Europea: Put Europea: Put Call Parity:
Black & Scholes Function dOne(Azione, Esercizio, Scadenza, Interesse, sigma) dOne = (Log(Azione / Esercizio) + Interesse * Scadenza) / (sigma * Sqr(Scadenza)) _ + 0.5 * sigma * Sqr(Scadenza) End Function Function BSCall(Azione, Esercizio, Scadenza, Interesse, sigma) BSCall = Azione * Application.NormSDist(dOne(Azione, Esercizio, _ Scadenza, Interesse, sigma)) - Esercizio * Exp(-Scadenza * Interesse) * _ Application.NormSDist(dOne(Azione, Esercizio, Scadenza, Interesse, sigma) _ - sigma * Sqr(Scadenza))
Black & Scholes 'Questo è il prezzo dell'opzione put B&S secondo la parità put-call Function BSPut(Azione, Esercizio, Scadenza, Interesse, sigma) BSPut = BSCall(Azione, Esercizio, Scadenza, Interesse, sigma) + _ Esercizio * Exp(-Scadenza * Interesse) - Azione End Function
Volatilità implicita Function CallVolatility(Azione, Esercizio, Scadenza, Interesse, Obiettivo) High = 1 Low = 0 Do While (High - Low) > 0.0001 If CallOption(Azione, Esercizio, Scadenza, Interesse, (High + Low) / 2) > _ Obiettivo Then High = (High + Low) / 2 Else: Low = (High + Low) / 2 End If Loop CallVolatility = (High + Low) / 2 End Function
Risolutore Componenti aggiuntivi Strumenti\Riferimenti\Solver.xla Solveradd ( cellRef, relation, formulaText) Relation: 1 <= 2 = 3 >= SolverOk (SetCell, MaxMinVal, ValueOf, ByChange) Value of: 1 max 2 min 3 al valore di SolverOptions SolverSolve