Valutazione opzioni Europee: • Formula per valutazione Call Europea su albero binomiale: n i n i i n i q ( 1 q ) max Su d X ,0 i i 0 • Put Europea: n n i n i i n i q ( 1 q ) max X Su d ,0 i i 0 n 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) Dichiarazione variabili ed assegnazione valori For State = 0 To n OptionReturnEnd(State) = Application.Max(S * _ up ^ State * down ^ (n - State) - X, 0) Next State Assegnazion e valori ai nodi finali Call Americana (continua) Ciclo che sconta i payoff fino al tempo 0 ReDim OptionReturnMiddle(Index) Assegna For State = 0 To Index dimensione OptionReturnMiddle(State) = Application.Max(S * _ e valori al up ^ State * down ^ (Index - State) - X, _ vettore dei q_down * OptionReturnEnd(State) + _ nodi centrali For Index = n - 1 To 0 Step -1 q_up * OptionReturnEnd(State + 1)) Next State ReDim OptionReturnEnd(Index) For State = 0 To Index OptionReturnEnd(State) = OptionReturnMiddle(State) Next State Next Index AmericanCall = OptionReturnMiddle(0) End Function 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: C SN (d1 ) Xe rT N (d 2 ) ln( S / X ) (r s 2 / 2)T d1 s T d 2 d1 s T rT P SN ( d ) Xe N ( d 2 ) • Put Europea: 1 rT P S C Xe • 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)) End Function 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