1 Il valore ricorsivo di un’opzione americana

Un’opzione americana dà, in ogni momento, il diritto di esercitarla oppure di aspettare il momento successivo. In ogni istante di tempo \(t\in[t_0,T]\) tra l’emissione e la scadenza, l’opzione americana ha un payoff che può avere due valori:

  1. se l’opzione è esercitata: il suo valore è uguale a quello della corrispondente opzione europea (scadente lo stesso giorno): \[\left(S\left(t\right)-K\right)\mathbb{I}_{S\left(t\right)>K};\]
  2. se l’opzione non è esercitata: allora il suo valore è pari al valore scontato dell’opzione americana nel periodo successivo\[\mathbb{E}_{t}^{\mathbb{Q}}\left[C_{a}\left(t+1\right)\frac{G\left(t\right)}{G\left(t+1\right)}\right].\]

Poiché possiamo scegliere se esercitare o meno l’opzione, allora il valore dell’opzione americana al tempo \(t\) è dato da

\[C_{a}\left(t\right)=\max\left\{ \left(S\left(t\right)-K\right)\mathbb{I}_{S\left(t\right)>K},\mathbb{E}_{t}^{\mathbb{Q}}\left[C_{a}\left(t+1\right)\frac{G\left(t\right)}{G\left(t+1\right)}\right]\right\},\]

la quale è un’equazione ricorsiva perché definisce il valore \(C_a(t)\) in funzione del valore \(C_a(t+1)\). Questa equazione si definisce “alle differenze finite” (si tratta del corrispondente, in tempo discreto, di un’equazione differenziale).

2 Risoluzione a ritroso di un’equazione alle differenze

Per risolvere numericamente un’equazione alle differenze, basta conoscere un valore dell’incognita in un momento qualsiasi, e derivare gli altri valori per iterazione. Noi conosciamo il valore dell’opzione americana al momento della scadenza \(T\), poiché, in tale momento, essa coincide con il valore dell’opzione europea:

\[C_{a}\left(T\right)=C\left(T\right)=\left(S\left(T\right)-K\right)\mathbb{I}_{S\left(T\right)>K}.\] Si può, quindi, partire dall’ultima data \(T\) e risolvere, “a ritroso”, l’equazione alle differenze fino ad arrivare al momento della valutazione (cosiddetta backward induction). Vediamo ora come scrivere il modello di Balck e Scholes nella forma binomiale discretizzata.

3 Il modello binomiale di Black e Scholes

Data l’equazione del moto del prezzo di un sottostante \(S_t\) nella forma

\[\frac{dS_{t}}{S_{t}}=rdt+\sigma dW_{t}^{\mathbb{Q}},\] sappiamo che la soluzione è:

\[S_{T}=S_{t}e^{\left(r-\frac{1}{2}\sigma^{2}\right)\left(T-t\right)+\sigma\left(W_{T}^{\mathbb{Q}}-W_{t}^{\mathbb{Q}}\right)},\]

dove ricordiamo che la differenza \(W_{T}^{\mathbb{Q}}-W_{t}^{\mathbb{Q}}\) è distribuita come una normale con media nulla e varianza \(T-t\). Per discretizzare questa distribuzione possiamo usare la variabile:

\[x=\begin{cases} +\sqrt{T-t} & \frac{1}{2}\\ -\sqrt{T-t} & \frac{1}{2} \end{cases}\]

e, quindi, scrivere il prezzo del sottostante come

\[S_{T}=\begin{cases} S_{t}e^{\left(r-\frac{1}{2}\sigma^{2}\right)\left(T-t\right)+\sigma\sqrt{T-t}} & \frac{1}{2}\\ S_{t}e^{\left(r-\frac{1}{2}\sigma^{2}\right)\left(T-t\right)-\sigma\sqrt{T-t}} & \frac{1}{2} \end{cases}\]

Il titolo privo di rischio, invece, evolve in modo desterministico nella forma:

\[G_{T}=G_{t}e^{r\left(T-t\right)}.\]

Pensando al modello binomiale, quindi, si può scrivere un mercato nella forma:

\[\Phi\left(t\right)=\left[\begin{array}{c} G_{t}\\ S_{t} \end{array}\right],\quad\Phi\left(t+1\right)=\left[\begin{array}{cc} G_{t}v & G_{t}v\\ S_{t}vu & S_{t}vd \end{array}\right]\]

