σμ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ᵀμ = μ*∫Σ∂∞λ
σμ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 AcademyRoteiros
Ctrl K
AO
+1,2 mil alunos
EntrarParticipar ↗
Roteiros
AO
+1,2 mil alunos
Entrar
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Roteiro de Python›Módulo 4 · Precificação de renda fixa e opções›Tópico 4.7·~40 minIntermediário

Paridade put-call

Posição no roteiroMódulo 4 de 11 · Tópico 7 de 16
4.7 Paridade put-call
—Nota do lab— / 100XP total—Sequência—

Dois caminhos para o mesmo lugar

Monte duas carteiras. A: compre uma call e coloque no banco (ou num título sem risco) o valor presente do strike K * exp(-rT). B: compre uma put e compre a ação. No vencimento, se a ação termina acima de K, A é o S - K da call mais o K do banco, ou seja S; B é a ação S e uma put sem valor, ou seja S. Se a ação termina abaixo de K, A é só o K do banco, pois a call vence sem valor, e B é o K - S da put mais a ação S, ou seja K. Nos dois casos as duas carteiras valem o mesmo no vencimento, então devem custar o mesmo hoje.

C + K * exp(-r*T) = P + S so P = C - S + K * exp(-r*T)
import math

spot, strike, rate, t = 100, 100, 0.05, 1
pv_strike = strike * math.exp(-rate * t)             # what must be put in the bank today to own K at expiry
print(round(pv_strike, 4))                            # 95.1229

call = 10.4506                                        # a call price we observe
put = call - spot + pv_strike                         # the parity relation
print(round(put, 4))                                  # 5.5735
print(round(put + spot - pv_strike, 4))               # 10.4506   and back to the call

Quando a paridade se quebra: arbitragem

Se o mercado cota preços que não satisfazem a relação, existe lucro sem risco. Defina a diferença (C - P) - (S - K e^(-rT)). Uma diferença positiva significa que a call está cara demais para a put: venda a call, compre a put, compre a ação e tome emprestado o valor presente do strike. A carteira não custa nada no início, não paga nada no vencimento faça a ação o que fizer, e embolsa a diferença hoje. Uma diferença negativa inverte cada perna. Mercados reais têm custos e spreads, então pequenas diferenças não são negociáveis: é isso que a tolerância representa.

def parity_gap(call, put, spot, strike, rate, t):
    return (call - put) - (spot - strike * math.exp(-rate * t))

print(round(parity_gap(11.0, put, 100, 100, 0.05, 1), 4))         # 0.5494   the call at 11.00 is too expensive: sell it
print(round(parity_gap(call, put, 100, 100, 0.05, 1), 4))         # 0.0      consistent prices: nothing to do

def arbitrage_action(call, put, spot, strike, rate, t, tolerance=0.01):
    gap = parity_gap(call, put, spot, strike, rate, t)
    if gap > tolerance:
        return "sell call, buy put, buy stock"
    if gap < -tolerance:
        return "buy call, sell put, sell stock"
    return "none"

print(arbitrage_action(11.0, put, 100, 100, 0.05, 1))             # sell call, buy put, buy stock
# The package of the arbitrage, at today's prices: sell the call at 11, buy the put, buy the stock, borrow the strike's present value
cash_today = 11.0 - put - 100 + 100 * math.exp(-0.05 * 1)
print(round(cash_today, 4))                # 0.5494   you are paid the gap now and owe nothing at expiry
# A call minus a put is a synthetic forward: it behaves like the stock bought with borrowed money
print(round(10.4506 - put, 4), round(100 - pv_strike, 4))        # 4.8771 4.8771
A paridade não depende de modeloA paridade put-call não precisa de nenhuma hipótese sobre como a ação se move nem sobre a volatilidade, apenas ausência de arbitragem e exercício europeu (sem exercício antecipado). Isso a torna uma verificação poderosa: um modelo de precificação que viola a paridade está errado. Opções americanas e dividendos mudam a relação, que passa a valer só como desigualdades, então subtraia o valor presente dos dividendos do preço à vista antes de usá-la.
  • C + K * exp(-rT) = P + S: uma call mais o título é igual a uma put mais a ação, logo P = C - S + K * exp(-rT).
  • Diferença (C - P) - (S - K e^(-rT)) positiva: venda a call, compre a put e a ação; negativa: o inverso.
  • A paridade não depende de modelo, use-a para verificar qualquer modelo de precificação; com dividendos ou exercício antecipado vira desigualdade.

A seguir: a fórmula de Black–Scholes, um preço em forma fechada para a call e a put.

Lab: o que é avaliado

  • Obter a put a partir da call com parity_put_price25 pts
  • Obter a call a partir da put com parity_call_price25 pts
  • Medir o quanto os preços se afastam da paridade com parity_gap25 pts
  • Nomear a operação sem risco com arbitrage_action25 pts
Explorador · lab-72-1
▾ lab-72-1
…
bash · no navegador
learner@quantcraft:~/lab-72-1$
Python ainda não carregadoPythonLn 1, Col 1Spaces: 4UTF-8

Redefinir este tópico?

Tudo em lab-72-1 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