Estoy tratando de calibrar el modelo de volatilidad estocástica local utilizando el método de diferencias finitas, y estoy siguiendo principalmente esta referencia: Tian (2015) .
Me encontré con un problema al calibrar la función de apalancamiento - la ecuación de fokker planck discritizada con el esquema ADI Douglas generará una densidad negativa, lo que lleva a un valor negativo en las integrales de la función de apalancamiento y esto romperá el cálculo de root cuadrada. Sin embargo, no parece haber mucha discusión en las referencias sobre este tema.
Así que mi pregunta es:
- ¿Se supone que el ADI preserva la positividad de la función de densidad? (Si es así, esto indica que mi implementación actual está sujeta a algún error).
- Si no es así, ¿qué debo hacer para evitarlo?
-----------------------------------------
Actualizaciones (0401):
He comprobado que aplicando la condición de contorno de flujo cero (descrita en Documento QuantLib ) ayuda mucho a estabilizar el proceso de calibración - no más integrales negativas en la función de root cuadrada. El recorrido de Monte Carlo de la opción a cinco años tiene un error de 0,5 (en comparación con el precio BS) con el strike ATM.
Sin embargo, sólo es estable cuando el paso de tiempo es pequeño (dt=1/300). Si intento utilizar una malla temporal no uniforme que tenga un paso de tiempo mayor para vencimientos más largos, la densidad perderá su estructura y la calibración fallará. Otra preocupación es que veo que la densidad se hace más pequeña a medida que la calibración avanza en el tiempo y actualmente estoy arreglando esto reescalando la densidad a uno en cada paso.
Así que mi pregunta actual es:
-
Implementé la condición de contorno de flujo cero sólo en el límite de v y apliqué una condición de contorno más simple sobre S - asumir un término de segundo orden decreciente en la EDP. Me pregunto si esta es la forma correcta de hacerlo. ¿Debería aplicar el flujo cero en la frontera de S también? si no, ¿qué debería usar?
-
¿Cómo debo tratar la pérdida de densidad en la calibración?
-
¿Cómo puedo mejorar la estabilidad de la calibración para un paso de tiempo grande?
¡Muchas gracias!
-----------------------------------------
Actualizaciones (0405):
El proceso de calibración aún no es estable. El truncamiento en cero sólo ayuda para un paso de tiempo pequeño. Creo que debe haber algo que ver con la forma en que implemento el esquema ADI. Aquí están los detalles sobre cómo trato con Fokker Planck en ADI.
Parto de la ecuación de Fokker Planck como sigue: \begin {align*} \partial_ {t}f = & \frac {1}{2}v \partial_ {x}^2L^2f \\ &+ (-r+q) \partial_ {x}f + \frac {v}{2} \partial_ {x}L^2f \\ &+ \frac { \sigma ^2}{2} \frac {1}{v} \partial_ {z}^2f \\ &+ ((- \kappa\theta - \frac { \sigma ^2}{2}) \frac {1}{v} + \kappa ) \partial_ {z}f + \kappa\theta\frac {1}{v}f \\ &+ \rho\sigma\partial_ {x} \partial_ {z}Lf \end {align*} donde $x=log(S/S_0)$ y $z=log(v/v0)$ .
Entonces reescribo esto en forma de matriz: $$\partial_{t}f = F_0+F_1+F_2 $$ $$F_0 = \sigma*\rho*dx@f@dz$$
\begin {align*} F_1=f @ &[(- \kappa * \theta -0.5* \sigma ^2)*dz@Diag(1/v \_vec ) \\ &+ \kappa *dz \\ &+ 0.5* \sigma ^2*dz2@Diag(1/v \_vec ) \\ &+ \kappa * \theta *Diag(1/v \_vec )] \end {align*}
para $ j = 1,2,...,Nz:$ \begin {align*} F_2[:,j]=&[-r*dx \\ &+ 0.5*v \_vec [j]*dx@Diag(L^2) \\ &+ 0.5*v \_vec [j]*dx2@Diag(L^2)]@f[:.j] \end {align*}
donde:
- $f$ es un $m\times n$ matriz. $L$ es un vector de longitud $m$ . $v\_vec$ es un vector de longitud $n$ .
- $dx,dx2,dz,dz2$ son todos operadores diferenciales (matriz tri-diagonal).
- $Diag(A)$ representa una matriz cuadrada con $A$ siendo diagonal.
- $'*'$ representa la multiplicación normal y $'@'$ representa la multiplicación de matrices.
Entonces esta forma puede encajar directamente en la estructura ADI descrita en Tian(2015) .
¿Alguien ve algún problema en estos pasos de ADI? Muchas gracias.