Almacenar solo lo que hay
Valorar una opción en una malla sustituye una ecuación diferencial por una cadena de sistemas lineales. Cada nodo está unido solo a sus dos vecinos, así que la matriz del sistema es tridiagonal: tres diagonales de números y ceros en todo lo demás. Un arreglo denso n×n guarda n² números, casi todos cero; un formato disperso guarda solo los 3n-2 que importan. scipy.sparse.diags([lower, diag, upper], [-1, 0, 1], format='csc') construye una matriz así a partir de sus diagonales (la subdiagonal tiene n-1 elementos y la superdiagonal también, por eso la diagonal inferior se corta para empezar en la segunda fila y la superior para terminar antes de la última columna). El formato CSC es el que quieren los solucionadores dispersos.
El esquema implícito retrocede el valor de la opción en el tiempo resolviendo A V^new=V^old+borde en cada paso. La matriz A no cambia de un paso a otro, así que se factoriza una vez con scipy.sparse.linalg.splu(A) y cada paso es solo lu.solve(rhs), una operación muy barata para una matriz tridiagonal. La condición de borde en S=0 (un put vale allí Ke^(-rτ)) entra en la primera ecuación, por lo que el primer lado derecho se corrige con lower[0] * K * exp(-r * m * dt). Con una tasa a 1 año del 4,47% y σ=25%, el put en el dinero vale 7,6987 en forma cerrada; el esquema da 7,6958 en una malla de 200×200 y 7,6965 en una de 400×400, a unos 0,003. Una malla de 2000 nodos guarda 5.995 números en forma dispersa en vez de casi 4 millones.
- Guarde las diagonales, no los ceros:
sparse.diagsguarda 3n - 2 números en vez de n al cuadrado. - Factorice una vez, resuelva muchas:
splupaga el costo al inicio y luego cada paso de tiempo es unsolvebarato. - Los bordes viven en el lado derecho: el valor conocido en el borde de la malla pasa al otro lado de la ecuación.
Lab: qué se califica
- Las tres diagonales20 pts
- La matriz dispersa15 pts
- Valorar con una factorización30 pts
- Disperso contra denso10 pts
- El error de valoración5 pts
- El estudio con una tasa real20 pts