σμ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 1 · Ajustar e encontrar›Tópico 1.6·~50 minIntermediário

Mínimos quadrados e ajuste de curvas

Posição no roteiroMódulo 1 de 3 · Tópico 6 de 6
1.6 Mínimos quadrados e ajuste de curvas
—Nota do lab— / 100XP total—Sequência—

Ajustar uma curva reduzindo os erros

Muitos modelos são curvas com poucos parâmetros, e ajustar significa escolher os parâmetros que deixam a curva perto dos dados. scipy.optimize.least_squares(fun, x0) faz isso. Você escreve fun(p), que devolve o vetor de resíduos, um por dado, em que o resíduo é o valor do modelo menos o valor observado. A função então minimiza o custo 12∑ri2\tfrac12\sum r_i^221​∑ri2​. Ela parte do seu palpite x0 e avança usando o jacobiano JJJ, a tabela de como cada resíduo muda quando cada parâmetro muda. Um passo de Gauss–Newton resolve J⊤J δ=−J⊤rJ^{\top}J\,\delta=-J^{\top}rJ⊤Jδ=−J⊤r e depois move os parâmetros em δ\deltaδ. Para um modelo linear nos parâmetros, um único passo cai na resposta. bounds=(baixo, alto) mantém os parâmetros numa faixa razoável. curve_fit é um invólucro mais amigável que recebe direto o modelo f(x,paraˆmetros)f(x,\text{parâmetros})f(x,paraˆmetros).

Erros ao quadrado deixam um ponto louco dominar: um resíduo de 101010 conta 100100100. Uma perda robusta cresce mais devagar para resíduos grandes. Com loss='soft_l1' e f_scale=1 a penalidade é ρ(z)=2(1+z−1)\rho(z)=2(\sqrt{1+z}-1)ρ(z)=2(1+z​−1), em que zzz é o resíduo ao quadrado. O ajuste de curvas de juros é o uso clássico. A curva de Nelson–Siegel é y(τ)=β0+β11−e−τ/λτ/λ+β2(1−e−τ/λτ/λ−e−τ/λ)y(\tau)=\beta_0+\beta_1\frac{1-e^{-\tau/\lambda}}{\tau/\lambda}+\beta_2\Big(\frac{1-e^{-\tau/\lambda}}{\tau/\lambda}-e^{-\tau/\lambda}\Big)y(τ)=β0​+β1​τ/λ1−e−τ/λ​+β2​(τ/λ1−e−τ/λ​−e−τ/λ). Ela tem um nível de longo prazo β0\beta_0β0​, uma inclinação β1\beta_1β1​, uma corcova β2\beta_2β2​ e um comprimento de decaimento λ\lambdaλ em anos, e quatro números descrevem a curva inteira. Após o ajuste, o nível de ruído é estimado por s=SSE/(n−p)s=\sqrt{\mathrm{SSE}/(n-p)}s=SSE/(n−p)​, com nnn pontos e ppp parâmetros.

δ=−(J⊤J)−1J⊤r,cost=12∑ri2,ρ(z)=2(1+z−1),s=SSEn−p\delta=-(J^{\top}J)^{-1}J^{\top}r,\qquad \text{cost}=\tfrac12\sum r_i^{2},\qquad \rho(z)=2(\sqrt{1+z}-1),\qquad s=\sqrt{\frac{\mathrm{SSE}}{n-p}}δ=−(J⊤J)−1J⊤r,cost=21​∑ri2​,ρ(z)=2(1+z​−1),s=n−pSSE​​(1)
Uma reta pela origemAjuste y=a xy=a\,xy=ax aos pontos (1;2,1)(1;2{,}1)(1;2,1), (2;3,9)(2;3{,}9)(2;3,9) e (3;6,2)(3;6{,}2)(3;6,2). Comece em a=1a=1a=1. Os resíduos são r=ax−y=(−1,1;−1,9;−3,2)r=ax-y=(-1{,}1;-1{,}9;-3{,}2)r=ax−y=(−1,1;−1,9;−3,2) e o jacobiano é J=x=(1;2;3)J=x=(1;2;3)J=x=(1;2;3). Então J⊤r=−14,5J^{\top}r=-14{,}5J⊤r=−14,5 e J⊤J=14J^{\top}J=14J⊤J=14, logo δ=14,5/14=1,036\delta=14{,}5/14=1{,}036δ=14,5/14=1,036 e o novo valor é a=2,036a=2{,}036a=2,036. Já é a resposta, porque o modelo é linear em aaa. Os resíduos na resposta são 0,0640{,}0640,064, −0,171-0{,}171−0,171 e 0,0930{,}0930,093, então o custo é 0,02110{,}02110,0211. Um resíduo de 101010 custa 100100100 com quadrados, mas só ρ=18,10\rho=18{,}10ρ=18,10 com soft_l1. Em dados reais, uma curva de Nelson–Siegel ajustada por least_squares aos dez rendimentos do Tesouro de 9 de outubro de 2026 (3 meses a 30 anos) tem nível de 5,75%5{,}75\%5,75%, inclinação de −1,52-1{,}52−1,52 (a curva sobe com o prazo) e λ=2,7\lambda=2{,}7λ=2,7 anos, e erra os rendimentos cotados em apenas 7,37{,}37,3 pontos-base em média e 131313 no pior caso. Ajustar 444 parâmetros a 101010 pontos com SSE=0,54\mathrm{SSE}=0{,}54SSE=0,54 deixa n−p=6n-p=6n−p=6 graus de liberdade e s=0,54/6=0,30s=\sqrt{0{,}54/6}=0{,}30s=0,54/6​=0,30.
  • Resíduos na entrada, parâmetros na saída: fun(p) devolve modelo menos dados e least_squares reduz a soma dos quadrados.
  • Perda robusta para atípicos: soft_l1 impede que um ponto louco arraste a curva inteira.
  • Quatro números para uma curva: Nelson–Siegel resume uma curva de juros com um nível, uma inclinação, uma corcova e um comprimento de decaimento.