dove abbiamo posto:

\[v:=e^{r\left(T-t\right)},\] \[u:=e^{-\frac{1}{2}\sigma^{2}\left(T-t\right)+\sigma\sqrt{T-t}},\] \[d:=e^{-\frac{1}{2}\sigma^{2}\left(T-t\right)-\sigma\sqrt{T-t}}.\]

L’assenza di arbitraggio prevede che esista una probabilità neutrale al rischio tale da soddisfare:

\[\mathbb{E}_{t}^{q}\left[\Phi\left(t+1\right)\frac{1}{v}\right]=\Phi\left(t\right),\]

dove ho usato il termine \(\frac{1}{v}\) per indicare il fattore di sconto. Questa equazione diventa:

\[\left(vuq+vd\left(1-q\right)\right)\frac{1}{v}=1,\]

da cui si ottiene

\[q=\frac{1-d}{u-d}.\]

4 Simulazione mediante albero

Se dividiamo il periodo \(T-t\) in una sequenza di \(n\) nodi equidistanti, possiamo simulare il prezzo del titolo sottostante mediante un albero a \(n\) nodi nella forma seguente:

Nella definizione dei termini \(v\), \(u\) e \(d\), quando si divide il periodo \(T-\) in \(n\) nodi, bisogna sostituire la differenza \(T-\) con il lasso temporale \(\frac{T-t}{n}\). Trasformando questo albero in una matrice, si può scrivere:

colonna 0 colonna 1 colonna 2
\(S_0\) \(S_0 \cdot v\cdot u\) \(S_0 \cdot v^2\cdot u^2\)
\(S_0 \cdot v\cdot d\) \(S_0 \cdot v^2\cdot u\cdot d\)
\(S_0 \cdot v^2\cdot d^2\)

Un codice che calcola queseta matrice è scritto come segue.

albero=function(S0,T,r,sigma,n){
  v=exp(r*T/n)
  u=exp(-0.5*sigma^2*T/n+sigma*sqrt(T/n))
  d=exp(-0.5*sigma^2*T/n-sigma*sqrt(T/n))

  n=n+1 #si crea una matrice con una colonna in più
  S=array(NA,dim=c(n,n)) #matrice vuota

  for (i in 1:n){
    S[1:i,i]=S0*v^(i-1)*u^(seq(i,1)-1)*d^(seq(1,i)-1)
  }
  S
}

Proviamo a usare questa funzione per costruire un albero binomiale su \(T=10\) anni, con tasso di interesse \(r=0.03\), volatilità \(\sigma=0.2\) e \(n=10\) nodi:

albero(100,10,0.03,0.2,5)
##      [,1]      [,2]     [,3]      [,4]      [,5]      [,6]
## [1,]  100 135.37015 183.2508 248.06686 335.80849 454.58447
## [2,]   NA  76.88628 104.0811 140.89471 190.72939 258.19066
## [3,]   NA        NA  59.1150  80.02407 108.32871 146.64474
## [4,]   NA        NA       NA  45.45133  61.52753  83.28992
## [5,]   NA        NA       NA        NA  34.94584  47.30623
## [6,]   NA        NA       NA        NA        NA  26.86855

5 Valutazione dell’opzione americana

Partendo dall’ultima colonna della matrice dell’albero binomiale, possiamo calcolare il valore dell’opzione americana (che, in \(T\), coincide con il valore dell’opzione europea) e, poi, calcolare il valore dell’americana a ritroso, utilizzando la prima equazione alle differenze. Per valutare l’opzione americana in ogni colonna, bisogna moltiplicare i valori della colonna (nodo) successivo per le probabilità neutrali al rischio \((q,1-q)\) per i valori della colonna successiva.

Prendendo l’esempio dell’albero più semplice iniziale, su una ipotetica quarta colonna, si dovrebbe calcolare il valore atteso della call americana è dato dal seguente calcolo matriciale:

\[\left[\begin{array}{cccc} q & 1-q & 0 & 0\\ 0 & q & 1-q & 0\\ 0 & 0 & q & 1-q \end{array}\right]\left[\begin{array}{c} S_{0}v^{3}u^{3}\\ S_{0}v^{3}u^{2}d\\ S_{0}v^{3}ud^{2}\\ S_{0}v^{3}d^{3} \end{array}\right]=\left[\begin{array}{c} S_{0}v^{3}u^{3}q+S_{0}v^{3}u^{2}d\left(1-q\right)\\ S_{0}v^{3}u^{2}dq+S_{0}v^{3}ud^{2}\left(1-q\right)\\ S_{0}v^{3}ud^{2}q+S_{0}v^{3}d^{3}\left(1-q\right) \end{array}\right].\]

