34
Dai numeri complessi al Fast Fourier Transform Option Pricing R. Marf´ e Metodi numerici per la finanza 2006/ 2007

Dai numeri complessi al Fast Fourier Transform Option Pricingrobertomarfe.xoom.it/Marfe_notes_on_fourier.pdf · I numeri complessi sono un utile strumento per descrivere vettori su

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

  • Dai numeri complessi al Fast FourierTransform Option Pricing

    R. Marfé

    Metodi numerici per la finanza 2006/ 2007

  • Indice

    1 Introduzione 3

    2 I numeri complessi 4

    3 Discrete Fourier transform 7

    4 Il modello binomiale 11

    5 Option pricing attorno ad un cerchio 13

    6 Modelli continui e Fourier transform 17

    7 Modelli continui e Fast Fourier transform 19

    8 Applicazione in VBA 218.1 Convoluzione circolare . . . . . . . . . . . . . . . . . . . . . . 218.2 Discrete Fourier transform . . . . . . . . . . . . . . . . . . . . 228.3 Modello binomiale (CRR) . . . . . . . . . . . . . . . . . . . . 238.4 Modello binomiale (CRR) con convoluzione circolare . . . . . 248.5 Modello binomiale (CRR) con discrete Fourier

    transform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258.6 Modello Black-Scholes: funzione caratteristica . . . . . . . . . 278.7 Modello Black-Scholes: funzione ψT . . . . . . . . . . . . . . . 278.8 Modello Black-Scholes: pricing con formula classica (1973) . . 278.9 Modello Black-Scholes: pricing con Fourier transform . . . . . 28

    9 Applicazione in MATLAB 299.1 Modelli discreti: Binomiale (CRR) . . . . . . . . . . . . . . . 299.2 Modelli Continui: BS, MJD, VG, NIG e CGMY . . . . . . . . 31

    Bibliografia 34

  • 1 Introduzione

    In questo questo lavoro si intende descrivere brevemente l’utilizzo della tra-sformata di Fourier nel pricing delle opzioni. Lo scopo di questo lavoro èquindi didattico: si riprendono, in parte fedelmente, i lavori di Carr e Madan1

    e Cerny2 e se ne propone l’implementazione informatica.Si intende quindi partire da stumenti matematici semplici come i numeri

    complessi per comprendere la logica e le potenzialità di strumenti più sofi-sticati come le Fourier transform, descrivendo la loro applicazione nel casodiscreto. Si illustra quindi una prima applicazione finanziaria esemplifica-tiva, come il pricing delle opzioni nel modello binomiale. Successivamente,passando ai modelli continui, si deriva una formula generale per il prezzodelle opzioni e quindi una sua soluzione numerica attraverso l’uso delle FastFourier transform.

    La diffusione di questa metodologia, oltre ad essere dovuta all’elevata effi-cienza numerica, si deve al fatto che i modelli azionari più avanzati, utilizzatinel pricing delle opzioni, possiedono una componente di martingala guidatada un processo di Lévy.3 Da tali processi, che sono in grado di riprodurre rea-listicamente l’evidenza statistica delle serie storiche dei dati finanziari, nonè sempre possibile derivare in forma analitica la funzione di densità e risultaquindi più semplice calcolare l’integrale del payoff dell’opzione partendo dallafunzione caratteristica e sfruttando l’algoritmo delle FFt.

    Infine si riportano le applicazioni in codice VBA e MATLAB degli stru-menti descritti in questo lavoro: nel primo caso le routine hanno un valo-re principalmente esemplificativo poiché FFt e numeri complessi non sonofacilmente gestibili in ambiente Excel, mentre nel secondo caso la sintassiMATLAB garantisce una notevole efficienza computazionale.

    1Carr e Madan, 1999 [2]2Cerny, 2004 [3]3Schoutens, 2003 [8]

  • 2 I numeri complessi

    La discrete Fourier transform (dFt) utilizza punti posizionati su una circon-ferenza. Il modo più semplice di descrivere questi numeri è quello dei numericomplessi. Si intende descriverne la geometria per definire le proprietà delleFourier transform.

    I numeri complessi sono un utile strumento per descrivere vettori su unospazio bidimensionale.

    Figura 1:

    Ad esempio, in Figura 1, è rappresentato il vettore:

    2 + i,

    esso congiunge l’origine con un punto del piano, muovendosi di due unitàsull’asse reale (orizzontale) e di un’unità su quello immaginario (verticale).

    La somma di numeri complessi segue le stesse regole di quella dei vettori,per esempio: [

    21

    ]+

    [3−4

    ]=

    [5−3

    ]che nella notazione dei numeri complessi equivale a:

    (2 + i) + (3− 4i) = 5− 3i.

    Allo stesso modo, la moltiplicazione per uno scalare (un numero reale) nondifferisce del calcolo vettoriale:

    −3[21

    ]=

    [−6−3

    ],

  • Figura 2:

    che con i numeri complessi si scrive:

    −3(2 + i) = −6− 3i.

    I numeri complessi sono un buon modo di descrivere i movimenti attornoun cerchio di raggio unitario: come mostrato in Figura 2a, un cerchio diraggio unitario interseca l’asse reale nei punti 1 e -1, quello immaginario in ie −i.

    Un punto A su un cerchio di raggio unitario è unicamente identificato dalsuo argomento, ϕ, l’angolo fra l’asse reale e la linea che congiunge il puntoA all’origine. La Figura 2b mostra che il punto A può essere espresso come

    cosϕ+ i sinϕ.

    Moltiplicare numeri complessi rispetto ad un cerchio di raggio unitariosignifica aggiungere angoli. L’angolo di i è l’angolo retto, l’angolo di i × iallora sarà 90◦ + 90◦ che corrisponde a −1 per cui:

    i× i = i2 = −1.

    Questa regola permette di dare una definizione generale per la moltipli-cazione:

    (a1 + ib1)× (a2 + ib2) = a1a2 + i(b1a2 + a1b2) + b1b2i2

    = a1a2 − b1b2 + i(b1a2 + a1b2).

    Se invece si considerano nuovamente i numeri complessi come coordinatedi punti su una circonferenza di raggio unitario si ha:

    (cosϕ1 + i sinϕ1)× (cosϕ2 + i sinϕ2) =

  • cos(ϕ1 + ϕ2) + i sin(ϕ1 + ϕ2).

    Usando la formula di Eulero si ottiene elegantemente:

    cosϕ+ i sinϕ = eiϕ,

    da cuieiϕ1 × eiϕ2 = ei(ϕ1+ϕ2).

  • 3 Discrete Fourier transform

    Si supponga di voler distribuire su un cerchio di raggio unitario cinque puntiequidistanti: un quinto della circonferenza è caratterizzato dall’angolo 2Π

    5,

    quindi il primo punto si posizionerà in ei2Π5 , definito come

    z5 ≡ ei2Π5 .

    Proseguendo in senso antiorario (z5)2, (z5)

    3 e cos̀ı via identificheranno gliulteriori punti equidistanti.

    Figura 3:

  • Al completamento di ogni cerchio, sulla base del numero di punti inizial-mente considerato si ha:

    (z5)0 = (z5)

    5 = (z5)10 = (z5)

    15 = . . .

    (z5)1 = (z5)

    6 = (z5)11 = (z5)

    16 = . . .

    e

    (z5)0 = (z5)

    −5 = (z5)−10 = (z5)

    −15 = . . .

    (z5)1 = (z5)

    −4 = (z5)−9 = (z5)

    −14 = . . .

    Si definisca zn la rotazione di un ennesimo di un’intera circonferenza diraggio unitario:

    zn ≡ ei2Πn .

    Dunque(zn)

    0 + (zn)1 + . . .+ (zn)

    n−1 = 0 ∀n.

    Questo risultato può essere ulteriormente generalizzato: sia k un interocompreso tra 1 e n− 1, si ha

    (zkn)0 + (zkn)

    1 + . . .+ (zkn)n−1 = 0 ∀n.

    La differenza con la precedente sequenza sta nel fatto che mentre prima ogni(zn)

    i occorreva esattamente una volta, nella seconda sequenza ogni (zn)i viene

    considerata k volte.Se invece si sceglie k = 0, allora (z0n)

    j = 1 ∀j e dunque

    (zkn)0 + (zkn)

    1 + . . .+ (zkn)n−1 = n.

    Data una sequenza di n numeri a = [a0, a1, . . . , an−1] si definisce

    rev(a) ≡ [a0, an−1, . . . , a1]

    la sequenza a in ordine inverso: se a rappresenta un insieme di punti suuna circonferenza ordinati in senso antiorario, rev(a) significa individuare imedesimi punti in senso orario.

    Per ogni k, la sequenza (zkn)0, (zkn)

    1, . . ., (zkn)n−1 equivale alla sequenza

    (z−kn )0, (z−kn )

    1, . . ., (z−kn )n−1 letta nel senso inverso:

    rev((z−kn )

    0, (z−kn )1, . . . , (z−kn )

    n−1) = (zkn)0, (zkn)1, . . . , (zkn)n−1.

  • Figura 4:

    Infatti (z−kn )n−j = z−kn+kjn = z

    kjn = (z

    kn)

    j ∀ j.Si considerino nuovamente zn ≡ ei

    2Πn e la sequenza a = [a0, a1, . . . , an−1]

    di n numeri (complessi).La discrete Fourier transform (dFt) di a è data dalla sequenza b =

    [b0, b1, . . . , bn−1] tale che:

    bk =a0(z

    kn)

    0 + a1(zkn)

    1 + . . .+ an−1(zkn)

    n−1√n

    =1√n

    n−1∑j=0

    ajzjkn =

    1√n

    n−1∑j=0

    ajei 2Π

    njk. (1)

    O più semplicementeF(a) = b

    che rappresenta la forward transform.La inverse transform è invece data da:

    b̃k =a0(z

    −kn )

    0 + a1(z−kn )

    1 + . . .+ an−1(z−kn )

    n−1√n

    =1√n

    n−1∑j=0

    ajz−jkn =

    1√n

    n−1∑j=0

    aje−i 2Π

    njk. (2)

    ossiaF−1(a) = b̃.

    La inverse dFt di una sequenza a corrisponde alla forward dFt dellasequenza inversa:

    F−1(a) = F(rev(a)) (3)

  • e viceversaF−1(rev(a)) = F(a).

    L’F−1 non è che la trasformata inversa di F , per cui

    F−1(F(a)) = F(F−1(a)) = a.

  • 4 Il modello binomiale

    Si consideri un orizzonte temporale, T , e lo si divida in N sottoperiodi∆t = T/N . Si può ad esempio considerare un periodo annuale e suddividerlosettimanalmente:

    T = 1, N = 52 e ∆t =1

    52= 0.0192.

    Si consideri quindi un titolo azionario, la cui volatilità periodale, σ, in que-sto caso annuale, sia pari al 20%. Per determinare l’incremento o il decre-mento relativo, sulla base del modello binomiale (Jarrow-Turnbull), su ognisottoperiodo, occorre calcolare le quantità:

    Up = e(r−12σ2)∆t+σ

    √∆t = 1.0287, Down =

    1

    Up= 0.9721 (4)

    dove r = 5% è l’intensità istantanea del tasso d’interesse privo di rischio.Le probabilità neutrali al rischio di incremento o decremento del valore deltitolo, in ogni sottoperiodo, sono date da:

    Pr(Up) =e(r−

    12σ2)∆t −Down

    Up−Down= 0.5031, Pr(Down) = 1−Pr(Up) = 0.4969.

    (5)Assumendo che il prezzo iniziale del titolo sia S0 = 100, la sua evoluzionenelle tre settimane successive è descritta dal seguente albero binomiale: Si

    S0 S1 S2 S3100.00 102.87 105.82 108.86

    97.21 100.00 102.8794.50 97.21

    91.86

    supponga di voler prezzare un’opzione call con scadenza ad un anno e prezzodi esercizio 102 (2% out-of-the-money). Il valore intrinseco dell’opzione ascadenza è dato da:

    C3 = E[(S3 −K)+].L’asset pricing theory prevede che il prezzo di non arbitraggio di un payoffdel tipo: [

    Cu(T )Cd(T )

    ]

  • è dato dal valore atteso, sotto la misura di probabilità neutrale al rischio, delpayoff scontato:

    C(t) =EQ[quCu(T ) + qdCd(T )]

    e−r(T−t)(6)

    dove qu e qd sono le probabilità neutrali al rischio viste precedentemente etali che

    quUp+ qdDown = er∆t.

    I rapporti quer∆t

    e qder∆t

    sono detti prezzi degli stati del mondo.Nell’esempio qui riportato i prezzi dell’opzione al tempo T −∆t possono

    essere calcolati utilizzando quelli del periodo successivo e quindi a ritroso finoa t = 0:

    C(T −∆t) = 0.5031Cu(T ) + 0.4969Cd(T )1.0010

    cos̀ı come mostra il seguente albero binomiale:

    C0 C1 C2 C31.24 2.22 3.92 6.86

    0.23 0.44 0.870.00 0.00

    0.00

  • 5 Option pricing attorno ad un cerchio

    Dati due vettori n-dimensionali a = [a0, a1, . . . an−1] e b = [b0, b1, . . . bn−1] sidefinisce convoluzione ciclica o circolare di a e b il nuovo vettore c

    c = a~ b (7)

    tale che

    cj =n−1∑k=0

    aj−kbk

    dove all’indice j − k, se negativo, si aggiunge n affinchè sia compreso tra 0 en− 1.

    Tale operazione riflette un movimento attorno ad un cerchio, infatti gra-ficamente la convoluzione circolare può essere descritta in quattro passi:

    • si considerino due cerchi concentrici suddivisi in n segmenti uguali; siscrivano gli n elementi di a lungo il cerchio interno in senso orario e glielementi di b lungo il cerchio esterno in senso antiorario;

    • si calcoli la somma degli n prodotti scalari tra le coppie di valori cos̀ıcostruiti; per n = 4 si ha

    a0b0 + a3b1 + a2b2 + a1b3

    il risultato è c0;

  • • si ruoti in senso antiorario il cerchio interno di un n-esimo di circon-ferenza; si ricalcola la somma come al punto precedente per ottenerec1:

    c1 = a1b0 + a0b1 + a3b2 + a2b3

    • si ripeta la procedura per calcolare c2, . . . cn−1, ruotando per ogni ele-mento il cerchio interno di un n-esimo di circonferenza in senso antio-rario.

    Si descrive ora come è possibile utilizzare la convoluzione circolare perprezzare un’opzione. Si scrivano i payoff dell’opzione a scadenza lungo ilcerchio interno in senso orario e i prezzi degli stati lungo il cerchio esterno insenso antiorario; si ruotino i payoff in senso antiorario e si otterranno i prezzidell’opzione. Riprendendo l’esempio, il vettore dei payoff a scadenza è:

    [6.86 0.87 0.00 0.00] ,

    mentre il vettore, in senso inverso, degli stati è dato da

    rev(q/er∆t) =[0.5031 0.4969 0.0000 0.0000]

    1.0010,

    dove gli elementi in eccesso al numero degli stati sono sostituiti da ze-ri. Dunque per determinare i prezzi delle opzioni al tempo t = 2 occorrecalcolare:

    C(T −∆t) = C(T ) ~ rev(q/er∆t)= [3.92 0.44 0.00 3.36]

    Si noti che bisogna considerare solo i primi tre prezzi, mentre il quarto è privodi significato (corrisponde al prezzo di non arbitraggio del payoff [0.00 6.86]).

  • In generale i prezzi nel modello binomiale possono essere calcolati come:

    C(T −∆t) = C(T ) ~ rev(q) e−r∆t

    C(T − 2∆t) = C(T ) ~ rev(q) ~ rev(q) e−2r∆t

    C(t) = C(T ) ~

    (T−t)/∆t volte︷ ︸︸ ︷rev(q) ~ rev(q) ~ . . .~ rev(q) e−r(T−t) (8)

    C0 C1 C2 C31.24 2.22 3.92 6.860.92 0.23 0.44 0.872.61 1.64 0.00 0.002.94 3.63 3.36 0.00

    Si intende ora spiegare come la metodologia di pricing che utilizza laconvoluzione circolare possa essere riformulata grazie alla discrete Fouriertransform. La Fourier transform di una convoluzione circolare può infattiessere scritta come il prodotto:

    F(a~ b) =√nF(a)F(b),

    F−1(a~ b) =√nF−1(a)F−1(b),

  • dove n è la dimensione di a. Tale proprietà può essere agevolmente sfruttatanel procedimento di pricing. Il prezzo di un’opzione, come precedentementedescritto, con notazione semplificata, viene descritto dall’equazione:

    C0 = e−rN∆tCN ~

    N volte︷ ︸︸ ︷rev(q) ~ rev(q) . . .~ rev(q)

    dove N è il numero di sottoperiodi fino a scadenza. Se si applica la inverseFourier transform, F−1, ad entrambi i membri dell’equazione si ottiene:

    F−1(C0) = F−1(CN)×(√

    N + 1 F−1(rev(q)) e−r∆t)N

    nel modello binomiale infatti i payoff, CN , sono N + 1. Ricordando cheF−1(rev(q))) = F(q), si semplifica:

    F−1(C0) = F−1(CN)×(√

    N + 1 F(q) e−r∆t)N

    .

    Infine applicando ad entrambi i membri la forward Fourier transfom, siottiene il prezzo dell’opzione:

    C0 = F(F−1(CN)×

    (√N + 1 F(q) e−r∆t

    )N), (9)

    o, simmetricamente, invertendo forward e inverse Fourier transform:

    C0 = F−1(F(CN)×

    (√N + 1 F−1(q) e−r∆t

    )N), (10)

    che rappresentano le formule per il prezzo di non arbitraggio delle opzioninel modello binomiale.

  • 6 Modelli continui e Fourier transform

    Dalla fine degli anni ’90 si sono diffusi modelli di random walks per i prezziazionari in grado di riprodurre realisticamente le caratteristiche statistichedelle serie storiche. Si tratta infatti di modelli esponenziali con una compo-nente di martingala guidata da un processo di Lévy, in grado di tener contodella skewness e dell’eccesso di curtosi in genere presente nelle serie storichedei rendimenti azionari.

    Poiché è sempre possibile conoscere in forma analitica la funzione carat-teristica di un qualche processo di Lévy, mentre spesso non è nota la formulaper la funzione di densità, appare evidente l’utilità della Fourier transformquale strumento per derivare una formula generale per il calcolo del prezzodi un’opzione.

    Sia k il logaritmo del prezzo di esercizio, K, sia CT (k) il prezzo di un’op-zione con scadenza T e prezzo di esercizio ek e sia qT (s) la densità neutraleal rischio del logaritmo del prezzo, s ≡ ln(S). La funzione caratteristica diquesta densità è data da:

    φT (u) ≡∫ ∞−∞

    eiusqT (s)ds. (11)

    Data la funzione di densità neutrale al rischio, qT (s), il valore dell’opzionecall è dato da

    CT (k) ≡∫ ∞

    k

    e−rT (es − ek)qT (s)ds. (12)

    Si intende quindi ridefinire tale equazione, facendo riferimento non più alladensità qT (s) ma alla funzione caratteristica φT . Si definisce la versionemodificata del prezzo della call come

    cT (k) ≡ eαkCT (k)

    con α > 0. Si considera quindi la sua Fourier transfom definita:

    ψT (υ) =

    ∫ ∞−∞

    eiυkcT (k)dk.

    Si intende quindi trovare un espressione analitica per ψT (υ) in termini di φT equindi ottenere il valore dell’opzione call usando la inverse Fourier transform:

    CT (k) =e−αk

    ∫ ∞−∞

    e−iυkψT (υ)dυ =e−αk

    π

    ∫ ∞0

    e−iυkψT (υ)dυ. (13)

  • L’espressione per ψT (υ) è determinata come segue:

    ψT (υ) =

    ∫ ∞−∞

    eiυk∫ ∞

    k

    eαke−rT (es − ek)qT (s)dsdk

    =

    ∫ ∞−∞

    e−rT qT (s)

    ∫ s−∞

    (es+αk − e(1+α)k

    )eiυkdkds

    =

    ∫ ∞−∞

    e−rT qT (s)

    [e(α+1+iυ)s

    α+ iυ− e

    (α+1+iυ)s

    α+ 1 + iυ

    ]ds

    =e−rTφT (υ − (α+ 1)i)

    α2 + α− υ2 + i(2α+ 1)υ. (14)

    A titolo di esempio si riporta la funzione caratteristica nel modello Black-Scholes:

    φBS, T (z) = eiz((r− 1

    2σ2)T+ln(S))− 1

    2σ2z2T .

  • 7 Modelli continui e Fast Fourier transform

    La forward e la inverse Fast Fourier transform sono un efficiente algoritmoper il calcolo delle dFt:

    w(k) =N∑

    j=1

    e−i2πN

    (j−1)(k−1)x(j) k = 1, 2, . . . N (15)

    dove N è generalmente una potenza di 2. L’algoritmo riduce infatti le mol-tiplicazioni richieste nelle N sommatorie da un’ordine di N2 a quello diN ln2(N).

    Si intende quindi riformulare l’integrale da calcolare nella (13) con l’utiliz-zo delle FFt. Utilizzando la ‘regola trapezoidale’4 e definendo υj = η(j − 1),un’approssimazione del prezzo dell’opzione call è dato da:

    CT (k) ≈e−αk

    π

    N∑j=1

    e−iυjkψT (υj)η, (16)

    dove il limite superiore di integrazione è stato posto pari a

    a = Nη.

    Poiché le FFt permettono di calcolare contemporaneamente N prezzi diopzioni con N diversi strike, ek, occorre scegliere uno spazio [−b, b], diampiezza λ, su cui distribuire i valori di k:

    ku = −b+ λ(u− 1) u = 1, 2, . . . N (17)

    con

    b =Nλ

    2.

    Sostituendo la (17) nella (16) si ottiene:

    CT (ku) ≈e−αku

    π

    N∑j=1

    e−iυj(−b+λ(u−1))ψT (υj)η u = 1, 2, . . . N. (18)

    4ossia tutti i punti in cui la funzione integranda è valutata hanno peso unitario salvogli estremi che hanno peso pari ad un mezzo.

  • Poiché υj = η(j − 1), la (18) può essere riscritta come

    CT (ku) ≈e−αku

    π

    N∑j=1

    e−iλη(j−1)(u−1)eibυjψT (υj)η u = 1, 2, . . . N. (19)

    Quindi al fine di utilizzare le FFt nel calcolo della (19), basta scegliere iparametri η e λ tali che

    λη =2π

    N.

  • 8 Applicazione in VBA

    Nelle routine che seguono è stata utilizzata una libreria open-source per eseguire le ope-razioni sui numeri comlessi:

    ’ w = CCmp(r, i): costruisce un numero complesso con’ parti reale e immaginaria date.’ w = CSom(z1, z2): ritorna la somma z1 + z2.’ w = CDif(z1, z2): ritorna la differenza z1 - z2.’ w = CMol(z1, z2): ritorna il prodotto z1 * z2.’ w = CDiv(z1, z2): ritorna il rapporto z1 / z2.’ w = CPtN(z1, N): ritorna la potenza z1 ^ N.’ w = CSqr(z): ritorna la radice quadrata di z.’ w = CExp(z): ritorna l’ esponenziale di z.’ w = CLog(z): ritorna il logaritmo naturale di z.

    8.1 Convoluzione circolare

    Public Sub Circular_Covolution(a, b, c, n)’ Calcola la convoluzione circolare dei vettori a e b di lunghezza n’ restituendo il vettore cReDim tmp(n)Dim nn As IntegerFor j = 1 To ntmp(j) = 0For i = 1 To nnn = j - iIf nn < 1 Thennn = nn + nEnd Iftmp(j) = tmp(j) + a(nn) * b(i)Next iNext jFor i = 2 To nc(i - 1) = tmp(i)Next ic(n) = tmp(1)End Sub

  • 8.2 Discrete Fourier transform

    Public Sub DFT(direction As Integer, ar, ai, br, bi, n)’ Calcola la discrete Fourier transform del vettore complesso’ A(ar, ai) restituendo il vettore complesso B(br, bi)’ direction: +1/-1 forward o inverse transform’ n: numero elementi del vettore A (su cui effettuare la trasformata)Dim Pi As DoublePi = 3.14159265358979Dim x As complex, a As complexReDim tmpr(n)ReDim tmpi(n)For i = 1 To nx = CCmp(0, 0)For j = 1 To na = CCmp(ar(j), ai(j))x = CSom(x, CMol(CMol(CCmp((1 / Sqr(n)), 0), a), CExp(CMol(CCmp(0, 1), _

    CCmp((direction * 2 * Pi / n) * (i - 1) * (j - 1), 0)))))Next jtmpr(i) = CRea(x)tmpi(i) = CImm(x)Next iFor i = 1 To nbr(i) = tmpr(i)bi(i) = tmpi(i)Next iEnd Sub

  • 8.3 Modello binomiale (CRR)

    Function Binomiale_CRR(ByVal cp As Integer, ByVal S As Double, _ByVal K As Double, ByVal t As Double, ByVal r As Double, _ByVal vol As Double, ByVal n As Integer) As Double

    ’ Calcola il prezzo call/put col modello binomiale (CRR)

    Dim rl As Double, Rinv As Double, u As Double, d As Double, _dd As Double, pUp As Double, pDown As Double

    Dim prices() As DoubleDim call_valuesR() As DoubleReDim q(2) As DoubleReDim prices(n + 1)ReDim call_valuesR(n + 1)

    rl = Exp(r * t / n)Rinv = 1 / ru = Exp(vol * Sqr(t / n))d = 1 / udd = d * dpUp = (rl - d) / (u - d)pDown = 1 - pUpprices(1) = S * u ^ ncall_valuesR(1) = WorksheetFunction.Max(0, prices(1) - K)

    q(1) = pUp / rlq(2) = pDown / rl

    For i = 1 To nprices(1 + i) = prices(i) * ddcall_valuesR(1 + i) = WorksheetFunction.Max(0, prices(1 + i) - K)

    Next i

    Dim CurrStep As IntegerFor j = 1 To n

    CurrStep = n + 1 - jFor i = 1 To CurrStep

    call_valuesR(i) = (q(1) * call_valuesR(i) + _q(2) * call_valuesR(1 + i))

    Next iNext j

    Binomiale_CRR = call_valuesR(1)If cp = -1 ThenBinomiale_CRR = Binomiale_CRR - S + K * Exp(-r * t)End IfEnd Function

  • 8.4 Modello binomiale (CRR) con convoluzione circo-lare

    Function Binomiale_CircConv(ByVal cp As Integer, ByVal S As Double, _ByVal K As Double, ByVal t As Double, ByVal r As Double, _ByVal vol As Double, ByVal n As Integer) As Double

    ’ Calcola il prezzo call/put col modello binomiale (CRR)’ usando la convoluzione circolare

    Dim rl As Double, Rinv As Double, u As Double, d As Double, _dd As Double, pUp As Double, pDown As Double

    Dim prices() As DoubleDim call_values() As Double, qR() As DoubleReDim prices(n + 1)ReDim call_valuesR(n + 1)ReDim qR(n + 1)

    rl = Exp(r * t / n)Rinv = 1 / ru = Exp(vol * Sqr(t / n))d = 1 / udd = d * dpUp = (rl - d) / (u - d)pDown = 1 - pUpprices(1) = S * u ^ ncall_valuesR(1) = WorksheetFunction.Max(0, prices(1) - K)For i = 1 To n

    prices(1 + i) = prices(i) * ddcall_valuesR(1 + i) = WorksheetFunction.Max(0, prices(1 + i) - K)qR(i + 1) = 0

    Next iqR(1) = pUp * Exp(-r * t / n)qR(n + 1) = pDown * Exp(-r * t / n)

    For i = 1 To nCircular_Covolution a:=call_valuesR, b:=qR, c:=call_valuesR, n:=n + 1Next i

    Binomiale_CircConv = call_valuesR(1)If cp = -1 ThenBinomiale_CircConv = Binomiale_CircConv - S + K * Exp(-r * t)End IfEnd Function

  • 8.5 Modello binomiale (CRR) con discrete Fouriertransform

    Function Binomiale_Fourier(ByVal cp As Integer, ByVal S As Double, _ByVal K As Double, ByVal t As Double, ByVal r As Double, _ByVal vol As Double, ByVal n As Integer) As Double

    ’ Calcola il prezzo call/put col modello binomiale (CRR) usando’ la discrete Fourier transform

    Dim rl As Double, Rinv As Double, u As Double, d As Double, _dd As Double, pUp As Double, pDown As Double

    Dim prices() As DoubleDim call_valuesR() As Double, call_valuesI() As Double, qR(), qI()ReDim prices(n + 1)ReDim call_valuesR(n + 1)ReDim call_valuesI(n + 1)ReDim qR(n + 1)ReDim qI(n + 1)

    rl = Exp(r * t / n)Rinv = 1 / ru = Exp(vol * Sqr(t / n))d = 1 / udd = d * dpUp = (rl - d) / (u - d)pDown = 1 - pUpprices(1) = S * u ^ ncall_valuesR(1) = WorksheetFunction.Max(0, prices(1) - K)call_valuesI(1) = 0

    For i = 1 To nprices(1 + i) = prices(i) * ddcall_valuesR(1 + i) = WorksheetFunction.Max(0, prices(1 + i) - K)qR(i + 1) = 0call_valuesI(i + 1) = 0qI(i + 1) = 0

    Next iqR(1) = pUp * Exp(-r * t / n)qR(2) = pDown * Exp(-r * t / n)qI(1) = 0

    DFT direction:=1, ar:=call_valuesR, ai:=call_valuesI, _br:=call_valuesR, bi:=call_valuesI, n:=n + 1

    DFT direction:=-1, ar:=qR, ai:=qI, br:=qR, bi:=qI, n:=n + 1

    Dim z As complex

  • For i = 1 To n + 1z = CCmp(0, 0)z = CMol(CCmp(call_valuesR(i), call_valuesI(i)), CPtN(CMol( _

    CCmp(Sqr(n + 1), 0), CCmp(qR(i), qI(i))), n))call_valuesR(i) = CRea(z)call_valuesI(i) = CImm(z)Next i

    DFT direction:=-1, ar:=call_valuesR, ai:=call_valuesI, _br:=call_valuesR, bi:=call_valuesI, n:=n + 1

    Binomiale_Fourier = call_valuesR(1)If cp = -1 ThenBinomiale_Fourier = Binomiale_Fourier - S + K * Exp(-r * t)End IfEnd Function

  • 8.6 Modello Black-Scholes: funzione caratteristica

    Function CF_BS(u As complex, ByVal s As Double, ByVal r As Double, _ByVal T As Double, ByVal vol As Double) As complex

    ’ Calcola la funzione caratteristica del logaritmo del sottostanteDim m As Doublem = r - 0.5 * vol ^ 2CF_BS = CExp(CDif(CMol(CCmp(0, 1), CMol(u, CCmp(m * T + Log(s), 0))), _

    CMol(CPtN(u, 2), CCmp(0.5 * (T * vol ^ 2), 0))))End Function

    8.7 Modello Black-Scholes: funzione ψT

    Function PSI_BS(ByVal u As Double, ByVal s As Double, ByVal r As Double, _ByVal T As Double, ByVal vol As Double, ByVal a As Double) As complex

    ’ Calcola la trasformata di Fourier della call modificataDim y1 As complexDim y2 As complexy1 = CF_BS(CDif(CCmp(u,0), CMol(CCmp(0,1), CCmp(a + 1, 0))), s, r, T, vol)y2 = CSom(CDif(CCmp(a ^ 2 + a, 0), CPtN(CCmp(u, 0), 2)), _

    CMol(CCmp(u, 0), CMol(CCmp(0, 1), CCmp(2 * a + 1, 0))))PSI_BS = CMol(CCmp(Exp(-r * T), 0), CDiv(y1, y2))End Function

    8.8 Modello Black-Scholes: pricing con formula classi-ca (1973)

    Function BS_closed_forme(ByVal cp As Double, ByVal s As Double, _ByVal k As Double, ByVal r As Double, ByVal T As Double, _ByVal vol As Double) As Double

    ’ Calcola il prezzo per call/put europee con la formula chiusa (BS 1973)Dim d1 As Double, d2 As Double, logmoneyness As Doublelogmoneyness = Log(s) - Log(k)d1 = (logmoneyness + (r + 0.5 * vol * vol) * T) / (vol * Sqr(T))d2 = d1 - vol * Sqr(T)BS_closed_forme = cp * s * WorksheetFunction.NormSDist(cp * d1) _

    - Exp(-r * T) * k * cp * WorksheetFunction.NormSDist(cp * d2)End Function

  • 8.9 Modello Black-Scholes: pricing con Fourier tran-sform

    Function FT_BS(ByVal cp As Double, ByVal s As Double, _ByVal k As Double, ByVal r As Double, ByVal T As Double, _ByVal vol As Double, ByVal alpha As Double) As Double

    ’ Calcola il prezzo per call/put europee con la trasformata inversa’ di Fourier (MCC 1999)Dim lnks As Doublelnks = Log(k)Dim N As IntegerN = 256Dim a As Integera = 128’Dim alpha As Double’alpha = 1.5Dim eta As Doubleeta = a / NReDim nu(N) As DoubleReDim tr(N) As DoubleFor i = 1 To Nnu(i) = (i - 1) * etatr(i) = 1Next itr(1) = 0.5tr(N) = 0.5ReDim H(N) As complexDim F As complexF = CCmp(0, 0)For i = 1 To NH(i) = CMol(CMol(PSI_BS(nu(i), s, r, T, vol, alpha), _

    CCmp(eta * tr(i), 0)), CExp(CMol(CCmp(0, 1), _CCmp(-nu(i) * lnks, 0))))

    F = CSom(F, H(i))Next iFT_BS = CRea(CMol(F, CCmp(Exp(-alpha * lnks) / 3.14159265358979, 0)))If cp = -1 ThenFT_BS = FT_BS - s + k * Exp(-r * T)End IfEnd Function

  • 9 Applicazione in MATLAB

    Si riportano due file di esempio sull’uso delle dFt e FFt nel pricing delle opzioni. Nelprimo caso utilizzando il modello binomiale (CRR) e nel secondo caso utilizzando diversimodelli continui: Black-Scholes (diffusivo), Merton 1976 (jump-diffusion), VG, NIG eCGMY (pure jump Lévy processes).

    9.1 Modelli discreti: Binomiale (CRR)

    function discrete_fourier_binomial(t,r,sigma,n,S,K)%% DISCRETE FOURIER BINOMIAL%if nargin < 1;t=1;r=.05;sigma=.2;n=50;S=100;K=100;endfprintf(’Maturity: \t\t%4.4f\n’,t);fprintf(’Interest rate: \t%4.4f\n’,r);fprintf(’Volatility: \t%4.4f\n’,sigma);fprintf(’Tree steps: \t%4.4f\n’,n);fprintf(’Moneyness: \t\t%4.4f\n\n’,K/S);

    R = exp(r*t/n);Rinv = 1/R;u = exp(sigma*sqrt(t/n));d = 1/u;dd = d*d;pUp = (R-d)/(u-d);pDown = 1-pUp;

  • prices = S*u^n;call_values = max(0, prices-K);

    for i=1:nprices(1+i) = prices(i)*dd;call_values(1+i) = max(0, prices(1+i)-K);

    end

    q=[pUp*exp(-r*t/n) pDown*exp(-r*t/n) zeros(1,n-1)];

    Rq=[q(1) q(end:-1:2)];Cn=call_values;for i=1:n

    Cn=conv_(Cn,Rq);end

    fprintf(’Modello Binomiale (CRR): call vanilla\n’);fprintf(’Metodo della convoluzione circolare: \t%4.4f\n’,Cn(1));

    C0fft=real(ifft(fft(call_values).*(((n+1)*ifft(q)).^n)));fprintf(’Metodo Discrete Fourier Transform: \t\t%4.4f\n’,C0fft(1));

    for j=1:nCurrStep = n+1-j;for i=1:CurrStep;

    call_values(i) = (q(1)*call_values(i)+q(2)*call_values(1+i));end

    end

    fprintf(’Metodo classico: \t\t\t\t\t\t%4.4f\n’,call_values(1));

  • 9.2 Modelli Continui: BS, MJD, VG, NIG e CGMY

    function [price]= ft_price(model,callput,param)%% Computes call/put vanilla price% inputs: BS->model=1; MJD->model=2; VG->model=3;% NIG->model=4; CGMY->model=5;% call -> callput=1; put -> callput: else% param=[pricing model parameters,(S),(K),r,T]% default values:% Matsuda 2005 table pag. 41 S&P500 daily average% throuh 248 days from March 2004 to March 2005par=[% BS: (mu) sigma - - - S K r T

    0 0.14437 0 0 0 100 100 0.03 0.5;% MJD: (alpha) sigma lambda mu delta S K r T0 0.095 0.777 -0.149 0.094 100 100 0.03 0.5;% VG: sigma theta nu - - S K r T0.135 -0.167 0.396 0 0 100 100 0.03 0.5;% NIG: alpha beta mu delta - S K r T20.741 -11.731 0 0.248 0 100 100 0.03 0.5;% CGMY: C G M Y - S K r T0.067 2.352 262.805 1.199 0 100 100 0.03 0.5 ];

    if nargin

  • function y = CF(model,u, param)% Computes the characteristic function% inputs: BS->model=1; MJD->model=2; VG->model=3;% NIG->model=4; CGMY->model=5;% u ->log stock price% param=[pricing model parameters,(S),(K),r,T]% BS Matsuda 2004 formula 8.11if model==1;

    mu = param(1); sigma = param(2); S = param(end-3);r = param(end-1); t = param(end);m = r -0.5*sigma^2;y = exp(i*(m*t+log(S)).*u - 0.5*(t*sigma^2).*u.^2);

    % MJD Matsuda 2004 formula 10.3elseif model==2;

    mu = param(1); sigma = param(2); lambda = param(3); muj = param(4);sigmaj = param(5);r = param(end-1);t = param(end);m = r -0.5*sigma^2-lambda*(exp(muj+0.5*sigmaj^2)-1);y = exp(lambda*t*(exp(i*muj.*u-0.5*sigmaj^2.*u.^2)-1)...

    +i*(m*t+log(S)).*u-0.5*t*sigma^2.*u.^2);% VG Matsuda 2004 formula 12.4elseif model==3;

    sigma = param(1); theta = param(2); nu = param(3);r = param(end-1); t = param(end);m = r + log(1-theta*nu-0.5*sigma^2*nu)/nu;y = exp(i*(m*t+log(S)).*u).*((1-i*nu*theta*u+0.5*nu*sigma^2*u.^2)...

    .^(-t/nu));% NIG Matsuda 2005 formula 23elseif model==4;

    alpha = param(1); beta = param(2); mu = param(3); delta = param(4);r = param(end-1); t = param(end);m = r-(mu+delta*sqrt(alpha^2-beta^2)-delta*sqrt(alpha^2-(beta+1)^2));y = exp(i*(m*t+log(S)).*u+t*delta.*(sqrt((alpha^2)-beta^2)-...

    sqrt((alpha^2)-(beta+i.*u).^2)));% CGMY Matsuda 2005 modified formula 34elseif model==5;

    C = param(1); G = param(2); M = param(3); Y = param(4);r = param(end-1); t = param(end);m = r-(C*(G^Y)*gamma(-Y)*(-1-(Y/G)+(1+1/G)^Y)+C*(M^Y)*gamma(-Y)...

    *(-1+(Y/M)+(1-1/M)^Y));y = exp(i*(m*t+log(S)).*u+t*(C*(G^Y)*gamma(-Y).*(-1-((i.*u.*Y)/G)...

    +(1+(i.*u)./G).^Y)+C*(M^Y).*gamma(-Y).*(-1+((i.*u.*Y)./M)...+(1-(i.*u)./M).^Y) ));

    end

  • function y = Psi_CF(model,u, param, a)% Computes the Psi function (modified call version)% Carr Madan ’99 formula 6% inputs: BS->model=1; MJD->model=2; VG->model=3;% NIG->model=4; CGMY->model=5;% u ->log stock price% param=[pricing model parameters,(S),(K),r,T]% a ->alpha, dampening factor 1.5 (Carr Madan ’99 pag.13)t = param(end); r = param(end-1);y1 = CF(model,u - i*(a+1), param);y2 = a^2 + a - u.^2 + i*(2*a+1)*u;y = exp(-r*t) * y1 ./ y2;

  • Riferimenti bibliografici

    [1] Black, F. e Scholes, M. (1973) The pricing of options and corporate liabilities. Journalof Political Economy, 81, 637-654.

    [2] Carr, P. e Madan, D. B. (1999) Option valuation using the fast Fourier Transform.Journal of Computational Finance 2, 6173.

    [3] Cerny, A. (2004) Introduction to fast Fourier Transform in finance. Tanaka BusinessSchool, Working Paper.

    [4] Madan, D. B., Carr P. e Chang, E. C. (1998) The Variance Gamma Process andOption Pricing. European Finance Review.

    [5] Matsuda, K. (2004) Introduction to Option Pricing with Fourier Transform: OptionPricing with Exponential Lévy Models. Graduate School and University Center of theCity University of New York, Working Paper.

    [6] Matsuda, K. (2005) Calibration of Lévy Option Pricing Models: Application to S&P500 Futures Option. Graduate School and University Center of the City Universityof New York, Working Paper.

    [7] Merton, R. C. (1976) Option Pricing When Underlying Stock Returns AreDiscontinuous. Journal of Financial Economics, 3, 125-144.

    [8] Schoutens, W. (2003) Lévy Processes in Finance. Wiley Series in Probability andStatistics.

    [9] Shreve, E. S. (2004) Stochastic Calculus for Finance II, Continuous-Time Models.Springer Finance.