σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademyRoadmapsRoteiros
Ctrl K
AO
+1,2 mil alunos
EntrarParticipar ↗
RoadmapsRoteiros
AO
+1,2 mil alunos
Entrar
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademyRoadmapsRoteiros
Ctrl K
AO
+1,2 mil alunos
EntrarParticipar ↗
RoadmapsRoteiros
AO
+1,2 mil alunos
Entrar
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Roteiro de SciPy›Módulo 3 · Matrizes, sinais e estrutura›Tópico 3.4·~55 minIntermediário

Uma resolução tridiagonal esparsa para o preço de uma opção

Posição no roteiroMódulo 3 de 3 · Tópico 4 de 10
3.4 Uma resolução tridiagonal esparsa para o preço de uma opção
—Nota do lab— / 100XP total—Sequência—

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.diags guarda 3n - 2 números em vez de n ao quadrado.
  • Fatore uma vez, resolva muitas: splu paga o custo adiantado, depois cada passo de tempo é um solve barato.
  • 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
Explorador · lab-sp-20
▾ lab-sp-20
▾ data
…
bash · no navegador
learner@quantcraft:~/lab-sp-20$
Python ainda não carregadoPythonLn 1, Col 1Spaces: 4UTF-8

Redefinir este tópico?

Tudo em lab-sp-20 volta aos arquivos iniciais e o terminal é limpo. Sua solução atual será perdida — isso não pode ser desfeito.

Será redefinido
  • main.py → código inicial
  • Histórico do terminal e saída dos testes
  • Alterações não enviadas
Será mantido
  • Melhor nota do lab
  • Seu XP e sua sequência
  • Progresso da aula e anotações

Entre para executar o seu código.

Todas as aulas são gratuitas para ler. Crie uma conta ou entre para executar código, rodar os testes e enviar este lab.

  • IDE no navegador com terminal bash — nada para instalar
  • Correção instantânea, XP e o seu lugar no roteiro
Criar uma contaEntrar
OU
Continuar com o GitHub