La matrice a sinistra può essere creata mediante il comandi diag che genera una matrice digonale (anche se rettangolare).

optionAE=function(S0,T,r,sigma,n,K){
  #generazione dell'albero (funzione precedente)
  v=exp(r*T/n)
  u=exp(-0.5*sigma^2*T/n+sigma*sqrt(T/n))
  d=exp(-0.5*sigma^2*T/n-sigma*sqrt(T/n))
  
  n=n+1
  S=array(NA,dim=c(n,n)) #matrice vuota

  for (i in 1:n){
    S[1:i,i]=S0*v^(i-1)*u^(seq(i,1)-1)*d^(seq(1,i)-1)
  }
  
  q=(1-d)/(u-d) #probabilità neutrale al rischio
  
  C=(S-K)*as.numeric(S>K) #matrice dei payoff europei
  Ca=Ce=array(NA,dim=c(n,n)) #matrice vuota (americana ed europea)
  Ca[,n]=Ce[,n]=C[,n] #ultimo valore uguale all'europea

  for (i in (n-1):1){
    M=diag(q,i,i+1)+cbind(rep(0,i),diag(1-q,i,i))
    Ca[1:i,i]=pmax(C[1:i,i],
                   M%*%Ca[1:(i+1),i+1]/v)
    Ce[1:i,i]=M%*%Ce[1:(i+1),i+1]/v
  }
  
  list(S=S,Ce=Ce,Ca=Ca)
}

Possiamo così verificare se le due opzioni (europea e americana) hanno o meno lo stesso prezzo. La teoria ci dice che dovrebbero avere lo stesso prezzo poiché il sottostante, in questo modello, non paga dividendi.

optionAE(100,10,0.03,0.2,5,110)
## $S
##      [,1]      [,2]     [,3]      [,4]      [,5]      [,6]
## [1,]  100 135.37015 183.2508 248.06686 335.80849 454.58447
## [2,]   NA  76.88628 104.0811 140.89471 190.72939 258.19066
## [3,]   NA        NA  59.1150  80.02407 108.32871 146.64474
## [4,]   NA        NA       NA  45.45133  61.52753  83.28992
## [5,]   NA        NA       NA        NA  34.94584  47.30623
## [6,]   NA        NA       NA        NA        NA  26.86855
## 
## $Ce
##          [,1]     [,2]      [,3]       [,4]      [,5]      [,6]
## [1,] 33.80389 57.13288 94.143996 150.505616 232.21439 344.58447
## [2,]       NA 14.57485 27.060386  49.233461  87.13529 148.19066
## [3,]       NA       NA  3.847834   8.156078  17.28807  36.64474
## [4,]       NA       NA        NA   0.000000   0.00000   0.00000
## [5,]       NA       NA        NA         NA   0.00000   0.00000
## [6,]       NA       NA        NA         NA        NA   0.00000
## 
## $Ca
##          [,1]     [,2]      [,3]       [,4]      [,5]      [,6]
## [1,] 33.80389 57.13288 94.143996 150.505616 232.21439 344.58447
## [2,]       NA 14.57485 27.060386  49.233461  87.13529 148.19066
## [3,]       NA       NA  3.847834   8.156078  17.28807  36.64474
## [4,]       NA       NA        NA   0.000000   0.00000   0.00000
## [5,]       NA       NA        NA         NA   0.00000   0.00000
## [6,]       NA       NA        NA         NA        NA   0.00000

6 Calcolo delle opzioni put

Possiamo modificare il precedente codice in modo da tenere conto anche delle opzioni put. Questa volta ci aspettiamo che il prezzo dell’opzione europea sia diverso da quello dell’opzione americana, sempre perché il sottostante non paga dividendi.