Lab: o que é avaliado

  • Uma inclinação pela origem10 pts
  • Um passo de Gauss–Newton15 pts
  • Uma penalidade robusta15 pts
  • O nível de ruído após um ajuste10 pts
  • Os argumentos de least_squares10 pts
  • Um fluxo de ajuste de curva10 pts
  • Por que uma perda robusta30 pts
0/ 7 respondidas
Tarefas
1Resposta numérica10 ptsSem resposta

Para y=a xy=a\,xy=ax o melhor aaa é ∑xiyi/∑xi2\sum x_iy_i/\sum x_i^{2}∑xi​yi​/∑xi2​. Com x=(1;2;3)x=(1;2;3)x=(1;2;3) e y=(2,1;3,9;6,2)y=(2{,}1;3{,}9;6{,}2)y=(2,1;3,9;6,2), quanto vale aaa? Dê três casas decimais.

a=a =a=aceito: ± 0.003
2Resposta numérica15 ptsSem resposta

Comece em a=1a=1a=1. Os resíduos são r=(−1,1;−1,9;−3,2)r=(-1{,}1;-1{,}9;-3{,}2)r=(−1,1;−1,9;−3,2) e J=(1;2;3)J=(1;2;3)J=(1;2;3), com J⊤r=−14,5J^{\top}r=-14{,}5J⊤r=−14,5 e J⊤J=14J^{\top}J=14J⊤J=14. Quanto vale o passo δ=−J⊤r/J⊤J\delta=-J^{\top}r/J^{\top}Jδ=−J⊤r/J⊤J? Dê três casas decimais.

d=d =d=aceito: ± 0.003
3Resposta numérica15 ptsSem resposta

Um resíduo de 101010 tem quadrado z=100z=100z=100. Com soft_l1 e f_scale=1, a penalidade é ρ(z)=2(1+z−1)\rho(z)=2(\sqrt{1+z}-1)ρ(z)=2(1+z​−1). Quanto vale ρ\rhoρ? Dê duas casas decimais.

rho=rho =rho=aceito: ± 0.05
4Resposta numérica10 ptsSem resposta

Uma curva de p=4p=4p=4 parâmetros é ajustada a n=10n=10n=10 pontos e a soma dos quadrados dos resíduos é SSE=0,54\mathrm{SSE}=0{,}54SSE=0,54. Quanto vale s=SSE/(n−p)s=\sqrt{\mathrm{SSE}/(n-p)}s=SSE/(n−p)​? Dê duas casas decimais.

s=s =s=aceito: ± 0.005
5Associar10 ptsSem resposta

Associe cada argumento ao que ele faz.

Escolha o par de cada item da esquerda.

fun
x0
bounds
loss
6Ordenar os passos10 ptsSem resposta

Coloque em ordem os passos para ajustar uma curva de juros.

Arraste para reordenar, ou foque um item, Espaço para levantá-lo, setas para movê-lo e Espaço para soltá-lo.

  1. 1Olhar os resíduos e o indicador de sucesso
  2. 2Chamar least_squares com início e limites
  3. 3Escolher o modelo, aqui Nelson–Siegel
  4. 4Escrever uma função que devolva modelo menos dados
7Explicar com palavras30 ptsSem resposta

Uma cotação ruim fica longe dos outros nove rendimentos. Em uma ou duas frases, explique por que um ajuste de mínimos quadrados simples é puxado para ela e por que soft_l1 ajuda.

Modo matemáticaEntrada por teclado ou LaTeXTarefa 1 de 7 · Ctrl ⏎ para verificar

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