Guardar só o que existe
Precificar uma opção numa grade troca uma equação diferencial por uma cadeia de sistemas lineares. Cada nó liga-se só aos seus dois vizinhos, então a matriz do sistema é tridiagonal: três diagonais de números e zeros em todo o resto. Um array denso n×n guarda n² números, quase todos zero; um formato esparso guarda só os 3n-2 que importam. scipy.sparse.diags([lower, diag, upper], [-1, 0, 1], format='csc') constrói uma matriz assim a partir das diagonais (a subdiagonal tem n-1 elementos e a superdiagonal também, por isso a diagonal inferior é cortada para começar na segunda linha e a superior para terminar antes da última coluna). O formato CSC é o que os solucionadores esparsos querem.
O esquema implícito recua o valor da opção no tempo resolvendo A V^new=V^old+contorno a cada passo. A matriz A não muda de um passo para o outro, então fatora-se uma vez com scipy.sparse.linalg.splu(A) e cada passo é só lu.solve(rhs), operação baratíssima para uma matriz tridiagonal. A condição de contorno em S=0 (um put vale ali Ke^(-rτ)) entra na primeira equação, por isso o primeiro lado direito é corrigido com lower[0] * K * exp(-r * m * dt). Com taxa de 1 ano de 4,47% e σ=25%, o put no dinheiro vale 7,6987 em forma fechada; o esquema dá 7,6958 numa grade 200×200 e 7,6965 numa 400×400, a cerca de 0,003. Uma grade de 2000 nós guarda 5.995 números em forma esparsa em vez de quase 4 milhões.
- Guarde as diagonais, não os zeros:
sparse.diagsguarda 3n - 2 números em vez de n ao quadrado. - Fatore uma vez, resolva muitas:
splupaga o custo adiantado, depois cada passo de tempo é umsolvebarato. - Os contornos vivem no lado direito: o valor conhecido na borda da grade passa para o outro lado da equação.
Lab: o que é avaliado
- As três diagonais20 pts
- A matriz esparsa15 pts
- Precificar com uma fatoração30 pts
- Esparso contra denso10 pts
- O erro de precificação5 pts
- O estudo com uma taxa real20 pts