optionAE=function(S0,T,r,sigma,n,K){
  #generazione dell'albero (funzione precedente)
  v=exp(r*T/n)
  u=exp(-0.5*sigma^2*T/n+sigma*sqrt(T/n))
  d=exp(-0.5*sigma^2*T/n-sigma*sqrt(T/n))
  
  n=n+1
  S=array(NA,dim=c(n,n)) #matrice vuota
  
  for (i in 1:n){
    S[1:i,i]=S0*v^(i-1)*u^(seq(i,1)-1)*d^(seq(1,i)-1)
  }
  
  q=(1-d)/(u-d) #probabilità neutrale al rischio
  
  C=(S-K)*as.numeric(S>K) #payoff call europei
  P=(K-S)*as.numeric(S<K) #payoff put europei
  Ca=Ce=Pa=Pe=array(NA,dim=c(n,n)) #matrici vuote
  Ca[,n]=Ce[,n]=C[,n] #ultimo valore uguale per call
  Pa[,n]=Pe[,n]=P[,n] #ultimo valore uguale per put
  
  for (i in (n-1):1){
    M=diag(q,i,i+1)+cbind(rep(0,i),diag(1-q,i,i))
    Ca[1:i,i]=pmax(C[1:i,i],
                   M%*%Ca[1:(i+1),i+1]/v)
    Pa[1:i,i]=pmax(P[1:i,i],
                   M%*%Pa[1:(i+1),i+1]/v)
    #le europee sono solo lo sconto del valore successivo
    Ce[1:i,i]=M%*%Ce[1:(i+1),i+1]/v
    Pe[1:i,i]=M%*%Pe[1:(i+1),i+1]/v
  }
  
  list(S=S,Ce=Ce,Ca=Ca,Pe=Pe,Pa=Pa)
}

Il confronto dà i risultati che si aspettavano.

optionAE(100,10,0.03,0.2,5,110)
## $S
##      [,1]      [,2]     [,3]      [,4]      [,5]      [,6]
## [1,]  100 135.37015 183.2508 248.06686 335.80849 454.58447
## [2,]   NA  76.88628 104.0811 140.89471 190.72939 258.19066
## [3,]   NA        NA  59.1150  80.02407 108.32871 146.64474
## [4,]   NA        NA       NA  45.45133  61.52753  83.28992
## [5,]   NA        NA       NA        NA  34.94584  47.30623
## [6,]   NA        NA       NA        NA        NA  26.86855
## 
## $Ce
##          [,1]     [,2]      [,3]       [,4]      [,5]      [,6]
## [1,] 33.80389 57.13288 94.143996 150.505616 232.21439 344.58447
## [2,]       NA 14.57485 27.060386  49.233461  87.13529 148.19066
## [3,]       NA       NA  3.847834   8.156078  17.28807  36.64474
## [4,]       NA       NA        NA   0.000000   0.00000   0.00000
## [5,]       NA       NA        NA         NA   0.00000   0.00000
## [6,]       NA       NA        NA         NA        NA   0.00000
## 
## $Ca
##          [,1]     [,2]      [,3]       [,4]      [,5]      [,6]
## [1,] 33.80389 57.13288 94.143996 150.505616 232.21439 344.58447
## [2,]       NA 14.57485 27.060386  49.233461  87.13529 148.19066
## [3,]       NA       NA  3.847834   8.156078  17.28807  36.64474
## [4,]       NA       NA        NA   0.000000   0.00000   0.00000
## [5,]       NA       NA        NA         NA   0.00000   0.00000
## [6,]       NA       NA        NA         NA        NA   0.00000
## 
## $Pe
##         [,1]      [,2]      [,3]      [,4]     [,5]     [,6]
## [1,] 15.2939  8.291792  2.772936  0.000000  0.00000  0.00000
## [2,]      NA 24.217637 14.859032  5.899996  0.00000  0.00000
## [3,]      NA        NA 36.612553 25.693256 12.55346  0.00000
## [4,]      NA        NA        NA 52.109920 42.06657 26.71008
## [5,]      NA        NA        NA        NA 68.64826 62.69377
## [6,]      NA        NA        NA        NA       NA 83.13145
## 
## $Pa
##          [,1]      [,2]      [,3]      [,4]     [,5]     [,6]
## [1,] 19.92126  9.237793  2.772936  0.000000  0.00000  0.00000
## [2,]       NA 33.113718 16.871844  5.899996  0.00000  0.00000
## [3,]       NA        NA 50.884996 29.975929 12.55346  0.00000
## [4,]       NA        NA        NA 64.548672 48.47247 26.71008
## [5,]       NA        NA        NA        NA 75.05416 62.69377
## [6,]       NA        NA        NA        NA       NA 83.13145