Você está na página 1de 185

Machine Translated by Google

www.free-ebooks-download.org
Machine Translated by Google

Finanças Computacionais Usando C e C#

www.free-ebooks-download.org
Machine Translated by Google

Série de Finanças Quantitativas

Metas e Objetivos • Livros


baseados no trabalho de profissionais e acadêmicos do mercado financeiro
• Apresentar pesquisas de ponta para o mercado profissional/praticante •
Combinar rigor intelectual e aplicação prática • Cobrir a interação entre
teoria matemática e prática financeira • Melhorar o desempenho do portfólio,
gerenciamento de risco e desempenho da carteira de negociação • Abrangendo
técnicas quantitativas
Corretores/

Traders de Mercado ; Atuários; Consultores; Gestores de Ativos; Gestores de fundos; reguladores; Bancos
Centrais; Funcionários do Tesouro; Análise técnica; e Acadêmicos para Mestrado em Finanças e MBA
mercado.

Títulos de séries
Finanças Computacionais Usando C e C#
A análise da validação do modelo de risco
Previsão de retornos esperados nos mercados financeiros
Governança Corporativa e Impacto Regulatório em Fusões e Aquisições
Actividade de Fusões e Aquisições Internacionais desde 1990
Previsão de Volatilidade nos Mercados Financeiros, Terceira Edição
Capital de risco na Europa
Fundos de Hedge Funds
Ofertas públicas iniciais
Modelos de Fatores Lineares em Finanças
Finanças Computacionais
Avanços na Construção e Implementação de Portfólios
Regras avançadas de negociação, segunda edição
Opções reais de P&D
Medição de Desempenho em Finanças
Economia para Mercados Financeiros
Gerenciando o risco negativo nos mercados financeiros
Instrumentos Derivativos: Teoria, Avaliação, Análise
Distribuições de retorno em finanças

Editor da Série: Dr. Stephen Satchell O Dr. Satchell é

Leitor em Econometria Financeira no Trinity College, Cambridge; Professor visitante no Birkbeck College, City
University Business School e University of Technology, Sydney. Ele também trabalha como consultor para
muitas empresas e edita a revista Derivatives: use, trading and Regulations e o Journal of Asset Management.
Machine Translated by Google

Finanças Computacionais
Usando C e C#

George Levy

AMSTERDÃ • BOSTON • HEIDELBERG • LONDRES • NOVA YORK


OXFORD • PARIS • SAN DIEGO • SAN FRANCISCO • CINGAPURA
SYDNEY • TÓQUIO

Academic Press é uma marca da Elsevier


Machine Translated by Google

Imagem da capa cortesia da iStockphoto


Academic Press é uma marca da Elsevier
30 Corporate Drive, Suite 400, Burlington, MA 01803, EUA
525 B Street, Suite 1900, San Diego, Califórnia 92101-4495, EUA
84 Theobald's Road, Londres WC1X 8RR, Reino Unido

Copyright © 2008, Elsevier Ltd. Todos os direitos reservados.

Nenhuma parte desta publicação pode ser reproduzida ou transmitida de qualquer forma ou por qualquer meio,
eletrônico ou mecânico, incluindo fotocópia, gravação ou qualquer sistema de armazenamento e recuperação
de informações, sem permissão por escrito do editor.

As permissões podem ser solicitadas diretamente ao Departamento de Direitos de Ciência e


Tecnologia da Elsevier em Oxford, Reino Unido: telefone: (+44) 1865 843830, fax: (+44) 1865 853333,
e-mail: permissions@elsevier.com. Você também pode preencher sua solicitação on-line na página
inicial da Elsevier (http://elsevier.com), selecionando “Suporte e contato”, depois “Direitos autorais e
permissão” e, em seguida, “Obtenção de permissões”.

Dados de Catalogação na Publicação da Biblioteca do Congresso

Levy, Jorge.
Finanças Computacionais Usando C e C# / George Levy.
pág. cm. - (Finança quantitativa)
Inclui referências bibliográficas e índice.
ISBN-13: 978-0-7506-6919-1 (alk. paper) 1. Modelos matemáticos financeiros. I. Título.
HG106.L484 2008
332.0285'5133-dc22
2008000470

Dados de catalogação na publicação da Biblioteca


Britânica Um registro de catálogo para este livro está disponível na Biblioteca Britânica.

Para obter informações sobre todas as publicações da Academic


Press, visite nosso site em www.books.elsevier.com

Impresso nos Estados Unidos da América


08 09 10 11 9 8 7 6 5 4 3 2 1
Machine Translated by Google

Aos meus pais Paulo e Paula


Machine Translated by Google

páginaEsta intencionalmente em brancoesquerda


Machine Translated by Google

Conteúdo

Prefácio XI

1 Visão geral dos derivativos financeiros 1

2 Introdução aos processos estocásticos 2.1


Movimento browniano 2.2 Um modelo
browniano de movimentos de preços de ativos 2.3 Fórmula de 5

Ito (ou lema) 5


2.4 Teorema de Girsanov 2.5 9

Lema de Ito para movimentos brownianos geométricos multiativos 2.6 Regras 10

do produto e quociente Ito em duas dimensões 2.7 Produto Ito em n 12

dimensões 2.8 A ponte browniana 2.9 Movimento browniano transformado no 13

tempo 2.10 Processo de Ornstein–Uhlenbeck 2.11 Ponte Ornstein–Uhlenbeck 15


2.12 Outros recursos úteis resultados 2.13 Problemas selecionados 18
19
21
24
27 31 33

3 Geração de variáveis aleatórias 3.1 37


Introdução 3.2 Sequências pseudo- 37
aleatórias e quasi-aleatórias 3.3 Geração de distribuições 38
multivariadas: variáveis independentes 3.4 Geração de distribuições multivariadas: 41
variáveis correlacionadas 47

4 Opções europeias 4.1 59


Introdução 4.2 59
Precificação de derivativos usando uma medida martingale 4.3 59
Paridade de opção de compra 4.4 Opções Vanilla e o modelo 60
Black-Scholes 4.5 Opções de barreira 62
85

5 Opções americanas de um único ativo 97


5.1 Introdução 5.2 Aproximações para 97
opções americanas vanilla 5.3 Métodos de treliça para opções 97
vanilla 114
Machine Translated by Google

viii Finanças Computacionais Usando C e C#

5.4 Métodos de grade para opções vanilla 5.5 135


Precificação de opções americanas usando uma rede estocástica 172

6 Opções de multiativos 6.1 181


Introdução 6.2 A 181
equação de Black-Scholes de multiativos 6.3 Métodos de 181
Monte Carlo multidimensionais 6.4 Introdução aos métodos 183
de rede multidimensional 6.5 Duas opções de ativos 6.6 Três opções 185
de ativos 6.7 Quatro opções de ativos 190
201
205

7 Outros derivados financeiros 209


7.1 Introdução 7.2 209
Derivativos de taxas de juros 7.3 209
Derivativos cambiais 7.4 Derivativos de 228
crédito 7.5 Derivativos de ações 232
237

8 C# Aplicação de precificação de portfólio 245


8.1 Introdução 8.2 Armazenando e 245
recuperando os dados de mercado 8.3 A classe 254

PricingUtils e Analytics_MathLib 8.4 Classes de negociação de ações 8.5 Classes 262


de negociação FX 267
280

Apêndice A: Os gregos para opções europeias de baunilha A.1 289


Introdução A.2 Gama A.3 Delta A.4 Theta A.5 Rho A.6 Vega 289
290
291
292
293
294

Apêndice B: Integrais da opção de barreira B.1 295


A chamada para baixo e para fora B.2 A 295
chamada para cima e para fora 298

Apêndice C: Resultados estatísticos padrão C.1 A 303


lei dos grandes números C.2 O teorema do 303
limite central C.3 A variância e covariância de 303
variáveis aleatórias C.4 Média condicional e covariância de distribuições 305
normais C.5 Funções geradoras de momentos 310
311
Machine Translated by Google

Conteúdo ix

Apêndice D: Funções de distribuição estatística D.1 313


A distribuição normal (Gaussiana) D.2 A 313
distribuição lognormal D.3 A distribuição t de 315
Student D.4 A distribuição de erro geral 317
319

Apêndice E: Referência matemática E.1 321


Integrais padrão E.2 Função gama E.3 321
A função de distribuição normal 321
cumulativa E.4 Progressões aritméticas e geométricas 322
323

Apêndice F: Esquemas de diferenças finitas de Black-Scholes 325


F.1 O caso geral F.2 A 325
transformação logarítmica e uma grade uniforme 325

Apêndice G: A ponte browniana: derivação alternativa 329

Apêndice H: Movimento browniano: mais resultados 333


H.1 Alguns resultados relativos ao movimento browniano 333
H.2 Prova da Eq. (H.1.2) 334
H.3 Prova da Eq. (H.1.4) 335
H.4 Prova da Eq. (H.1.5) 335
H.5 Prova da Eq. (H.1.6) 335
H.6 Prova da Eq. (H.1.7) 338
H.7 Prova da Eq. (H.1.8) 338
H.8 Prova da Eq. (H.1.9) 338
H.9 Prova da Eq. (H.1.10) 339

Apêndice I: A fórmula de Feynman-Kac 341

Apêndice J: Respostas aos problemas 343


J.1 Problema 1 J.2 Problema 2 J.3 343
Problema 3 J.4 Problema 4 J.5 344
Problema 5 J.6 Problema 6 J.7 345
Problema 7 J.8 Problema 8 J.9 346
Problema 9 J.10 Problema 10 J.11 346
Problema 11 347
348
350
350
352
354

Referências 355

Índice 361
Machine Translated by Google

páginaEsta intencionalmente em brancoesquerda


Machine Translated by Google

Prefácio

Este livro se baseia no livro anterior do autor, Computational Finance: Num merical Methods for
Pricing Financial Instruments, que continha informações sobre como precificar opções de ações
usando o código C. O livro atual cobre os seguintes tipos de instrumentos:

• Derivativos de ações •
Derivativos de taxa de juros •
Derivativos de câmbio • Derivativos de
crédito

Há também um extenso capítulo final que demonstra como uma biblioteca de precificação
analítica baseada em C pode ser usada pelo software de avaliação de portfólio C#. Além disso,
este aplicativo: • ilustra o uso de dicionários C#, classes abstratas e .NET InteropSer

vícios
• permite que o leitor avalie carteiras sob medida • permite
que os dados de mercado sejam especificados por meio de um arquivo
de configuração • contém uma cesta de preços genérica para a qual o leitor pode especificar o retorno
função
• pode ser baixado gratuitamente para uso do leitor.

O livro atual também contém maior cobertura de processos estocásticos, cálculo de Ito e
simulação de Monte Carlo. Esses tópicos são apoiados por aplicações práticas e problemas de
exemplo resolvidos.
Além disso, o Numerical Algorithms Group (NAG) permitiu que os leitores desfrutassem de uma
licença de teste estendida para a biblioteca NAG C e rotinas financeiras associadas a partir do
seguinte URL: www.nag.co.uk/market/elsevier_glevy. A biblioteca NAG C pode ser chamada em
C# e fornece um grande conjunto de rotinas matemáticas abordando muitas áreas abordadas
neste livro (números aleatórios, distribuições estatísticas, precificação de opções, matrizes de
correlação e covariância, etc.).
Computational Finance Using C and C# também inclui software de suporte que pode ser
baixado gratuitamente. O software consiste em arquivos executáveis, arquivos de configuração e
arquivos de resultados. Com esses arquivos, o usuário pode executar o aplicativo de portfólio de
exemplo no Capítulo 8 e alterar a composição do portfólio e os atributos dos negócios.

Software de atualização adicional está disponível para compra com Computational


Finanças usando C e C#. O software inclui: • Código para

executar todos os exemplos C, C# e Excel do livro


Machine Translated by Google

xii Finanças Computacionais Usando C e C#

• Código-fonte C completo para a biblioteca de matemática Analytics_Mathlib que é usada


no livro
• Código-fonte C#, dados de mercado e arquivos de portfólio para o aplicativo de portfólio
descrito no Capítulo 8. Todos os softwares C/C# do livro podem ser compilados usando o

Visual Studio .NET 2005 ou o Microsoft Visual C#/C++ Express Editions disponível
gratuitamente.
Gostaria de aproveitar esta oportunidade para agradecer a minha esposa Kathy por seu
apoio.
Além disso, sou grato a Karen Maloney, da Elsevier, por sua paciência com relação à
data de entrega do livro, e ao Dr. Stephen Satchell, do Trinity College Cambridge, por me
dar a oportunidade de escrever uma continuação.

George Levy
Benson, Oxfordshire, Reino
Unido 2008
Machine Translated by Google

1 Visão geral dos derivativos financeiros

Um derivado financeiro é um contrato entre duas contrapartes (aqui referidas como A e B)


que deriva o seu valor do estado das quantidades financeiras subjacentes. Podemos ainda
dividir os derivativos entre aqueles que carregam uma obrigação futura e aqueles que não
carregam. No mundo financeiro, um derivativo que dá ao proprietário o direito , mas não a
obrigação , de participar de um determinado contrato financeiro é chamado de opção. Vamos
agora ilustrar isso usando um contrato de câmbio a termo e uma opção de câmbio.

Forward Cambial—um contrato com uma obrigação


Em um contrato de câmbio a termo, uma certa quantia de moeda estrangeira será comprada
(ou vendida) em uma data futura usando uma taxa de câmbio pré-combinada
avaliar.

Por exemplo, a contraparte A pode possuir um Termo de Câmbio que, no período de um


ano, obriga contratualmente A a comprar de B a quantia de $ 200 por £ 100. Ao final de um
ano várias coisas podem ter acontecido.

(i) O valor da libra pode ter diminuído em relação ao dólar (ii) O valor da libra pode ter
aumentado em relação ao dólar (iii) A contraparte B pode se recusar a honrar o contrato
- B pode ter falido,
etc.
(iv) A contraparte A pode se recusar a honrar o contrato - A pode ter falido,
etc.

Vamos agora considerar os eventos (i)–(iv) da perspectiva de A.


Em primeiro lugar, se (i) ocorrer, A poderá obter $ 200 por menos do que a taxa de mercado
atual, digamos £ 120. Neste caso, os $ 200 podem ser comprados por £ 100 e imediatamente
vendidos por £ 120, dando um lucro de £ 20. No entanto, esse lucro só pode ser realizado se
B honrar o contrato – ou seja, o evento (iii) não acontecer.
Em segundo lugar, quando (ii) ocorre, A é obrigado a comprar $ 200 por mais do que a
taxa de mercado atual, digamos £ 90. Neste caso, os $ 200 são comprados por £ 100, mas
poderiam ter sido comprados por apenas £ 90, dando uma perda de £ 10.
A probabilidade de ocorrência dos eventos (iii) e (iv) está relacionada ao Risco de Crédito
associado à contraparte B. O valor do contrato para A não é afetado por (iv), embora A possa
ser processado se ambos (ii) e ( iv) ocorrer. A contraparte A deve se preocupar apenas com
a possibilidade dos eventos (i) e (iii) ocorrerem - ou seja, a probabilidade de o contrato valer
um valor positivo em um ano
Machine Translated by Google

2 Finanças Computacionais Usando C e C#

e a probabilidade de B honrar o contrato (que é um menos a probabilidade de o evento (iii)


acontecer).
Do ponto de vista de B, o risco de crédito importante ocorre quando ambos (ii) e (iv) ocorrem
– isto é, quando o contrato tem valor positivo, mas a contraparte A entra em default.

Opção de câmbio - um contrato sem obrigação


Uma opção de câmbio é semelhante ao câmbio a termo, com a diferença de que, se o evento
(ii) ocorrer, A não é obrigado a comprar dólares a uma taxa de câmbio desfavorável. Para ter
essa flexibilidade, A precisa comprar uma opção de câmbio de B, que aqui pode ser considerada
como um seguro contra flutuações inesperadas da taxa de câmbio.

Por exemplo, a contraparte A pode possuir uma opção de câmbio que, em um ano, permite
contratualmente que A compre de B a quantia de $ 200 por £ 100.
Como antes, ao final de um ano pode ter acontecido o seguinte:

(i) O valor da libra pode ter diminuído em relação ao dólar (ii) O valor da libra pode ter
aumentado em relação ao dólar (iii) A contraparte B pode se recusar a honrar o contrato
- B pode ter falido,
etc.
(iv) A contraparte A pode ter falido, etc.

Vamos agora considerar os eventos (i)–(iv) da perspectiva de A.


Em primeiro lugar, se (i) ocorrer, A poderá obter $ 200 por menos do que a taxa de mercado
atual, digamos £ 120. Neste caso, os $ 200 podem ser comprados por £ 100 e imediatamente
vendidos por £ 120, dando um lucro de £ 20. No entanto, esse lucro só pode ser realizado se B
honrar o contrato – ou seja, o evento (iii) não acontecer.
Em segundo lugar, quando (ii) ocorrer, A decidirá não comprar $ 200 por mais
do que a taxa de mercado atual; neste caso, a opção é inútil.
Podemos assim ver que A ainda está preocupado com o Risco de Crédito quando os eventos
(i) e (iii) ocorrem simultaneamente.
O Risco de Crédito do ponto de vista da contraparte B é diferente. B vendeu para A uma
opção de câmbio, que vence em um ano, e já recebeu o dinheiro - o preço justo atual da opção.
A contraparte B não tem risco de crédito associado a A. Isso ocorre porque se o evento (iv)
ocorrer e A falir, isso não importa para B, pois o dinheiro da opção já foi recebido. Por outro
lado, se o evento (iii) ocorrer, B pode ser processado por A, mas B ainda não tem Risco de
Crédito associado a A.

Este livro considera a avaliação de derivativos financeiros que carregam obrigações


ções e também opções financeiras.
Os capítulos 1–7 tratam tanto da teoria dos processos estocásticos quanto da precificação
de instrumentos financeiros. No Capítulo 8, essas informações são aplicadas a um avaliador de
portfólio C#. A aplicação é fácil de usar (as carteiras e as taxas de mercado atuais são definidas
em arquivos de texto) e também pode ser estendida para incluir novos tipos de negócios.
Machine Translated by Google

Visão geral dos derivativos financeiros 3

O livro foi escrito de forma que (na medida do possível) os resultados da matemática
financeira sejam derivados dos primeiros princípios.
Finalmente, os apêndices contêm várias informações, que esperamos que sejam úteis ao
leitor.
Machine Translated by Google

páginaEsta intencionalmente em brancoesquerda


Machine Translated by Google

2 Introdução aos processos


estocásticos

2.1 Movimento Browniano

O movimento browniano recebeu o nome do botânico Robert Brown, que usou um microscópio
para estudar o mecanismo de fertilização das plantas com flores. Ele observou pela primeira vez
o movimento aleatório de partículas de pólen (obtidas da espécie americana Clarkia pulchella)
suspensas na água e escreveu:

A fovila ou grânulos preenchem todo o disco orbicular, mas não se estendem


aos ângulos salientes. Eles não são esféricos, mas oblongos ou quase
cilíndricos, e as partículas têm movimento manifesto. Este movimento só é
visível para minha lente que amplia 370 vezes. O movimento é obscuro, mas certo. . .

Robert Brown, 12 de junho de 1827; ver Ramsbottom (1932)

Parece que Brown considerou esse movimento apenas uma curiosidade (ele acreditava que
as partículas estavam vivas) e continuou sem se distrair com sua pesquisa botânica. O
significado total de suas observações só se tornou aparente cerca de oitenta anos depois,
quando foi demonstrado (Einstein, 1905) que o movimento é causado pelas colisões que ocorrem
entre os grãos de pólen e as moléculas de água. Em 1908, Perrin (1909) finalmente conseguiu
confirmar experimentalmente as previsões de Einstein. Seu trabalho foi possível graças ao
desenvolvimento do ultramicroscópio por Richard Zsigmondy e Henry Siedentopf em 1903. Ele
foi capaz de calcular a partir de seus resultados experimentais e da fórmula de Einstein o
tamanho da molécula de água e um valor preciso para o número de Avogadro. Seu trabalho
estabeleceu a teoria física do movimento browniano e acabou com o ceticismo sobre a existência
de átomos e moléculas como entidades físicas reais. Muitas das propriedades fundamentais do
movimento browniano foram descobertas por Paul Levy (Levy, 1939, 1948), e o primeiro
tratamento matematicamente rigoroso foi fornecido por Norbert Wiener (Wiener, 1923, 1924).
Karatzas e Shreve (1991) são um excelente livro-texto sobre as propriedades teóricas do
movimento browniano, enquanto Shreve, Chalasani e Jha (1997) fornecem muitas informações
úteis sobre o uso de processos brownianos em finanças.

O movimento browniano também é chamado de caminhada aleatória, processo de Wiener


ou, algumas vezes (mais poeticamente), caminhada do bêbado. Apresentaremos agora as três
propriedades fundamentais do movimento browniano.
Machine Translated by Google

6 Finanças Computacionais Usando C e C#

2.1.1 As propriedades do movimento browniano

Em termos formais, um processo W = (Wt : 0) é (unidimensional) browniano


movimento t se:

(i) Wt é contínuo e W0 = 0, (ii) Wt ÿ


N(0,t), (iii) O incremento dWt = Wt+dt
ÿWt é normalmente distribuído como dWt ÿ N(0, dt), então E[dWt] = 0 e Var[dWt] = dt.
O incremento dWt também é independente do histórico do processo até o tempo
t.

A partir de (iii) podemos afirmar ainda que, como os incrementos dWt são independentes, um
de valores passados , processo Browniano também é um processo Markoviano . Além disso nós
Wt deve agora mostrar que um processo browniano também é um processo martingale .
Em um processo martingale Pt,t 0, a expectativa condicional E[Pt+dt|Ft] = onde Ft é
, chamada
pela observação
de filtração
do processo
gerada
atépelo
o tempo
processo
t. Como
e contém
para o amovimento
informaçãobrowniano
Pt aprendida
temos

E[Wt+dt|Ft] = E (Wt+dt ÿ Wt) + Wt|Ft = E[Wt+dt ÿ Wt] + Wt


= E[dWt] + Wt = Wt

onde usamos o fato de que E[dWt] = 0. Como E[Wt+dt|Ft] = Wt , o movimento


browniano W é um processo martingale.
Usando a propriedade (iii), também podemos derivar uma expressão para a
covariância do movimento browniano. O requisito de incremento independente significa
que para n vezes 0 t0 < t1 < t2 < ··· < tn < ÿ as variáveis aleatórias Wt1 ÿ Wt0 ,Wt2 ÿ
Wt1 ,...,Wtn ÿ Wtnÿ1 são independentes. Então

Cov[Wti ÿ Wtiÿ1 ,Wtj ÿ Wtjÿ1 ] = 0, eu = j (2.1.1)

Mostraremos que Cov[Ws,Wt] = s ÿ t.

Prova. Usando Wt0 = 0, e assumindo t nós temos

Cov[Ws ÿ Wt0 ,Wt ÿ Wt0 ] = Cov[Ws,Wt] = Cov Ws,Ws + (Wt ÿ Ws)


Do Apêndice C.3.2 temos

Cov Ws,Ws + (Wt ÿ Ws) = Cov[Ws,Ws] + Cov[Ws,Wt ÿ Ws]


= Var[Ws] + Cov[Ws,Wt ÿ Ws]
Portanto

Cov[Ws,Wt] = s + Cov[Ws,Wt ÿ Ws]


Agora

Cov[Ws,Wt ÿ Ws] = Cov[Ws ÿ Wt0 ,Wt ÿ Ws] = 0 onde


usamos a Eq. (2.1.1) com n = 2,t1 = s e t2 = t.
Machine Translated by Google

Introdução aos processos estocásticos 7

Obtemos assim

Cov[Ws,Wt] = s
Então

Cov[Ws,Wt] = s ÿ t (2.1.2)

Vamos agora considerar os incrementos brownianos ao longo do intervalo de tempo dt


com mais detalhes. Vamos primeiro definir o processo X tal que: dXt = dWt

(2.1.3)

onde dWt é uma variável aleatória extraída de uma distribuição normal com média zero e
variância dt, que denotamos como dWt ÿ N(0, dt). A equação (2.1.3) também pode ser
escrita na forma equivalente: dXt = ÿ dt dZ onde dZ é uma variável aleatória extraída de

uma distribuição normal padrão (ou seja, uma distribuição normal com média(2.1.4)
zero e

variância unitária).

As equações (2.1.3) e (2.1.4) fornecem a variação incremental no valor de X ao longo


do intervalo de tempo dt para o movimento browniano padrão .
Vamos agora generalizar ligeiramente essas equações introduzindo o parâmetro extra
(volatilidade) ÿ que controla a variância do processo. Agora temos:

dXt = ÿdWt (2.1.5)

onde dWt ÿ N(0, dt) e dXt ÿ N(0,ÿ2 dt). A equação (2.1.5) também pode ser escrita na
forma equivalente: dXt = ÿ ÿ dt dZ, dZ ÿ N(0, 1)

(2.1.6)

ou equivalente

dXt = ÿ dt dZ, d Z ÿ N 0,ÿ2 (2.1.7)

Estamos agora em condições de fornecer uma descrição matemática do movimento dos


grãos de pólen observados por Robert Brown em 1827. Começaremos assumindo que o
recipiente com água está perfeitamente nivelado. Isso garantirá que não haja desvio dos
grãos de pólen em nenhuma direção específica. Vamos denotar a posição de um
, estatística
determinado grão de pólen no tempo t por Xt e definir a posição como zero. A da
distribuição
posição
do
da seguinte forma: grão, XT em t = 0, Xt0 , algum tempo depois t = T pode ser encontrada , no
,
Vamos dividir o tempo T em n intervalos iguais dt = T/n. Uma vez que a posição da
partícula muda na quantidade dXi = ÿ ÿ dt dZi no i-ésimo intervalo de tempo dt, a posição
final XT é dada por:
n n

XT = ÿ ÿ dt dZi = ÿ ÿ dt coração

i=1 i=1
Machine Translated by Google

8 Finanças Computacionais Usando C e C#

Como dZi ÿ N(0, 1), pela Lei dos Grandes Números (ver Apêndice C.1), temos que o
valor esperado da posição XT é:
n
E[XT ] = ÿ ÿ dtE dZi =
i=1

A variância da posição XT é:
n n
Sim[XT ] = Sim ÿ ÿ dt dZi = ÿ2 dt Var coração (2.1.8)
i=1 i=1

Como todas as variáveis dZi são IID N(0, 1), temos Var[dZi] = 1 e n
Onde [ i=1 Xi] = tem=1
Var[Xi] (ver Apêndice C.3.1).
Por isso

n n
Var[XT ] = ÿ2 dt Var[dZi] = ÿ2 dt 1 (2.1.9)
i=1 i=1

que dá:
Var[XT ] = ÿ2n dt = T ÿ2 (2.1.10)

Então, no , a posição do grão de pólen XT é distribuída como XT ÿ


tempo TN(0,Tÿ2).
Se o recipiente de água não estiver perfeitamente nivelado, os grãos de pólen exibirão
deriva em uma direção específica. Podemos modificar a Eq. (2.1.5) para levar isso em
consideração da seguinte forma:

dXt = ÿdt + ÿ ÿ dt dZi, dZi ÿ N(0, 1), (2.1.11)

ou equivalente

dXt = ÿdt + ÿ dWt, dWt ÿ N(0, dt), (2.1.12)

onde incluímos o desvio constante ÿ. Procedendo de maneira semelhante ao caso do


movimento browniano de deriva zero , temos:
n n n

XT = µdt + ÿ ÿ dt dZi = µ dt + ÿ ÿ dt coração

i=1 i=1 i=1


n
= ÿT + ÿ ÿ dt coração

i=1

que dá
n
E[XT ] = E ÿT + ÿ ÿ dt coração

i=1
n
E[XT ] = ÿT + ÿ ÿ dtE dZi = µT
i=1
Machine Translated by Google

Introdução aos processos estocásticos 9

A variância da posição XT é:
n n
Var[XT ] = Var ÿT + ÿ ÿ dt dDia = Var ÿ ÿ dt coração

i=1 i=1

Aqui usamos o fato (consulte o Apêndice C.3.1) de que Var[a + bX] = b2 Var[X], onde a =
ÿT , e b = 1. Das Eqs. (2.1.9) e (2.1.10) temos:
n
Sim[XT ] = Sim ÿ ÿ dt dZi = T ÿ2
i=1

Então, no tempo , a posição do grão de pólen XT é distribuída como XT ÿ


TN(ÿT,T ÿ2).
Acabamos de mostrar que, quando variamos o desvio de um movimento browniano, sua
volatilidade permanece inalterada. Esta é uma propriedade muito importante e (como veremos
mais adiante) é amplamente utilizada na teoria de precificação de derivativos.

2.2 Um modelo browniano de movimentos de preços de ativos

Na seção anterior, mostramos como o movimento browniano pode ser usado para
descrever o movimento aleatório de pequenas partículas suspensas em um líquido. A
primeira tentativa de usar o movimento browniano para descrever movimentos de preços
de ativos financeiros foi fornecida por Bachelier (1900). Isso, no entanto, teve apenas
sucesso limitado porque a significância de uma determinada mudança absoluta no preço
do ativo depende do preço do ativo original. Por exemplo, um aumento de £ 1 no valor de
uma ação originalmente valendo £ 1,10 é muito mais significativo do que um aumento de
£ 1 no valor de uma ação originalmente valendo £ 100. É por esta razão que os movimentos
dos preços dos ativos são geralmente descritos em termos de variações relativas ou
percentuais. Por exemplo, se a ação de £ 1,10 aumenta de valor em 11 pence e a ação de
£ 100 aumenta de valor em £ 10, então ambas as mudanças de preço têm o mesmo
significado e correspondem a um aumento de 10% no valor. A ideia de mudanças de
preços relativos no valor de uma ação pode ser formalizada definindo uma quantidade ,
chamada retorno , Rt de uma ação no tempo t. O retorno Rt é definido da seguinte forma:
dSt St
Rt = St+dt ÿ St = (2.2.1)
St

onde St+dt é o valor da ação no tempo t + dt, St é o valor da ação no tempo t e dSt é a
mudança no valor da ação no intervalo de tempo dt. O retorno percentual Rÿ no intervalo
de tempo dt é simplesmente definido como Rÿ = 100×Rt .
Agora estamos em condições de construir um modelo browniano simples de movimentos
de preços de ativos; mais informações sobre o movimento browniano em finanças podem
ser encontradas em Shreve, Chalasani e Jha (1997).
O retorno do ativo no tempo t agora é dado por:
dSt = ÿdt + ÿ dWt, dWt ÿ N(0, dt), Rt
= St (2.2.2)
Machine Translated by Google

10 Finanças Computacionais Usando C e C#

ou equivalente:

dSt = Stÿdt + Stÿ dWt (2.2.3)

O processo nas Eqs. (2.2.2) e (2.2.3) é denominado movimento browniano geométrico; que
vamos abreviar como GBM. Isso ocorre porque as mudanças de preço relativas (e não
absolutas) seguem o movimento browniano.

2.3 Sua fórmula (ou lema)


Nesta seção derivaremos a fórmula de Ito; um tratamento mais rigoroso pode ser encontrado
em Karatzas e Shreve (1991).
Consideremos o processo estocástico X:

dX = a dt + b dW = a dt + b ÿ dt dZ, dZ ÿ N(0, 1), dW ÿ N(0, dt) (2.3.1)

onde a e b são constantes. Queremos encontrar o processo seguido por uma função da variável
estocástica X, ou seja ÿ(X,t). Isso pode ser feito aplicando uma expansão de Taylor, até segunda
ordem, nas duas variáveis X e t da seguinte forma:

dX2 + ÿÿ =2ÿ + dt + dX +ÿ2ÿ ÿ2ÿ ÿt2


dt ÿX2 ÿt 11ÿX 2
ÿÿ ÿÿ 2 dX dtÿÿ
+
ÿXÿt

(2.3.2)

onde ÿÿ é usado para denotar o valor ÿ(X + dX,t + dt), e ÿ denota o valor ÿ(X,t). Vamos agora
considerar a magnitude dos termos dX2, dX dt e dt2 como dt ÿ 0. Primeiro

dX2 = a dt + b ÿ dt dZ a dt + b ÿ dt dZ = a2 dt
2 + 2ab dt 3/2 dZ + b2 dt dZ2

então

2 dX dt = a dt + b dt 3/2 dZ

Assim como dt ÿ 0, e ignorando todos os termos em dt de ordem maior que 1, temos:

dX2 ÿ b2 dt dZ2, dt 2 ÿ 0, e dX dt ÿ 0

Portanto a Eq. (2.3.2) pode ser reescrita como:

ÿÿ ÿÿ 1 ÿ2ÿ
dÿ = dt + dX + ÿX2 ÿX 2 E dX2 (2.3.3)
ÿt

onde dÿ = ÿÿ ÿ ÿ, e substituímos dX2 por seu valor esperado E[dX2].


Agora

E dX2 = E b2 dt dZ2 = b2 dtE dZ2 = b2 dt


Machine Translated by Google

Introdução aos processos estocásticos 11

onde usamos o fato de que, como dZ ÿ N(0, 1), a variância de dZ, E[dZ2], é por definição igual
a 1. Usando esses valores na Eq. (2.3.3) e substituindo dX da Eq. (2.3.1), obtemos:

ÿÿ ÿÿ dÿ = dt + (a dt + b dw) + dt ÿX2 ÿt b2
ÿX ÿ2ÿ
(2.3.4)
2

Isso dá a fórmula de Ito

ÿÿ ÿÿ b2 ÿ2ÿ ÿÿ
dÿ = + a + ÿX dt + b dW ÿX (2.3.5)
ÿt 2 ÿX2

Em particular, se considerarmos o processo geométrico browniano:

dS = ÿS dt + ÿS dW

onde ÿ e ÿ são constantes, então substituindo X = S, a = ÿS e b = ÿS na Eq. (2.3.5) rende:

ÿ2S2
ÿÿ ÿÿ + ÿS + ÿS2 ÿt ÿS ÿ2ÿ ÿÿ
dÿ = dt + ÿS dW ÿS (2.3.6)
2

A equação (2.3.6) descreve a mudança no valor de uma função ÿ(S,t) ao longo do intervalo de
tempo dt, quando a variável estocástica S segue GBM. Este resultado tem aplicações muito
importantes na precificação de derivativos financeiros. Aqui a função ÿ(S,t) é tomada como o
preço de um derivado financeiro, f(S,t), que depende do valor de um ativo subjacente S, que
se assume seguir o GBM. No Capítulo 4, usaremos a Eq. (2.3.6) para derivar a equação
diferencial parcial (Black-Scholes) que é satisfeita pelo preço de um derivativo financeiro.

Também podemos usar a Eq. (2.3.3) para derivar o processo seguido por ÿ = log(St). Nós
temos:

ÿÿ 1 ÿ2ÿ = ÿ ÿ 1 1
= ÿ log(St) = ,
ÿ log(St) = =ÿ

ÿSt ÿS S ÿS2t ÿSt ÿSt ÿSt St S2


t

ÿÿ = ÿ log(St)
=0
ÿt ÿt

Então

ÿ2
d log(St) = ÿ dt + ÿ dWt onde ÿ = ÿ ÿ (2.3.7)
2

Integrando a Eq. (2.3.7) rende


T T T
d log(St) = n dt + ÿ dWt
t=t0 t=t0 t=t0
então

log(ST ) ÿ log(St0 ) = ÿT + ÿWT (2.3.8)

onde usamos t0 = 0 e Wt0 = 0.


Machine Translated by Google

12 Finanças Computacionais Usando C e C#

Nós obtemos

logST ÿ N ÿT,ÿ2T (2.3.9)


St0
e assim

logST = ÿT + ÿWT (2.3.10)


St0

A solução para o movimento browniano geométrico (GBM) na Eq. (2.2.3) é


p2
ST = St0 exp(ÿT + ÿWT ), ÿ = ÿ ÿ (2.3.11)
2
O valor do ativo no tempo t + dt pode, portanto, ser gerado a partir de seu valor no tempo
t usando

St+dt = St exp{ÿ dt + ÿ dWt}

Mostramos que se o preço do ativo segue o movimento browniano geométrico, então o


logaritmo do preço do ativo segue o movimento browniano padrão. Uma outra forma de
afirmar isso é que, ao longo do intervalo de tempo dt, a mudança no logaritmo do preço do
ativo é uma distribuição gaussiana com média (ÿ ÿ ÿ2/2 ) dt e variância ÿ2 dt.

Esses resultados podem ser facilmente generalizados para incluir variações no tempo e
volatilidade. Agora, em vez da Eq. (2.2.3) temos dSt = Stÿt dt + Stÿt dWt
(2.3.12)
o que resulta em

d log(St) = ÿt dt + ÿt dWt (2.3.13)


então

T T T
d log(St) = ÿt dt + ÿt dWt
t=t0 t=t0 t=t0

que resulta na seguinte solução para ST


T T ÿ2t
ST = St0 exp ÿt dt + ÿt dWt onde ÿt = ÿt ÿ (2.3.14)
t=t0 t=t0 2

Os resultados apresentados nas Eqs. (2.3.11) e (2.3.14) são muito importantes e


serão mencionados em seções posteriores do livro.

2.4 Teorema de Girsanov

Este teorema afirma que para qualquer processo estocástico k(t) tal que ÿ t0 k(s)2 ds <
então a derivada Radon–Nikodym dQ = ÿ(t) é dada
dP por:
t t
1
ÿ(t) = exp para dWPs ÿ

k(s)2 ds (2.4.1)
0 2 0
Machine Translated by Google

Introdução aos processos estocásticos 13

onde WP é o movimento browniano (possivelmente com deriva) sob medida de probabilidade


t
P, veja Baxter e Rennie (1996). Sob a medida de probabilidade Q, temos:
t
WQt = WP ÿ

k(s) ds (2.4.2)
t
0

onde WQ também é o movimento browniano (possivelmente com deriva).


t
Também podemos escrever

dWP = dWQ + k(t) dt (2.4.3)

O teorema de Girsanov fornece, assim, um mecanismo para mudar o desvio de um


Movimento browniano.

2.5 Lema de Ito para movimento browniano geométrico multiativos

Vamos agora considerar o processo estocástico n-dimensional:

dXi = ai dt + bi ÿ dt dZi = ai dt + bi dWi, i = 1,...,n, (2.5.1)

ou na forma vetorial:

dX = A dt + ÿ dtB dZ = A dt + B dW (2.5.2)

onde A e B são vetores de n elementos respectivamente contendo as constantes, ai,i = 1,...,n,


e bi,i = 1,...,n. O vetor estocástico dX contém as n variáveis estocásticas Xi,i = 1,...,n.

Assumiremos que o vetor aleatório de n elementos dZ é extraído de uma distribuição


normal multivariada com média zero e matriz de covariância C . Ou seja, podemos escrever:

dZ ÿ N(0,C)

Como C ii = Var[dZi] = 1,i = 1,...,n, os elementos diagonais de C são todos unitários e a matriz
C é de fato uma matriz de correlação com elementos fora da diagonal dada por:

onde=ÿij
E[dZi
é o coeficiente
dZj ] = ÿi,j , de
C ij i = 1,...,n, j = 1,...,n, i = j,

correlação entre os i-ésimos e j-ésimos elementos do vetor dZ.

Da mesma forma, o vetor aleatório de n elementos dW é extraído de uma variável nem


distribuição mal com média zero e matriz de covariância C. Podemos assim escrever:

dW ÿ N(0,C)

Os elementos diagonais de C são Cii = Var[dWi] = dt,i = 1,...,n, e os elementos fora da


diagonal são

Cij = E[dWi dWj ] = ÿi,j dt, i = 1,...,n, j = 1,...,n, i = j


Machine Translated by Google

14 Finanças Computacionais Usando C e C#

Como na Seção 2.3, queremos encontrar o processo seguido por uma função do vetor
estocástico X, ou seja, o processo seguido por ÿ(X,t). Isso pode ser feito aplicando uma
expansão de Taylor n-dimensional, até segunda ordem, nas variáveis X e t da seguinte
forma:
n n
ÿÿ 1 ÿÿ dXi + ÿ2ÿ
ÿÿ = ÿ + dt +n E dXi dXj ÿXi
ÿt ÿXi 2 ÿXj i=1 j=1
i=1

1 ÿ2ÿ ÿÿ
+ ÿt2 2 dt 2 +n dXi dt ÿXi (2.5.3)
ÿt
i=1

onde ÿÿ é usado para denotar o valor ÿ(X + dX,t + dt), e ÿ denota o valor ÿ(X,t). Vamos
agora considerar a magnitude dos termos dXi dXj , dXi dt e dt2 como dt ÿ 0. Expandindo
os termos dXi dXj e dXi dt temos:

dXi dXj = ai dt + bi ÿ dt dZi aj dt + bj ÿ dt dZj + aibj dt 3/2


2
ÿ dXi dXj = aiaj dt dZj + aj bi dt 3/2
dZidZi
dZj++bibj
bi dtdt3/2 dZi
(2.5.4)

2
dXi dt = ai dt

Assim como dt ÿ 0, e ignorando todos os termos em dt de ordem maior que 1, temos:

dXi dt ÿ 0

dXi dXj ÿ bibj dt dZi dZj

Portanto a Eq. (2.5.3) pode ser reescrita como


n n
ÿÿ ÿÿ 1 dXi + ÿ2ÿ
dÿ = ÿt dt +n E dXi dXj ÿXi (2.5.5)
ÿXi 2 ÿXj i=1 j=1
i=1

onde dÿ = ÿÿ ÿ ÿ.
Agora

E[dXi dXj ] = E[bibj dt dZi dZj ] = bibj dtE[dZi dZj ] = bibjÿij dt

onde ÿij é o coeficiente de correlação entre o i-ésimo e o j-ésimo ativo.


Usando esses valores na Eq. (2.5.5), e substituindo dXi da Eq. (2.5.1), obtemos:

n n n
ÿÿ ÿÿ (ai dt + bi dWi) + dt + 1 ÿ2ÿ
dÿ = ÿXi 2 bibjÿij dt ÿXi ÿXj
ÿt
i=1 i=1 j=1

(2.5.6)

Isso dá a fórmula n-dimensional de Ito:


Machine Translated by Google

Introdução aos processos estocásticos 15

n n
ÿÿ +n 1 ÿÿ + ai ÿ2ÿ
dÿ = 2 ÿXi bibjÿij ÿXi ÿXj dt
ÿt i=1 i=1 j=1

+n ÿÿ
bi dWi (2.5.7)
i=1 ÿXi

Em particular se considerarmos o movimento browniano geométrico:


dSi = ÿiSi dt + ÿiSi dWi, i = 1,...,n,

onde ÿi é o desvio constante do i-ésimo ativo e ÿi é a volatilidade constante do i-ésimo


ativo, então substituindo Xi = Si, ai = ÿiSi e bi = ÿiSi na Eq. (2.5.7) produz:

n n
ÿÿ +n ÿÿ 1 ÿiSi ÿ2ÿ
dÿ = + ÿSi 2 ÿiÿjSiSjÿij ÿSi ÿSj dt
ÿt i=1 i=1 j=1

+n ÿÿ
ÿiSi dWi (2.5.8)
i=1 ÿSi

2.6 Regras de produto e quociente de Ito em duas dimensões

Vamos agora derivar expressões para o produto e quociente de dois processos


estocásticos. Neste caso ÿ ÿ ÿ(X1,X2), com
dX1 = a1 dt + b1 dW1 e dX2 = a2 dt + b2 dW2

A seguinte versão bidimensional do lema de Ito será usada:


2 2
ÿÿ ÿÿ dÿ = dX1 1 ÿ2ÿ
+ dX2 + ÿX1 ÿX2 E dXi dXj ÿXi (2.6.1)
2 ÿXj i=1 j=1

onde usamos o fato de que ÿÿ ÿt = 0.

2.6.1 Regra do produto Ito

Aqui ÿ = ÿ(X1X2), e as derivadas parciais são as seguintes:

ÿÿ ÿÿ ÿ2ÿ ÿ2ÿ
= X2, = X1 = = 0,
ÿX1 ÿX2 ÿX2 1 ÿX22

ÿ2ÿ = ÿ2ÿ
=1
ÿX1 ÿX2 ÿX2 ÿX1
Portanto, usando a Eq. (2.6.1)
2E[dX1 dX2]
dÿ = X2 dX1 + X1 dX2 +
2
Machine Translated by Google

16 Finanças Computacionais Usando C e C#

e a regra do produto é

d(X1X2) = X2 dX1 + X1 dX2 + E[dX1 dX2] (2.6.2)

Movimento browniano com uma fonte de aleatoriedade

Para o caso especial em que X1 é um movimento browniano e X2 não possui termo


aleatório, temos:

dX1 = X1ÿ1 dt + X1ÿ1 dW1 e dX2 = X2ÿ2 dt


Agora

E[dX1 dX2] = E (X1ÿ1 dt + X1ÿ1 dW1)X2ÿ2 dt


2
= X1X2ÿ1ÿ2 dt + X1X2ÿ1ÿ2 dtX2ÿ2 dt E[dW1]
=0

onde ignoramos termos em dt com ordem maior que 1 e usamos E[dW1] = 0.

Portanto a Eq. (2.6.2) torna-se:

d(X1X2) = X2 dX1 + X1 dX2


d(X1X2) = X2(X1ÿ1 dt + X1ÿ1 dW1) + X1X2ÿ2 dt

Então finalmente obtemos:

d(X1X2) = (X1X2){ÿ1 + ÿ2} dt + (X1X2)ÿ1 dW1 (2.6.3)

2.6.2 Regra do quociente Ito

Aqui ÿ = ÿ(X1/X2) e as derivadas parciais são as seguintes:

ÿÿ 1 ÿÿ ÿ2ÿ
= , = -X1 , = 0,
ÿX1 x2 ÿX2 x22 ÿX21

ÿ2ÿ ÿ2ÿ ÿ2ÿ 1


X1 = 2 , = =ÿ

ÿX22 X32 ÿX1 ÿX2 ÿX2 ÿX1 x22

Portanto, usando a Eq. (2.6.1)


dX1 dX2 dÿ X1
=ÿ 1 2X1 dX1 dX2
X2 X2 +2 E dX2 2ÿ 2
2 X32 x22

Obtemos a seguinte expressão para a regra do quociente:

X1 =
X1 dX1 dX2 dX2 dX2
d ÿ

+E
x2 x2 X1 X2 x2 x2
dX1 dX2
ÿE (2.6.4)
X1 x2
Machine Translated by Google

Introdução aos processos estocásticos 17

movimento browniano

Aqui temos:

dX1 = X1ÿ1 dt + X1ÿ1 dW1 e dX2 = X2ÿ2 dt + X2ÿ2 dW2

ou equivalentemente

dX1 = ÿ1 dX2
dt + ÿ1 dW1 e = ÿ2 dt + ÿ2 dW2
X1 x2
Portanto

dX2 dX2
E = E (ÿ2 dt + ÿ2 dW2)(ÿ2 dt + ÿ2 dW2)
x2 x2
2
= E ÿ2 2 2 dt + E ÿ2 (dW2)
2 + 2E[ÿ2 dt dW2]

= ÿ2 2 2 dt + ÿ22dt + 2ÿ2 dt E[dW2]

o que resulta em
dX2 dX2
E = ÿ2 dt (2.6.5)
2
x2 x2
onde ignoramos todos os termos em dt com ordem maior que 1 e usamos o fato de que E[dW2]
= 0.
De maneira semelhante

dX1 dX2
E = E (ÿ1 dt + ÿ1 dW1)(ÿ2 dt + ÿ2 dW2)
X1 x2
2
= E ÿ1ÿ2 dt + E[ÿ1ÿ2 dt dW1]

+ E[ÿ2ÿ1 dt dW2] + E[ÿ1ÿ2 dW1 dW2] = ÿ1ÿ2


2
dt + ÿ1ÿ2 dtE[dW1] + ÿ2ÿ1 dtE[dW2]

+ ÿ1ÿ2E[dW1 dW2]

que dá dX1

dX2
E = ÿ1ÿ2 dt ÿ12 (2.6.6)
X1 x2
onde procedemos como antes, mas também usamos o fato de que E[dW1 dW2] = ÿ12 dt.

Substituindo-os na Eq. (2.6.4) temos:

X1 X1 dX1 dX2
d = ÿ
+ ÿ2 dt ÿ ÿ1ÿ2ÿ12 dt
2
x2 x2 X1 x2
= X1
ÿ1 dt + ÿ1 dt ÿ ÿ2 dt ÿ ÿ2 dt + ÿ2 dt ÿ ÿ1ÿ2ÿ12
2
dt
x2
= X1
ÿ1 dt + ÿ1 dW1 ÿ ÿ2 dt ÿ ÿ2 dW2 + ÿ2 dt ÿ ÿ1ÿ2ÿ12
2
dt
x2
Machine Translated by Google

18 Finanças Computacionais Usando C e C#

Isso rende:

d X1 = X1
ÿ1 ÿ ÿ2 + ÿ2 2ÿ ÿ1ÿ2ÿ12 dt
x2 x2
X1
+ {ÿ1 dW1 ÿ ÿ2 dW2} (2.6.7)
x2

Movimento browniano com uma fonte de aleatoriedade


Nós temos

dX1 = X1ÿ1 dt + X1ÿ1 dW1 e dX2 = X2ÿ2 dt


Como antes

dX2 dX2
E = E ÿ2 2 2 dt = ÿ22 2 dt ÿ 0
x2 x2

dX1 dX2
E = E (ÿ1 dt + ÿ1 dW1)ÿ2 dt
X1 x2
2
= E ÿ1ÿ2 dt + ÿ1ÿ2 dt dW1
2
= ÿ1ÿ2 dt + ÿ1ÿ2 dt E[dW1] ÿ 0
Portanto
dX1 dX2
d X1 = X1 ÿ

x2 x2 X1 x2
= X1
{ÿ1 dt + ÿ1 dW1 ÿ ÿ2 dt}
x2
Então a expressão final é

d X1 = X1
{ÿ1 ÿ ÿ2} dt +
X1
ÿ1 dW1 (2.6.8)
x2 x2 x2

2.7 Ito produto em n dimensões


Usando a Eq. (2.5.7) derivaremos agora uma expressão para o produto de n
n
i=1 Xi, e as derivadas parciais são como
processos estocásticos. Neste caso ÿ ÿ segue:

ÿÿ = ÿ ÿXidXi
Xi ÿ2ÿ para i = 1,...,n
= 0 para i =
1,...,n ÿX2
eu
Machine Translated by Google

Introdução aos processos estocásticos 19

ÿ2ÿ = ÿ2ÿ
ÿXi ÿXj ÿXj ÿXi

= dXi dXj
ÿ para i = j,i = 1,...,n,j = 1,...,n
XI Xj
ÿÿ
=0
ÿt

Portanto, substituindo na Eq. (2.5.7) temos


n n n
dXi dXi dXj
dÿ = ÿ + ÿE (2.7.1)
XI XI Xj
i=1 i=1 j=1(i=j)

que na íntegra é
n n n
dXi
d Xi = XI
XI
i=1 i=1 i=1
n n n
dXi dXj
+ Xi E (2.7.2)
XI Xj
i=1 i=1 j=1(i=j)

2.8 A ponte browniana

Deixe um processo browniano ter valores Wt0 no tempo t0 e Wt1 no tempo t1.
Queremos encontrar a distribuição condicional de Wt
, será onde t0 por
denotada <t<t1. Esta distribuição
P(Wt|{Wt0 ,Wt1 }),
para indicar que Wt é condicional aos valores finais Wt0 e Wt1 . Agora escrevemos
Wt0 e Wt1 como

Wt = Wt0 + ÿt ÿ t0Xt, Xt ÿ N(0, 1), (2.8.1)


Wt1 = Wt + ÿt1 ÿ tYt, Yt ÿ N(0, 1), (2.8.2)

onde Xt e Yt são variáveis normais independentes.


Combinando as Eqs. (2.8.1) e (2.8.2) temos

Wt1 = Wt0 + ÿt ÿ t0Xt + ÿt1 ÿ tYt

que pode ser reexpressa como

Wt1 ÿ Wt0 = ÿt ÿ t0Xt + ÿt1 ÿ tYt

Usando a propriedade de movimento browniano (iii) na Seção 2.1

Wt1 ÿ Wt0 = ÿt1 ÿ t0Zt, Zt ÿ N(0, 1)


Então

ÿt1 ÿ t0Zt = ÿt ÿ t0Xt + ÿt1 ÿ tYt


Machine Translated by Google

20 Finanças Computacionais Usando C e C#

e
ÿt1 ÿ t0Zt ÿ ÿt ÿ t0Xt
Y(Xt,Zt) = (2.8.3)
ÿt1 ÿ t
Agora P(Wt|{Wt0 ,Wt1 }) = P(Xt|Zt), a distribuição de probabilidade de Xt condicional em
Zt . Da lei de Bayes
1 ÿ Z2t
P(Xt|Zt) =
P(Xt)P(Y(Xt,Zt)) = ÿX2 t + A2t (2.8.4)
exp
P(Zt) ÿ2ÿ 2

Desde Xt , Yt e Zt são gaussianos que podemos escrever


1 ÿ Z2t
P(Xt|Zt) = exp ÿ2ÿ ÿX2 t + A2t (2.8.5)
2

Primeiro vamos calcular Y2


t.
2
Y2 = ÿt1 ÿ t0Zt ÿ ÿt ÿ t0Xt ÿt1
t
ÿt
então

Y2 =
(t1 ÿ t0)Z2 t+ (t ÿ t0)X2 ÿ 2t ÿt1 ÿ t0 ÿt ÿ t0XtZt
t (2.8.6)
t1 ÿ t

t + A2t ÿ Z2 da
Em seguida, calculamos X2 t seguinte forma

x2 t + A2t ÿ Z2t

= (t1 ÿ t0)X2 + (t ÿ t0)Z2 ÿ 2t ÿt1 ÿ t0 ÿt ÿ t0XtZt


t
(2.8.7)
t1 ÿ t

Dividindo o topo e o fundo da Eq. (2.8.7) por t1 ÿ t0 obtemos:


x2 t + A2t ÿ Z2t
X2t + ((t ÿ t0)/(t1 ÿ t0))Z2 ÿ 2 t ÿt1 ÿ t0 ÿt ÿ t0/(t1 ÿ t0)XtZt
=
(t1 ÿ t)/(t1 ÿ t0)
X2t + ((t ÿ t0)/(t1 ÿ t0))Z2 ÿ 2 t ÿ(t ÿ t0)/(t1 ÿ t0)XtZt
=
(t1 ÿ t)/(t1 ÿ t0)
que dá
(Xt ÿ ÿ(t ÿ t0)/(t1 ÿ t0)Zt)2 (t1 ÿ
x2 t + A2t ÿ Z2t = (2.8.8)
t)/(t1 ÿ t0)
onde usamos
2
t - t0 t - t0 t - t0
Xt ÿ Zt = x2 t t1 ÿ t0 Z2 ÿ 2 +
t XtZt
t1 ÿ t0 t1 ÿ t0
Substituindo a Eq. (2.8.8) na Eq. (2.8.5) rende
1
P(Xt|Zt) = exp ÿ2ÿ ÿ(Xt ÿ ÿ(t ÿ t0)/(t1 ÿ t0)Zt)2
2(t1 ÿ t)/(t1 ÿ t0)
Machine Translated by Google

Introdução aos processos estocásticos 21

Portanto P(Xt|Zt) é uma distribuição Gaussiana com:

t - t0 t1 ÿ t
E[Xt] = Zt e Var[Xt] = t1 ÿ t0 t1
ÿ t0

Substituindo por Zt temos

t - t0 t ÿ t0 ÿt1
Wt1
ÿ t0ÿ Wt0
E[Xt] = Zt =
t1 ÿ t0 t1 - t0

que dá:

t - t0
E[Xt] = (Wt1 ÿ Wt0 ) (2.8.9)
t1 - t0

A variável X t = E[Xt] + ÿVar[Xt]Zt tem a mesma distribuição que P(Xt|Zt).


Podemos substituir X t para Xt na Eq. (2.8.1) para obter:

Wt = Wt0 + ÿt ÿ t0 E[Xt] + Var[Xt]Zt

que dá:

t - t0 t1 ÿ t
Wt = Wt0 + ÿt ÿ t0 (Wt1 ÿ Wt0 ) + Zt
t1 - t0 t1 ÿ t0

e simplificando obtemos:

t1 ÿ t0 t ÿ t0 (t1 ÿ t)(t ÿ t0)


Peso = Peso0 + t1 ÿ t0 t1(Wt1
ÿ t0 ÿ Wt0 ) + Zt (2.8.10)
t1 ÿ t0

Variáveis, Wt ,da distribuição de P(Wt|{Wt0 ,Wt1 }) podem, portanto, ser geradas usando

t1 ÿ tt ÿ t0 (t1 ÿ t)(t ÿ t0)


Peso = Peso0 + Wt1 + t1 ÿ t0 Zt (2.8.11)
t1 ÿ t0 t1 - t0

Uma derivação alternativa da ponte browniana é dada no Apêndice G.

2.9 Movimento browniano transformado no tempo

Vamos considerar o movimento browniano:

dWt = ÿ ÿ dt dZt (2.9.1)


e também o movimento browniano escalado e transformado no tempo

YW,t = atWft (2.9.2)

onde o fator de escala, em , é uma função real e a transformação de tempo, ft , é 0; ver


função crescente contínua satisfazendo ft Cox e Miller (1965).
Machine Translated by Google

22 Finanças Computacionais Usando C e C#

Usando o lema de Ito,


ÿYt ÿYt dYW,t
= dt + dWt ÿWt (2.9.3)
ÿt

onde usamos o fato de que ÿ2Yt Da Eq. = 0.


ÿW2
t
(2.9.3)
ÿat
é, t = Wft dt + em dWft (2.9.4)
ÿt

Agora

dWft = dft dZt = pés dt dZt (2.9.5)


t
então podemos escrever:

dYW,t = a tWft dt + em f t dt dZt (2.9.6)

onde
ÿat ÿft
um
t
= ef =
ÿt t ÿt

2.9.1 Movimento browniano escalado

Vamos provar que W t definido por


1
EM = wc2t, c>0,
t
c
é o movimento browniano.
Consideremos o processo

Yt = Wc2t

Da Eq. (2.9.2) temos at = 1, ft = c2t, a esses valores t =0ef t = c2. Substituindo


na Eq. (2.9.6), rende

dYt = c2dt dZt

o que dá dYt

= c ÿ dt dZt = c dWt
Portanto W t = dYt /c é o movimento browniano.

2.9.2 O processo de Ornstein–Uhlenbeck

Mostraremos agora que o processo de Ornstein–Uhlenbeck (ver Seção 2.10) pode ser
representado da seguinte forma:

ÿ2 exp(2ÿt)
YW,t = exp(ÿÿt)Wÿt onde ÿt = ,ÿ> 0 (2.9.7)
2a
Machine Translated by Google

Introdução aos processos estocásticos 23

Prova. Das Eqs. (2.9.2) e (2.9.7) temos:


ÿ2 exp(ÿ2 exp(2ÿt))
ft = e em = exp(ÿ2ÿt) (2.9.8)
2a
Portanto
um
t
= ÿÿÿ exp(ÿÿt) = ÿa (2.9.9)
no
exp(ÿÿt)
e

ft = ÿ2 2ÿ exp(2ÿt) = ÿ2 exp(2ÿt) (2.9.10)


2a
Então

f t dt = ÿ2 exp(2ÿt) = ÿ exp(ÿt)ÿ dt (2.9.11)

Por isso

dYW,t = ÿÿYW,t dt + exp(ÿÿt)ÿ exp(ÿt)ÿ dt dZ (2.9.12)


o que significa que

dYW,t = ÿÿYW,t dt + ÿ dWt (2.9.13)

Da Eq. (2.9.13) pode ser visto que a média e a variância condicionais são

E[dYW,t|Ft] = ÿYW,t dt (2.9.14)


Var[dYW,t|Ft] = ÿ2 dt (2.9.15)

média incondicional

A média incondicional é

E[YW,t] = E exp(ÿÿt)Wÿ2 exp(2ÿt) onde ÿ > 0 e t ÿ ÿ


2a
(2.9.16)
Então

E[YW,t] = 0 (2.9.17)

Variância e covariância incondicional

Deixar

ÿ2 exp(2ÿt)
YW,t = exp(ÿÿt)Wÿt onde ÿt = (2.9.18)
2a
Machine Translated by Google

24 Finanças Computacionais Usando C e C#

ÿ2 exp(2ÿs)
YW,s = exp(ÿÿs)Wÿs onde ÿs = (2.9.19)
2a
A covariância é:

Cov[YW,s,YW,t] = E[YW,tYW,s] ÿ E[YW,t]E[YW,s]


= E[YW,tYW,s] (2.9.20)

uma vez que E[YW,s] = E[YW,t] = 0.


Encurtando a notação de YW,t para Yt , obtemos

Cov[Ys,Yt] = E exp(ÿÿt)Wÿt exp(ÿÿt)Wÿs


= exp ÿÿ(t + s) E {Wÿt Wÿs }

Da Eq. (2.1.2)

E[Ws,Wt] = s ÿ t (2.9.21)

Portanto, se st

E[Wÿt Wÿs ] = Wÿs (2.9.22)


e

exp(ÿÿ(t + s))ÿ2 exp(2ÿs) ÿ2


Cov[S,Yt] = = exp ÿÿ(t ÿ s) 2ÿ (2.9.23)
2a
A variância incondicional (obtida ao definir s = t) é
p2
Var[Yt] = (2.9.24)
2ÿ

2.10 Processo Ornstein-Uhlenbeck


O processo Ornstein-Uhlenbeck é freqüentemente usado para modelar taxas de juros por
causa de sua propriedade de reversão à média. É definido pela equação dXt = ÿÿXt dt + ÿ

dWt (2.10.1)

Usando o fator de integração exp(ÿt) temos:

exp(ÿt) dXt = ÿÿXt exp(ÿt) dt + ÿ exp(ÿt) dWt


então

exp(ÿt) dXt + ÿXt exp(ÿt) dt = ÿ exp(ÿt) dWt (2.10.2)

Usando a regra do produto de Ito temos:

d Xt exp(ÿt) = exp(ÿt) dXt + ÿXt exp(ÿt) dt (2.10.3)


Machine Translated by Google

Introdução aos processos estocásticos 25

Então, das Eqs. (2.10.2) e (2.10.3) obtemos


d Xt exp(ÿt) = ÿ exp(ÿt) dWt (2.10.4)

Integrando a Eq. (2.10.4) dá


s=t s=t
d Xs exp(ÿs) = p exp(ÿs) dWs
s=0 s=0

que rende
s=t
Xt exp(ÿt) ÿ Xt0 = ÿ exp(ÿs) dWs
s=0

e assim a solução da Eq. (2.10.1) é


s=t
Xt = Xt0 exp(ÿÿt) + ÿ exp(ÿÿt) exp(ÿs) dWs (2.10.5)
s=0

Vamos agora derivar expressões tanto para a média incondicional quanto para a
variância incondicional de Xt .

O significativo

Tomando as expectativas de ambos os lados da Eq. (2.10.5) rende


s=t
E[Xt] = E Xt0 exp(ÿÿt) + E ÿ exp(ÿÿt) exp(ÿs) dWs (2.10.6)
s=0

desde
s=t
E ÿ exp(ÿÿt) exp(ÿs) dWs
s=0
s=t
= ÿ exp(ÿÿt)E exp(ÿs) dWs = 0
s=0

a média incondicional é

E[Xt] = Xt0 exp(ÿÿt) (2.10.7)

a variância

Derivar a expressão para variação incondicional requer um pouco mais de esforço.


Nós temos

2
Var[Xt] = E Xt ÿ E[Xt] (2.10.8)

= E Xt ÿ Xt0 exp(ÿÿt)2 No
entanto, da Eq. (2.10.5)
s=t
Xt ÿ Xt0 exp(ÿÿt) = ÿ exp(ÿÿt) exp(ÿs) dWs
s=0
Machine Translated by Google

26 Finanças Computacionais Usando C e C#

Portanto, substituindo a expressão acima na Eq. (2.10.8)


s=t 2
Var[Xt] = E exp(ÿÿt)ÿ exp(ÿs) dWs (2.10.9)
s=0
s=t 2
Var[Xt] = ÿ2 exp(ÿ2ÿt)E exp(ÿs) dWs (2.10.10)
s=0

Usando a isometria de Ito (consulte a Seção 2.12.2)


s=t 2 s=t
E exp(ÿs) dWs =E exp(ÿs)2 ds
s=0 s=0

Em seguida, usando o teorema de Fubini (consulte a Seção 2.12.1)


s=t s=t
E exp(ÿs)2 ds = E exp(ÿs)2 ds
s=0 s=0
s=t
= exp(2ÿs) ds
s=0
s=t
exp(2ÿs)
=
2ÿ
s=0

= exp(2ÿt) ÿ 1
2ÿ
Substituindo o resultado acima na Eq. (2.10.10)

Var[Xt] = ÿ2 exp(ÿ2ÿt)exp(2ÿt) ÿ 1
2a

que produz a seguinte expressão para a variância


1 ÿ exp(ÿ2ÿt)
Var[Xt] = ÿ2 (2.10.11)
2ÿ

As expressões para a média e a variância derivadas nas Eqs. (2.10.7) e (2.10.11)


nos permitem escrever a distribuição de Xt como
1 ÿ exp(ÿ2ÿt)
Xt ÿ N Xt0 exp(ÿÿt),ÿ2 (2.10.12)
2ÿ

que, se Xt0 = 0, se reduz a


1 ÿ exp(ÿ2ÿt)
Xt ÿ N 0,ÿ2 (2.10.13)
2a

A densidade de transição de Xt0 para Xt é:

k
P(Xt|Xt0 ) = exp ÿK(Xt ÿ Xt0 exp(ÿÿ(t 2ÿ t0)))2
2ÿ(1 ÿ ÿ 2) 1ÿc
(2.10.14)
onde K = 2ÿ/ÿ2 e ÿ = exp(ÿÿ(t ÿ t0)).
Machine Translated by Google

Introdução aos processos estocásticos 27

Os caminhos estocásticos de Ornstein-Uhlenbeck podem, portanto, ser simulados usando

1 ÿ exp(ÿ2ÿ dt) dZ
Xt+dt = Xt exp(ÿÿ dt) + p 2ÿ (2.10.15)

Da Eq. (2.10.14) podemos escrever

E[Xt+dt|Xt] = Xt exp(ÿÿ dt)

1 ÿ exp(ÿ2ÿ dt) 2ÿ
Var[Xt+dt|Xt] = ÿ2

Mostraremos agora que no limite dt ÿ 0, a Eq. (2.10.15) se reduz ao processo de Ornstein–


Uhlenbeck dado na Eq. (2.10.1).
Para dt pequeno, podemos fazer uma expansão de primeira ordem das exponenciais na
Eq. (2.10.15) para obter

(1 ÿ (1 ÿ 2ÿ dt)) dZ
Xt+dt = Xt (1 ÿ ÿ dt) + p 2ÿ

então

2ÿ dt
Xt+dt = Xt ÿ Xta dt + ÿ dZ
2a
Portanto

Xt+dt ÿ Xt = ÿÿXt dt + ÿ ÿ dt dZ
qual é

dXt = ÿÿXt dt + ÿ dWt

2.11 A ponte Ornstein-Uhlenbeck


Seja um processo de Ornstein–Uhlenbeck com valor Xt0 no tempo t0 e Xt1 no tempo t1.
Estamos interessados na distribuição de Xt em um ponto intermediário, ou seja, P(Xt|
{Xt0 ,Xt1 }), onde t0 <t<t1.
Mostraremos que Xt é uma Gaussiana com média condicional

1 ÿ exp(ÿ2ÿ(t1 ÿ t)) 1 ÿ
ÿt = Xt0 exp ÿÿ(t ÿ t0) 2
c

1 ÿ exp(ÿ2ÿ(t ÿ t0)) 1 ÿ
+ Xt1 exp ÿÿ(t1 ÿ t) 2 (2.11.1)
c
e variância condicional

(1 ÿ exp(ÿ2ÿ(t ÿ t0)))(1 ÿ exp(ÿ2ÿ(t1 ÿ t)))


Vt = (2.11.2)
2ÿ(1 ÿ exp(ÿ2ÿ(t1 ÿ t0))) onde ÿ = exp(ÿÿ(t1
ÿ t0)).
Machine Translated by Google

28 Finanças Computacionais Usando C e C#

Prova. O processo padrão de Ornstein–Uhlenbeck (ÿ = 1) é definido pelo processo:

dXt = ÿÿXt dt + ÿ dt dZt (2.11.3)

Da Seção 2.10 temos que

1 ÿ exp(ÿ2ÿ(t ÿ t0)) 2ÿ
Xt = Xt0 exp ÿÿ(t ÿ t0) + dZt (2.11.4)

e que a densidade de transição de Xt0 para Xt é

ÿ2ÿ
P(Xt|Xt0 ) =
2ÿ(1 ÿ exp(ÿ2ÿ(t ÿ t0)))

ÿÿ(Xt ÿ Xt0 exp(ÿÿ(t ÿ t0)))2


× exp (2.11.5)
1 ÿ exp(ÿ2ÿ(t ÿ t0))

A densidade conjunta de Xt e Xt1 dado Xt0 é:

P {Xt,Xt1 }|Xt0 = P(Xt1 |Xt)P(Xt|Xt0 ) (2.11.6)

Temos assim:

ÿÿ(Xt ÿ Xt0 exp(ÿÿ(t ÿ t0)))2 (1 ÿ


P {Xt,Xt1 }|Xt0 = ÿ exp
exp(ÿ2ÿ(t ÿ t0))) ÿÿ(Xt1 ÿ Xt

exp(ÿÿ(t1 ÿ t)))2
× exp
1 ÿ exp(ÿ2ÿ(t1 ÿ t))
onde
1 2a
k=
2p (1 ÿ exp(ÿ2ÿ(t ÿ t0)))(1 ÿ exp(ÿ2ÿ(t1 ÿ t)))

A distribuição de Xt dado Xt0 e Xt1 , P(Xt|Xt0 ,Xt1 ) é:

P({Xt,Xt1 }|Xt0 )
P Xt|{Xt0 ,Xt1 } = (2.11.7)
P(Xt1 |Xt0 )
onde

ÿ2ÿ
P(Xt1 |Xt0 ) =
2ÿ(1 ÿ exp(ÿ2ÿ(t1 ÿ t0)))

ÿÿ(Xt1 ÿ Xt0 exp(ÿÿ(t1 ÿ t0)))2


× exp (2.11.8)
1 ÿ exp(ÿ2ÿ(t1 ÿ t0))

Depois de alguma álgebra, podemos reexpressar a Eq. (2.11.7) como

a
P Xt|{Xt0 ,Xt1 } = exp{A} (2.11.9)
ÿÿt
Machine Translated by Google

Introdução aos processos estocásticos 29

onde

A= - a (B1 + B2 ÿ B3) ÿ

B1 = X2 t + X2t0 exp ÿ2ÿ(t ÿ t0) ÿ 2XtXt0 exp ÿÿ(t ÿ t0) 1 ÿ

exp(ÿ2ÿ(t1 ÿ t)) 1 ÿ ÿ
× (2.11.10)
2

B2 = X2 t1 + X2t exp ÿ2ÿ(t1 ÿ t) ÿ 2XtXt1 exp ÿÿ(t1 ÿ t) 1 ÿ

exp(ÿ2ÿ(t ÿ t0)) 1 ÿ ÿ
× (2.11.11)
2

B3 = X2 t1 + X2t0 exp ÿ2ÿ(t1 ÿ t0) ÿ 2Xt1Xt0 exp ÿÿ(t1 ÿ t0) 1 ÿ

exp(ÿ2ÿ(t1 ÿ t)) (1 ÿ ÿ 2)2


× 1 ÿ exp ÿ2ÿ(t ÿ t0) (2.11.12)

(1 ÿ exp(ÿ2ÿ(t ÿ t0)))(1 ÿ exp(ÿ2ÿ(t1 ÿ t))) ÿt = 1 ÿ


exp(ÿ2ÿ(t1 ÿ t0))

ÿ = exp ÿÿ(t1 ÿ t0)

Vamos supor agora que P(Xt|{Xt0 ,Xt1 }) é uma distribuição normal com média condicional
ÿt e variância condicional Vt . Temos assim: ÿ(Xt ÿ ÿt)2
1
P Xt|{Xt0 ,Xt1 } = exp ÿ2ÿVt (2.11.13)
Equacionando 2 Vt

as Eqs. (2.11.7) e (2.11.13)


1 2 1
ÿ

(Xt ÿ ÿt) =ÿ
X2t ÿ ÿ2t ÿ 2Xtÿt
2 Vt 2Vt
= ÿa (B1 + B2 ÿ B3) ÿ (2.11.14)

A variância condicional Vt pode ser obtida observando que:


1 a
=
2 Vt ÿt
e, portanto:
Phi
Vt = (2.11.15)
2ÿ

então substituindo ÿ na Eq. (2.11.15) obtemos a seguinte expressão para a variância


condicional:
(1 ÿ exp(ÿ2ÿ(t ÿ t0)))(1 ÿ exp(ÿ2ÿ(t1 ÿ t))) ÿt
Vt = =
1 ÿ exp(ÿ2ÿ(t1 ÿ t0)) 2a
Machine Translated by Google

30 Finanças Computacionais Usando C e C#

A média condicional pode ser obtida observando que Xt0 e Xt1 são constantes e os
coeficientes de Xt e X2 na Eq. (2.11.14)
t deve ser o mesmo. comparando
coeficientes de Xt temos assim:

1 ÿ exp(ÿ2ÿ(t1 ÿ t)) 1 ÿ
ÿ2ÿt = ÿ2Xt0 exp ÿÿ(t ÿ t0) 2
ÿ 1 ÿ exp(ÿ2ÿ(t
ÿ t0)) 1 ÿ ÿ
ÿ 2Xt1 exp ÿÿ(t1 ÿ t) 2

Portanto, a média condicional ÿt é:

1 ÿ exp(ÿ2ÿ(t1 ÿ t)) 1 ÿ
ÿt = Xt0 exp ÿÿ(t ÿ t0) 2
ÿ 1 ÿ exp(ÿ2ÿ(t
ÿ t0)) 1 ÿ ÿ
+ Xt1 exp ÿÿ(t1 ÿ t) 2

Isso completa a prova.

Relação com a ponte browniana

Vamos agora provar que no limite (t1 ÿ t0) ÿ 0 obtém-se o resultado da ponte browniana.

Para a média condicional, temos:

1 ÿ exp(ÿ2ÿ(t1 ÿ t)) 1 ÿ
ÿ = Xt0 exp ÿÿ(t ÿ t0) 2
ÿ 1 ÿ exp(ÿ2ÿ(t
ÿ t0)) 1 ÿ ÿ
+ Xt1 exp ÿÿ(t1 ÿ t) 2

onde:

ÿ = exp ÿÿ(t1 ÿ t0)


qual é:

exp(ÿÿ(t ÿ t0)) ÿ exp(ÿ2ÿ(t1 ÿ t)) 1 ÿ


ÿ = Xt0
exp(ÿ2ÿ(t1 ÿ t0) ÿ ÿ(t ÿ t0)) exp(ÿÿ(t1 ÿ
t)) ÿ exp(ÿ2ÿ(t ÿ t0) ÿ ÿ(t1 ÿ t)) 1 ÿ exp(ÿ2ÿ(t1 ÿ t0))
+ Xt1

Para t1 ÿ t0 pequenos, tanto t1 ÿ t quanto t ÿ t0 são pequenos, então:

1 ÿ ÿ(t ÿ t0) ÿ {1 ÿ 2ÿ(t1 ÿ t) ÿ ÿ(t ÿ t0)} 1 ÿ {1 ÿ


ÿ ÿ Xt0
2ÿ(t1 ÿ t0)}
1 ÿ ÿ(t1 ÿ t) ÿ {1 ÿ 2ÿ(t ÿ t0) ÿ ÿ(t1 ÿ t)} 1 ÿ {1 ÿ
+ Xt1
2ÿ(t1 ÿ t0)}

que produz o resultado da ponte browniana para a média condicional:


t1 ÿ t0 t ÿ t0 ÿ ÿ Xt0
+ Xt1
t1 ÿ t0 t1 ÿ t0
Machine Translated by Google

Introdução aos processos estocásticos 31

Para a variância condicional:

(1 ÿ exp(ÿ2ÿ(t ÿ t0)))(1 ÿ exp(ÿ2ÿ(t1 ÿ t)))


Vt =
2ÿ(1 ÿ exp(ÿ2ÿ(t1 ÿ t0)))

Para t1 ÿ t0 pequenos, tanto t1 ÿ t quanto t ÿ t0 são pequenos, então podemos escrever:

(1 ÿ {1 ÿ 2ÿ(t ÿ t0)})(1 ÿ {1 ÿ 2ÿ(t1 ÿ t)}) 2ÿ(1 ÿ


Em ÿ
{1 ÿ 2ÿ(t1 ÿ t0)})

que produz o resultado da ponte browniana para a variância condicional:

(t ÿ t0)(t1 ÿ t)
Vt ÿ
t1 - t0

2.12 Outros resultados úteis

2.12.1 Teorema de Fubini

O teorema de Fubini afirma que (para funções bem comportadas) o valor de uma
integral multidimensional é independente da ordem na qual a integral é calculada.
Por exemplo, a integral bidimensional da função f (X,Y) pode ser avaliada como:

b d d b

f (X,Y) dX dY = f (X,Y) dX dY
X=a Y=c Y=c X=a

b d
= f (X,Y) dY dX
X=a Y=c

Usaremos principalmente esse resultado na forma:


t t
E f (W,s) ds = E f (W,s) ds (2.12.1)
s=0 s=0

Desde
ÿ

Ef (W,s) = P(W,s)f (W,s)dW


ÿÿ

onde P(W,s) é a função de densidade de probabilidade de f(W,s), podemos então escrever a


Eq. (2.12.1) na íntegra como:

ÿ t

P(W,s)f (W,s) ds dW
W=ÿÿ s=0
t ÿ

= P(W,s)f (W,s) dW ds
s=0 W=ÿÿ
Machine Translated by Google

32 Finanças Computacionais Usando C e C#

2.12.2 Isometria de Ito O

valor esperado da integral da função bem comportada f (Wt,t) satisfaz:


tb
2 tb
E f (Ws,s) dWs =E f (Ss,s)2 ds (2.12.2)
s=ta s=ta

Prova. Primeiramente usamos a seguinte aproximação:


nÿ1
s=tb
f (W,s) dWs = f (Wti,ti){Wti+1 ÿ Wti}
s=ta i=0

onde a<t0 < t1 < ··· < tn < tb e ti+1 ÿ ti = dt. Assim, a integral do lado esquerdo da Eq. (2.12.2)
é:
tb
2
f (Ws,s) dWs
s=ta
nÿ1 nÿ1

= f (Wti,ti)f (Wtj ,tj ){Wti+1 ÿ Wti}{Wtj+1 ÿ Wtj } (2.12.3)


i=0 j=0

Tomando as expectativas da Eq. (2.12.3) obtemos:


tb
2
E f (Ws,s) dWs
s=ta
nÿ1 nÿ1

=E f (Wti,ti)f (Wtj ,tj ){Wti+1 ÿ Wti}{Wtj+1 ÿ Wtj } (2.12.4)


i=0 j=0

o que significa que:


tb
2
E f (Ws,s) dWs
s=ta
nÿ1 nÿ1

= f (Wti,ti)f (Wtj ,tj )E {Wti+1 ÿ Wti}{Wtj+1 ÿ Wtj } (2.12.5)


i=0 j=0

No entanto, da propriedade de movimento browniano (iii) na Seção 2.1, temos: E

{Wti+1 ÿ Wti}{Wtj+1 ÿ Wtj } = 0 quando i = j e dt quando i = j Portanto, a Eq.


(2.12.5) pode ser reescrita como:
2 nÿ1
tb
E f (Ws,s) dWs = f (Wti,ti) 2 dt
s=ta i=0

que significa:
tb
2 tb
E f (Ws,s) dWs =E f (Ss,s)2 ds
s=ta s=ta
Machine Translated by Google

Introdução aos processos estocásticos 33

2.12.3 Expectativa de uma integral estocástica


Se f(t) é uma função determinística do tempo então
s=b
E f(s) dWs = 0 (2.12.6)
s=a

Prova. Primeiro expressamos a integral (2.12.6) pelo seguinte somatório:


nÿ1
s=tb
f(s) dWs = f (ti){Wti+1 ÿ Wti},
s=ta i=0

onde a<t0 < t1 < ··· < tn < tb

Tomando as expectativas da equação acima, obtém-se:


s=b nÿ1

E f(s) dWs = E f (ti){Wti+1 ÿ Wti}


s=a
i=0

nÿ1

= f (ti)E[Wti+1 ÿ Wti]
i=0

=0

onde usamos E[Wti+1 ÿWti] = 0, que é a propriedade de movimento browniano (iii) na Seção
2.1.

2.13 Problemas selecionados

Nesta seção, fornecemos vários problemas que testam a compreensão do leitor sobre cálculo
estocástico. As respostas são dadas no apêndice no final do livro.

Problema 1 (Problema 4.5, Øksendal (2003)). Seja ÿk = E[Wk t ],k = 0, 1, 2,...,


t 0, onde Wt0 = 0.
t (a) Mostre usando a fórmula de Ito para k = 2, 3, 4,..., que:

ÿkt = 1 (k ÿ 1) ÿkÿ2
s ds
2 s=0

(b) Deduza que E[W4 ] = t3t2 (c) O


que é E[W6 ]? t

Problema 2 (Problema 5.4(ii), Øksendal (2003)). Resolva a equação diferencial estocástica:

dXt = Xt dt + dWt
Machine Translated by Google

34 Finanças Computacionais Usando C e C#

Problema 3 (Problema 5.4(iii), Øksendal (2003)). Resolva a equação diferencial estocástica:


dXt = ÿXt dt + exp(ÿt) dWt

Problema 4 (Problema 4.2, Øksendal (2003)). Use a fórmula de Ito para provar que
1 t
W2s dWs = 3 W3 ÿ

Ws ds
t
s=0 s=0

onde Wt0 = 0.

Problema 5 (Problema 5.6, Øksendal (2003)). Resolva: dYt = r


dt + ÿYt dWt

onde r e ÿ são constantes reais. Use o fator de integração Ft = exp(ÿÿWt + (ÿ2/2)t).

Problema 6 (Problema 5.7, Øksendal (2003)). O processo Ornstein– Uhlenbeck de reversão


média é a solução Xt da equação diferencial estocástica: dXt = (m ÿ Xt) dt + ÿ dWt

onde m e ÿ são constantes.

(a) Resolva esta equação


(b) Encontre E[Xt] e Var[Xt] = E[{Xt ÿ E[Xt]}2].

Problema 7. Considere a equação dSt = ÿtSt dt +ÿtSt dWt onde o valor de St no tempo t = 0 é
denotado por S0.

(a) Mostre que a média é:


t
ÿ2t
E log(St) = log(S0) + mt ÿ
dÿ
ÿ=0
2

(b) Mostre que a variância é:


t
Onde log(St) = p2 dt
t
ÿ=0

Problema 8. Prove que se ÿ = exp(tWt) então t2 dÿ =


ÿ Wt + 2
dt + tÿ dWt

Problema 9 (Problema 4.4, Øksendal (2003)). Definir:


t 1 t
2
Zt = exp ÿs dWs ÿ eu ds
s
s=0
2 s=0

Use a fórmula de Ito para provar que


dZt = Zt ÿt dWt
Machine Translated by Google

Introdução aos processos estocásticos 35

Problema 10. Seja St = S0 exp(ÿt + ÿWt) onde ÿ e ÿ são constantes.

(a) Mostre pelo lema de Ito que:


ÿ2 dSt =
ÿ+ St dt + ÿSt dWt
2

(b) Mostre que:


t
p2
E[St] ÿ E[S0] = ÿ + ES(t)dt
2 ÿ=0

(c) Mostre que:


p2
E[St] = S0 exp ÿt + t
2

Problema 11 (Problema 4.3, Øksendal (2003)). Sejam Xt,Yt processos estocásticos.


Prove que:

d(XtYt) = Xt dYt + Yt dXt + E[dXt dYt]

Deduza a seguinte fórmula geral de integração por partes:


t t t

Xs dYs = XtYt ÿ Xt0Yt0 ÿ Sim dXs ÿ E[dXs dYs]


s=0 s=0 s=0
Machine Translated by Google

páginaEsta intencionalmente em brancoesquerda


Machine Translated by Google

3 Geração de variáveis aleatórias


3.1 Introdução

A simulação de Monte Carlo e a geração de números aleatórios são técnicas amplamente


utilizadas na engenharia financeira como forma de avaliar o nível de exposição ao risco.
Aplicações típicas incluem a precificação de derivativos financeiros e geração de cenários
no gerenciamento de portfólio. De fato, muitas das aplicações financeiras que usam a
simulação de Monte Carlo envolvem a avaliação de várias integrais estocásticas
relacionadas às probabilidades de ocorrência de eventos específicos.

Em muitos casos, no entanto, as suposições de volatilidade constante e uma


distribuição lognormal para ST são bastante restritivas. Aplicações financeiras reais
podem requerer uma variedade de extensões ao modelo Black-Scholes padrão. Os
requisitos comuns são para: distribuições não lognormais, volatilidades variáveis no
tempo, limites, pisos, barreiras, etc. Nessas circunstâncias, muitas vezes não há uma
solução de forma fechada para o problema. A simulação de Monte Carlo pode fornecer
um meio muito útil de avaliar as integrais necessárias.
Quando avaliamos a integral de uma função, f (x), no cubo unitário s-dimensional, I S,
pelo método de Monte Carlo, estamos de fato calculando a média da função em um
conjunto de pontos amostrados aleatoriamente. Isso significa que cada ponto soma
linearmente à soma acumulada que se tornará a integral e também linearmente à soma
acumulada dos quadrados que se tornará a variância da integral.

Quando há N pontos amostrais, a integral é:


N
1
n= em alguns
N
i=1

onde ÿ é usado para denotar a aproximação da integral e x1,x2,...,xN são os pontos


amostrais N, s-dimensionais. Se um gerador de números pseudoaleatórios for usado, os
pontos xi serão (deveriam ser) distribuídos de forma independente e idêntica. A partir dos
resultados estatísticos padrão, podemos estimar o erro esperado da integral da seguinte
forma:
Se definirmos ÿi = f (xi ), então, como xi é distribuído de maneira independente e
idêntica, ÿi também é distribuído de maneira independente e idêntica. A média de ÿi é ÿ e nós
Machine Translated by Google

38 Finanças Computacionais Usando C e C#

denotará a variância como Var[ÿi ] = ÿ2. É uma propriedade estatística bem conhecida que a
variância de ÿ é dada por Var[ÿ] = Nÿ1ÿ2 (ver Apêndice E.1 para mais detalhes). Podemos,
portanto, concluir que a integral estimada ÿ tem um erro padrão de Nÿ1/2ÿ. Isso significa que o
erro estimado da integral diminuirá na taxa de Nÿ1/2.

É possível alcançar uma convergência mais rápida do que isso se os pontos amostrais
forem escolhidos para ficarem em uma grade cartesiana. Se amostrarmos cada ponto da grade
exatamente uma vez, o método de Monte Carlo efetivamente se torna um esquema de
quadratura determinístico, cujo erro fracionário diminui na taxa de Nÿ1 ou mais rápido. O
problema com a abordagem da grade é que é necessário decidir com antecedência o quão fino
deve ser, e todos os pontos da grade precisam ser usados. Portanto, não é possível amostrar
até que algum critério de convergência seja atendido.
As sequências numéricas quase aleatórias procuram preencher a lacuna entre a flexibilidade
dos geradores de números pseudoaleatórios e as vantagens de uma grade regular.
Eles são projetados para ter um alto nível de uniformidade no espaço multidimensional, mas
ao contrário dos números pseudo-aleatórios, eles não são estatisticamente independentes.

3.2 Sequências pseudo-aleatórias e quase-aleatórias

Aqui consideramos a geração de sequências multidimensionais pseudoaleatórias e quase


aleatórias para aproximar a distribuição uniforme multidimensional no intervalo [0, 1], que é a
distribuição U(0, 1).
Números quase aleatórios também são chamados de sequências de baixa discrepância. A
discrepância de uma sequência é uma medida de sua uniformidade e é definida da seguinte
forma: Dado um conjunto de pontos x1,x2,...,xN ÿ I Sfunção
e um subconjunto
de contagemGSN ÿ I (G
S, defina
) comoao
número de pontos xi ÿ G. Para cada x = (x1,x2,...,xs) ÿ I S, seja Gx a região s-dimensional
retangular Gx = [0,x1) × [0,x2 ) ×···×[0,xs), com volume x1,x2,...,xn. Então a discrepância dos
pontos x1,x2,...,xN é dada por:

DÿN x1,x2,...,xN = sup SN (Gx ) ÿ Nx1x2,...,xs


xÿI S

A discrepância é, portanto, calculada comparando-se o número real de pontos de amostragem


em um determinado volume de espaço multidimensional com o número de pontos de
amostragem que deveriam existir assumindo uma distribuição uniforme.
Pode-se mostrar que a discrepância dos primeiros termos da sequência quasi-aleatória tem
a forma: x1,x2,...,xN CS(log N)S + O (log N)Sÿ1
DÿN

para todo N 2.
O principal objetivo na construção de sequências de baixa discrepância é, portanto, encontrar
sequências nas quais a constante seja a menor possível. Várias sequências foram construídas
para atingir esse objetivo. Aqui consideramos as seguintes sequências quase aleatórias:
Niederreiter, Sobol e Faure.
Machine Translated by Google

Geração de variáveis aleatórias 39

Os resultados do uso de vários geradores de números aleatórios são mostrados abaixo.


As Figuras 3.1–3.3 ilustram a uniformidade visual das sequências. eles eram cre

Figura 3.1 Diagrama de dispersão formado por mil pontos de uma sequência pseudo-
aleatória U(0, 1) de 16 dimensões. Para cada ponto, o componente de 4ª dimensão é
plotado contra o componente de 5ª dimensão.

Figura 3.2 O diagrama de dispersão formado por mil pontos de uma sequência de Sobol
U(0, 1) de 16 dimensões. Para cada ponto, o componente de 4ª dimensão é plotado
contra o componente de 5ª dimensão.
Machine Translated by Google

40 Finanças Computacionais Usando C e C#

Figura 3.3 O diagrama de dispersão formado por mil pontos de uma sequência
Niederreiter U(0, 1) de 16 dimensões. Para cada ponto, o componente de 4ª dimensão
é plotado contra o componente de 5ª dimensão.

gerado pela geração de mil pontos de amostragem U(0, 1) de 16 dimensões e, em seguida,


plotando o componente de 4ª dimensão de cada ponto em relação ao seu componente de 5ª
dimensão.
Na Fig. 3.1, pode ser visto que a sequência pseudo-aleatória exibe agrupamento de pontos, e
há regiões sem nenhum ponto.
Inspeção visual das Figs. 3.2 e 3.3 mostra que tanto o Sobol quanto o Nieder
sequências quasi-aleatórias repetidas parecem cobrir a área de maneira mais uniforme.
É interessante notar que a sequência de Sobol parece ser uma rede estruturada que ainda
possui algumas lacunas. A sequência de Niederreiter, por outro lado, parece ser mais irregular e
cobre melhor a área. No entanto, não podemos concluir automaticamente que a sequência de
Niederreiter é a melhor. Isso ocorre porque não consideramos todos os outros pares de dimensões
possíveis.
Talvez a maneira mais fácil de avaliar as sequências de números aleatórios seja usá-las para
calcular uma integral.
Na Fig. 3.4 são apresentados os resultados de Monte Carlo para o cálculo da integral de 6
dimensões:
1 1 1 1 1 1 6
eu = cos(ixi) dx1 dx2 dx3 dx4 dx5 dx6
0 0 0 0 0 0
i=1

O valor exato dessa integral é:


6
eu = pecado (eu)

i=1

que para i = 6, dá I = ÿ0,0219.


Machine Translated by Google

Geração de variáveis aleatórias 41

Figura 3.4 Integração de Monte Carlo usando números aleatórios.

Pode-se ver que a sequência pseudoaleatória apresenta o pior desempenho.


Mas à medida que o número de pontos aumenta, sua aproximação da integral
melhora. Das sequências quase aleatórias, pode-se ver que a sequência de Faure
tem o pior desempenho, enquanto ambas as sequências de Sobol e Neiderreiter
fornecem convergência rápida para a solução.
A literatura financeira contém muitas referências aos benefícios do uso de
números quase aleatórios para computar importantes integrais financeiros. Por
exemplo, Brotherton-Ratcliffe (1994) discute o uso de sequências de Sobol para a
avaliação de opções de ações com média geométrica e fornece resultados que
mostram que o erro de precificação da raiz quadrada média obtido usando números
quase aleatórios é consideravelmente menor do que calculados com números pseudo-
aleatórios. Outra aplicação financeira de números quasi-aleatórios é a precificação
eficiente de títulos garantidos por hipotecas, Caflisch, Morokoff e Owen (1997). Aqui,
as técnicas de ponte browniana são empregadas para reduzir a dimensão efetiva do
problema e, assim, fornecer maior precisão de precificação do que se fossem usados
números pseudo-aleatórios.

3.3 Geração de distribuições multivariadas:


variáveis independentes

Nesta seção, mostramos como gerar distribuições multivariadas que contêm variáveis
independentes; ou seja, as variáveis têm correlação zero.
Machine Translated by Google

42 Finanças Computacionais Usando C e C#

3.3.1 Distribuição normal

A distribuição mais fundamental é a distribuição normal padrão univariada, N(0, 1), com
média zero e variância unitária. No caso de variáveis independentes p, isso assume a forma
de uma distribuição normal independente variável p N(0,Ip) com média zero e matriz de
covariância unitária p × p Ip.
Primeiro citaremos um resultado referente a funções de densidade de probabilidade
multivariadas; ver Press, Teukolsky, Vetterling e Flannery (1992). Se x1,x2,... são variáveis
aleatórias com uma função de densidade de probabilidade conjunta p(x1,x2,...), e se há um
número igual de variáveis y y1,y2,... que são funções de os x's, então a função de densidade
de probabilidade conjunta das variáveis y, p(y1,y2,...), é dada pela seguinte expressão:

p(y1,y2,...) dy1 dy2,... = p(x1,x2,...)Jx,y dy1 dy2,... (3.3.1)

onde Jx,y é o determinante jacobiano dos x's em relação aos y's.


Uma aplicação importante deste resultado é a transformação Box-Muller na qual uma p
distribuição normal independente N(0,Ip) é gerada a partir de uma p distribuição uniforme
variável U(0, 1); ver Box e Muller (1958).
Vamos agora descrever como o método funciona.
Considere duas variáveis N(0, 1) distribuídas independentemente x e y, e use o
transformação polar para obter:

x = r cos ÿ, y = r sen ÿ, e r2 = x2 + y2 (3.3.2)

Da Eq. (3.3.1) as funções conjuntas de densidade de probabilidade f (r,ÿ) ef (x,y) obedecem à


equação

f (r,ÿ) dr dÿ = f (x,y)Jxy,rÿ dr dÿ

onde está o jacobiano

cos ÿ sen ÿ ÿr
Jxy,rÿ = =r
sen ÿ r cos ÿ

Nós, portanto, temos

f (r,ÿ) = rf (x,y) (3.3.3)

Além disso, como x e y são independentes N(0, 1)

f(x,y) = f(x)f(y)

onde

eÿx2/2 eÿy2/2
f(x) = ÿ2ÿ e f (y) = ÿ2ÿ

Portanto:

eÿx2/2
eÿy2/2 f (r,ÿ) = rf (x)f (y) = r ÿ2ÿ ÿ2ÿ
Machine Translated by Google

Geração de variáveis aleatórias 43

que dá
r 1
f(r,ÿ) = 2ÿ e(ÿx2+y2)/2 = (3.3.4)
2ÿreÿr2/2 = f (ÿ) f (r)

onde f (ÿ) = 1/(2ÿ), f (r) = reÿr2/2 são funções de densidade de probabilidade independentes
ções.
As funções de distribuição de probabilidade cumulativa correspondentes F(ÿ) e
F(r) podem ser encontradas avaliando as seguintes integrais:
1 eu
eu

F(ÿ) = dÿ =
2ÿ 0
2ÿ

e
r
F(r) = reÿr2/2 dr = ÿeÿr2/2r = 1 ÿ eÿr2/2
0
0

Agora queremos desenhar as variáveis rˆ e ÿˆ das distribuições de probabilidade f


(r) ef (ÿ) respectivamente. Para fazer isso, usaremos o resultado (ver, por exemplo,
Evans, Hastings e Peacock (2000)), de que uma variável uniforme u¯, da distribuição
U(0, 1) pode ser transformada em uma variável v¯ da distribuição f (v) usando v¯ =
F ÿ1(u)¯ ou equivalentemente F(v)¯ =a ¯u.
, desenhando primeiro As variáveis
variável v¯ u¯
uniforme são, portanto,
e depois encontradas
encontrando o
valor de v que torna a função de distribuição cumulativa F(v) igual a u¯. são de U(0,
1), então as variáveis rˆ e ÿˆ = F(r)ˆ = 1 ÿ eÿˆr2/2, e V que satisfazem V distribuições
eV
Portanto, se varia V 1 2 f (r) ef (ÿ) respectivamente. ˆ
1 2 = F(ÿ)ˆ = ÿ/( 2ÿ) são do

Por conveniência, definiremos as variáveis U(0, 1)

V1 = 1 ÿ V 1
= eÿˆr2/2 e V2 = V 2

Então nós temos:

ÿˆ
V1 = eÿˆr2/2, V2 =
2ÿ
e
ÿˆr2
log V1 = , rˆ = (ÿ2 log V1) 1/2, e ÿˆ = 2ÿV2
2

Como rˆ é da mesma distribuição que r e ÿˆ é da mesma distribuição que ÿ, podemos


usar

log V1 = ÿr2/2, r = (ÿ2 log V1) 1/2, e ÿ = 2ÿV2

Substituindo esses resultados na Eq. (3.3.2) dá


1/2 2ÿV2 y = (-2 log 1/2
V1) sen (3.3.5)
x = (ÿ2 log V1) cos 2ÿV2,

onde x e y são N(0, 1).


Machine Translated by Google

44 Finanças Computacionais Usando C e C#

O método Box-Muller está contido na Eq. (3.3.5), que mostra que as N(0, 1) variáveis
são geradas em pares a partir das variáveis uniformes U(0, 1) V1 e V2.

Como as variáveis N(0, 1) são criadas duas por vez, se quisermos gerar uma
distribuição normal com um número ímpar de dimensões, nodd, é necessário gerar nodd
+ 1 dimensões e descartar uma das dimensões.
É fácil modificar a Eq. (3.3.5) para que possamos especificar as médias e variâncias
das variáveis x e y; isso é feito da seguinte forma:

1/2 x = ÿ1(ÿ2 log V1) cos 2ÿV2 + ÿ1,


(3.3.6)
y = ÿ2(ÿ2 log V1) 1/2 sen 2ÿV2 + ÿ2

onde as distribuições de x e y são agora e y ÿ N

x ÿ N ÿ1,ÿ2 1 ÿ2,ÿ2 2

O trecho de código 3.1 ilustra como gerar variáveis normais quase aleatórias com médias
e desvios padrão fornecidos.

long Quasi_Normal_Independent(long fcall, long seq, double xmean[], double std[],


long idim, double quasi[])
{
/* Parâmetros de entrada:
===================
fcall - se fcall == 1 então é uma chamada de inicialização, se fcall == 0 então é uma
chamada de continuação
sequência - se seq == 0 então uma sequência de Faure, se seq == 1 então uma sequência de Niederreiter, se seq == 2 então uma sequência
de Sobol xmean[] - as médias das variáveis normais independentes std[] idim

- os desvios padrão das variáveis normais independentes - o número de variáveis normais


independentes, idim deve ser inferior a 40

Parâmetros de saída:
==================

quasi[] - os elementos quasi[0], .. quasi[idim-1] contêm as variáveis normais independentes


*/

longo ierr, i, j; duplo twopi,


v1, v2, pi; longo ind1, ind2; #define
QUASI(I) quasi[(I)-1] #define STD(I)
std[(I)-1] #define XMEAN(I) xmean[(I)-1]

if ((idim / 2) * 2 != idim) { printf("Erro na entrada,


idim não é um número par: idim = %ld\n" ,idim); retornar 1; } else if (idim > 40) { printf("Na entrada, idim > 40: idim =
%ld\n" ,idim); retornar 1;

} for (i = 1; i <= idim; ++i) { if (STD(i) <= 0,0) {

printf("Na entrada, o desvio padrão não é maior que zero: STD(%ld) = %12.4f\n" ,i,STD(i)); retornar 1;

} pi = 4,0*atan(1,0);

Trecho de código 3.1 Gerando variáveis normais quase aleatórias usando a transformação
Box-Muller.
Machine Translated by Google

Geração de variáveis aleatórias 45

if (fcall) { /* primeira chamada para inicialização */


if (seq == 0) {
Generate_Faure_Sequence(fcall, idim, &QUASI(1));

} senão if (seq == 1) {
Generate_Niederreiter_Sequence(fcall, idim, &QUASI(1));

} senão if (seq == 2) {
Generate_Sobol_Sequence(fcall, id, &QUASI(1));
}
} else { /* uma chamada de continuação */ if (seq == 0) {

Generate_Faure_Sequence(fcall, idim, &QUASI(1));

} senão if (seq == 1) {
Generate_ Niederreiter_Sequence(fcall, idim, &QUASI(1));

} senão if (seq == 2) {
Generate_Sobol_Sequence(fcall, id, &QUASI(1));

} for (i = 1; i <= idim/2; ++i) { /* gera as variáveis normais */ ind1 = i * 2 - 1; ind2 = i * 2; twopi = pi * 2,0; v1 =
sqrt(log(QUASI(ind1)) * -2,0); v2 = twopi * QUASI(ind2); QUASI(ind1) = XMEAN(ind1) + STD(ind1) * v1
* cos(v2); QUASI(ind2) = XMEAN(ind2) + STD(ind2) * v1 * sin(v2);

} retorna 0;
}

Trecho de código 3.1 (continuação).

3.3.2 Distribuição lognormal


A distribuição lognormal pode ser gerada a partir da distribuição normal
discutida na seção anterior por meio de uma transformação simples. Se y ÿ
N(ÿ, ÿ2) ey = log(x) então x = exp(y), e dizemos que a variável x tem a distribuição
lognormal (ÿ,ÿ2).
A função de densidade lognormal é:
1
ÿ(log x ÿ ÿ)2 (3.3.7)
f(x) = exp
xÿ(2ÿ)1/2 2x2

Se zi,i = 1,...,p, são variáveis normais independentes N(ÿi,ÿ2 ), i = 1,...,p, então variáveis eu

lognormais i,i = 1,...,p, podem ser gerado usando a transformação:


eu
= exp(zi), i = 1,...,p, (3.3.8)
onde a média da i-ésima variável lognormal é
p2
eu

E[xi]= mi = exp ÿi + (3.3.9)


2
e a variância é

Var[xi] = s2 = exp 2ÿi + ÿ2 ÿ2 i exp


eu eu ÿ1 (3.3.10)
A razão entre a variância e a média ao quadrado é, portanto,
s2
i
p2
2 = exp eu ÿ1 (3.3.11)
m¯ i
Machine Translated by Google

46 Finanças Computacionais Usando C e C#

ou equivalente
s2
ÿ2 i = log 1 + 2 m¯ i (3.3.12)
eu

Uma distribuição lognormal consistindo de p variáveis independentes com médias m¯ i,i =


1,...,p, e variâncias s2 ,i = 1,...,p, pode ser gerada usando o seguinte procedimento.
eu

Primeiro, gere as p variáveis normais independentes:

zi ÿ N ÿi,ÿ2 eu , i = 1,...,p,

onde

ÿ2eu

ÿi = log(m¯ i) ÿ (3.3.13)
2
e
s2
ÿ2 i = log 1 + 2 m¯ i (3.3.14)
eu

Em seguida, crie as variáveis lognormais independentes usando

eu = exp(zi), i = 1,...,p

3.3.3 Distribuição t de Student

Se St(ÿ, ÿ) representa a distribuição t de Student com média ÿ e número de graus de


liberdade ÿ, então a variável X ÿ St(0,ÿ) pode ser gerada da seguinte forma:
COM

Xÿ (3.3.15)
ÿY/n

onde Z ÿ N(0, 1), e Y ÿ ÿ2 . A variância


n de X é:
n
E X2 = ÿ
ÿ2

Varia X de uma distribuição t de Student com ÿ graus de liberdade com média ÿ e


variância s pode ser gerada modificando a Eq. (3.3.15) da seguinte forma:
s1/2 COM

X ÿ ÿ + ÿÿ/ (3.3.16)
(ÿ ÿ 2) ÿY/ÿ

A função de densidade de probabilidade, f (x), para X é:


ÿ(n+1)/2
((ÿ + 1)/2)(ÿ ÿ 2)ÿ1/2sÿ1/2 (x ÿ m)2
f (x) = 1+ (3.3.17)
ÿ1/2(ÿ/2) s(n ÿ 2)
onde v > 2.
Machine Translated by Google

Geração de variáveis aleatórias 47

3.4 Geração de distribuições multivariadas: variáveis


correlacionadas

Nesta seção mostraremos como gerar variáveis a partir de uma distribuição multivariada
com uma média conhecida e uma dada covariância ou matriz de correlação. Os métodos
descritos para matrizes de covariância também são aplicáveis a matrizes de correlação,
embora neste caso as variáveis geradas sejam normalizadas para ter variância unitária.

3.4.1 Estimativa de correlação e covariância

Aqui mostramos como obter uma matriz de correlação válida Cr ou matriz de covariância C
a partir de dados históricos de mercado.
Seja X uma matriz de dados n por p, com as entradas na i-ésima linha correspondendo à i-
ésima observação, e a j-ésima coluna contendo os valores da j-ésima variável. Se criarmos
uma nova matriz X tal que as entradas da j-ésima coluna de i = 1,...,n, onde ÿj é a média da j-
C = XTX é a matriz de covariância
ésima coluna
de X. de X sejam Xi,j = Xi,j ÿ ÿj , X, então a matriz p por p

Além disso, se outra matriz X for definida tal que Xi,j = Xi,jÿÿj ,i = 1,...,n, ÿj
onde ÿj é a média da jª coluna de X e ÿj é o desvio padrão da jª coluna, então a matriz p por
p Cr = XTX é a matriz de correlação de X.

Matriz de correlação

Vamos primeiro considerar as propriedades de uma matriz de correlação válida. Eles

são: • A matriz é simétrica com diagonal unitária • A matriz deve ser positiva definida -
ou seja, todos os autovalores precisam ser
positivo.
Mostraremos agora que a matriz p por p Cr é uma matriz de correlação válida se puder
ser fatorada como Cr = XTX, onde X é uma matriz de dados n por m não singular (ou seja,
posto completo).

A prova é a seguinte: Como


X não é singular, podemos realizar a decomposição do valor singular:
X = UKV T

onde U é uma matriz unitária n por n, K é uma matriz n por p contendo os valores singulares
(não nulos) ÿi,i = 1,...,p, como os elementos diagonais e zero em qualquer outro lugar, e V é
ap por p matriz unitária.
Temos assim

XTX = UKV TT UKV T

= V KTUTUKV T
Machine Translated by Google

48 Finanças Computacionais Usando C e C#

= V TKTKV T desde UTU = UUT = Em


= VÿV T

Portanto

Cr = XTX = VÿV T

onde ÿ é a matriz diagonal p por p contendo os autovalores de Cr, e V é a correspondente


matriz de autovetores. Como o iésimo autovalor satisfaz ÿi = ÿ2 , pode-se ver que todos os
autovalores são positivos e, portanto, Cr deve ser positivo definido.
eu

Se Cr for positivo definido, então podemos realizar a decomposição de Cholesky


Cr = LLT onde L é uma matriz triangular inferior.

3.4.2 Reparando matrizes de correlação e covariância


Existem situações em que uma matriz de correlação fornecida não é positiva definida.
Algumas das razões para isso são:

• Pode haver dados ausentes ou feeds de dados assíncronos. Como consequência, os


elementos na matriz de correlação podem ter sido calculados usando correlações de
pares, com uma variedade de comprimentos de sequência. Nessas circunstâncias, a
equação Cr = XTX não é mais verdadeira e, portanto, Cr não pode ser garantido como
positivo definido.
• O ajuste manual de uma matriz de correlação pode ter ocorrido para refletir as condições
de mercado esperadas. Isso ocorre especialmente quando o mercado quebra e os preços
de certas ações tornam-se altamente correlacionados • Pode haver erro de
arredondamento no cálculo de Cr = XTX.

Nestas circunstâncias, o melhor que pode ser feito é tentar reparar a matriz de correlação
Cr em uma matriz de correlação válida C Procedemos da seguinte r. forma.

Quando Cr não é positivo definido (a decomposição de Cholesky falha), então usamos a


decomposição própria:

Cr = VÿV T

onde

l1
ÿ l2 ÿ
ÿ ÿ

S= ÿ . ÿ

ÿ ÿ

.
ÿ ÿ
p
Então formamos a matriz

C+ = VKKTV T = VK(VK)T
r
Machine Translated by Google

Geração de variáveis aleatórias 49

onde a matriz K é formada tomando a raiz quadrada do máximo de cada autovalor e


um número muito pequeno ÿ (digamos ÿ10ÿ16). Assim: ÿmax(ÿ1,ÿ)

ÿ ÿmax(ÿ2,ÿ) ÿ
ÿ ÿ

K= ÿ . ÿ

ÿ ÿ

.
ÿ máx(ÿp,e) ÿ
A matriz C+ não é aceitável como matriz de correlação porque, embora real, simétrica
r
e positiva definida, seus elementos diagonais não são unitários. É possível remediar
isso pré-multiplicando e pós-multiplicando C+ pela matriz diagonal F:

Cr = CF+ F = FC+ FT
r r

onde C é a nova matriz de correlação reparada - ou seja, é positiva definida, simétrica


e possui elementos diagonais unitários. Para conseguir isso, os elementos diagonais
de F devem ser dados por:
1
ser =
C+ver

Temos assim:

Cr = CF+ F T
r

= FV K(V K)TF T
= (FV K) KTV TF T
= (VF K)(FV K)T (3.4.1)

r , que minimiza a distância


Uma matriz de correlação Cÿ reparada de forma otimizada
Cr ÿ Cÿ r , pode ser obtido via otimização numérica na dimensão n
hiperesfera unitária; isso é descrito abaixo.
No entanto, descobriu-se que C é uma aproximação
r muito boa para a estimativa
ótima Cÿ .
r

Matriz de correlação otimizada


Aqui fornecemos detalhes de como obter uma matriz de correlação reparada de
maneira otimizada usando coordenadas hiperesféricas e o método de Rebonato e
Jäckel (1999/2000) - para uma abordagem diferente, consulte Higham (2002) ou Qi e
Sun (2006).
As coordenadas cartesianas do ponto i em uma hiperesfera n-dimensional
com raio r pode ser mostrado como:

xi,1 = r cos(ÿi,1)
xi,2 = r sin(ÿi,1) cos(ÿi,2)
Machine Translated by Google

50 Finanças Computacionais Usando C e C#

xi,3 = r sin(ÿi,1)sin(ÿi,2) cos(ÿi,3)


xi,4 = r sin(ÿi,1)sin(ÿi,2)sin(ÿi,3) cos(ÿi, 4)
..
.
xi,nÿ1 = r sin(ÿi,1)sin(ÿi,2)···sin(ÿi,nÿ3)sin(ÿi,nÿ2) cos( ÿi,nÿ1)
xi,n = r sin(ÿi,1)sin(ÿi,2)···sin(ÿi,nÿ2)sin(ÿi,nÿ1)
onde ÿi,1 são coordenadas esféricas e possuem as seguintes restrições: 0 ÿi,k
ÿ, k = 1,...,n ÿ 2, e 0 ÿi,nÿ1 2ÿ.
Por construção, o raio da esfera satisfaz
n
2
r2 = (xi, k)
k=1

Poderá ser visto da seguinte forma:


n
2
(xi, k)
k=1

= r2 cos2(ÿi,1) + sin2(ÿi,1) cos2(ÿi,2)


+ sin2(ÿi,2) cos2(ÿi,3)
+ sin2(ÿi,3) cos4(ÿi,4)
+·· ·+ sin2(ÿi,nÿ2) ×
cos2(ÿi,nÿ1) + sin2(ÿi,nÿ1) ···
= r2

onde usamos

cos2(ÿi,k) + sin2(ÿi,k) = 1, k = 1,...,n ÿ 1

Se, quando r = 1, as coordenadas de n pontos hiperesféricos são armazenadas


nas n linhas da matriz n por n BT, então:

BT = cos(ÿi,1) i,1

j-1
BT = cos(ÿi,j ) i,j sin(ÿi,k), j = 2,...,n ÿ 1,
k=1
n-1
BT = sin(ÿi,k), n > 1,
eu, n
k=1

cos(ÿ1,1) sin(ÿ1,1) cos(ÿ1,2) sin(ÿ1,1)sen(ÿ1,2) cos(ÿ1,3) ···


ÿ cos(ÿ2,1) sin(ÿ2,1 ) ) cos(ÿ2,2) sin(ÿ2,1)sen(ÿ2,2) cos(ÿ2,3) ···ÿ
BT = ÿ ÿ

ÿ
cos(ÿ3,1) sin(ÿ3,1) cos(ÿ3,2) sin(ÿ3,1)sen(ÿ3,2) cos(ÿ3,3) ··· ÿ

.. .. ..
ÿ . . . ... ÿ
Machine Translated by Google

Geração de variáveis aleatórias 51

Assim, pode ser visto que os elementos diagonais de BTB são

n
BTB
eu, eu
=
(xi, k) 2 = 1
k=1

A decomposição de Cholesky pode ser formada ajustando os ângulos dos elementos


triangulares superiores de BT para zero, e isso resulta em
10 0 sin(ÿ2,1) 0 cos(ÿ3,1) ···
ÿ cos(ÿ2,1) ··· ÿ
sin(ÿ3,1) cos(ÿ3,2)
LT = ÿ ÿ ÿ

sin(ÿ3,1)sin(ÿ3,2) ··· ÿ

.. .. ..
ÿ . . . ... ÿ

LT1,1 = 1

LT = cos(ÿi,1) i,1
j
LT = cos(ÿi,j ) i,j ÿ1 sin(ÿi,k), j = 2,...,i ÿ 1,
k=1
i-1
LTeu, eu
= sin(ÿi,k), i > 1,
k=1

LT = 0, j = i + 1,...,n i,j

Queremos encontrar a matriz definida positiva


r Cÿ que minimiza Cr ÿ Cÿ r
.
Isso pode ser encontrado escrevendo

Cÿr = LTL

e usando otimização numérica para determinar os n(n ÿ 1)/2 ângulos apropriados. Uma
aproximação inicial pode ser obtida computando a fac de Cholesky = L TL e então
diferente de zero
r calculando
de LT . os ângulos correspondentes a cada torização C elemento

Matriz de covariância

Vamos agora considerar o caso em que uma matriz de covariância C é fornecida que
não é positiva definida - isto é, não há decomposição de Cholesky C = LTL, onde L é
triangular inferior.
Nessas circunstâncias, como uma matriz de covariância não requer elementos
diagonais unitários, é possível reparar C usando: C+ = VK(VK)T

onde V e K têm os mesmos significados de antes. Uma melhor aproximação


poderia ser obtida via otimização numérica dos elementos da decomposição de
Cholesky. No entanto, esses pontos ótimos não estão mais restritos a se situar
na hiperesfera da unidade n-dimensional.
Machine Translated by Google

52 Finanças Computacionais Usando C e C#

3.4.3 Distribuição normal

Aqui mostramos como gerar uma distribuição normal variável p com uma determinada matriz
de média e covariância.
Denotaremos o vetor contendo as variáveis da i-ésima observação a partir de uma
distribuição normal de média zero da variável p por Zi; ou seja, escrevemos uma amostra de n
observações como:

Zi ÿ N(0,C), i = 1,...,n, (3.4.2)

onde C é a matriz de covariância p × p.


Além disso , Zi,k é usado para denotar o k-ésimo elemento de Zi, que contém o valor da k-
ésima variável para a i-ésima observação.
Do ponto de vista computacional, podemos então considerar uma amostra de n observações
a serem representadas pela matriz n×p Z. A i-ésima linha de Z contém os valores para i-ésima
observação, e a k-ésima coluna da i-ésima linha, Zi ,k, contém o valor da k-ésima variável para
a i-ésima observação.
Além disso, como a distribuição tem média zero, a matriz de covariância da amostra é
dada por: C = ZTZ.
Para gerar variáveis com a matriz de covariância C podemos usar o fato de que, se
a matriz C é positiva definida, existe uma fatoração de Cholesky na qual:

C = AAT (3.4.3)

onde A é triangular inferior.


Podemos, portanto, gerar p variáveis que possuem uma matriz de covariância C como segue.

Primeiro gere (por exemplo) usando o método Box-Muller descrito em


Seção 3.3.1, as variações normais independentes:

X ÿ N(0,Ip)

onde o vetor X contém as variáveis p, Ip é a matriz unitária e XXT = Ip.


Então, usando a fatoração de Cholesky da Eq. (3.4.4), formulário:
Y = AX (3.4.4)

onde Y é um vetor p-elemento.


Agora, desde YY T = AX(AX)T = A(XXT)AT = AAT = C, temos que

Y ÿ N(0,C)

As variáveis que têm meios diferentes de zero ÿk,k = 1,...,p, podem ser obtidas simplesmente
modificando a Eq. (3.4.4) para:

Y = AX + ÿ (3.4.5)

onde Y é um p vetor de variáveis que é distribuído como N(ÿ, C), e os p elementos do vetor ÿ
contêm as médias das variáveis Y k,k = 1,...,p.
Se a matriz C não for positiva definida, então podemos criar uma matriz reparada, , usando
C a abordagem descrita na Seção 3.4.2.
Machine Translated by Google

Geração de variáveis aleatórias 53

Agora usamos a decomposição:

C = VK(VK)T

Nessas circunstâncias, os vetores do elemento p Y e Y são gerados usando as seguintes


versões modificadas das Eqs. (3.4.4) e (3.4.5):

Y = VKX e Y = VKX + ÿ (3.4.6)

O método para gerar as variáveis Y a partir de uma dada matriz de correlação Cr é


idêntico. No entanto, neste caso, as matrizes definidas não positivas são reparadas
como C
r = VF K(FV K)T; consulte a Seção 3.4.2.
Uma função para gerar variáveis normais e lognormais correlacionadas é dada em
Trecho do código 3.2.

long Quasirandom_Normal_LogNormal_Correlated(long fcall, long seq, long lnorm,


double significa[], long n, double c[], long tdc, double tol, long *irank, double x[], double work[], long lwk) {

/* Parâmetros de entrada:
===================

fcall - se fcall == 1 então é uma chamada de inicialização, se fcall == 0 então é uma


chamada de continuação
sequência - se seq == 0 então uma sequência Faure, se seq == 1 então uma sequência Niederreiter, se seq == 2 então uma sequência Sobol

normal - se lnorm == 1 então é uma distribuição lognormal, se lnorm == 0 então uma distribuição
normal
n - o número de variáveis, n deve ser menor que 40 c[] - uma matriz que contém a
matriz de covariância necessária,
usada para calcularCotdc - a segunda
posto da matrizdimensão da matriz
de covariância C tol - a
C significa [] tolerância
- as médias das variáveis normais
independentes std[] lwk

- os desvios padrão das variáveis normais independentes - o tamanho da matriz de trabalho, trabalho

Parâmetros de saída:
==================

- a classificação calculada da matriz de covariância C - os elementos x[0], ..


classificação x[] x[n-1] contêm as variáveis

Parâmetros de entrada/saída:
=========================

trabalhar - uma matriz de trabalho


*/

duplo zero = 0,0, um = 1,0, dois = 2,0; longo n1, i, j, k, kk; mtol
duplo, alfa; longo ptrc, ptre, ptrv, ptrw, ptrw0, ptrw1;

#define C(I,J) c[((I)-1) * tdc + ((J)-1)] #define MEANS(I) significa[(I)-1]


#define X(I) x[ (I)-1] #define WORK(I) work[(I)-1]

if (lwk < (2 + 3*n + 2*n*n + 3)) {


printf("O erro lwk é muito pequeno \n"); retornar 1;

ptre = 2; ptrv
= n+2; ptrw = n*n
+ n + 2;

Trecho de código 3.2 A função Quasirandom_Normal_LogNormal_Correlated que gera


variáveis normais quase aleatórias correlacionadas e variáveis lognormais quase
aleatórias correlacionadas.
Machine Translated by Google

54 Finanças Computacionais Usando C e C#

/* adiciona 1 extra para permitir valores ímpares de n */ ptrw0 = ptrw + 1 + n;


ptrw1 = ptrw0 + 1 + n; ptrc = ptrw1 + n + 1; n1 = n; if (((n/2)*2) != n) { /*
teste para ímpar n */

n1 = n + 1;

} if (fcall) { /* primeira chamada para inicialização */ if (lnorm) { /* distribuição lognormal


*/ for (i = 1; i <=n; ++i) { /* Carregar a matriz de covariância modificada em WORK
*/
for (j = 1; j <= n; ++j) {
TRABALHO(ptrc+(i-1)*n+j-1) = log(um + C(i,j)/(MÉDIO(i)*MÉDIO(j)));
}
}

} else { /* distribuição normal */


for (i = 1; i <=n; ++i) { /* Carregar a matriz de covariância em WORK */ for (j = 1; j <= n; ++j) {

TRABALHO(ptrc+(i-1)*n+j-1) = C(i,j);
}
}
}

/* calcula os autovalores e o autovetor da matriz que foi carregada em WORK */

calc_eigvals_eigvecs (n,&WORK(ptrc),n,&WORK(ptre),&WORK(ptrv),n);
/* O código usa a rotina NAG f02abc */ *irank = 0;

/* printf("Os autovalores são \n"); for (j=n; j >= 1; --j) { printf


("%12.5f \n", TRABALHO(ptre+j-1));

}
*/
for (j=n; j >= 1; --j) { /* use os autovalores para calcular o posto da matriz */
if (WORK(ptre+j-1) < tol) vá para L24; *irank = *irank + 1;

} printf("*classificação = %ld \n",*classificação);


L24:
mtol = -tol; if
(WORK(ptre) < mtol) {
printf("Aviso que existe um autovalor menor que %12.4f \n",mtol);

} for (j=1; j <= *irank; ++j) { kk = 1; for (k=1; k <=n; +


+k) {

if(WORK(ptrv+(k-1)*n+(j-1)) != zero) vá para L28; kk = kk + 1;

}
L28: /
* garante que todos os autovetores tenham o mesmo sinal em máquinas diferentes */ alpha = sqrt(WORK(ptre+j-1)); if (WORK(ptrv+
(kk-1)*n+(j-1)) < zero) alpha = -sqrt(WORK(ptre+j-1)); for (i = 1; i <= n; ++i) {

TRABALHO(ptrv+(j-1)+(i-1)*n)=TRABALHO(ptrv+(j-1)+(i-1)*n)*alfa;
}

/* } printf ("Os autovetores são \n"); for (j=1; j <= *irank; ++j) { for
(i = 1; i <= n; ++i) { printf ("%10.5f ", WORK(ptrv+(j-1)+ (i-1)*n));

}
printf("\n");
}
*/
for (i = 1; i <=n; ++i) { /* armazena um
vetor de uns e zeros para gerar os números quase aleatórios */
TRABALHO(ptrw0+i-1) = zero;
TRABALHO(ptrw1+i-1) = um;
}

Trecho de código 3.2 (continuação).


Machine Translated by Google

Geração de variáveis aleatórias 55

for (i = n; i <= n1; ++ i) {


TRABALHO(ptrw0+i-1) = zero;
TRABALHO(ptrw1+i-1) = um;
}
} /* fim da primeira seção de chamada */

/* gera um vetor de n1 variáveis aleatórias a partir de uma distribuição normal padrão,


média zero e variância unitária */
Quasi_Normal_Independent(fcall, seq, &WORK(ptrw0), &WORK(ptrw1), n1, &WORK(ptrw));

/* printf ("Os números quase aleatórios são:\n"); for (i = 1; i <= n; ++i)


{ printf ("%12.4f \n", TRABALHO(ptrw+(i-1)));

}
*/
/* Agora gera varias com a média e variância especificadas */
if (lnorm) { /* uma distribuição lognormal */ for (i = 1; i <= n; ++i) {

X(i) = log(MEIO(i)) - TRABALHO(ptrc+(i-1)*n+i-1)/dois; for (k = 1; k <= *irank; ++k) {

X(i)=X(i)+TRABALHO(ptrv+(k-1)+(i-1)*n)*TRABALHO(ptrw+k-1);
}

} for (i = 1; i <= n; ++i) {


X(i) = exp(X(i));
}
}
else { /* uma distribuição normal */ for (i = 1; i <= n; ++i)
{
X(i) = MÉDIO(i); for (k = 1; k <=
*irank; ++k) {
X(i)=X(i)+TRABALHO(ptrv+(k-1)+(i-1)*n)*TRABALHO(ptrw+k-1);
}
}

/* } printf ("As variáveis geradas são:\n"); for (i = 1; i <= n; ++i) {

printf("%12.4f\n",X(i));
}
*/
retorna 0;
}

Trecho de código 3.2 (continuação).

Para visualizar o efeito da matriz de covariância, exibiremos os resultados do uso da função


Quasirandom_Normal_LogNormal_Correlated para gerar as seguintes variáveis:

• Um vetor de três variáveis independentes normais com matriz de covariância:

1,0 0,0 0,0 0,0


C1 = 1,0 0,0 0,0 0,0
1,0

• Um vetor de três variáveis normais em que os elementos da covariância


matriz são todos positivos; a matriz de covariância é:

1,0 0,8 0,8


C2 = 0,8 1,0 0,8
0,8 0,8 1,0
Machine Translated by Google

56 Finanças Computacionais Usando C e C#

Figura 3.5 Diagrama de dispersão para uma amostra de 3000 observações (Zi, i = 1,...,
3000) gerada a partir de uma distribuição normal multivariada composta por três variáveis
com matriz de covariância C1 e média ÿ. Aqui plotamos os valores da primeira variável em
relação aos valores da segunda variável. Se usarmos a notação da Eq. (3.4.2), então as
coordenadas (x,y) para os pontos são xi = Zi,1, i = 1,..., 3000, e yi = Zi,2, i = 1,..., 3000 .

• Um vetor de três variáveis normais em que dois elementos da covariância


matriz são negativas; a matriz de covariância é:
1,0 ÿ0,7 0,2 ÿ0,7 1,0
C3 = 0,2
0,2 0,2 1,0

Em todos os casos, o vetor médio é dado por:


2.0
m= 2,0
2,0

Os resultados são exibidos nas Figs. 3,5–3,7.

3.4.4 Distribuição lognormal A

distribuição lognormal multivariada é importante porque é a distribuição dos retornos dos


ativos assumida pela equação de Black–Scholes.
Sejam os vetores de elementos p Y e X relacionados por Y = log(X) onde Y ÿ
N(ÿ, ÿ), ÿ é um vetor de elementos p e ÿ é uma matriz p×p. Então X = exp(Y) e X tem
distribuição lognormal multivariada, que denotamos por X ÿ (ÿ,ÿ).
Representaremos o vetor médio do elemento p de X por m¯ e a matriz de covariância p × p
de X por S.
Machine Translated by Google

Geração de variáveis aleatórias 57

Figura 3.6 Diagrama de dispersão para uma amostra de 3000 observações (Zi, i = 1,...,
3000) gerada a partir de uma distribuição normal multivariada composta por três variáveis
com matriz de covariância C2 e média ÿ. Aqui plotamos os valores da primeira variável em
relação aos valores da segunda variável. Se usarmos a notação da Eq. (3.4.2), então as
coordenadas (x,y) para os pontos são xi = Zi,1, i = 1,..., 3000, e yi = Zi,2, i = 1,..., 3000 .

Figura 3.7 Diagrama de dispersão para uma amostra de 3000 observações (Zi, i = 1,...,
3000) gerada a partir de uma distribuição normal multivariada composta por três variáveis
com matriz de covariância C3 e média ÿ. Aqui plotamos os valores da primeira variável em
relação aos valores da segunda variável. Se usarmos a notação da Eq. (3.4.2), então as
coordenadas (x,y) para os pontos são xi = Zi,1, i = 1,..., 3000, e yi = Zi,2, i = 1,..., 3000 .
Machine Translated by Google

58 Finanças Computacionais Usando C e C#

Pode-se mostrar que:

Si,j
ÿi,j = log 1 + m¯im¯j (3.4.7)

e
ÿi,i
ÿi = log(m¯i) ÿ , i = 1,...,p, e j = 1,...,p (3.4.8)
2
Para o caso de variáveis independentes temos então:
ÿ2
eu

ÿi = log(m¯i) ÿ , i = 1,...,p,
2
e
s2
ÿi,i = ÿ2 = log 1 +
eu
eu 2
, i = 1,...,p, e para i = j, ÿi,j = 0
m¯i
que são apenas Eqs. (3.3.13) e (3.3.14) apresentados na Seção 3.3.2.
O trecho de código 3.3 mostra como gerar uma distribuição lognormal
multivariada com uma dada média m¯ e matriz de covariância S. Informações
mais completas podem ser encontradas na função
Quasirandom_Normal_LogNormal_ Correlated, fornecida no trecho de código 3.2.

assinatura dupla[40][40], s[40][40]; /* limite de 40 */ double meios[40],


x[40], lx[40], tmp;
...
#define S(I,J) s[(I)-1][(J)-1] #define SIG(I,J)
sig[(I)-1][(J)-1] #define MEANS( i) meios[(I)-1] /*
as médias da distribuição lognormal */ #define X(I) x[(I)-1] /* variáveis normais */ #define LX(I) lx[(I) )-1] /* variáveis
lognormais */

...
/* obtém a matriz de covariância Gaussiana SIG, que corresponde ao
matriz de covariância lognormal S. */

for (i=1; i <= m; ++i) {


for (j=1; j <= m; ++j) {
tmp = MÉDIO(i) * MÉDIO(j);
SIG(i,j) = log( 1 + (S(i,j)/tmp));
}
}
...
/* Gera variáveis Gaussianas multivariadas X(i),i = 1,..,m, com média zero e
matriz de covariância SIG, usando a seção .. */
.. .
/* Usando a equação () gere variáveis normais com a média correta */
for (i=1; i <= m; ++i) {
X(i) = X(i) + log(MEANS(i)) - SIG(i,i)/2;
}
/* Agora exponencial para criar variáveis lognormais com média
XMEAN, e matriz de covariância S */ for (i=1; i <=
m; ++i) {
LX(i) = exp(X(i));
}

Trecho de código 3.3 Ilustrando como gerar variáveis a partir de uma distribuição lognormal com
uma determinada média e matriz de covariância.
Machine Translated by Google

4 opções europeias
4.1 Introdução

Uma opção europeia contratada no momento atual t dá ao titular o direito (mas não a
obrigação) de fazer algo quando a opção vence no momento T . Isso pode ser,o por direito
exemplo,
de
comprar ou vender ações a um determinado preço de exercício . A opção, obviamente, só
seria exercida se fosse do interesse do proprietário fazê-lo. Por exemplo, uma opção de
venda europeia de um único ativo , com preço de exercício E e tempo de expiração T , dá
ao proprietário o direito
valer
no ST
momento
no vencimento,
T de vender
então
umodeterminado
valor da opção
ativo
depor
venda
E. Se
opção
o ativo
no
vencimento, conhecido como payoff, é, portanto, max(E ÿST , 0). Em contraste, uma opção
de compra de um único ativo europeu de baunilha , com preço de exercício E e tempo de
expiração T , dá ao proprietário o direito no momento T de comprar um ativo por no E; o payoff
vencimento de uma opção de compra é max(ST ÿ E, 0).

O titular de uma opção americana tem o direito (mas não a obrigação) de exercer a opção
a qualquer momento desde o momento atual t até o vencimento da opção. Essas opções
são mais difíceis de avaliar do que as opções européias devido a essa flexibilidade extra.
Mesmo o único ativo único americano vanilla put não tem solução analítica e requer
diferenças finitas e métodos de rede para estimar seu valor.
Muitas opções européias, por outro lado, assumem a forma de uma integral definida
relativamente fácil a partir da qual é possível calcular uma solução de forma fechada.
A avaliação de opções europeias multiativos, dependentes de um grande número de ativos
subjacentes, é mais complicada, mas pode ser convenientemente obtida usando a simulação
de Monte Carlo para calcular a integral definida multidimensional necessária.

O valor atual esperado de uma opção de baunilha europeia de um único ativo dependerá
do preço atual do ativo no tempo t, S, a duração da opção, ÿ = T ÿt, o preço de exercício, E,
a taxa de juros sem risco, r, e a função de densidade de probabilidade do ativo subjacente
no vencimento, p(ST ).

4.2 Precificação de derivativos usando uma medida martingale

Nesta seção, resumiremos brevemente os resultados de Harrison e Kreps (1979) e Harrison


e Pliska (1981). Consideremos uma economia no intervalo de tempo [0,T ] que consiste em
n ativos Si ,i = 1,...,n, que pode levar
Machine Translated by Google

60 Finanças Computacionais Usando C e C#

os valores Si . que
Qualquer
zero éativo
chamado
Si quede
sónumerário.
assume valores
Numerários
que ,i =
podem
1,...,n,ser
0 tusados
T são maiores
para
t
denominar todos os preços de ativos na economia. Então (por exemplo) se S1 é um
numerário então os preços dos outros ativos denominados em unidades de S1 são os
preços relativos Zi = (Si /S1 ), i = 2,...,n.
t t t
Pode-se encontrar uma única medida de probabilidade Q tal que os preços relativos Zi
t,i = 2,...,n, sejam martingales. Se a economia estiver livre de oportunidades de arbitragem,
então cada padrão de pagamento HT pode ser representado como uma combinação linear
dos valores dos ativos Sit ,i = 1,...,n e, além disso, o processo de preço relativo (HT /S1
T) é um martingale.
Isso significa que podemos escrever

Ht = equalizador
HT onde 0 t T
equalizador ,
S1
t S1
T

O valor atual (tempo t) Vt do payoff HT é, portanto,

HT
Vt = S1 t equalizador

S1
T

Em geral para um numerário N que assume os valores Nt, 0 t T , nós podemos escrever

HT
Vt = NtEQ (4.2.1)
NT

A equação (4.2.1) é muito importante porque Vt é o preço atual (tempo t) de um derivativo


financeiro com vencimento T e payoff HT .
De referir que o preço de um derivado financeiro independe da medida martingale sob a
qual é valorizado, pelo que se obterá o mesmo preço Vt para diferentes numerários N.

4.3 Colocar paridade de chamada

4.3.1 Dividendos discretos


Aqui consideramos opções de compra e venda europeias de um único ativo e derivamos a
seguinte relação entre seus valores na presença de dividendos em dinheiro:

c(S,E,ÿ) + E exp(ÿrÿ) + D = p(S,E,ÿ) + S (4.3.1)

onde D é o valor presente dos dividendos que são pagos durante a vigência da opção.
Aquilo é:
n
D= Dk exp ÿr(tk ÿ t)
k=1

com Dk o k-ésimo dividendo em dinheiro pago no tempo tk; os outros símbolos já foram
definidos na Seção 4.1.
Esse resultado pode ser comprovado considerando os dois investimentos a seguir:
Machine Translated by Google

opções europeias 61

Carteira A: Uma call europeia, c(S,E,ÿ), e numerário de valor E exp(ÿrÿ)+D.

Carteira B: Uma opção de venda europeia, p(S,E,ÿ) e uma ação de valor S.

No vencimento da opção, os valores de compra e venda são c(ST ,E, 0) ep(ST ,E, 0),
respectivamente; também no tempo T o valor dos dividendos pagos durante a vida da
opção é D exp(rÿ).
Agora consideramos o valor de ambas as carteiras no tempo T sob todas as condições
possíveis.

Se ST E

A Carteira A vale:

max(ST ÿ E, 0) + exp(rÿ) E exp(ÿtÿ) + D = ST ÿ E + E + D exp(rÿ)


= ST + D exp(rÿ)
A Carteira B vale:

max(E ÿ ST , 0) + ST + D exp(rÿ) = 0 + ST + D exp(rÿ)


= ST + D exp(rÿ)

Se ST < E

A Carteira A vale:

max(ST ÿ E, 0) + exp(rÿ) E exp(ÿtÿ) + D = 0 + E + D exp(rÿ)


= E + D exp(rÿ)
A Carteira B vale:

max(E ÿ ST , 0) + ST + D exp(rÿ) = E ÿ ST + ST + D exp(rÿ)


= E + D exp(rÿ)

Mostramos, portanto, que sob todas as condições o valor da carteira A é


igual ao da carteira B.

4.3.2 Dividendos contínuos


Aqui, consideramos as opções de compra e venda europeias de um único ativo e
derivamos a seguinte relação:

c(S,E,ÿ) + E exp(ÿrÿ) = p(S,E,ÿ) + S exp(ÿqÿ) (4.3.2)

onde q é o rendimento de dividendo contínuo do ativo que é pago durante a vida da


opção. O resultado pode ser comprovado considerando os dois investimentos a seguir:

Carteira A: Uma opção de compra europeia, c(S,E,ÿ), e numerário de valor E exp(ÿrÿ).


Machine Translated by Google

62 Finanças Computacionais Usando C e C#

Carteira B: Uma opção de venda européia, p(S,E,ÿ), e uma ação de valor S exp(ÿqÿ).

No vencimento da opção, o valor da chamada e da colocação são c(ST ,E, 0) e p(ST ,E,
0), respectivamente. Além disso, se o valor da ação no momento t for denotado por S, o
valor combinado das ações e dividendos no momento T é S exp(qÿ): Observe que q é
tratado de maneira semelhante à taxa de juros sem risco composta continuamente r.

Se ST E

A Carteira A vale:

max(ST ÿ E, 0) + exp(rÿ)E exp(ÿrÿ) = ST ÿ E + E = ST


A Carteira B vale:

max(E ÿ ST , 0) + ST exp(ÿqÿ) exp(qÿ) = 0 + ST = ST

onde ST exp(ÿqÿ) exp(qÿ) é o valor combinado das ações e dividendos no vencimento da


opção.

Se ST < E

A Carteira A vale:

max(ST ÿ E, 0) + exp(rÿ)E exp(ÿrÿ) = 0 + E = E


A Carteira B vale:

max(E ÿ ST , 0) + ST exp(ÿqÿ) exp(qÿ) = E ÿ ST + ST = E

Mostramos, portanto, que sob todas as condições o valor da carteira A é o mesmo que o da
carteira B.

4.4 Opções de baunilha e o modelo Black-Scholes

4.4.1 A equação diferencial parcial de precificação de opções

Nesta seção derivaremos a equação diferencial parcial (Black-Scholes) que é obedecida por
opções lançadas sobre um único ativo.
Anteriormente, na Seção 2.3 e na Seção 2.5, derivamos o lema de Ito, que fornece uma
expressão para a mudança no valor da função ÿ(X,t), onde X é uma variável estocástica.
Quando a variável estocástica, X, segue GBM, a mudança no valor de ÿ foi dada pela Eq.
(2.3.6). Aqui assumiremos que a função ÿ(S,t) é o valor de uma opção financeira e que o
preço do ativo subjacente, S, segue GBM.

Se denotarmos o valor do derivativo financeiro por f , então sua variação, df ,


ao longo do intervalo de tempo dt é dado

ÿ2f ÿf ÿfÿS por:


dfÿt= ÿS + +ÿ2S2
ÿS2 ÿf
dt + ÿS dW, dW ÿ N(0, dt) ÿS
2
Machine Translated by Google

opções europeias 63

A versão discretizada desta equação é: ÿ2S2 ÿ2f

ÿS2 ÿS ÿf ÿff =+t +


ÿS ÿf
+ ÿSW, W ÿ N(0,t),
ÿt 2 ÿS

(4.4.1)

onde o intervalo de tempo agora é t e a mudança no valor da derivada é f .


Se assumirmos que o preço do ativo, S, segue GBM, também temos:
S = ÿSt + ÿSW, W ÿ N(0,t), (4.4.2)

onde ÿ é o desvio constante e a definição dos outros símbolos é como antes.


Consideremos agora uma carteira composta por ÿ1 derivativo e ÿf unidades ÿS da ação
subjacente. Em outras palavras, ficamos curtos (ou seja, vendidos) em um derivativo de um
ativo e temos ÿf ações do ÿS
(mesmo) ativo subjacente. O valor da carteira, ÿ, é portanto: ÿf ÿ =
ÿf + S ÿS

(4.4.3)

e a variação, ÿ, no valor da carteira ao longo do tempo t é:


ÿf
ÿ = ÿf + ÿS S (4.4.4)

Substituindo as Eqs. (4.4.1) e (4.4.2) na Eq. (4.4.4) obtemos:

ÿf ÿf 1 ÿ2S2 + ÿS2ÿ2f
ÿt 2
ÿ = ÿ ÿS ÿS + t

ÿf ÿf ÿ
ÿSW {ÿSt + ÿSW}ÿS +ÿfÿS
ÿf ÿS
+ ÿSt
ÿf ÿÿSÿ = ÿÿSt

ÿf 1 ÿ2f
ÿt ÿ

tÿ2S2 ÿS2
ÿt 2 ÿf +

ÿ ÿSW ÿS ÿSW ÿS (4.4.5)

Cancelando os termos obtemos:

1 ÿ2S2 +ÿ2f
ÿ = ÿtÿf ÿS2 2 (4.4.6)
ÿt

Se esta carteira cresce à taxa de juros sem risco r, temos:


rÿt = ÿ

Então nós temos isso:

1 ÿ2S2 +ÿ2f
rÿt = ÿtÿf ÿS2 2 (4.4.7)
ÿt

Substituindo ÿ, obtemos:

ÿf 1 ÿ2S2 +ÿ2f
rt f ÿ S ÿS = ÿtÿf ÿS2 2 (4.4.8)
ÿt
Machine Translated by Google

64 Finanças Computacionais Usando C e C#

Reorganizando temos:

ÿf ÿf 1 ÿ2S2 ÿ2f
+ S = rf + ÿS2 ÿt ÿS 2 (4.4.9)

que é a equação diferencial parcial de Black-Scholes. Consulte o Apêndice I sobre a fórmula de


Feynman–Kac.
Vamos agora considerar as opções de compra e venda sobre o mesmo ativo subjacente. Se
considerarmos c o valor de uma opção de compra europeia e p o de uma opção de venda
europeia, teremos as seguintes equações:

ÿp ÿp ÿ2S2 1 ÿ2p
+ S + ÿS2 = rpm (4.4.10)
ÿt ÿS 2

ÿc ÿc 1 ÿ2S2 ÿ2c
+ S + ÿS2 = rc (4.4.11)
ÿt 2 ÿS

Se agora formarmos uma combinação linear de opções de venda e compra, ÿ = a1c + a2p, onde
a1 e a2 são constantes, então ÿ também obedece à equação de Black-Scholes:

ÿÿ ÿÿ 1 ÿ2ÿ
+ +2 ÿ2S2 ÿS2 = rÿ (4.4.12)
ÿt SÿS

Vamos agora provar que ÿ satisfaz a Eq. (4.4.12).


Primeiro reescrevemos a Eq. (4.4.12) como:

ÿ(a1c + a2p) ÿ(a1c + a2p) 1 ÿ2S2 ÿ2(a1c + a2p)


+ S + ÿS2 2
ÿt ÿS
= r(a1c + a2p) (4.4.13)

e use os seguintes resultados do cálculo elementar:

ÿ(a1c + a2p) ÿt ÿc ÿp + a2 =
a1 ÿt ÿt

ÿ(a1c + a2p) ÿc ÿp + a2 =
a1 ÿS ÿS
ÿS
e

ÿ2(a1c + a2p) ÿ2c ÿ2p


= a1 + a2 ÿS2
ÿS2 ÿS2

Se denotarmos o lado esquerdo da Eq. (4.4.12) por LHS, então temos:

ÿc ÿc 1 ÿ2S2 ÿ2c
LHS = a1 + S + ÿS2
ÿt ÿS 2

ÿp ÿp 1 ÿ2S2 ÿ2p
+ a2 + S + ÿS2 (4.4.14)
ÿt ÿS 2
Machine Translated by Google

opções europeias 65

Agora usamos as Eqs. (4.4.10) e (4.4.11) para substituir os valores nas chaves na Eq. (4.4.14),
e obtemos:

LHS = a1rc + a2rp (4.4.15)

que é apenas o lado direito da Eq. (4.4.12); então provamos o resultado.


Note-se que este resultado também é verdadeiro para as opções americanas, pois elas também
obedecem à equação de Black-Scholes.
O resultado acima pode ser generalizado para incluir uma carteira composta por n sen
opções de ativos gle. Aqui temos:
n
ÿ= ajfj , j = 1,...,n, j=1

onde fj representa o valor da j-ésima derivada e aj é o número de unidades da j-ésima derivada.


Para provar que ÿ segue a equação de Black-Scholes, simplesmente particionamos a carteira
em setores cujas opções dependem do mesmo ativo subjacente. Em seguida, procedemos
como antes, mostrando que o valor de cada setor individual obedece à equação de Black-
Scholes e, portanto, o valor da carteira completa (a soma dos valores de todos os setores)
obedece à equação de Black-Scholes. Deve-se mencionar que este resultado se aplica tanto
às opções americanas quanto às européias e não importa se compramos ou vendemos as
opções.

No Capítulo 5 usaremos o fato de que a diferença entre o valor de uma opção européia e a
opção americana equivalente obedece à equação de Black-Scholes. Podemos ver isso
imediatamente considerando as seguintes carteiras que estão compradas em uma opção
americana e vendidas (ou seja, venderam) em uma opção europeia:

ÿp = P ÿ p, ÿc = C ÿ c

onde P e C são os valores das opções americanas de venda e compra. ÿp e ÿc obedecem às


equações de Black-Scholes e são as respectivas diferenças no valor das opções de venda
americanas/europeias e das opções de compra americanas/europeias.

4.4.2 A equação diferencial parcial de precificação de opções multiativos

Nesta seção derivaremos a equação diferencial multiativos (Black-Scholes) que é obedecida


por opções lançadas sobre n ativos. Procedendo como na Seção 4.4.1, usaremos a versão n-
dimensional do lema de Ito para encontrar o processo seguido pelo valor de um derivativo
financeiro multiativos. Denotaremos o valor dessa derivada por f (S,t), onde S é um vetor
estocástico de n elementos contendo os preços dos ativos subjacentes, Si,i = 1,...,n. Se
assumirmos que S segue GBM n-dimensional, então a mudança no valor da derivada, df , é
(veja
Machine Translated by Google

66 Finanças Computacionais Usando C e C#

Eq. (2.5.8)) dado por:


n n
ÿf ÿf 1 ÿiSii=1
ÿiÿjSiSjÿij
j=1 + ÿSi 2 ÿSi ÿSjÿ2f
df =
ÿt
+n dt
i=1

ÿf
+n ÿiSi dWi (4.4.16)
ÿSi
i=1

A versão discretizada desta equação é:


n n
ÿf ÿf 1 ÿ2f
f=
ÿt
+n ÿiSi + ÿSi 2 ÿiÿjSiSjÿij ÿSi ÿSj t
i=1 i=1 j=1

ÿf
+n ÿiSiWi ÿSi (4.4.17)
i=1

onde o intervalo de tempo agora é t e a mudança no valor da derivada é f .


Consideremos agora uma carteira composta por ÿ1 derivativo e ÿf unidades da
ÿSii-ésima
ação subjacente. Em outras palavras, ficamos curtos (ou seja, vendidos) em um derivativo
que depende do preço, Si,i = 1,...,n, de n ativos subjacentes, e temos ÿf unidades do i-ésimo
ativo. O valor da carteira, ÿ, é, portanto:
ÿSi

ÿf
ÿ = ÿf +n E (4.4.18)
ÿE
i=1

e a variação, ÿ, no valor da carteira no intervalo de tempo t é:

ÿf
ÿ = ÿf +n E (4.4.19)
i=1
ÿSi

Como as variáveis estocásticas Si,i = 1,...,n seguem GBM n-dimensional, a variação no


preço do ativo i, Si, no intervalo de tempo t é dada por:

Si = µiSit + ÿiSiWi, i = 1,...,n, onde Wi = dZi ÿt, (4.4.20)

E dZ2

eu
= 1, i = 1,...,n,
e

E[dZi dZj ] = ÿi,j , i = 1,...,n, j = 1,...,n, i = j

Substituindo as Eqs. (4.4.17) e (4.4.20) na Eq. (4.4.19), obtemos:


n n
ÿf 1
ÿf ÿiSi ÿiÿjÿijSiSj + ÿSi 2 ÿSi ÿSj ÿ2f
i=1
ÿ=ÿ
ÿt
+n j=1 t
i=1

ÿn ÿf ÿf
ÿiSiWi ÿSi +n {ÿiSit + ÿSiWi} ÿSi
i=1 i=1
Machine Translated by Google

opções europeias 67

n n
ÿn ÿf ÿf 1 ÿ2f
ÿP= ÿiSit ÿSi ÿ t ÿt ÿ

t ÿiÿjÿijSiSj ÿSi ÿSj


i=1
2 i=1 j=1

ÿn ÿf ÿf
ÿiSiWi ÿSi +n ÿiSit ÿSi
i=1 i=1

ÿf
+n ÿiSiWi ÿSi (4.4.21)
i=1

Cancelando os termos obtemos:


n n
ÿf 1 ÿ2f
ÿ = ÿt + ÿiÿjÿijSiSj ÿSi ÿSj (4.4.22)
ÿt 2 i=1
j=1

Se esta carteira crescer à taxa de juros sem risco r, temos:

rÿt = ÿ

Então, da Eq. (4.4.22) temos que:


n n
ÿf 1 ÿ2f
rÿt = ÿt +
ÿt ÿSj i=1 j=1ÿiÿjÿijSiSj 2 ÿSi (4.4.23)

Substituindo ÿ, obtemos:

ÿn ÿf
rt f E
i=1 ÿE
n n
ÿf 1 ÿiÿjÿijSiSj + ÿt 2 ÿSi ÿSj i=1 ÿ2f
j=1
= ÿt (4.4.24)

Reorganizando a Eq. (4.4.24) fornece:


n n
ÿf ÿf 1 ÿ2f
+n E +2 ÿiÿjÿijSiSj = rf ÿSi ÿSj (4.4.25)
ÿt ÿE
i=1 i=1 j=1

que é a equação diferencial parcial n-dimensional de Black-Scholes.

4.4.3 A fórmula de Black-Scholes


O modelo Black-Scholes consiste em dois ativos: a conta monetária sem risco e o
patrimônio líquido. Pode ser expresso como a seguinte equação bidimensional de Ito:

dSt = ÿSt dt + ÿSt dWP dBt =


(4.4.26)
rBt dt

onde WP é o movimento browniano (sem deriva) sob a medida P, então dWP ÿ


N(0, dt).
Machine Translated by Google

68 Finanças Computacionais Usando C e C#

O tempo atual será denotado por t0, e o tempo de vencimento da opção por T . A conta
do mercado monetário tem valor Bt0 = 1 no tempo t0 e BT = exp(r(T ÿ t0) no tempo T Vamos
agora considerar
. o processo seguido pelo valor relativo ÿ(St,Bt) = St /Bt .

Usando a regra do quociente Ito conforme descrito na Seção 2.6.2 e substituindo X1 =


St e X2 = Bt na Eq. (2.6.8) temos:

St = St St
d (ÿ ÿ r) dt + em dWP
Bt Bt Bt

Então finalmente podemos escrever:

dSÿ = Sÿ (ÿ ÿ r) dt + Sÿ ÿ dWP (4.4.27)


t t t

onde Sÿ = St /Bt .
t
Referindo-se ao teorema de Girsanov na Seção 2.4, podemos escolher uma medida de
probabilidade Q tal que:
m-r
dWp = dWQ ÿ dt (4.4.28)
p

Na Eq. (2.4.3) temos assim k(t) = ÿ((ÿ ÿ r)/ÿ) e


1 2
dQ m-r m-r
= exp ÿ dP WP ÿ t (4.4.29)
p 2 p

Consulte a pág. 114 da Musiela (1998). Substituindo para dWp na Eq. (4.4.27) rende
m-r
dSÿ = Sÿ {ÿ ÿ r} dt ÿ Sÿ p dt + Sÿÿ dWQ
t t t p

que simplifica para ÿ


dSÿ = Sÿ dWQ (4.4.30)
t t

A equação (4.4.30) significa que o processo para Sÿ é tum martingale sob proba
medida de bilidade Q.
Substituindo dWp na Eq. (4.4.26) com o valor na Eq. (4.4.28) rende

dSt = ÿSt dt + Stÿ dWP


m-r
= ÿSt dt + Stÿ dWQ ÿ dt
p

m-r
= Stÿdt ÿ Stÿ dt + Stÿ dWQ
p

Assim, na medida neutra ao risco Q, a dinâmica de dS é

dSt = Str dt + Stÿ dWQ (4.4.31)

Comparando a Eq. (4.4.31) com a Eq. original. (4.4.26) vemos que mudar da medida do
mundo real para a medida neutra ao risco envolve simplesmente substituir dWQ por dWP e
r por ÿ.
Machine Translated by Google

opções europeias 69

Agora podemos resolver a Eq. (4.4.31) usando o resultado dado na Eq. (2.3.11). Nós
temos

ST = S exp ÿ(T ÿ t0) + ÿWQ T-t0

onde S é o preço do ativo no tempo atual t0, e ÿ = r ÿ ÿ2/2.


O preço a termo com vencimento T , denotado por S(t0,T), é E[ST ]. De Ap
pendix D.2 temos

S(t0,T) = E[ST ] = S exp r(T ÿ t0) (4.4.32)

Usando a Eq. (2.3.9) a distribuição do preço do ativo no tempo T é:

logST ÿ N ÿ(T ÿ t0), ÿ2(T ÿ t0) (4.4.33)


S

Queremos obter o preço atual de uma opção europeia vanilla com preço de exercício E que
vence no tempo futuro T e, portanto, tem uma, duração de ÿ = T ÿ t0.
A abordagem que adotaremos aqui é primeiro derivar uma expressão para o valor de uma
opção de compra européia e, em seguida, usar as relações de paridade de compra/venda
da Seção 2.2 para obter o valor da opção de venda européia correspondente.
Com referência a (4.2.1) temos

HT
Vt0 = Bt0EQ = Bt0 EQ[HT ] (4.4.34)
BT BT

Substituindo Bt0 = 1, BT = exp(r(T ÿt0)) = exp(rÿ), e HT = max(ST ÿE, 0) temos:

1
Vt0 = EQ max(ST ÿ E, 0) (4.4.35)
exp(rÿ)

e assim denotando o valor da opção de compra por c(S,E,ÿ) obtemos

c(S,E,ÿ) = exp(ÿrÿ)EQ max(ST ÿ E, 0) (4.4.36)

Pode ser visto a partir da Eq. (4.4.36) que o valor da opção de compra europeia é o valor
esperado do retorno da opção no vencimento, descontado para o tempo atual t pela taxa
de juros sem risco r.
Isso significa que o valor da opção de compra pode ser escrito como
ÿ

c(S,E,ÿ) = exp(ÿrÿ) f (ST )(ST ÿ E) dST (4.4.37)


ST = E

onde f (ST ) é a função de densidade de probabilidade de ST .


Em vez de integrar sobre ST , calcularemos (4.4.37) usando a variável X = log(ST /S).
Da Eq. (4.4.33), sabemos que a função densidade de probabilidade de X é

1
ÿ(X ÿ (r ÿ ÿ2/2)ÿ)2 (4.4.38)
f(X) = ÿ exp
ÿÿ ÿ2ÿ 2s2sq
Machine Translated by Google

70 Finanças Computacionais Usando C e C#

e, portanto, o valor da opção é


ÿ

c(S,E,ÿ) = exp(ÿrÿ) S exp(X) ÿ E f (X) dX (4.4.39)


X=log(E/S)

onde usamos ST = S exp(X). O limite inferior na Eq. (4.4.39) correspondendo a ST =


E na Eq. (4.4.37) é encontrado definindo E = exp(X); isso produz o limite inferior X =
log(E/S).
A integral na Eq. (4.4.39) é avaliado dividindo-o em duas partes:
c(S,E,ÿ) = IA ÿ IB (4.4.40)
onde
ÿ
S exp(ÿrÿ) ÿ{X ÿ (r ÿ ÿ2/2)ÿ }2
IA = exp(X) exp dX
ÿ ÿÿ ÿ2ÿ X=log(E/S)
2s2sq

(4.4.41)
e
ÿ
E exp(ÿrÿ)
IB = exp ÿ{X ÿ (r ÿ ÿ2/2)ÿ }2 E dX (4.4.42)
ÿ ÿÿ ÿ2ÿ X=log(E/S)
2s2sq

Para calcular essas integrais, faremos uso do fato de que a função normal cumulativa
univariada N1(x) é: ÿu2
1 x
N1(x) = exp de
ÿ2ÿ u=ÿÿ
2

Por simetria temos N1(ÿx) = 1 ÿ N1(x) e ÿu2


1 ÿ
1 ÿx

exp du = exp -u2 você = N1(ÿx)


ÿ2ÿ x 2 ÿ2ÿ ÿÿ
2

Vamos primeiro considerar IB, que é a mais fácil das duas integrais.
ÿ
E exp(ÿrÿ)
IB = exp ÿ{X ÿ (r ÿ ÿ2/2)ÿ }2 dX
ÿ ÿÿ ÿ2ÿ X=log(E/S)
2s2sq

Se fizermos u = Xÿ(rÿÿ2/2)ÿ
então dX = ÿ ÿÿ du. Então ÿ ÿt

ÿ
E exp(ÿrÿ)ÿÿÿ -u2
IB = exp de
ÿ ÿ2ÿ ÿÿ u=k2 2

log(E/S)ÿ(rÿÿ2/2)ÿ onde .
o limite inferior de integração é k2 = ÿ ÿÿ
Temos portanto:

IB = E exp(ÿrÿ)N1(ÿk2) (4.4.43)

Vamos agora considerar a integral IA.


ÿ
S exp(ÿrÿ) ÿ{X ÿ (r ÿ ÿ2/2)ÿ }2
IA = exp(X) exp dX
ÿ ÿÿ ÿ2ÿ X=log(E/S)
2s2sq
Machine Translated by Google

opções europeias 71

Rearranjando o integrando:
ÿ
exp(ÿrÿ) ÿ{X ÿ (r ÿ ÿ2/2)ÿ }2 ÿ 2ÿ2ÿX
IA = exp dX
ÿ ÿÿ ÿ2ÿ X=log(E/S) 2s2sq

(4.4.44)

Expandindo os termos na exponencial:


2
X ÿ r ÿ ÿ2/2 quadrados ÿ 2ÿ2ÿX
2
= X2 ÿ 2 r ÿ ÿ2/2 ÿ X + r ÿ ÿ2/2 ÿ ÿ 2ÿ2ÿX
2
= X2 ÿ 2 r + ÿ2/2 ÿ X + r ÿ ÿ2/2 ÿ
2 2 2
= X ÿ r + ÿ2/2 quadrados + r ÿ ÿ2/2 quadrados ÿ r + ÿ2/2 quadrados

O que resulta em:


2 2
X ÿ r ÿ ÿ2/2 quadrados ÿ 2ÿ2ÿX = X ÿ r + ÿ2/2 ÿ ÿ 2ÿ2rÿ 2 (4.4.45)

Substituindo a Eq. (4.4.45) no integrando da Eq. (4.4.44) temos:

ÿ{X ÿ (r ÿ ÿ2/2)ÿ }2
exp(X) exp
2s2sq

ÿ{X ÿ (r + ÿ2/2)ÿ }2
= exp(rÿ) exp
2s2sq

A integral IA pode, portanto, ser expressa como:


ÿ
S exp(rÿ) exp(ÿrÿ) ÿ{X ÿ (r + ÿ2/2)ÿ }2
IA = exp dX
ÿÿÿ2ÿ X=log(E/S) 2s2sq

Xÿ(r+ÿ2/2)ÿ
Se fizermos u = então dX = ÿ ÿÿ du. Então ÿ ÿt

ÿ
Sÿÿÿ -u2
IA = exp de
ÿ ÿ2ÿ ÿÿ u=k1 2

log(E/S)ÿ(r+ÿ2/2)ÿ . Portanto, ÿ ÿÿ
onde o limite inferior de integração é k1 = tem:

IA = SN1(ÿk1) (4.4.46)

Portanto, o valor de uma chamada europeia é:

c(S,E,ÿ) = SN1(ÿk1) ÿ E exp(ÿrÿ)N1(ÿk2)

que dá a forma usual da fórmula de Black-Scholes para uma chamada europeia como:

c(S,E,ÿ) = SN1(d1) ÿ E exp(ÿrÿ)N1(d2) (4.4.47)


Machine Translated by Google

72 Finanças Computacionais Usando C e C#

onde

log(S/E) + (r + ÿ2/2)ÿ d1 =
ÿ ÿÿ log(S/E) + (r ÿ ÿ2/2)ÿ = d1 ÿ e
ÿ ÿÿ d2 = ÿ ÿÿ
(4.4.48)

Para entender melhor o significado da equação acima, vamos reescrevê-la da seguinte


forma:

c(S,E,ÿ) = exp(ÿrÿ) SN1(d1) exp(rÿ) ÿ EN1(d2) (4.4.49)

O termo N1(d2) é a probabilidade de a opção ser exercida em um mundo neutro ao


risco, de modo que EN1(d2) é o preço de exercício multiplicado pela probabilidade de o
preço de exercício ser pago. O termo SN1(d1) exp(rÿ) é o valor esperado de uma variável,
em um mundo neutro ao risco, que é igual a ST se ST > E e é caso contrário
zero.
A fórmula correspondente para uma opção de venda pode ser mostrada usando paridade de chamada de venda (consulte
Seção 4.3) para ser:

p(S,E,ÿ) = E exp(ÿrÿ)N1(ÿd2) ÿ SN1(ÿd1) (4.4.50)

ou equivalentemente, usando N1(ÿx) = 1 ÿ N1(x) temos

p(S,E,ÿ) = E exp(ÿrÿ) 1 ÿ N1(d2) ÿ S 1 ÿ N1(d1) (4.4.51)

A inclusão de dividendos contínuos


O efeito dos dividendos sobre o valor de uma opção europeia pode ser tratado assumindo
que o preço do ativo é a soma de um componente sem risco envolvendo dividendos
conhecidos que serão pagos durante a vida da opção e um componente de risco
(estocástico); ver Hull (2003).
À medida que os dividendos contínuos q são pagos, o preço da ação é reduzido na
mesma proporção e, quando a opção europeia vence, todos os dividendos terão sido
pagos, restando apenas o componente de risco do preço do ativo.
Da Eq. (4.4.26) temos assim:

dS = ÿS dt ÿ Sq dt + ÿS dWP dB
(4.4.52)
= rB dt

onde sob a medida de probabilidade P sabemos que dWP ÿ N(0, dt).


Como antes (usando o teorema de Girsanov), escolhemos a medida de probabilidade Q de modo
que

m-r
dWp = dWQ ÿ dt
p

e assim sob esta medida o processo para S é


m-r
dS = Sÿdt ÿ Sq dt ÿ dt + Sÿ dWQ, onde dWQ ÿ N(0, dt)
p
Machine Translated by Google

opções europeias 73

o que resulta em

dS = S(r ÿ q) dt + ÿS dWQ onde dWQ ÿ N(0, dt) (4.4.53)


Procedendo como antes obtemos:
X ÿ Nr ÿ q ÿ ÿ2/2 ÿ,ÿ2ÿ
onde X = ST /S. A função de densidade de probabilidade de X é
1
f(X) = ÿ exp agora: ÿ(X ÿ (r ÿ q ÿ ÿ2/2)ÿ)2 2ÿ2ÿ
ÿÿ ÿ2ÿ
O valor de uma opção de compra é assim:
ÿ
exp(ÿrÿ)
c(S,E,ÿ) = ÿ ÿÿ ÿ2ÿ S exp(X) ÿ E
X=log(E/S)

× exp ÿ(X ÿ (r ÿ q ÿ ÿ2/2)ÿ)2 dX (4.4.54)


2s2sq
com
ÿ
S exp(ÿrÿ) ÿ{X ÿ (r ÿ q ÿ ÿ2/2)ÿ }2
IA = exp(X) exp dX
ÿ ÿÿ ÿ2ÿ X=log(E/S) 2s2sq

e
ÿ
E exp(ÿrÿ)
IB = exp ÿ{X ÿ (r ÿ q ÿ ÿ2/2)ÿ }2 E dX
ÿ ÿÿ ÿ2ÿ X=log(E/S) 2s2sq

log(E/S)ÿ(rÿqÿÿ2/2)ÿ .
Então IB = E exp(ÿrÿ)N1(ÿk2), onde k2 = ÿ ÿÿ Vamos agora considerar a integral
IA.

ÿ
S exp(ÿrÿ) ÿ{X ÿ (r ÿ q ÿ ÿ2/2)ÿ }2
exp(X) exp IA = ÿ ÿÿ ÿ2ÿ dX
X=log(E/S) 2s2sq

Rearranjando o integrando:
ÿ
exp(ÿrÿ)
IA = exp ÿ{X ÿ (r ÿ q ÿ ÿ2/2)ÿ }2 ÿ 2ÿ2ÿX dX
ÿ ÿÿ ÿ2ÿ X=log(E/S) 2s2sq

Expandindo a exponencial, obtemos:


2
X ÿ r ÿ q ÿ ÿ2/2 quadrados ÿ 2ÿ2ÿX
2 2
= 2 X ÿ r ÿ q + ÿ2/2 sq ÿ 2ÿ2(r ÿ q)t
A integral IA pode, portanto, ser expressa como:
S exp((r ÿ q)ÿ) exp(ÿrÿ)
IA =
ÿÿÿ2ÿ
ÿ

× exp ÿ{X ÿ (r ÿ q + ÿ2/2)ÿ }2 dX


X=log(E/S) 2s2sq

log(E/S)ÿ(rÿq+ÿ2/2)ÿ que .
dá IA = S exp(ÿqÿ)N1(ÿk1) onde k1 = ÿ ÿÿ
Machine Translated by Google

74 Finanças Computacionais Usando C e C#

A fórmula de Black-Scholes para o valor de uma opção de compra europeia incluindo


dividendos contínuos é:

c(S,E,ÿ) = S exp(ÿqÿ)N1(d1) ÿ E exp(ÿrÿ)N1(d2) (4.4.55)

e a fórmula correspondente para uma opção de venda pode ser mostrada (usando paridade de chamada de venda)
como:

p(S,E,ÿ) = ÿS exp(ÿqÿ)N1(ÿd1) + E exp(ÿrÿ)N1(ÿd2) (4.4.56)

ou equivalentemente, usando N1(ÿx) = 1 ÿ N1(x), temos

p(S,E,ÿ) = E exp(ÿrÿ) 1 ÿ N1(d2)


ÿ S exp(ÿqÿ) 1 ÿ N1(d1) (4.4.57)
onde

log(S/E) + (r ÿ q + ÿ2/2)ÿ d1 = log(S/E) + (r ÿ q ÿ ÿ2/2)ÿ d2 =


ÿ ÿÿ , ÿ ÿÿ

Assim, as opções de compra/venda europeias com dividendos contínuos podem ser precificadas nos EUA
Eqs. (4.4.47) e (4.4.50) mas com S substituído por S exp(ÿqÿ).
Essas fórmulas também podem ser reexpressas em termos do preço atual do patrimônio
para o futuro com vencimento T , S(t,T ), como segue:

ct = exp ÿr(T ÿ t)S(t,T )N1(d1) ÿ EN1(d2) pt = exp (4.4.58)


ÿr(T ÿ t)ÿS(t,T )N1(ÿd1) + EN1( ÿd2) (4.4.59)

onde usamos a notação abreviada pt e ct para denotar o valor atual (tempo t) das
opções de venda e compra; o preço futuro atual das ações com vencimento T é

S(t,T ) = S exp (r ÿ q)(T ÿ t) , t T,


e

log(S(t, T )/E) + (ÿ2/2)ÿ d1 log(S(t, T )/E) ÿ (ÿ2/2)(T ÿ t) d2 =


= ÿ ÿ(T ÿ t) , ÿ ÿ(T ÿ t)

A inclusão de dividendos discretos


Aqui consideramos n dividendos em dinheiro discretos Di,i = 1,...,n, pagos nos
momentos ti,i = 1,...,n, durante a vigência da opção. Nessas circunstâncias, a fórmula
de Black-Scholes pode ser usada para precificar as opções européias, mas com o
valor do ativo corrente S reduzido pelo valor presente dos dividendos em dinheiro.

Isso significa que, em vez de S, usamos a quantidade SD que é calculada como

SD = Sim
ÿn Em exp(ÿrti)
i=1
Machine Translated by Google

opções europeias 75

onde r é a taxa de juros sem risco (neste caso constante). As fórmulas para opções de
compra e venda europeias são então

c(S,E,ÿ) = SDN1(d1) ÿ E exp(ÿrÿ)N1(d2) (4.4.60)

p(S,E,ÿ) = E exp(ÿrÿ) 1 ÿ N1(d2) ÿ SD 1 ÿ N1(d1) (4.4.61)


onde

log(SD/E) + (r + ÿ2/2)ÿ d1
= ÿ ÿÿ log(SD/E) + (r ÿ ÿ2/2)ÿ = e
d1 ÿ ÿ ÿÿ d2 =
(4.4.62)
ÿ ÿÿ

Os gregos

Agora que derivamos as fórmulas para precificar as opções de compra e venda europeias
vanilla, é possível calcular suas derivadas parciais (estatísticas de hedge). Vamos agora
apenas citar expressões para os gregos (estatísticas de cobertura) para opções europeias.
Aqui, o subscrito c refere-se a uma opção de compra europeia e o subscrito p refere-se a
uma opção de venda europeia. Derivações completas desses resultados podem ser
encontradas no Apêndice A.

Gama:
ÿ2c ÿ2p n(d1) = exp(ÿqÿ) ÿc = = ÿp =
ÿS2 ÿS2 (4.4.63)
Sÿÿÿ
Delta:
ÿc
c= = exp(ÿqÿ)N1(d1)
S p ÿp = = exp(ÿqÿ)
(4.4.64)
N1(d1) ÿ 1 ÿS

Teta:
ÿc
ÿc = = q exp(ÿqÿ)SN1(d1) ÿ rE exp(ÿrÿ)N1(d2) ÿt

ÿ
Sn(d1)ÿ exp(ÿqÿ)
2 ÿÿ
(4.4.65)
ÿp
ÿp = = ÿq exp(ÿqÿ)SN1(ÿd1) + rE exp(ÿrÿ)N1(ÿd2) ÿt

ÿ
Sn(d1)ÿ exp(ÿqÿ)
2 ÿÿ
Ró:
ÿc ÿp
ÿc = ÿr = EÿN1(d2), ÿp = ÿr = ÿEÿN1(ÿd2) (4.4.66)
Machine Translated by Google

76 Finanças Computacionais Usando C e C#

Vegas:
ÿc ÿp
Vc = = Vp = ÿÿ = S exp(ÿqÿ)n(d1) ÿÿ (4.4.67)
ÿÿ

1 onde n(x) = ÿ2ÿ exp(ÿx2/2)

Apresentamos agora, no trecho de código 4.1, um programa de computador para calcular o valor
da opção Black-Scholes e os gregos dados nas Eqs. (4.4.63)–(4.4.67). A rotina usa EPS = 1.0e-16
para identificar se os argumentos são muito pequenos,

void black_scholes(double *value, double greeks[], double s0, double x, double sigma, double t, double r, double
q, long put, long *iflag) {

/* Parâmetros de entrada:
===================

s0 - o preço atual do ativo subjacente x - o preço de exercício sigma - a


volatilidade t - o tempo até o vencimento r - a taxa de juros q - o
rendimento contínuo de dividendos put - se put for 0, então uma opção
de compra, caso contrário, uma opção de venda

Parâmetros de saída:
==================

value - o valor da opção greeks[] - a saída de


estatísticas de hedge da seguinte forma: greeks[0] é gamma, greeks[1] é delta
greeks[2] é theta, greeks[3] é rho e greeks[4] é vega iflag - um indicador de erro

*/
duplo um=1,0,dois=2,0,zero=0,0; duplo
eps,d1,d2,temp,temp1,temp2,pi,np;

if( (x < EPS) || (sigma < EPS) || (t < EPS) ) os argumentos são muito { /* Verifica se alguma das entradas
pequenos */ *iflag = 2; retornar;

} temp = log(s0/x); d1 =
temp+(r-q+(sigma*sigma/dois))*t; d1 = d1/
(sigma*quadrado(t)); d2 = d1-sigma*quadrado(t); /*
avalia o preço da opção */ if (put==0) *value = (s0*exp(-
q*t)*cum_norm(d1)- x*exp(-r*t)*cum_norm(d2)); else
*valor = (-s0*exp(-q*t)*cum_norm(-d1) + x*exp(-
r*t)*cum_norm(-d2));

if (greeks) { /* então calcula os gregos */ temp1 = -d1*d1/two; d2 = d1-


sigma*quadrado(t); np = (um/quadrado(dois*PI)) * exp(temp1); if
(put==0) { /* uma opção de chamada */

gregos[1] = (cum_norm(d1))*exp(-q*t); /* delta */ greeks[2] = -s0*exp(-


q*t)*np*sigma/(two*sqrt(t))
+ q*s0*cum_norm(d1)*exp(-q*t)- r*x*exp(-r*t)*cum_norm(d2); /* theta */ greeks[3] = x*t*exp(-r*t)*cum_norm(d2); /
* ro */

} else { /* uma opção de venda */


gregos[1] = (cum_norm(d1) - um)*exp(-q*t); /* delta */ greeks[2] = -s0*exp(-q*t)*np*sigma/
(two*sqrt(t)) -
q*s0*cum_norm(-d1)*exp(-q*t) + r*x*exp(-r*t)*cum_norm(-d2); /* theta */ greeks[3] = -x*t*exp(-r*t)*cum_norm(-
d2); /* ro */

} greeks[0] = np*exp(-q*t)/(s0*sigma*sqrt(t)); /* gama */ gregos[4] = s0*sqrt(t)*np*exp(-


q*t); /* vê */

} retornar;
}

Trecho de código 4.1 Função para calcular o valor de Black-Scholes para opções europeias.
Machine Translated by Google

opções europeias 77

PI = 3,14159, e também a função cum_norm para calcular a função de distribuição


normal cumulativa.
Pode-se observar nas Tabelas 4.1 e 4.2 que os valores de gamma e vega são os mesmos
tanto para puts quanto para call. Também podemos demonstrar que os valores das opções são
consistentes usando paridade de chamada de venda.

c(S,E,ÿ) + E exp(ÿrÿ) = p(S,E,ÿ) + S exp(ÿqÿ)

Por exemplo, quando ÿ = 1,0 temos c(S,E,ÿ) = 12,952 e P(S,E,T ) = 9,260. Assim:
c(S,E,ÿ) + E exp(ÿrÿ) = 12,952 + 100 × exp(ÿ0,1) = 103,436 e p(S,E,ÿ) + S
exp(ÿqÿ) = 9,260 + 100 × exp(-0,06) = 103,436.

Tabela 4.1 Valores de opções de venda européias e gregas

t Valor Delta gama teta Vega Rho

0,100 3,558 ÿ0,462 0,042 ÿ16.533 12.490 ÿ4,971


0,200 4,879 ÿ0,444 0,029 ÿ10.851 17.487 ÿ9,860
0,300 5,824 ÿ0,431 0,024 ÿ8.298 21.204 ÿ14,663
0,400 6,571 ÿ0,419 0,020 ÿ6.758 24.241 ÿ19,377
0,500 7.191 ÿ0,408 0,018 ÿ5.698 26.832 ÿ24.004
0,600 7.720 ÿ0,399 0,016 ÿ4.909 29.100 ÿ28.544
0,700 8.179 ÿ0,390 0,015 ÿ4.292 31.118 ÿ32.997
0,800 8.582 ÿ0,381 0,014 ÿ3.792 32.935 ÿ37.364
0,900 8.940 ÿ0,373 0,013 ÿ3.377 34.585 ÿ41.646
1.000 9.260 ÿ0,366 0,012 ÿ3.025 36.093 ÿ45.843

Os parâmetros são: S = 100,0, E = 100,0, r = 0,10, ÿ = 0,30, q = 0,06.

Tabela 4.2 Valores de opções de compra europeias e gregas

t Valor Delta Gama teta Vega Rho

0,100 3,955 0,532 0,042 ÿ20.469 12.490 4.929


0,200 5,667 0,544 0,029 ÿ14.724 17.487 9.744
0,300 6,996 0,552 0,024 ÿ12.109 21.204 14.451
0,400 8,121 0,558 0,020 ÿ10.508 24.241 19.054
0,500 9,113 0,562 0,018 ÿ9.387 26.832 23.557
0,600 10,007 0,566 0,016 ÿ8.539 29.100 27.962
0,700 10,826 0,569 0,015 ÿ7.863 31.118 32.271
0,800 11,584 0,572 0,014 ÿ7.305 32.935 36.485
0,900 12,290 0,574 0,013 ÿ6.832 34.585 40.608
1.000 12.952 0,576 0,012 ÿ6.422 36.093 44.640

Os parâmetros são: S = 100,0, E = 100,0, r = 0,10, ÿ = 0,30, q = 0,06.


Machine Translated by Google

78 Finanças Computacionais Usando C e C#

4.4.4 Volatilidade histórica e implícita

A obtenção da melhor estimativa do parâmetro de volatilidade, ÿ, na fórmula de Black-


Scholes é de importância crucial. Existem muitas abordagens diferentes para a estimativa
de volatilidade. Esses incluem:
• Estimativa histórica •
Volatilidade implícita

Vamos agora considerar a estimativa de volatilidade histórica e implícita.

Volatilidade histórica

Neste método calculamos a volatilidade usando n + 1 preços históricos dos ativos, Si,i =
0,...,n, e assumimos que os preços dos ativos são observados no intervalo de tempo
regular, dÿ . Uma vez que se supõe que os preços dos ativos sigam o GBM, a volatilidade
é calculada como o desvio padrão dos n retornos compostos continuamente, ui,i = 1,...,n,
onde

Si = Siÿ1 exp(ui)
ou
E
ui = registro
Si-1

Já sabemos (ver Eq. (2.1.10)) que o desvio padrão esperado dos retornos do ativo ao
longo do intervalo de tempo é ÿ ÿ dÿ . Isso significa que obtemos a seguinte expressão
para ÿˆ , a volatilidade estimada:
n
1
ÿˆ ÿ dÿ = (ui ÿ ¯u)2 (4.4.68)
n-1
i=1

ou
n
1
ÿˆ = (ui ÿ ¯u)2 (4.4.69)
(n ÿ 1) dÿ i=1

É prática aceita expressar todos os tempos em anos e, portanto, a volatilidade é o desvio


padrão anualizado dos retornos. Há também a questão de como contabilizar os dias sem
negociação, como finais de semana e feriados. Por exemplo, suponhamos que o histórico
dos preços dos ativos Si,i = 0,...,n, foi obtido registrando-se o preço em cada pregão .
Uma abordagem é usar dÿ = 1/Ntd, onde Ntd é o número de dias de negociação em um
ano. Se tomarmos Ntd = 250, então a Eq. (4.4.69) torna-se

n
250
ÿˆ = (ui ÿ ¯u)2 (4.4.70)
(n ÿ 1) i=1
Machine Translated by Google

opções europeias 79

void hist_vol(double *sigma, double *err, double data[], long n, double dt, long *ifail) {

/* Parâmetros de entrada:
===================

dados[] - os dados, que consistem em n preços de ativos - o número de pontos


n de dados - o espaçamento de tempo (constante) entre os pontos de
dt dados (em anos)
Parâmetros de saída:
==================

sigma - a volatilidade histórica calculada - o erro padrão na


errar estimativa de volatilidade sigma - um indicador de erro
iflag
*/

#define DADOS(I) dados[(I)-1]

média dupla=0,0,soma=0,0; temperatura


dupla,tn; longo i;

for(i = 2; i <= n; ++i)


média = média + log(DADOS(i))-log(DADOS(i-1)); média = média/
(duplo)(n-1);

for(i = 2; i <= n; ++i) { temp = log(DATA(i))-


log(DATA(i-1)); soma = soma + (média temporária)*(média
temporária);

} soma = soma/(duplo)(n-2); *sigma =


quadrado(soma/dt); tn = (duplo)(2*(n-1));
*err = *sigma/sqrt(tn); retornar;

Trecho de código 4.2 Função para calcular a volatilidade histórica de dados de ativos.

O erro padrão estimado em ÿˆ é (ver, por exemplo, Hull (2003)) dado por

1
ÿˆstd = ˆÿ (4.4.71)
2(n ÿ 1)

Um programa de computador para realizar esses cálculos é fornecido no trecho de código 4.2.

Volatilidade implícita

A volatilidade implícita de uma opção europeia é a volatilidade que, quando substituída na


equação de Black-Scholes, resulta no valor de mercado cotado para a mesma opção. Em
geral, a volatilidade implícita dependerá tanto do tempo até o vencimento da opção quanto da
razão entre o preço atual do ativo e o preço de exercício — isso é conhecido como sorriso de
volatilidade. Esses valores geralmente são armazenados em uma superfície de volatilidade
implícita multidimensional, sendo a volatilidade para precificação de uma determinada opção
obtida por meio de interpolação multidimensional.
A rotina fornecida no trecho de código 4.3 usa o método de Newton para calcular a
volatilidade implícita para uma opção europeia a partir de seu preço de mercado. Vamos
agora ilustrar esta técnica para uma opção de compra européia com valor de mercado
opt_value. A volatilidade implícita, ÿ, é então aquele valor que satisfaz:
K(ÿ) = c(S,E,ÿ,ÿ) ÿ opt_value = 0

em que c(S,E,ÿ,ÿ) representa o valor do call europeu e os restantes símbolos têm o seu
significado habitual.
Machine Translated by Google

80 Finanças Computacionais Usando C e C#

void implicit_volatility(double value, double s0, double x, double sigma[], double t, double r, double q, long put, long *iflag)

{
/* Parâmetros de entrada:
===================

valor - o valor atual da opção - o preço atual do ativo


s0 subjacente - o preço de exercício - os limites de entrada na volatilidade:
x sigma[0], o limite inferior e, sigma[1],
sigma[]
o limite superior - o tempo
t até o vencimento - a taxa de juros -
r o rendimento contínuo de dividendos
q - se a opção de venda for 0, então uma opção de
compra, caso contrário, uma opção de venda
Parâmetros de saída:
==================

sigma[] - o elemento sigma[0] contém a volatilidade implícita estimada - um indicador de erro


iflag
*/
duplo zero=0,0; duplo fx,
sig1, sig2; duplo val,tolx; temperatura
dupla,eps,epsqrt,temp1,v1; long
max_iters, i, ind, ir; duplo grego[5],c[20],sig,vega; feito
há muito tempo;

tolx = eps; epsqrt


= sqrt(EPS); if(put == 0) temp1
= MAX(s0*exp(-q*t)-x*exp(- /* uma opção de chamada */
r*t),zero); else temp1 = MAX(x*exp(-r*t)-s0*exp(-q*t),zero);
/* uma opção de venda */

v1 = fabs(valor-temp1); if (v1 <=


epsqrt) { *iflag = 3; retornar; /* a volatilidade é muito pequena */

} *iflag = 0; i = 0;
max_iters = 50;
feito = 0; sig = sigma[0];
valor = valor; while ((i <
max_iters) && (!feito)) { /* estimativa inicial */

/* Iteração de Newton */
black_scholes(&val,greeks,s0,x,sig,t,r,q,put,iflag); /* calcula o valor da opção Black-Scholes, val /* e vega. */ /* calcula a nova estimativa de sigma
usando o método de Newton */ */
vega = gregos[4]; sig1 = sig
- ((val - valor)/vega);

if (tolx > fabs((sig1 - sig)/sig1)) { /* verifica se a precisão especificada foi alcançada


*/
feito = 1;

} sig = sig1; ++i; /* atualizar sigma */

} sigma[0] = sig1; retornar; /* retorna a estimativa para sigma */

Trecho do código 4.3 Função para calcular a volatilidade implícita das opções europeias.

Do método de Newton temos:

F(ÿi)
ÿi+1 = ÿi ÿ
F (ÿi)
onde
ÿF ÿc(S,E,t,s)
F (ÿi) = = = Vc
ÿÿ ÿÿ
Machine Translated by Google

opções europeias 81

Portanto, o procedimento iterativo é

c(S,E,ÿ,ÿ) ÿ opt_value ÿi+1 = ÿi


ÿ
Vc

onde ÿ0 é a estimativa inicial e ÿi+1 é a estimativa melhorada da volatilidade implícita com


base na i-ésima estimativa ÿi. O término desta iteração ocorre quando ABS(ÿi+1 ÿ ÿi) < tol,
para uma tolerância especificada, tol.
Pode-se ver que como ÿ ÿ 0, d1 ÿ ÿ, d2 ÿ ÿ e, da Eq. (4.4.67), nós
tem Vc ÿ 0. Nessas circunstâncias, o método de Newton falha.
O mesmo procedimento pode ser usado para calcular a volatilidade implícita para uma
opção de venda europeia, neste caso apenas substituímos c(S,E,ÿ,ÿ) por p(S,E,ÿ,ÿ), o valor
de uma opção europeia colocar; da Eq. (4.4.67) Vc = Vp.
Se for necessária a volatilidade implícita das opções americanas, o procedimento é
exatamente o mesmo. No entanto, em vez de usar a fórmula de Black-Scholes para calcular
o valor da opção e vega, usamos uma rede binomial para fazer isso. O uso de redes
binomiais para obter preços de opções e os gregos é descrito no Capítulo 5.

O trecho de código 4.4 fornece um programa de teste simples que ilustra o uso de
a função implicit_volatility; os resultados são apresentados na Tabela 4.3.

duplo X, valor, S, sigma[2], sigmat, T, r, q; longo i, se falhar, coloque;

se falhar = 0; =
S 10,0; =
x 10,5; =
r 0,1; sigmat
= 0,1; = 0,04; = 0; put
q printf
para(i = 1;i <("Tempo
6; ++i)
{ T = (duplo)i*0.5; valor da opção volatilidade implícita (erro)\n");

black_scholes(&value,NULL,S,X,sigmat,T,r,q,put,&flag ); sigma[0] = 0,05; sigma[1] = 1,0;


implicit_volatility(value,S,X,sigma,T,r,q,put,&flag); printf("%8.4f %15.4f

%15.4f (%8.4e) \n",T,valor,sigma[0], fabs(sigmat-sigma[0]));

sigmat = sigmat + 0,1;


}

Trecho de código 4.4 Programa de teste simples para função implicit_volatility.

Tabela 4.3 Valores de opções calculados e volatilidades implícitas do trecho de código 4.4

Tempo (anos) Valor da opção Verdadeiro ÿ Erro em ÿ estimado

0,5 0,1959 0,1 2,7756 × 10ÿ16


1,0 0,8158 0,2 2,2204 × 10ÿ16
1,5 1,5435 0,3 3,8858 × 10ÿ16
2.0 2.3177 0,4 5,5511 × 10ÿ17
2.5 3.1033 0,5 1,1102 × 10ÿ16
Machine Translated by Google

82 Finanças Computacionais Usando C e C#

4.4.5 Opções de preços com o Microsoft Excel


Nesta seção, mostramos como o Visual Basic dentro do Excel pode ser usado para criar
aplicativos poderosos de precificação de derivativos com base na fórmula de Black-Scholes.
Explicaremos como o Visual Basic do Excel pode ser usado para criar um aplicativo que
precifica uma seleção de opções europeias simples de compra e venda com o pressionar
de um botão.
Na Seção 4.4.3 derivamos a fórmula de Black-Scholes:

c(S,E,ÿ) = SN1(d1) ÿ eÿrÿEN1(d2)


e

p(S,E,ÿ) = ÿSN1(ÿd1) + eÿrÿEN1(ÿd2)


onde

log(S/E)(r ÿ ÿ2/2)ÿ =
ÿ ÿÿ onde S é o valor atuald1doÿativo
ÿ ÿÿ ed1ÿ =
é
a volatilidade do ativo, e
eÿx2/2 dx .
1 x
N1(x) = ÿ ÿÿ
2p
A distribuição normal padrão cumulativa univariada, N1(x), pode ser avaliada no
Excel usando sua função interna NORMDIST. A definição desta função é a seguinte:

NORMDIST(x,média,desv_padrão,cumulativo)

Esta função retorna a distribuição cumulativa normal para a média e desvio padrão
especificados.
Parâmetros de função:

x: é o valor para o qual você deseja a distribuição.


média: é a média aritmética da distribuição.
standard_dev: é o desvio padrão da distribuição.
cumulativo: é um valor lógico que determina a forma da função. Se cumulativo
for TRUE, NORMDIST retorna a função de distribuição
cumulativa; se FALSE, retorna a função de densidade de
probabilidade.

Se média = 0 e standard_dev = 1, NORMDIST retorna a distribuição normal


padrão.
Esta função pode ser usada para criar uma função do Visual Basic para calcular os valores
das opções europeias no Excel, consulte o trecho de código 4.5.
Uma vez que a função tenha sido definida, ela pode ser acessada interativamente usando o
recurso Paste Function dentro do Excel, conforme mostrado na Fig. 4.1.
A função bs_opt também pode ser incorporada a outro código Visual Basic dentro
do Excel. O trecho de código 4.6 define a sub-rotina do Visual Basic
MANY_EUROPEANS_Click().
Machine Translated by Google

opções europeias 83

Function bs_opt(S0 As Double, _


ByVal X As Double, sigma As Double, T As Double, r As Double, q As Double, ByVal putcall _
As Long) As Double

' Visual Basic Rotina para calcular o valor de ' uma opção de venda europeia ou de compra
europeia.
Autor: George Levy

Dim temp como duplo


Dim d1 como duplo
Dim d2 como duplo
Dim SQT como duplo
Valor dim como duplo

temp = Log(S0 / X) d1 = temp + (r


- q + (sigma * sigma / 2#)) * T
SQT = Sqr(T) d1 =
d1 / (sigma * SQT) d2 = d1 - sigma *
quadrado

Se (putcall = 0) Então ' uma opção de chamada


value = S0 * Exp(-q * T) * WorksheetFunction.NormDist(d1, 0#, 1#, True) _
- WorksheetFunction.NormDist(d2, 0#, 1#, True) * X * Exp(-r * T)

Else ' value uma opção de venda


= -S0 * Exp(-q * T) * WorksheetFunction.NormDist(-d1, 0#, 1#, True) + _
X * WorksheetFunction.NormDist(-d2, 0#, 1#, True) * Exp(-r * T)

Fim se

bs_opt = valor

função final

Trecho de código 4.5 Código Visual Basic para precificar opções europeias usando a fórmula de
Black-Scholes.

Figura 4.1 Usando a função bs_opt interativamente no Excel. Aqui uma opção de compra é
processada com os seguintes parâmetros: S = 10,0, X = 9,0, q = 0,0, T = 1,5, r = 0,1 e ÿ = 0,2.
Machine Translated by Google

84 Finanças Computacionais Usando C e C#

Subscritor Privado MANY_EUROPEANS_Click()

Dim I As Long
Dim putcall As Long
Dim S0 como duplo
Dim q como duplo
Dim sigma como duplo
Dim T como duplo
Dim r As Double

q = 0#
T = 1,5
r = 0,1 sigma
= 0,2

Para i = 1 a 22

S0 = Sheet1.Cells(i + 1, 1).value X = Sheet1.Cells(i + 1, 2).value


putcall = Sheet1.Cells(i + 1, 3).value Sheet1.Cells(i + 1, 4).value
= bs_opt(S0, X, sigma, T, r, q, putcall)

Proximo eu

End Sub

Trecho de código 4.6 Código Visual Basic que usa a função bs_opt.

Figura 4.2 Planilha Excel antes do cálculo dos valores das opções europeias.

Quando o botão “CALCULAR OPÇÕES” é clicado, os valores de 22 opções européias


serão calculados usando os dados nas colunas 1–3 na planilha 1, veja as Figs. 4.2 e 4.3.
Machine Translated by Google

opções europeias 85

Figura 4.3 Planilha Excel após cálculo dos valores das opções europeias.

A distribuição normal padrão cumulativa também pode ser usada para fornecer
soluções analíticas para uma variedade de outras opções exóticas , como: opções de
barreira, opções de troca, opções de lookback, opções binárias, etc.

4.5 Opções de barreira

4.5.1 Introdução

As opções de barreira são derivativos em que o pagamento depende de o preço do


ativo atingir um determinado nível de barreira, B. As opções knockout tornam-se inúteis
(deixam de existir) se o preço do ativo atingir a barreira, enquanto as opções knockin
passam a existir quando o preço do ativo atinge o barreira. Consideraremos as
seguintes opções de barreira europeia de ativo único:

• Down and out call: Uma opção de call knockout vanilla, valor cdo, que deixa de existir
quando o preço do ativo atinge ou cai abaixo do nível de barreira. • Up and out call:
Uma opção de call knockout vanilla, valor cuo, que deixa de existir quando o preço do
ativo atinge ou ultrapassa o nível de barreira. • Down and in call: Uma opção de call
knockin vanilla, valor cdi, que passa a existir quando os preços dos ativos atingem ou
descem do nível de barreira.
Machine Translated by Google

86 Finanças Computacionais Usando C e C#

• Up and in call: Uma opção de compra knockin vanilla, valor cui, que passa a existir
quando o preço do ativo atinge ou ultrapassa o nível de barreira.

As seguintes expressões devem ser verdadeiras:

c = cuo + cui (4.5.1)


c = cdo + cdi (4.5.2)

onde c é o valor de uma opção de compra vanilla. Portanto, precisamos apenas derivar
expressões para ambas as opções knockout e, em seguida, usar as equações acima
para calcular o valor das opções knockin correspondentes.
A notação que usaremos é a seguinte: O símbolo t representa o tempo atual, T
representa o tempo em que a opção vence e ÿ = T ÿ t, a duração da opção. O símbolo
s, com restrição t é qualquer tempo intermediário durante o qual a opçãosestá
T ativa.
,

4.5.2 Precificação analítica de opções de compra para baixo e para fora

Se considerarmos o movimento Browniano (com desvio zero) Xs ÿ N(0,(s ÿ t)ÿ2), que


t sT , começa em Xt = 0 e, após o tempo ÿ = T ÿ t, termina no ponto XT = X
então (para exemplo, ver Freedman, 1983) a função de densidade de probabilidade
para este movimento não exceder o valor X = b (onde b > 0) durante o tempo ÿ é dada
por:

2 X2
fb Xmax s ,X = ÿ exp2b(X ÿp2s
b) exp ÿ 2ÿ2ÿ (4.5.3)
pi

onde por conveniência usamos ÿ = (2b ÿ X)/(ÿ3ÿ 3/2), e Xmax max(Xs,t s T ). Como =
s
Xs é um movimento browniano sem deriva e volatilidade ÿ, então ÿXs é um movimento
browniano idêntico. Portanto, substituindo X ÿ ÿX e b ÿ ÿb na equação acima, obtemos:

2 X2
fb Xmin s ,X = ÿÿ exp2b(X ÿp2s
b) exp ÿ 2ÿ2ÿ (4.5.4)
pi

onde usamos Xmin = min(Xs,t


s s T ). A equação (4.5.4) é a função de densidade de
probabilidade de ÿXs ficar acima do valor X = b, onde b < 0.
Esses resultados podem ser generalizados para incluir deriva (Musiela e Rutkowski,
1998, p. 212), de modo que Xs ÿ N((r ÿ q ÿ ÿ2/2)(s ÿ t),ÿ(s ÿ t)), para ts T. Agora
ostemos
seguintes resultados:

fb Xmax s ,X
2
= Ah exp2b(X ÿp2s
b) exp ÿ(X ÿ (r ÿ q ÿ2s2sq
ÿ2/2)ÿ)2 (4.5.5)
pi
Machine Translated by Google

opções europeias 87

fb Xmin s ,X
2
= ÿÿ ÿ(X ÿ (r ÿ q ÿ ÿ2/2)ÿ)2 (4.5.6)
exp2b(X ÿp2s
b) exp 2s2sq
pi

onde r é a taxa livre de risco e q é o rendimento contínuo de dividendos. Uma opção


europeia com barreira down and out com vencimento ÿ e uma barreira em X = B deixará de
existir (tornar-se sem valor) se a qualquer momento Xs B, para t . sA Tfunção
de de
probabilidade
densidade
de que a opção de barreira continuará a existir no tempo T se o ponto final for X é, portanto:

b=X
2
f (X > B) = ÿ ÿ exp2b(X ÿ p2s
b)
pi B=S exp(b)

ÿ{X ÿ (r ÿ q ÿ ÿ2/2)ÿ }2 (4.5.7)


× exp 2s2sq
banco de dados

ou

ÿ{X ÿ (r ÿ q ÿ ÿ2/2)ÿ }2
f (X > B) = ÿ 2 exp 2s2sq
pi
b=X
× ÿ exp2b(X ÿ p2s
b) banco de dados
(4.5.8)
b=log(B/S)

onde integramos todos os valores possíveis de b (ou seja, B<b<X) que mantêm a opção
viva. Lembrando que:
b=X

ÿ exp2b(X ÿ p2s
b)
ÿ

banco de dados

b=log(B/S)
b=X
(X ÿ 2b)
= exp2b(X ÿp2s
b) banco de dados

b=log(B/S) ÿ3ÿ 3/2

e observando que:
ÿ 2(X ÿ 2b)
exp2b(X ÿp2s
b) = exp2b(X ÿp2s
b)
ÿb p2p
Nós temos:
b=X
2(X ÿ 2b)
exp2b(X ÿp2s
b) banco de dados

b=log(B/S) p2p
b=X

= exp2b(X ÿ p2s
b) = 1 ÿ exp2 log(B/S)(X ÿ log(B/S))
p2s
b=log(B/S)

Então nós temos:

1
ÿ{X ÿ (r ÿ q ÿ ÿ2/2)ÿ }2
f (X > B) = ÿ exp 2s2sq
ÿÿ ÿ2ÿ × 1 ÿ

exp2 log(B/S)(X ÿ log(B/S) p2s


Machine Translated by Google

88 Finanças Computacionais Usando C e C#

O valor cdo de uma opção de compra europeia com strike E, satisfazendo E>B, é dado
por: exp(ÿrÿ) ÿ ÿÿ ÿ2ÿ
ÿ

cada = S exp(X) ÿ E f (X > B) dX (4.5.9)


X=log(E/S)

Esta integral é avaliada no Apêndice B.1, e o valor do down and out


opção de chamada cdo é:

cdo = c ÿ cdi (4.5.10)


onde

c = S exp(ÿqÿ)N1(d1) ÿ E exp(ÿrÿ)N1(d2)
2(rÿq) +1 2(rÿq) ÿ1
B ÿ2 B ÿ2
cdi = S exp(ÿqÿ)N1(d4) ÿ E exp(ÿrÿ)N1(d3)
S S
log(S/E) + (r ÿ q + ÿ2/2)ÿ d1 =
ÿ ÿÿ log(S/E) + (r ÿ q ÿ ÿ2/2)ÿ d2 = ÿ
ÿÿ log(B2/SE) + (r
ÿ q ÿ ÿ2/2)ÿ d3 = ÿ ÿÿ

log(B2/ES) + (r ÿ q + ÿ2/2)ÿ d4 =
ÿ ÿÿ

No trecho de código 4.7, fornecemos a função bs_opt_barrier_downout_ call que usa


a Eq. (4.5.10) para precificar uma opção de compra europeia de baixo para cima.
Essa rotina será usada no Capítulo 5 para medir a precisão alcançada usando várias
técnicas de grade de diferenças finitas para resolver a equação de Black-Scholes.

4.5.3 Precificação analítica de opções de compra up e out

Aqui obteremos uma expressão para uma opção de compra europeia up and out com
rendimento de dividendo contínuo q, de maneira semelhante à usada na Seção 4.5.2
para a opção de compra europeia down and out. Uma opção de barreira europeia up and
out com vencimento ÿ e uma barreira em X = B deixará de existir (tornar-se sem valor) se
a qualquer momento Xs B, para ts T . A função
opçãode
dedensidade
barreira continuará
de probabilidade
a existir de
no que
tempo
a
T se o ponto final for X é, portanto:

2 B=S exp(b)
f (X < B) = ÿ exp2b(X ÿ b)
pi b=X p2t

ÿ{X ÿ (r ÿ q ÿ ÿ2/2)ÿ }2 (4.5.11)


× exp banco de dados

2s2sq
Machine Translated by Google

opções europeias 89

void bs_opt_barrier_downout_call(duplo *valor, duplo nível_barreira, duplo s0, duplo x, duplo sigma, duplo t, duplo
r, duplo q, longo *iflag)

{
/* Parâmetros de entrada:
===================

nível_barreira s0 - o nível da barreira - o preço atual do ativo


subjacente - o preço de exercício - a volatilidade - o tempo até o
x vencimento - a taxa de juros livre de risco - o rendimento de dividendos
sigma t

r
q
Parâmetros de saída:
==================
valor - o valor da opção - um indicador de erro
iflag
*/
duplo um=1,0,dois=2,0,zero=0,0; temperatura dupla,
temp1, temp2,a,b,d1,d2,d3,d4,d5,d6,d7,d8; dupla face;

if(x < EPS) { /* então o preço de exercício (X) é muito pequeno */ *iflag = 2; retornar;

}
if (sigma < EPS) { /* então a volatilidade (sigma) é muito pequena */
*iflag = 3; retornar;

} if (t < EPS) { /* então o tempo para expirar (t) é muito pequeno */


*se falhar = 3;
retornar;
}
if (barrier_level <= 0) { /* nível de barreira deve ser maior que zero */
*iflag = 4;
}

if (s0 <= nível_barreira) { /* opção já foi eliminada */


*valor = 0,0; retornar;

fac = sigma*quadrado(t); temp1


= -um+(dois*(rq)/(sigma*sigma)); temp2 = nível_barreira/s0; a =
pow(temp2,temp1); temp1 = um+(dois*(rq)/(sigma*sigma)); b =
pow(temp2,temp1); if (x > nível_barreira) {

/* golpe > nível_barreira */ d1 = (log(s0/x)+(r-


q+0.5*sigma*sigma)*t)/fac; d2 = (log(s0/x)+(rq-0,5*sigma*sigma)*t)/fac; temp = (s0*x)/
(barrier_level*barrier_level); d7 = (log(temp)-(rq-0,5*sigma*sigma)*t)/fac; d8 = (log(temp)-
(r-q+0,5*sigma*sigma)*t)/fac;

temp1 = s0*exp(-q*t)*(cum_norm(d1)-b*(one-cum_norm(d8))); temp2 = x*exp(-r*t)*(cum_norm(d2)-


a*(one-cum_norm(d7))); *valor = temp1-temp2;

}
else { /* golpe <= nível_barreira */ d3 = (log(s0/nível_barreira)
+(rq-0.5*sigma*sigma)*t)/fac; d6 = (log(s0/barrier_level)-(rq-0.5*sigma*sigma)*t)/fac; d4 =
(log(s0/barrier_level)+(r-q+0,5*sigma*sigma)*t)/fac; d5 = (log(s0/barrier_level)-(r-
q+0,5*sigma*sigma)*t)/fac;

temp1 = s0*exp(-q*t)*(cum_norm(d3)-b*(one-cum_norm(d6))); temp2 = x*exp(-r*t)*(cum_norm(d4)-


a*(one-cum_norm(d5))); *valor = temp1-temp2;

} retornar;
}

Trecho de código 4.7 Função para calcular o valor para opções de compra europeias de compra
e venda.
Machine Translated by Google

90 Finanças Computacionais Usando C e C#

ou

ÿ{X ÿ (r ÿ q ÿ ÿ2/2)ÿ }2
f (X < B) = 2 exp p
2s2sq
b=log(B/S)
× ÿ exp2b(X ÿ b) banco de dados
(4.5.12)
b=X p2s

(2bÿX)
onde, como na Seção 4.5.2, usamos ÿ = e integramos todosÿ3ÿ
os3/2
valores possíveis de b (isto é,
B>b>X) que mantêm a opção ativa. Lembrando que:

b=log(B/S)
ÿ exp2b(X ÿ b) banco de dados

b=X p2s
b=log(B/S)
= (2b ÿ X)
exp2b(X ÿ b) banco de dados

b=X ÿ3ÿ 3/2 p2s

e observando:
ÿ 2(X ÿ 2b)
ÿ

exp2b(X ÿ b) = exp2b(X ÿ b) (4.5.13)


ÿb p2s p2p p2s

Nós temos:
b=log(B/S)
2(2b ÿ X) ÿ2ÿ
exp2b(X ÿ b) banco de dados

b=X p2s
b=log(B/S)
= ÿ exp2b(X ÿ b) = 1 ÿ
p2s b=X

exp2 log(B/S)(X ÿ log(B/S))


p2s

Portanto:

1 2
ÿ{X ÿ (r ÿ q ÿ ÿ2/2)ÿ }2
f (X < B) = ÿ ÿÿ exp
ÿ2ÿ × 1 ÿ pi 2s2sq

exp2 log(B/S)(X ÿ log(B/S)) (4.5.14)


p2s

Vamos agora derivar a fórmula para uma opção de compra para cima e para fora quando E<B.
De fato, se E>B, a opção não tem valor, pois no momento atual t o pagamento da opção de
compra, max(St ÿ E, 0) = 0, e se St > E, a opção será eliminada.

ÿ
exp(ÿrÿ) ÿ
cuo = S exp(X) ÿ E f (X < B) dX (4.5.15)
ÿÿ ÿ2ÿ X=log(E/S)

Levando em consideração o fato de que a opção se torna inútil quando S exp(X) > B, (ou seja, X >
log(B/S)) temos:

exp(ÿrÿ) ÿ log(B/S)
cuo = S exp(X) ÿ E f (X < B) dX (4.5.16)
ÿÿ ÿ2ÿ X=log(E/S)
Machine Translated by Google

opções europeias 91

Essa integral é avaliada no Apêndice B.2, e o valor da opção de call down and out cuo
é:
cuo = c ÿ cui

onde c é o valor de um call vanilla e cui, o valor de um up and in call, é dado por:

cui = S exp(ÿqÿ)N1(d2) ÿ E exp(ÿrÿ)N1(d4)


2(rÿq) ÿ1
B ÿ2
ÿ E exp(ÿrÿ) N1(d5) ÿ N1(d6)
S
2(rÿq) +1
B ÿ2
+ S exp(ÿrÿ) N1(d7) ÿ N1(d8) (4.5.17)
S
e

log(S/E) + (r ÿ q + ÿ2/2)ÿ d1 =
ÿ ÿÿ log(S/B) + (r ÿ q + ÿ2/2)ÿ d2 =
ÿÿ log(S/E) + (r ÿ
q ÿ ÿ2/2)ÿ d3 = ÿ ÿÿ log(S/B) +
(r ÿ q ÿ ÿ2/2)ÿ d4 = ÿ ÿÿ log(B2/ES)
ÿ (r ÿ q ÿ ÿ2 /2)ÿ
d5 = ÿ ÿÿ log(B/S) + (r ÿ q ÿ
ÿ2/2)ÿ d6 = ÿ ÿÿ log(B2/ES) + (r ÿ q
+ ÿ2/2)ÿ d7 = ÿ
ÿÿ log(B/S) + (r ÿ q + ÿ2/2)ÿ
d8 = ÿ ÿÿ

4.5.4 Precificação Monte Carlo de opções de baixo e de

saída Nesta seção, mostramos como a simulação de Monte Carlo pode ser usada para
precificar opções de barreira de baixo e de saída. Descreveremos uma abordagem básica
de Monte Carlo e também um método de ponte browniana que fornece resultados mais
precisos (consulte o Capítulo 8).
O preço do ativo, S, será considerado GBM, então o logaritmo do ativo
preço X segue o processo browniano:
X = ÿt + ÿWt (4.5.18)
onde ÿ é o desvio e ÿ é a volatilidade.
Machine Translated by Google

92 Finanças Computacionais Usando C e C#

Se o nível de barreira for B, a opção será eliminada quando SB ou, de forma equivalente,
log(S) log(B). Isso será expresso como X b, onde b = log(B).

A abordagem básica para simular a opção down and out é primeiro decidir quantos
Cenários usar e também quantos TimeSteps devem existir em cada cenário. O tamanho
de cada passo de tempo é então time_step = TimeToExpiry/TimeSteps. Para cada cenário,
o caminho de Xt é avançado no tempo de t para t + t usando a Eq. (4.5.18), com dt =
time_step e um valor para Wt de saída de um gerador gaussiano de números aleatórios.
A construção do caminho é interrompida se o tempo de expiração da opção for atingido ou
se a opção for eliminada - ou seja, X b. Quando a opção é eliminada antes do vencimento,
o retorno para esse cenário é zero. Denotaremos o valor da opção obtido do i-ésimo
cenário por DOi onde i = 1,..., Cenários. O valor da opção é o valor médio de DOi em todos
os cenários; para obter mais detalhes, consulte o trecho de código 4.8.

Um problema com essa abordagem de simulação é que ela não leva em conta a
possibilidade de que Xÿ b, t<ÿ<t + t, mesmo que Xt > b e Xt+t > b. Nestas circunstâncias a
opção deve ser tratada como nocauteada, já que X atingiu (ou cruzou) a barreira b no
tempo ÿ mas depois aumentou para o valor Xt+t > b no , tempo t + t.

Discutiremos agora como o método da ponte browniana lida com essa situação.

Vamos pegar dois pontos de tempo consecutivos t1 e t2 = t1 + t, e assumir que ambos


Xt1 e Xt2 estão
probabilidade
acima dodenível
quedenobarreira
intervalo
(logarítmico)
de tempo [t1,t2],
b. Queremos
o preço encontrar
do ativo tenha
a caído
abaixo de B, e usar isso para obter valores mais precisos para opções de baixa e baixa. A
probabilidade necessária de passagem de barreira é assim: P mX

t1,t2 b|{Xt2 ,Xt1 }


onde mX denota
t1,t2 o mínimo de X no intervalo de tempo [t1,t2].
A densidade de probabilidade de Xt2 condicional em Xt1
1
é ÿ(Xt2 ÿ Xt1 ÿ ÿt)2
p(Xt2 |Xt1 ) = exp ÿ ÿ2ÿt onde 2ÿ2t
t = t2 ÿ t1.

Da lei de Bayes sabemos que:

p({mX b,Xt2 }|Xt1 ) b|


PmX t1,t2
_ {Xt2 ,Xt1 } = p(Xt2 |Xt1 )

Mostramos no Apêndice I que

p mX b,Xt2 |Xt1
t1,t2
1
= ÿ(Xt2 + Xt1 ÿ 2b ÿ ÿt)2
exp2ÿ(b ÿ Xt1 ) exp
s ÿ2pt p2 2ÿ2t
Machine Translated by Google

opções europeias 93

então

PmX
t1 ,t2 b|{Xt2 ,Xt1 }

= exp2ÿ(b ÿ Xt1 )
p2

ÿÿ(Xt2 + Xt1 ÿ 2b ÿ ÿt)2 + (Xt2 ÿ Xt1 ÿ ÿt)2 2ÿ2t


× exp

Agora usaremos um pouco de álgebra para simplificar essa expressão.

PmX _ b|{Xt2 ,Xt1 }


t1,t2

= exp4ÿt(b ÿ Xt1 ) ÿ (Xt2 + Xt1 ÿ 2b ÿ ÿt)2 + (Xt2 ÿ Xt1 ÿ ÿt)2


2ÿ2t
2
= exp4ÿt(b ÿ Xt1 ) ÿ (Xt2 ÿ Xt1 ÿ ÿt) ÿ 2(b ÿ Xt1 )

+ (Xt2 ÿ Xt1 ÿ ÿt)2 / 2ÿ2t = exp4ÿt(b

ÿ Xt1 ) + 4(b ÿ Xt1 )(Xt2 ÿ Xt1 ÿ ÿt) + 4(b ÿ Xt1 )2


2ÿ2t

ÿ2(b ÿ Xt1 )(b ÿ Xt2 ) ÿ2t


= exp

que finalmente rende

PMlog (S) b| log(St2 ), log(St1 )


t1,t2

ÿ2(log(B) ÿ log(St1 ))(log(B) ÿ log(St2 )) ÿ2t


= exp (4.5.19)

A equação (4.5.19) dá a probabilidade de a opção ter sido eliminada entre os tempos t1 e t2 ,


mesmo que os preços dos ativos St1 e St2 sejam maiores que B. A probabilidade de a opção não
ter sido eliminada entre os tempos t1 e t2 é, portanto, P mlog(S) > b| log(St2 ), log(St1 )

t1,t2

ÿ2(log(B) ÿ log(St1 ))(log(B) ÿ log(St2 )) = 1 ÿ exp


ÿ2t (4.5.20)

Isso significa que para o (completo) i-ésimo caminho do cenário, de n etapas de tempo, a
probabilidade de mlog(S) > b é
n-1
=
2(log(B) ÿ log(Si 1 ÿ ))(log(B) ÿ log(Si tj+1 ))
BBi exp ÿ
c tj ÿ2t
j=0

onde Si tj é o preço do ativo no cenário i no tempo tj .


O valor de opção DOi do cenário básico de Monte Carlo pode, portanto, ser ajustado da
seguinte forma = DOi BBi DOÿ

eu c
Machine Translated by Google

94 Finanças Computacionais Usando C e C#

e a nova estimativa de Monte Carlo DOÿ é


Cenários
i=1 i DOÿ
FAZÿ =
Cenários

onde mais detalhes podem ser encontrados no trecho de código 4.8.

private double MonteCarloSim(bool is_put) {

int semente = 111;


double[] asset_path = new double[fTimeSteps]; double time_step =
fTimeToExpiry / fTimeSteps; double sqrt_time_step =
System.Math.Sqrt(time_step); disco duplo = System.Math.Exp(-fRiskFreeRate *
fTimeToExpiry);

set_seed(semente);

double opt_val = 0,0; bool not_out


= verdadeiro; int k = 0; STN duplo
= 0,0; média dupla = (fRiskFreeRate
- fDividendYield - fSigma1 *
fSigma1 * 0,5) * time_step; padrão duplo = System.Math.Sqrt(fSigma1 * fSigma1 * time_step); duplo z; double sum_opt_vals = 0,0;

for (int i = 0; i < fNumberScenarios; ++i) {

// gera o caminho do ativo double ST1 =


fS1; not_out = verdadeiro; k = 0;

while (not_out && k < fTimeSteps) {

z = RndNorm(média, padrão); STN =


ST1 * System.Math.Exp(z); if (STN <fBarrierLevel)
not_out = false; ST1 = STN; asset_path[k] = STN; ++k;

} if (é_put) {

opt_val = System.Math.Max(fStrike - STN, 0.0);

} outro
{
opt_val = System.Math.Max(STN - fStrike, 0.0);

} if (not_out) { // só
tem valor se o valor do ativo estiver acima do nível_barreira
// calcula a probabilidade de o ativo permanecer acima da barreira if (UseBrownianBridge) {

double total_probability_above = 1,0, pr; duplo sigma_2 = fSigma1


* fSigma1; duplo log_barrier_level = System.Math.Log(fBarrierLevel);
dupla face; for (int jj = 0; jj < fTimeSteps - 1; ++jj) {

log_S_i duplo = System.Math.Log(asset_path[jj]); log_S_i1 duplo =


System.Math.Log(asset_path[jj + 1]);

fac = 2,0 * (log_barrier_level - log_S_i) * (log_barrier_level -


log_S_i1) / (sigma_2 * time_step);
pr = (1.0 - System.Math.Exp(-fac)); // probabilidade de ficar acima do
barreira entre i e i+1
total_probabilidade_acima *= pr;

Trecho de código 4.8 Um exemplo de uso da probabilidade de cruzamento da barreira da ponte


browniana para aumentar o preço de uma opção de down and out europeia.
Machine Translated by Google

opções europeias 95

} sum_opt_vals += total_probability_above * opt_val * disco; else { // não use a ponte browniana }


sum_opt_vals += opt_val * disc;

}
}
}
double temp = sum_opt_vals / (double)fNumberScenarios;

temperatura de retorno;
}

Trecho de código 4.8 (continuação).


Machine Translated by Google

páginaEsta intencionalmente em brancoesquerda


Machine Translated by Google

5 Opções americanas de ativo único


5.1 Introdução

No Capítulo 4, discutimos as opções europeias de um único ativo e as fórmulas


analíticas que podem ser usadas para precificá-las. Aqui, consideraremos a avaliação
de opções de estilo americano de ativo único usando métodos numéricos e fórmulas
analíticas; além disso, discutiremos o uso de técnicas numéricas para avaliar certas
opções européias. A cobertura deste capítulo é a seguinte: • Técnicas de aproximação

analítica para avaliação de opções americanas • Técnicas de rede binomial usadas para
avaliação de opções americanas e europeias
opções
• A avaliação de opções americanas e europeias vanilla e de barreira usando grades de
diferenças finitas. • A avaliação de opções americanas via simulação de Monte Carlo.

Deve-se mencionar que, embora grande parte da discussão aqui diga respeito à
avaliação de opções de compra e venda europeias e americanas, as técnicas usadas
podem ser modificadas sem muita dificuldade para incluir opções mais exóticas com
retornos personalizados e características de exercício antecipado.

5.2 Aproximações para opções americanas vanilla

5.2.1 Opções de compra americanas com dividendos

em dinheiro Nesta seção, vamos considerar a avaliação de opções de compra


americanas com dividendos em dinheiro e discutir os métodos de Roll, Geske, Whaley e Black.
Vamos primeiro considerar o método Roll-Geske-Whaley.

A aproximação Roll-Geske-Whaley Este

método usa o trabalho de Roll (1977), Geske (1979) e Whaley (1981).


Seja S o preço atual (tempo t) de um ativo que paga um único dividendo em dinheiro D1
no tempo t1. Na data ex-dividendo , t1, haverá uma diminuição no valor do ativo de St1
para St1 ÿD1. Além disso, o preço atual do ativo líquido de dividendos garantidos é:

SD = S ÿ D1 exp ÿr(t1 ÿ t) (5.2.1)


Machine Translated by Google

98 Finanças Computacionais Usando C e C#

onde r é a taxa de juros sem risco.


Agora considere uma opção de compra americana, com preço de exercício E e tempo de ,
expiração T que é retirado desse ativo. Em t1 haverá um determinado preço ex-dividendo do ativo,
Sÿ, acima do qual a opção será exercida antecipadamente. Esse valor pode ser encontrado
resolvendo a seguinte equação:

c Sÿ,E,ÿ1 = Sÿ + D1 ÿ E (5.2.2)

onde c(Sÿ,E,ÿ1) é o valor de Black–Scholes de uma opção de compra europeia com preço de
exercício E e vencimento ÿ1 = T ÿ t1, sobre um ativo com valor atual Sÿ no tempo t1. Se antes da
data ex-dividendo St1 > Sÿ então a opção americana será exercida e realizará um pagamento em
dinheiro de St1 + D1 ÿ E. Por outro lado, se St1 Sÿ então a opção valerá mais se não for exercida
e irá ser mantido até o vencimento da opção no tempo T
.
Podemos reescrever a Eq. (5.2.2) de modo que Sÿ seja a raiz da seguinte equação:

K Sÿ = c Sÿ,E,ÿ1 ÿ Sÿ ÿ D1 + E = 0 (5.2.3)

onde K(Sÿ) denota a função na variável única Sÿ.


Uma técnica bem conhecida para resolver a Eq. (5.2.3) é o método de Newton, que
neste caso toma a forma:
K(Sÿ ) eu

Sÿi+1 = Sÿ eu
ÿ

(5.2.4)
K (Si)ÿ
onde Sÿ eu é a i-ésima aproximação de Sÿ e Sÿ aproximação.
i+1 é o (i + 1) melhorado

Se considerarmos agora os termos da Eq. (5.2.4) temos das Eqs. (5.2.2) e (5.2.3) que

K Sÿ eu
= c Sÿ eu ,E,ÿ1 ÿ Sÿ eu ÿ D1 + E
e
ÿK(Sÿ ) ÿc(Sÿ ,E,ÿ1) ÿ
K Sÿ eu
= eu
= 1
ÿSÿi i ÿSÿ
i

Também da Eq. (A.3.2) no Apêndice A.3:


ÿc(Sÿ ,E,ÿ1)
= N1 d1 Sÿ eu

i ÿSÿ
i

notamos que aqui o rendimento contínuo de dividendos q = 0.


Então

ÿK(Sÿ ) eu

K Sÿ i = = N1 d1 Sÿ ÿ1
eu

ÿSÿ eu

onde d1/E)
= ÿ+ÿT
(r + ÿ2/2)ÿ1
ÿ t1 log(Sÿ
Substituindo eu

estes resultados na Eq. (5.2.4) dá: c(Sÿ ,E,ÿ1)


ÿ (Sÿ + D1 ÿ E)

eu eu

Sÿ
i+1
= Sÿ eu
ÿ

N1(d1(Sÿ ))ÿ 1 eu
Machine Translated by Google

Opções americanas de ativo único 99

No rearranjo, isso produz:


Sÿ N1(d1(Sÿ ))ÿ c(Sÿ
eu
,E,ÿ1) + D1 ÿ E i
eu

Sÿi+1 =
N1(d1(Sÿ ))ÿ 1
eu

para i = 0,..., max_iter (5.2.5)

onde uma aproximação inicial conveniente é escolher Sÿ 0 = E, e max_iter


é o número máximo de iterações que devem ser usadas.
Vamos agora citar a fórmula de Roll, Geske e Whaley para o valor atual
de uma opção de compra americana que paga um único dividendo em dinheiro D1 no tempo t1; isso é:

C(S,E,t)
t1 ÿ t
= SD N1(b1) + N2 a1, ÿb1,
t

+ D1 exp ÿr(t1 ÿ t) N1(b2)


t1 ÿ t
ÿ E exp(ÿrÿ) N1(b2) exp(rÿ1) + N2 a2, ÿb2, ÿ (5.2.6)
t

onde SD é dado pela Eq. (5.2.1), E é o preço de exercício, T é a data de vencimento da


opção, t representa o tempo atual, ÿ é o vencimento da opção, N1(a) é a função de densidade
normal cumulativa univariada com limite integral superior a, e N2(a,b,ÿ) é a função de
densidade normal cumulativa bivariada com limites integrais superiores aeb e coeficiente de
correlação ÿ. Os outros símbolos usados na Eq. (5.2.6) são definidos como

log(S/E) + (r + ÿ2/2)ÿ ÿ ÿÿ
a1 = , a2 = a1 ÿ ÿ ÿÿ

log(S/Sÿ) + (r + ÿ2/2)(t1 ÿ t) b2 = ÿ
ÿt1 ÿ t , b2 = b1 ÿ ÿ ÿt1 ÿ t

e S é o preço atual (tempo t), Sÿ é encontrado usando a Eq. (5.2.5), r é a taxa de juros sem
risco, ÿ é a volatilidade do ativo, ÿ = T ÿ te ÿ1 = T ÿ t1.
Para calcular o valor de uma opção de compra americana que paga n dividendos em
dinheiro Di, i = 1,...,n, às vezes ti, i = 1,...,n, podemos usar o fato de que o exercício ótimo
normalmente ocorre apenas na data final ex-dividendo tn; ver, por exemplo, Hull (2003).
Nessas circunstâncias, a Eq. (5.2.6) ainda pode ser mostrado para valorizar a chamada
americana, mas agora t1 deve ser definido como tn, D1 deve ser definido como Dn e SD é
dado por:

ÿn
SD = Sim De exp ÿr(ti ÿ t) (5.2.7)
i=1

Um programa para calcular a aproximação Roll-Geske-Whaley para uma opção de compra


americana com múltiplos dividendos em dinheiro é fornecido no trecho de código 5.1. Aqui as
funções cum_norm e cum_norm2 são usadas para calcular os valores de N1(a) e N2(a,b,ÿ),
respectivamente. O trecho de código 5.3 foi usado para calcular os valores
Machine Translated by Google

100 Finanças Computacionais Usando C e C#

void RGW_approx(double *opt_value, double *critical_value, long n_divs, double dividends[],_ double Divs_T[], double S0, double X, double sigma, double
T, double r, long *iflag)

{
/* Parâmetros de entrada:
===================

n_divs - o número de dividendos - os dividendos:


dividendos[] dividendos[0] contém o primeiro dividendo, dividendo[1]
o segundo etc

Divs_T[] - os horários em que os dividendos são pagos: Divs_T[0] é o horário em que_


o primeiro dividendo é pago Divs_T[1] é o
momento em que o segundo dividendo é pago, etc.
S0 - o valor atual do ativo subjacente - o preço de exercício - a volatilidade
x - o tempo até o vencimento - a taxa de juros
sigma
T
r
Parâmetros de saída:
==================

opt_value - o valor da opção


critical_value - o valor crítico iflag - um indicador de erro

*/
duplo A_1,A_2,S_estrela,a1,a2,nt1,t1,S; duplo
b1,b2,d1,alfa,h,div,beta,temp,temp1,temp2,temp3; duplo pdf,b,eur_val,fac,tol,loc_q,err,zero=0,0;
longa iteração; longo i,iflagx,putx;

loc_q = 0,0;
temperatura = 0,0;
for (i=0; i < n_divs; ++i) { /Verifique o array Divs_T */
if ((Divs_T[i] <= temp) || (Divs_T[i] > T) || (Divs_T[i] <= zero)) {
*bandeira =
2; retornar;
}
temp = Divs_T[i];

} /* calcula o valor presente dos dividendos (excluindo o final) */ temp = 0,0; for (i=0; i < n_divs-1; ++i) { temp = fac + dividendos[i]
* exp(-r*Divs_T[i]);

} t1 = Divs_T[n_divs-1]; /* diminui o
preço da ação pelo valor presente de todos os dividendos */ div = dividendos[n_divs-1]; S = S0-Temp-div*exp(-
r*t1); iterar = 1; tol = 0,000001; S_estrela = X; while (iterate) { /* calcula S_star, iterativamente */

/* calcula o valor Black-Scholes de uma chamada europeia */ d1 = (log(S_star/X) + (r+


(sigma*sigma/2.0))*(T-t1))/(sigma*sqrt(T-t1 )); putx = 0; loc_q = 0,0; black_scholes(&eur_val,NULL,S_star,X,sigma,T-
t1,r,loc_q,putx,&iflag); S_star = (S_star*cum_norm(d1)-eur_val+div-X)/(cum_norm(d1)-1.0); err = fabs(eur_val - (S_star
+ div- X))/X; if (err < tol) iterar = 0;

}
a1 = (log(S/X) + (r+(sigma*sigma/2.0))*T)/(sigma*sqrt(T)); a2 = a1 - sigma*quadrado(T); b1 =
(log(S/S_star)+(r+(sigma*sigma/2.0))*t1)/(sigma*sqrt(t1)); b2 = b1 - sigma*quadrado(t1); nt1 =
sqrt(t1/T); temp1 = S*(cum_norm(b1)+cum_norm2(a1,-b1,-nt1,&iflagx)); temp2 = -X*exp(-
r*T)*cum_norm2(a2,-b2,-nt1,&iflagx)-(X-div)*exp(-r*t1)*cum_norm(b2); *opt_value = temp1+temp2;
*critical_value = S_star;

Trecho de código 5.1 Função para calcular a aproximação Roll–Geske–Whaley para o valor
de uma opção de compra americana com dividendos discretos.
Machine Translated by Google

Opções americanas de ativo único 101

Tabela 5.1 Uma comparação dos valores calculados para opções de compra americanas
com dividendos, usando a aproximação de Roll–Geske–Whaley e a aproximação de Black

preço das ações Preço crítico, aproximação Sÿ RGW aproximação preta

80,0 123.582 3,212 3,208


85,0 123.582 4,818 4,808
90,0 123.582 6,839 6,820
95,0 123.582 9,276 9,239
100,0 123.582 12,111 12,048
105,0 123.582 15,316 15,215
110,0 123.582 18,851 18,703
115,0 123.582 22,676 22,470
120,0 123.582 26,748 26,476

Os parâmetros usados foram: E = 100,0, r = 0,04, ÿ = 0,2, ÿ = 2,0, e há um dividendo em dinheiro de


valor 5,0 no tempo t = 1,0. O preço atual da ação, S, varia de 80,0 a 120,0. Os resultados estão de
acordo com os apresentados na Tabela 1 de Whaley (1981).

apresentados na Tabela 5.1. Eles comparam a aproximação de Roll-Geske-Whaley


com a aproximação de Black, que agora discutiremos brevemente.
Vamos agora considerar a aproximação de Black.

A aproximação negra
A aproximação de Black (1973) para uma opção de compra americana com dividendos
em dinheiro é mais simples do que o método Roll-Geske-Whaley que acabamos de
descrever. Para uma opção de compra americana que , dividendos
vence no tempo
discretos
T com
em dinheiro
n
Di,i = 1,...,n, nos momentos ti,i = 1,...,n, trata-se de calcular os preços das opções
europeias que vencem nos tempos T e tn, e então , maior
definindo
desseso dois
preçovalores,
da opçãoveja
para
por o
exemplo Hull (2003).
A aproximação de Black, CBL, pode ser expressa de forma mais concisa em termos de
nossa notação definida anteriormente como:

CBL(S,E,ÿ) = max(v1,v2)

onde v1 e v2 são as seguintes chamadas européias:

v1 = c(SD,E,ÿ) e v2 = c S+ D,E,ÿ1 , ÿ = T ÿ t, ÿ1 = T ÿ tn
e

SD = Sim
ÿn Dentro e S+ = S ÿnÿ1 De
D
i=1 i=1

O trecho de código 5.2 calcula a aproximação de Black.


O trecho de código 5.3 usa os mesmos valores de Whaley (1981) e compara a
aproximação de Roll–Geske–Whaley com a de Black; os resultados são apresentados
na Tabela 5.1.
Machine Translated by Google

102 Finanças Computacionais Usando C e C#

void black_approx(double *value, long n_divs, double dividends[], double Divs_T[],


duplo S0, duplo X, duplo sigma, duplo T, duplo r, long put, long *ifail)
{
/* Parâmetros de entrada:
===================

n_divs - o número de dividendos


dividendo[] - os dividendos, dividendos[0] contém o primeiro dividendo, dividendo[1] o_
segundo etc

Divs_T[] - os horários em que os dividendos são pagos, Divs_T[0] é o horário em que_


o primeiro dividendo é pago
Divs_T[1] é o momento em que o segundo dividendo é pago, etc.
S0 - o valor atual do ativo subjacente - o preço de exercício - a volatilidade
x - o tempo até o vencimento - a taxa de juros - se a opção de venda for
sigma 0, então uma opção de compra, caso contrário, uma opção de venda
T
r
colocar

Parâmetros de saída:
==================

valor - o valor da opção, iflag - um indicador de erro


*/
duplo zero = 0,0; beta duplo,
temp, temp1, temp2, temp3; duplo
tn,val_T,val_tn,tol,loc_q,err,fac; longo i, se falhar x;

loc_q = 0,0;
temperatura = 0,0;
for (i=0; i < n_divs; ++i) {
if (Divs_T[i] <= temp ) printf ("Erro no array Divs_T, elementos não aumentam \n"); if (Divs_T[i] > T) printf ("Erro no elemento do array Divs_T
tem valor maior que T\n"); if (Divs_T[i] <= zero) printf ("Erro no elemento do array Divs_T <= zero \n"); temp = Divs_T[i];

} /* calcula o valor presente dos dividendos */ fac = 0,0; for (i=0; i < n_divs; ++i)
{ fac = fac + dividendos[i] * exp(-r*Divs_T[i]);

} temp = S0 - fac; /*
calcula o valor da opção no vencimento */
black_scholes(&val_T,NULL,temp,X,sigma,T,r,loc_q,put,&ifailx);

/* calcula o valor da opção na data do último dividendo */ tn = Divs_T[n_divs-1]; temp = temp +


dividendos[n_divs-1]*exp(-r*tn); nag_opt_bs(&val_tn,NULL,temp,X,sigma,tn,r,loc_q,putx,&ifailx); *valor
= MAX(val_tn,val_T);

Trecho de código 5.2 Função para calcular o valor da aproximação de Black para o valor
de uma opção de compra americana com dividendos discretos.

Vamos agora considerar uma técnica mais geral para precificar opções de compra e
venda americanas.

5.2.2 O método MacMillan-Barone-Adesi-Whaley


Aqui consideramos um método de precificação de opções americanas que se baseia em
uma aproximação que reduz uma equação de Black-Scholes transformada em uma
equação diferencial ordinária de segunda ordem, ver Barone-Adesi e Whaley (1987) e
MacMillan (1986). Assim, fornece uma maneira alternativa de avaliar as opções americanas
que podem ser usadas em vez de técnicas computacionalmente intensivas, como métodos
de diferenças finitas. Embora o método precifique as opções americanas, na verdade ele
se baseia no valor de uma opção americana em relação à correspondente
Machine Translated by Google

Opções americanas de ativo único 103

duplo q,r,temp,loc_r; longo


i,m,m2,m_acc; duplo
S0,E,T,sigma,t1,delta,valor,ad_value,put_value; longo is_american, se falhar,
colocar; double bin_greeks[5],greeks[5],bin_value,bs_value; double opt_value,
critical_value, E1, E2, crit1, crit2; double black_value; duplo Divs_T[3],dividendos[3];
longos n_divs, coloque;

E = 100,0; r =
0,04; sigma =
0,2; T = 2,0; t1 =
1,0; colocar = 0;

/* verifica usando os mesmos parâmetros que em \inlinecite{Wha1981} */ Divs_T[0] = 1.0;


dividendos[0] = 5,0; n_divs = 1; printf ("\nPrice S RGW Approximation for (i=0; i < 9; ++i) { put =
0; S0 = 80,0+(double)i*5,0; opt_RGW_approx(&opt_value,&critical_value,n_divs,dividends,Divs_T,
S0,E,sigma,T,r,&ifail); printf("%8.4f ",S0); printf("%12.3f %12.3f ",opt_value,critical_value);
opt_black_approx(&black_value,n_divs,dividends,Divs_T,
(%8.4e) ",black_value); S0,E,sigma,T,r,put,&ifail);
Aproximação printf("%12.3f
preta \n\n");

Trecho de código 5.3 Programa de teste simples para comparar os resultados da


função opt_RGW_approx com a função opt_black_approx; os parâmetros utilizados
são os mesmos de Whaley (1981).

Valor da opção europeia (que pode ser facilmente calculado usando a fórmula de precificação
de Black-Scholes).
Como uma opção americana oferece mais opções, seu valor é sempre pelo menos igual ao de
sua contraparte européia. Esse prêmio de exercício antecipado (ÿ(S,E,ÿ) 0) agora é definido com
mais precisão para opções de compra e venda americanas. Se no momento atual t o preço do
ativo for S, então o prêmio de exercício antecipado para uma opção de compra americana que
expira no momento T
, e, portanto, tem maturidade ÿ = T ÿ t, é:

ÿc(S,E,ÿ) = C(S,E,ÿ) ÿ c(S,E,ÿ) 0 (5.2.8)

onde C(S,E,ÿ) denota o valor da chamada americana e c(S,E,ÿ) denota o valor da chamada
européia correspondente. O prêmio de exercício antecipado de uma opção de venda
americana, ÿp(S,E,ÿ), é definido de forma semelhante como:

ÿp(S,E,ÿ) = P(S,E,ÿ) ÿ p(S,E,ÿ) 0 (5.2.9)

onde P(S,E,ÿ) é o valor da opção de venda americana e p(S,E,ÿ) é o valor da opção de venda
européia correspondente. O principal insight fornecido pelo método MacMillan–Barone-Adesi–
Whaley é que, uma vez que os valores das opções americana e européia satisfazem a
equação diferencial parcial de Black–Scholes, o mesmo ocorre com o prêmio de exercício
antecipado, ÿ(S,E,ÿ); consulte a Seção 4.4.1. Isso significa que podemos escrever:

ÿÿ ÿÿ + (r ÿ q)S + ÿS ÿ2S2 ÿ2ÿ


= rÿ (5.2.10)
ÿt 2 ÿS2
Machine Translated by Google

104 Finanças Computacionais Usando C e C#

onde, como sempre, S é o preço do ativo, r é a taxa de juros composta continuamente, q é o dividendo
continuamente composto, ÿ é a volatilidade e o tempo t aumenta do tempo atual até o tempo de
expiração T .
Vamos agora introduzir a variável h(ÿ) = 1 ÿ exp(ÿrÿ) e usar o fator
ização ÿ(S,E,ÿ) = h(ÿ)g(S,E,h). Do cálculo padrão obtemos:
ÿÿ ÿh ÿg ÿg ÿh + h = rg(h ÿ 1) + h = g ÿt ÿt ÿh ÿg
ÿt = rg(h ÿ 1) + hr(h ÿ 1) ÿh
ÿt
e também
ÿÿ ÿg ÿ2ÿ ÿ2g
= h ÿS e =h
ÿS ÿS2 ÿS2

Substituindo esses resultados na Eq. (5.2.10) produz a seguinte equação transformada de Black–
Scholes: S2ÿ2h ÿ2g ÿg ÿg + (r ÿ q)Sh + rg(h ÿ 1) + rh(h ÿ 1) = rgh ÿS2 ÿS ÿh

(5.2.11)
2

que pode ser ainda mais simplificado para dar:

ÿ2g 2(r ÿ q)S ÿg 2r(1 ÿ h) ÿg =


S2ÿ2 + ÿS2 ÿ ÿ

rgh ÿ2 ÿh (5.2.12)
ÿ2 ÿS 2rghÿ2 _
ou

ÿ2g ÿg a
S2 + ÿS ÿS2 ÿgg ÿ (1 ÿ h)ÿ = 0 h ÿh (5.2.13)
ÿ

ÿS

onde ÿ = 2r/ÿ2 e ÿ = 2(r ÿ q)/ÿ2.


Consideremos agora o último termo da Eq. (5.2.13) e observe que quando ÿ é grande, 1 ÿ h(ÿ) ÿ 0.
Também quando ÿ ÿ 0 a opção está próxima do vencimento, e o valor das opções européia e americana
convergem; isso significa que ÿ(S,E,ÿ) ÿ 0 e ÿg
ÿh ÿ 0. Assim, pode-se ver que o último termo é geralmente muito pequeno
e a aproximação de MacMillan–Barone-Adesi–Whaley assume que ele pode ser ignorado. Isso resulta
na seguinte equação:

ÿ2g ÿg a
S2 + ÿS ÿS2 g=0h (5.2.14)
ÿ

ÿS

que é uma equação diferencial de segunda ordem com duas soluções linearmente independentes da
forma aSÿ . Eles podem ser encontrados substituindo g(S,E,h) = aSÿ na Eq. (5.2.14) da seguinte forma:
ÿ2g = aÿ(ÿ ÿ 1)Sÿ ÿS2

ÿg ÿ2 ÿ2
= ÿSÿ ÿ1, = aÿ 2Sÿ ÿ2 ÿ aÿSÿ
ÿS
então

ÿ2g
S2 = ag 2Sÿ ÿ aÿSÿ = ÿ 2g ÿ ÿg
ÿS2
e

ÿg ÿ1
ÿS ÿS = ÿSaÿSÿ = ÿÿSÿ = ÿÿg
Machine Translated by Google

Opções americanas de ativo único 105

Quando os resultados acima são substituídos na Eq. (5.2.14) obtemos a equação quadrática:

a a
ÿ 2g ÿ ÿg + ÿÿg ÿ 2=gÿh ÿ ÿ + (ÿ ÿ 1)ÿ ÿ h =0

ou
a
2c ÿ ÿ + (ÿ ÿ 1)ÿ ÿ h =0 (5.2.15)

que tem as duas soluções


a
1 ÿ1 = 2 ÿ(ÿ ÿ 1) ÿ (ÿ ÿ 1)2 + 4 h (5.2.16)

e
1 a
ÿ2 = ÿ(ÿ ÿ 1) + (ÿ ÿ 1)2 + 4 h (5.2.17)
2

onde notamos que como ÿ/h > 0, temos ÿ1 < 0 e ÿ2 > 0.


A solução geral da Eq. (5.2.14) é assim: g(S,E,h) =
a1Sÿ1 + a2Sÿ2 (5.2.18)

Vamos agora derivar as soluções apropriadas relativas às opções de compra americanas e


opções de venda americanas.

Opções de chamada americana

Aqui usamos o fato de que tanto o valor quanto o prêmio de exercício antecipado (ÿc(S,E,ÿ)
= hgc(S,E,h)) de uma call americana tendem a zero conforme o preço do ativo S ÿ 0. Isso
significa que como S ÿ 0, gc(S,E,h) ÿ 0.
No entanto, como ÿ1 < 0, a única maneira de conseguir isso na Eq. (5.2.18) é se a1 = 0.
Então gc(S,E,h) = a2Sÿ2 , e o valor de uma chamada americana é:
C(S,E,ÿ) = c(S,E,ÿ) + ha2Sÿ2 (5.2.19)

Uma expressão para a2 pode ser encontrada considerando o preço crítico do ativo (ponto no
limite de exercício antecipado), Sÿ, acima do qual a opção americana será exercida. Para
S<Sÿ, o valor da call americana é regido pela Eq. (5.2.19), e quando S>Sÿ temos C(S,E,ÿ) =
S ÿ E.
Agora, como o valor da opção americana é contínuo, no valor crítico do ativo Sÿ aplica-se
a seguinte equação:
Sÿ ÿ E = c Sÿ,E,ÿ + ha2Sÿÿ2 (5.2.20)

Além disso, como o gradiente do valor da opção americana também é contínuo, em Sÿ temos:

ÿ(Sÿ ÿ E) ÿ
= c Sÿ,E,ÿ + ha2Sÿÿ2 (5.2.21)
ÿSÿ ÿSÿ

que dá: 1 =
exp(ÿqÿ)N1 d1 Sÿ + ÿ2ha2Sÿ(ÿ2ÿ1) (5.2.22)
Machine Translated by Google

106 Finanças Computacionais Usando C e C#

onde usamos o valor do parâmetro de cobertura ÿc para uma opção de compra européia (veja a
seção sobre os gregos): ÿc(Sÿ,E,ÿ) = exp(ÿqÿ)N1 d1 Sÿ ÿc = ÿSÿ

A equação (5.2.22) pode, portanto, ser escrita como:

Sÿ ha2Sÿÿ2 = 1 ÿ exp(ÿqÿ)N1 d1 Sÿ (5.2.23)


c2

Quando o lado esquerdo da equação acima é substituído na Eq. (5.2.20) obtemos a seguinte
equação para Sÿ:
Sÿ
Sÿ ÿ E = c Sÿ,E,ÿ + 1 ÿ exp(ÿqÿ)N1 d1 Sÿ (5.2.24)
c2

Esta equação pode ser resolvida para Sÿ usando métodos iterativos padrão (consulte a
seção sobre a solução numérica de valores de ativos críticos). Uma vez que Sÿ tenha sido
encontrado, a Eq. (5.2.23) dá:

ha2 = A2Sÿÿÿ2

onde
Sÿ
A2 = 1 ÿ exp(ÿqÿ)N1 d1 Sÿ
c2

Da Eq. (5.2.19) o valor de uma chamada americana é, portanto, da forma:


S c2
C(S,E,ÿ) = c(S,E,ÿ) + A2 quando S<Sÿ (5.2.25)
Sÿ

C(S,E,ÿ) = S ÿ E quando S Sÿ (5.2.26)

Opções de venda americanas

Para uma opção de venda americana, procedemos de maneira semelhante à chamada


americana. Agora usamos o fato de que tanto o valor quanto o prêmio de exercício antecipado
(ÿp(S,E,ÿ) = hgp(S,E,h)) de uma opção de venda americana tendem a zero conforme o preço
do ativo S ÿ ÿ. Então gp(S,E,h) ÿ 0 como S ÿ ÿ. Como ÿ2 > 0, a única maneira de isso ser
obtido pela Eq. (5.2.18) é se a2 = 0. Isso dá gp(S,E,h) = a1Sÿ1 e o valor de uma opção de
venda americana é:

P(S,E,ÿ) = p(S,E,ÿ) + ha1Sÿ1 (5.2.27)

Uma expressão para a1 pode ser encontrada considerando o preço crítico do ativo, Sÿÿ,
abaixo do qual a opção americana será exercida. Para S>Sÿÿ o valor da put americana é
dado pela Eq. (5.2.27), e para S<Sÿÿ temos P(S,E,ÿ) = E ÿ S.

A continuidade do valor da opção americana no preço do ativo crítico fornece:

E ÿ Sÿÿ = p Sÿÿ,E,ÿ + ha1Sÿÿÿ1 (5.2.28)


Machine Translated by Google

Opções americanas de ativo único 107

e continuidade do gradiente do valor da opção nos rendimentos críticos do preço do ativo:

ÿ(E ÿ Sÿÿ) ÿ
= p Sÿÿ,E,ÿ + ha1Sÿÿÿ1 (5.2.29)
ÿSÿÿ ÿSÿÿ

que pode ser simplificado para:

ÿ1 = ÿN1 ÿd1 Sÿÿ exp(ÿqÿ) + ÿ1a1Sÿÿ(ÿ1ÿ1) (5.2.30)

onde usamos o valor do parâmetro de hedge ÿp para uma opção de venda europeia (consulte
o Apêndice A.3):

ÿp(Sÿÿ,E,ÿ)
ÿp = ÿSÿÿ

= N1 d1 Sÿÿ ÿ 1 exp(ÿqÿ) = ÿN1 ÿd1 Sÿÿ exp(ÿqÿ)

A equação (5.2.30) pode, portanto, ser escrita como:

ha1Sÿÿÿ1 = ÿSÿÿ 1 ÿ N1 ÿd1 Sÿÿ exp(ÿqÿ) (5.2.31)


c1

Quando o lado esquerdo da equação acima é substituído na Eq. (5.2.28) obtemos a seguinte
equação para Sÿÿ:

E ÿ Sÿÿ = p Sÿÿ,E,ÿ + 1 ÿ exp(ÿqÿ)N ÿd1 SÿÿSÿÿ (5.2.32)


c1

que pode ser resolvido iterativamente para produzir Sÿÿ (consulte a seção sobre a solução
numérica de valores de ativos críticos). Uma vez que Sÿÿ foi encontrado, a Eq. (5.2.31) dá:

ha1 = A1Sÿÿÿÿ1

onde

A1 = ÿSÿÿ 1 ÿ exp(ÿqÿ)N1 ÿd1 Sÿÿ


c1

Notamos aqui que A1 > 0 desde, ÿ1 < 0, Sÿÿ > 0, e N1(ÿd1(Sÿÿ)) exp(ÿqÿ) < 1.

Da Eq. (5.2.27) o valor de uma opção de venda americana é assim:

S c2
P(S,E,ÿ) = p(S,E,ÿ) + A1 quando S>Sÿÿ
Sÿÿ

P(S,E,ÿ) = E ÿ S quando S Sÿÿ

5.2.3 Solução numérica de valores de ativos críticos

Agora fornecemos detalhes sobre como resolver iterativamente o preço do ativo crítico nas
Eqs. (5.2.24) e (5.2.32).
Machine Translated by Google

108 Finanças Computacionais Usando C e C#

Opções de chamada americana

Para opções de compra americanas, precisamos resolver a Eq. (5.2.24), que é:

Sÿ
Sÿ ÿ E = c Sÿ,E,ÿ + 1 ÿ exp(ÿqÿ)N1 d1 Sÿ
c2

Denotamos a i-ésima aproximação do valor crítico do ativo Sÿ por Sÿ enviado ao eu , e repre


lado esquerdo da equação por:

LHS Sÿ eu
,E,ÿ = Sÿ eu
ÿE

e o lado direito da equação por:

Sÿ
RHS Sÿ eu
,E,ÿ = c Sÿ eu
,E,t +
eu

1 ÿ exp(ÿqÿ)N1 d1 Sÿ eu

c2

Se deixarmos K(Sÿ
que
,E,ÿ)
(para
então
umaqueremos
tolerância
eu
comencontrar
especificada)
o métodoo ,E,ÿ)
de dá
encontrar
=K(Sÿ
RHS(Sÿ
,E,ÿ)
a raiz
,E,ÿ)
ÿ 0.deIsso
ÿ Newton,
LHS(Sÿ
pode valor
no
serqual
obtido
de uma
eu
Sÿ eu

aproximação melhor, Sÿ pode ser encontrada usando:


eu eu

i+1,

K(Sÿ ,E,t)
= Sÿ i
eu

(5.2.33)
ÿ

Sÿi+1

K (Sÿ ,E,t)
eu

onde:

ÿ
K Sÿ eu
,E,ÿ = ÿSÿ RHS Sÿ ,E,ÿ ÿ LHS Sÿ
eu eu
,E,t
eu

ÿ ÿ
= RHS Sÿ ,E,ÿ ÿ i ÿSÿ LHS Sÿ eu,E,t
ÿSÿ eu eu

= por ÿ 1

Aqui usamos bi = ÿ ÿSÿ Eq. (5.2.35),


,E,ÿ)},
eu
que ée derivada
a expressão
no final
paradesta
bi é dada
seção.
{RHS(Sÿ pela
i

Substituindo K(Sÿ ,E,ÿ) e K (Sÿ ,E,ÿ) na Eq. (5.2.32), obtemos, portanto:


eu eu

RHS(Sÿ ,E,ÿ) ÿ LHS(Sÿ ,E,ÿ)


= Sÿ eu eu
ÿ

Sÿ
i+1 eu

algum ÿ
RHS(Sÿ ,E,ÿ) ÿ (Sÿ ÿ E)
= Sÿ i eu eu
ÿ

bi ÿ 1 biSÿ
ÿ RHS(Sÿ ,E,ÿ) ÿ E
= eu eu

com - 1

O algoritmo iterativo final para a chamada americana é, portanto:

E + RHS(Sÿ ,E,ÿ) ÿ biSÿ


Sÿi+1 = eu eu

(5.2.34)
1 - com
Machine Translated by Google

Opções americanas de ativo único 109

onde podemos usar Sÿ 0


= E para a estimativa inicial do valor crítico (consulte o trecho de código do
computador 5.4).

A expressão para bi Aqui


derivamos uma expressão para o termo bi que é usado na Eq. (5.2.34).

ÿc(Sÿ ,E,ÿ) bi eu
1
= + 1 ÿ exp(ÿqÿ)N1 d1 Sÿ eu

ÿSÿ eu c2
Sÿ ÿN1(d1(Sÿ )) ÿd1(Sÿ ) i eu
eu
ÿ

c2 ÿd1(Sÿ )eu
ÿSÿ eu

Vamos agora citar os seguintes resultados que são derivados no Apêndice A:


Apêndice A, Eq. (A.1.3)

ÿN1(d1(Sÿ )) = n d1 Sÿ eu

eu

ÿd1(Sÿ ) eu

Apêndice A, Eq. (A.1.6)

ÿd1(Sÿ ) 1
eu
=
ÿSÿi Sÿ ÿ ÿÿ i

Apêndice A, Eq. (A.3.2) ÿc(Sÿ ,E,ÿ) = exp(ÿqÿ)N1 d1

Sÿ ÿc =

eu

i ÿSÿ
i

Substituindo esses resultados na expressão acima, obtemos:

1 exp(ÿqÿ)N1(d1(Sÿ )) eu

bi = exp(ÿqÿ)N1 d1 Sÿ eu
+ ÿ

c2 c2

ÿ
exp(ÿqÿ)n(d1(Sÿ )) ÿ2ÿ eu

ÿÿ que pode ser

rearranjado para produzir:

1 1 exp(ÿqÿ)n(d1(Sÿ )) 1 ÿ ÿ
1ÿ ÿÿ
eu

bi = exp(ÿqÿ)N1 d1 Sÿ eu
+
c2 c2
(5.2.35)

Opções de venda americanas

Para opções de venda americanas, precisamos resolver a Eq. (5.2.32) que é:


Sÿÿi

E ÿ Sÿÿ = p Sÿÿ eu eu ,E,ÿ ÿ 1 ÿ N1 ÿd1 Sÿÿ eu exp(ÿqÿ)


c1

Se deixarmos Sÿÿ denotar a i-ésima aproximação do valor crítico do ativo Sÿÿ, então podemos
eu

representar o lado esquerdo da equação por:

LHS Sÿÿ eu ,E,ÿ = E ÿ Sÿÿ eu


Machine Translated by Google

110 Finanças Computacionais Usando C e C#

e o lado direito da equação por:


Sÿÿ
RHS Sÿÿ ,E,ÿ = p Sÿÿ i ,ÿ ÿ
eu

eu
1 ÿ N1 ÿd1 Sÿÿ eu exp(ÿqÿ)
c1

Sÿÿ
eu

= p Sÿÿ eu
,E,ÿ ÿ 1 ÿ 1 ÿ N1 d1 Sÿÿ eu exp(ÿqÿ)
c1

Sÿÿ i
=
p Sÿÿ eu
,E,ÿ ÿ 1 ÿ exp(ÿqÿ)
c1

+ N1 d1 Sÿÿ eu exp(ÿqÿ)

Denotamos então K(Sÿÿ ,E,ÿ) = RHS(Sÿÿ eu


,E,ÿ) ÿ LHS(Sÿÿ eu
,E,ÿ) e usando i
Pelo método de Newton obtemos:
K(Sÿÿ ,E,t)
Sÿÿi+1 = Sÿÿ eu
ÿ
eu

(5.2.36)
K (Sÿÿ ,E,t) eu

onde como antes:


ÿ
K SÿÿÿSÿÿ
,E,ÿi = i RHS Sÿÿeu,E,ÿ ÿ LHS Sÿÿ eu
,E,t

ÿ(RHS(Sÿÿ ,E,t))
Então K (Sÿÿ ,E,ÿ) = 1 + bi, onde bi = i ÿSÿÿ , e a expressão para bi é dada
eu
i
pela Eq. (5.2.38), que é derivada no final desta seção.
A equação (5.2.36) pode, portanto, ser escrita como:
RHS(Sÿÿ ,E,ÿ) ÿ LHS(Sÿÿ ,E,ÿ) 1
= Sÿÿ
eu
eu
Sÿÿi+1 ÿ

eu

+ algum
Sÿÿ (1 + bi) ÿ RHS(Sÿÿ ,E,ÿ) + E ÿ Sÿÿ
= eu eu eu

1 + bi
O algoritmo iterativo final para a opção de venda americana é, portanto:
E ÿ RHS(Sÿÿ eu
,E,ÿ) + biSÿÿ eu

Sÿÿ = (5.2.37)
1 + bi
eu

onde podemos usar Sÿÿ = E para a estimativa inicial do valor do ativo crítico (consulte o
0
trecho de código de computador 5.4).

A expressão para bi
Aqui derivamos uma expressão para o termo bi que é usado na Eq. (5.2.37).
Desde
ÿ Sÿÿ i
p
com = Sÿÿ eu
,E,ÿ ÿ 1 ÿ exp(ÿqÿ) + N1 d1 Sÿÿ eu exp(ÿqÿ)
ÿSÿÿ c1
eu

Nós temos

ÿp(Sÿÿ ,E,ÿ) 1 1
bi =
eu
ÿ

1 ÿ exp(ÿqÿ) ÿ exp(ÿqÿ)N1 d1 Sÿÿ eu

ÿSÿÿi c1 c1

Sÿÿ ÿN1(d1(Sÿÿ ÿd1(Sÿÿ exp(ÿqÿ) )) )


eu eu
ÿ
eu

c1 ÿd1(Sÿÿ ) eu
ÿSÿÿi
Machine Translated by Google

Opções americanas de ativo único 111

Vamos agora citar os seguintes resultados que são derivados no Apêndice A:


Apêndice A, Eq. (A.1.3): ÿN1(d1(Sÿÿ ))

= n d1 Sÿÿ eu

eu

ÿd1(Sÿÿ ) eu

Apêndice A, Eq. (A.1.6):

ÿd1(Sÿÿ ) 1
eu
=
ÿSÿÿi Sÿÿÿ ÿÿ i

Apêndice A, Eq. (A.3.4):

ÿp(Sÿÿ ,E,ÿ) =
eu

exp(ÿqÿ) N1 d1 Sÿÿ ÿp =
ÿ1
eu

ÿSÿÿ
eu

Substituindo esses resultados na expressão acima, obtemos:

bi = exp(ÿqÿ) N1 d1 Sÿÿ
ÿ1
eu

1
ÿ

1 ÿ exp(ÿqÿ) + N1 d1 Sÿÿ eu
exp(ÿqÿ)
c1
Sÿÿ exp(ÿqÿ) ÿN1(d1(Sÿÿ )) ÿd1(Sÿÿ ) i eu
eu
ÿ

c1 ÿd1(Sÿÿ )eu
ÿSÿÿ
eu

= exp(ÿqÿ) N1 d1 Sÿÿ
ÿ1
eu

1
ÿ

1 ÿ exp(ÿqÿ) + N1 d1 Sÿÿ eu
exp(ÿqÿ)
c1
Sÿÿ
ÿ1ÿexp(ÿqÿ)n(d1(Sÿÿ
ÿÿ que pode ser )) i eu
ÿ

rearranjado para

produzir:
1
bi = exp(ÿqÿ)N1 d1 Sÿÿ
1-
eu

c1
1 exp(ÿqÿ)n(d1(Sÿÿ ))
+
eu

exp(ÿqÿ) ÿ 1 ÿ ÿ ÿÿ No trecho de código 5.4 ÿ exp(ÿqÿ) (5.2.38)


c1 fornecemos

código de computador para implementar o método MacMillan– Barone-Adesi–Whaley.

void MBW_approx(double *opt_value, double *critical_value, double S0, double X, double sigma, double T, double r, double
q, long put, long *iflag)
{
/* Parâmetros de entrada:
===================

S0 - o valor atual do ativo subjacente - o preço de exercício - a


x volatilidade - o tempo até o vencimento - a taxa de juros
sigma
T
r

Trecho de código 5.4.


Machine Translated by Google

112 Finanças Computacionais Usando C e C#

q - o rendimento contínuo de dividendos - se a


colocar opção de venda for 0, então uma opção de compra, caso contrário, uma opção de venda
Parâmetros de saída:
==================

opt_value - o valor da opção


critical_value - o valor crítico iflag
- um indicador de erro
*/
double A_1,A_2,S_star,gamma_2,gamma_1; duplo
d1,alfa,h,beta,temp,temp1;
duplo pdf,pi,b,rhs,eur_val,tol,err; longa iteração; longo
iflagx,putx;

pi = PI; beta
= 2,0 * (r - q) / (sigma * sigma); alfa = 2,0 * r / (sigma * sigma); h
= 1,0 - exp(-r*T); temp =put)
beta{ /*
- 1,0;
Umaiterar
chamada
= 1; tol
americana
= 0,000001;
*/ if (!

gama_2 = (-temp + sqrt((temp*temp) + (4,0*alfa/h))); gama_2 = gama_2 / 2.0; S_estrela


= X; while (iterate) { /* calcula S_star, iterativamente */ d1 = log(S_star/X) + (r-q+
(sigma*sigma/2.0))*T; d1 = d1/(sigma*quadrado(T)); pdf = (1,0/sqrt(2,0*pi))*exp(-
d1*d1/2,0); temp = exp (-q*T)*cum_norm(d1)*(1.0 - (1.0/gamma_2)); temp1 = (1,0 - ((exp(-
q*T)*pdf)/(sigma*sqrt(T))))/gamma_2; b = temp + temp1; /* calcula o valor Black-
Scholes de uma chamada européia */ putx = 0;
black_scholes(&eur_val,NULL,S_star,X,sigma,T,r,q,putx,&iflagx); rhs = eur_val+(1.0-
exp(-q*T)*cum_norm(d1))*S_star/gamma_2; S_star = (X + rhs - b*S_star)/(1.0-b); err =
fabs((S_star - X) - rhs)/X; if (err < tol) iterar = 0;

}
A_2 = (S_star/gamma_2)*(1.0 - exp(-q*T)*cum_norm(d1)); if (S0 < S_estrela) {

temp1 = S0/S_estrela;
black_scholes(&temp,NULL,S0,X,sigma,T,r,q,putx,&iflagx); *opt_value = temp + A_2 *
pow(temp1,gamma_2);

} outro {
*opt_value = S0 - X;
}

} else { /* Um americano colocou */


gamma_1 = (-temp - sqrt((temp*temp) + (4,0*alpha/h))); gama_1 = gama_1 / 2.0; S_estrela
= X; while (iterate) { /* calcula S_star, iterativamente */ d1 = log(S_star/X) + (r-q+
(sigma*sigma/2.0))*T; d1 = d1/(sigma*quadrado(T)); pdf = (1,0/sqrt(2,0*pi))*exp(-
d1*d1/2,0); temp = exp(-q*T)*(cum_norm(d1)*(1.0-(1.0/gamma_1))-1.0); temp1 = (exp(-
q*T)-1.0-((exp(-q*T)*pdf)/(sigma*sqrt(T))))/gamma_1; b = temp + temp1; /* calcula o
valor de Black-Scholes de uma opção de venda européia */ putx = 1;
black_scholes(&eur_val,NULL,S_star,X,sigma,T,r,q,putx,&iflagx); rhs = eur_val-(1.0-
exp(-q*T)+exp(-q*T)*cum_norm(d1))*S_star/gamma_1; S_star = (X - rhs + b*S_star)/(1.0+b);
err = fabs((X - S_star) - rhs)/X; if (err < tol) iterar = FALSE;

}
A_1 = -(S_star/gamma_1)*(1.0 - exp(-q*T)*cum_norm(-d1)); if (S0 > S_estrela) {

temp1 = S0/S_estrela;
black_scholes(&temp,NULL,S0,X,sigma,T,r,q,putx,&iflagx); *opt_value = temp + A_1 *
pow(temp1,gamma_1);
}

Trecho de código 5.4 (continuação).


Machine Translated by Google

Opções americanas de ativo único 113

else
{ *opt_value = X - S0;
}

} *valor_crítico = S_star;
}

Trecho de código 5.4 Função para calcular a aproximação MacMillan–Barone-Adesi–Whaley para


opções americanas.

Tabela 5.2 O método MacMillan–Barone-Adesi–Whaley para valores de opções americanas


calculado pela rotina MBW_approx

preço das ações Chamar Colocar

valor exato Erro valor exato Erro

86,0 1.2064 5,54 × 10ÿ4 14.0987 ÿ3,69 × 10ÿ2


89,0 1,8838 1,95 × 10ÿ4 11.5120 ÿ4,85 × 10ÿ2
92,0 2.7890 7,03 × 10ÿ4 9.2478 ÿ3,58 × 10ÿ2
95,0 3.9427 1,16 × 10ÿ3 7.3031 ÿ1,66 × 10ÿ2
98,0 5.3522 1,15 × 10ÿ3 5.6674 7,19 × 10ÿ4
101,0 7.0119 1,10 × 10ÿ3 4.3209 1,35 × 10ÿ2
104,0 8.9043 2,21 × 10ÿ3 3.2362 2,22 × 10ÿ2
107,0 11.0072 2,63 × 10ÿ3 2.3823 2,63 × 10ÿ2
110,0 13.2905 4,20 × 10ÿ3 1,7235 2,80 × 10ÿ2
113,0 15.7264 4,77 × 10ÿ3 1.2272 2,66 × 10ÿ2

Os parâmetros utilizados foram: ÿ = 0,5, X = 100,0, r = 0,1, q = 0,06, ÿ = 0,2. O valor exato foi
calculado usando uma rede padrão com 2.000 passos de tempo, e o erro foi a estimativa de
MacMillan–Barone-Adesi–Whaley menos o valor exato.

Tabela 5.3 Os valores de ativos críticos de MacMillan, Barone-Adesi e Whaley para o limite de
exercício inicial de uma opção de venda americana calculada pela rotina MBW_approx

Tempo para expirar, ÿ Valor crítico do ativo, Sÿÿ Tempo para expirar, ÿ Valor crítico do ativo, Sÿÿ

1,00 82.1510 0,50 85.1701


0,95 82.3751 0,45 85.6199
0,90 82.6115 0,40 86.1176
0,85 82.8618 0,35 86.6740
0,80 83.1273 0,30 87.3049
0,75 83.4098 0,25 88.0333
0,70 83.7115 0,20 88.8959
0,65 84.0349 0,15 89.9568
0,60 84.3830 0,10 91.3469
0,55 84.7598 0,05 93.4260

Os parâmetros utilizados foram: S = 101,0, X = 101,0, r = 0,1, q = 0,06 e ÿ = 0,20.

Os resultados dados nas Tabelas 5.2 e 5.3 foram obtidos usando a função
MBW_approx.
Machine Translated by Google

114 Finanças Computacionais Usando C e C#

5.3 Métodos de rede para opções de baunilha

5.3.1 Rede Binomial

Nesta seção, derivaremos equações para uma rede binomial que descreve o movimento
GBM das mudanças nos preços dos ativos. A abordagem que adotaremos é baseada no
trabalho de Cox, Ross e Rubinstein (1979) e será chamada de rede CRR.

Do Capítulo 2, Eq. (2.3.9), sabemos que se o preço de um ativo, St GBM, , segue


então a variação no valor de seu preço ao longo do intervalo de tempo t tem a seguinte
distribuição:

ÿ2
logSt+t ÿNrÿ t,ÿ2t
St 2

Se usarmos a notação:

St+t
X=
St

ÿ2
ÿ=rÿ t, ÿ2 = ÿ2t
2

a equação acima fica:

log(X) ÿ N ÿ,ÿ2

ou equivalente

X ÿ ÿ,ÿ2

onde (ÿ,ÿ2) é a distribuição lognormal derivada de uma distribuição Gaussiana


com média ÿ e variância ÿ2. É bem conhecido – veja, por exemplo, Evans,
Hastings e Peacock (2000) – que os dois primeiros momentos de uma variável
X extraída de uma distribuição lognormal são:

média lognormal
n2
E[X] = exp n + (5.3.1)
2

substituindo ÿ e ÿ2 dá:

p2 p2
E[X] = expr ÿ t+ t (5.3.2)
2 2
Machine Translated by Google

Opções americanas de ativo único 115

variância lognormal

2 2
Var[X] = EX ÿ E[X] = E X2 ÿ E[X] =
exp 2ÿ + ÿ2exp ÿ2 ÿ 1 (5.3.3)

substituindo ÿ e ÿ2 dá: ÿ2

Var[X] = exp 2r r ÿ
2
t + ÿ2t

que pode ser simplificado para produzir:

Var[X] = exp{2rt} exp ÿ2t ÿ 1 (5.3.4)

Como podemos assumir que o valor esperado de X cresce à taxa de juros sem risco, r,
também podemos escrever:

E[X] = exp(rt) (5.3.5)

Os resultados acima podem ser usados para encontrar os dois primeiros momentos da
distribuição do preço do ativo St+t , dado que conhecemos o preço ,do
t. Para
ativo,fazer
St noisso,
instante
usaremos (veja o Apêndice C.3 para uma prova) o fato de que para uma variável aleatória
G temos:

E[a + bG] = E[a] + bE[G] e Var[a + bG] = b2 Var[G]

onde a e b são constantes. Aplicando isso à variável X dá:

St+t 1
E[X] = E = (5.3.6)
E[St+t]
St St
e

St+t 1
Var[X] = Var = Var[St+t] (5.3.7)
St S2
t

1 onde usamos a = 0 e b = . Nota: Também é fácil mostrar que: St

Var[St+t] = Var[S] (5.3.8)

onde a mudança no preço do ativo ao longo do intervalo de tempo t é denotada por S


= St+t ÿ St . Este resultado elementar às vezes é usado sem prova, veja por exemplo
Hull (1997), p. 344. A prova é simples:
Var[St+t] = Var[St + S] = Var[S]

onde novamente usamos:


Var[a + bG] = b2 Var[G], desta vez com a = 0 e b = 1.

Para encontrar expressões para a média e a variância de St+t, simplesmente


substituímos a Eq. (5.3.5) na Eq. (5.3.6) e obtenha:

E[St+t] = St exp(rt) (5.3.9)


Machine Translated by Google

116 Finanças Computacionais Usando C e C#

e substituindo a Eq. (5.3.4) na Eq. (5.3.7) dá: Var[St+t]


= S2 t exp 2rtexp ÿ2t ÿ 1 (5.3.10)
Uma vez que estamos modelando os movimentos de preços de ativos com uma rede
, binomial,
preço, valor St no próximo
o ativopasso
em qualquer
de tempo nó t.sóAqui
podevamos
saltarassumir
para cima
queouo para
novo baixo
preçono
do
ativo, St+t , é Stu para um salto para cima e Std para um salto para baixo onde u e d
são constantesprobabilidade
que se aplicam
de aum
todos
saltoospara
nóscimada rede. Seentão
por p, aindaadenotarmos a de um
probabilidade
salto para baixo deve (por definição) ser 1 ÿ p.

Agora que especificamos os parâmetros da rede, vamos usá-los para corresponder


aos dois primeiros momentos da distribuição lognormal. Isso resulta na seguinte equação
para a média:
E[St+t] = pStu + (1 ÿ p)Std = St exp(rt) (5.3.11)

A equação correspondente para a variância requer um pouco mais de trabalho:


2 2
Var[St+t] = E (St+t) ÿ E[St+t] (5.3.12)
Desde

E (St+t) e, 2 = p(Stu)2 + (1 ÿ p)(Std)2 = S2 pu2t + (1 ÿ p)d2 (5.3.13)

da Eq. (5.3.9), temos: = St exp(rt)2


2
E[St+t] = S2 exp(2rt) (5.3.14) podemos
t substituir as Eqs. (5.3.13) e (5.3.14)
na Eq. (5.3.12) para obter:

Var[St+t] = S2 pu2
t + (1 ÿ p)d2 ÿ S2 exp(2rt)t (5.3.15)

Então, das Eqs. (5.3.10) e (5.3.15):

exp(2rt) exp ÿ2t ÿ 1 = pu2 + (1 ÿ p)d2 = pu2 + (1 ÿ


p)d2 ÿ exp(2rt) (5.3.16)

Então, refazendo a Eq. (5.3.11) e simplificando a Eq. (5.3.16), obtemos as duas


equações a seguir:
pu + (1 ÿ p)d = exp(rt) exp (5.3.17)
2rt + ÿ2t = pu2 + (1 ÿ p)d2 (5.3.18)

que usaremos para resolver os três parâmetros u,d e p. Como existem três incógnitas e
apenas duas equações, podemos impor uma restrição adicional para obter uma solução
única. A restrição usada no modelo binomial CRR é:

1
em =
d
Agora usamos a seguinte notação:
a = exp(rt)
Machine Translated by Google

Opções americanas de ativo único 117

b2 = exp(2rt) exp ÿ2t ÿ 1 = a2 exp ÿ2t ÿ 1

Isso significa que a Eq. (5.3.17) pode ser escrita como:

a = p + (1 ÿ p)d

que dá:
a-d
p= (5.3.19)
u-d

Da Eq. (5.3.18) temos:

exp 2rt + ÿ2t = a2 exp ÿ2t = a2 + b2


e assim:

a2 + b2 = pu2 + (1 ÿ p)d2

Reorganizando temos:

pu2 + (1 ÿ p)d2 ÿ a2 = b2 pu3

+ (1 ÿ p)d2u ÿ a2u ÿ b2u = 0


mas:

(1 ÿ p)d2u = (1 ÿ p)d = a ÿ pu
então

pu3 + (a ÿ pu) ÿ a2u ÿ b2u = 0


ou

p u3 ÿ u + a ÿ a2u ÿ b2u = 0

Agora,

p u3 ÿ u = u2p(u ÿ d) = u2(a ÿ d) = u2a ÿ u

que dá: au2


ÿ u + a ÿ a2u ÿ b2u = 0

Assim, obtemos a seguinte equação quadrática em u:


au2 ÿ u 1 + a2 + b2 + a = 0

A solução é:

(1 + a2 + b2) + (1 + a2 + b2)2 ÿ 4a2


em =
2a
Se t for pequeno, podemos obter uma aproximação razoável da solução desprezando
termos de ordem superior a t.
Machine Translated by Google

118 Finanças Computacionais Usando C e C#

Nestas circunstâncias temos:

a2 + b2 + 1 = exp(2rt) + exp(2rt) exp ÿ2t ÿ 1 +1


ÿ 1 + 2rt + (1 + 2rt)ÿ2t + 1 ÿ 2 + 2rt + ÿ2t
Portanto,
2
a2 + b2 + 1 ÿ 4a2 ÿ 2 + 2rt + ÿ2t2 ÿ 4(1 + 2rt)

ÿ4 + 8rt + 4ÿ2t ÿ 4 ÿ 8rt

= 4ÿ2t = 2ÿ ÿ t
e assim
2 + 2rt + ÿ2t + 2ÿ ÿt 2 exp(rt)
em ~
ÿ2t + ÿ ÿ t (1 ÿ rt) u ÿ
1 + rt +
2
ÿ2t ÿ2t + ÿ ÿ t ÿ rt = 1 + ÿ ÿ t + u ÿ 1 +
rt +
2
2 que ordenar t dá: u = exp

ÿ ÿ t e d = exp ÿÿ ÿ t (5.3.20)
onde usamos
ÿ2t ÿ3(t)3/2 exp ÿ ÿ t
= 1 + ÿ ÿ t + + +···
2 6
e
1
d=
em

É interessante notar (substituindo na Eq. (5.3.19)) que quando r = 0 e


t ÿ 0, temos p ÿ Agora 1 2 .
que conhecemos os valores dos parâmetros de rede u,d e p, podemos usá-los para
construir uma rede com um número especificado de intervalos de tempo. Uma vez
construído, pode ser usado para calcular os valores e gregos para vários tipos de
opções financeiras. Estas podem ser simplesmente opções de baunilha americanas/
europeias ou opções mais exóticas que podem incorporar recursos como: períodos de
bloqueio, barreiras e funções de pagamento fora do padrão.
Vamos agora discutir como criar uma treliça que pode ser usada para avaliar o Amer
opções de baunilha icana e européia.
Se o valor atual do ativo subjacente for S, e a duração da opção for ÿ e usarmos uma rede
com n intervalos de tempo igualmente espaçados t, então temos:
t
t=
n
Os valores do preço do ativo em vários nós da rede podem ser facilmente calculados.
Isso é ilustrado, na Fig. 5.1, para uma rede com seis passos de tempo (ou seja, sete níveis
de rede).
Machine Translated by Google

Opções americanas de ativo único 119

Figura 5.1 Uma rede binomial padrão consistindo em seis etapas de tempo. O nó R da
rede raiz corresponde ao tempo atual t, e os nós terminais G a M são aqueles no
, ativo tno
vencimento da opção; ou seja, o tempo + ÿnóonde
R é ÿS,éonde
a duração
S é o da
valor
opção.
atual O
dovalor
ativo.
do
Os valores de ativos em outros nós são, por exemplo, nó S: Su, nó T: Sd, nó V: S e nó
A: Su5 . Os valores das opções são calculados usando um processo iterativo reverso:
os valores das opções nos nós A–F no penúltimo passo de tempo são calculados a
partir dos pagamentos dos nós terminais G–M, e esse processo continua até que o nó
raiz seja alcançado, o que produz o valor atual da opção. Aqui calculamos os gregos
usando os seguintes nós: Delta usa os nós S e T, Gamma usa os nós U, V e W e Theta
usa os nós R e V.

Os valores dos ativos nos nós rotulados são:

Nível 1 da rede: Tempo t

RS = S

Nível 2 da rede: Tempo t + t

SS = Su, ST = Sd

Nível 6 da rede: Tempo t + 5t

SA = Su5, SB = Su3, SC = Su,


SD = SD, SE = S, SF = Sd5

Nível 7 da rede: Tempo t + 6t

SG = Su6, SH = Su4, SI = Su2, SJ = S,


SK = Sd2, SL = Sd4, SM = Sd6
Machine Translated by Google

120 Finanças Computacionais Usando C e C#

Em geral, no instante t + it, existem preços i + 1 das ações; estes são:

Si,j = Suj diÿj , j = 0, 1,...,i

Notamos que, como u = 1/d, um movimento para cima seguido de um movimento para baixo
dá o mesmo preço da ação que um movimento para baixo seguido de um movimento para
cima; por exemplo, Su2d = Su. Isso significa que a árvore se recombina e o número de nós
necessários para representar todos os diferentes preços de ativos é significativamente reduzido.

5.3.2 Construindo e usando a rede binomial


Nesta seção, estamos preocupados com os detalhes práticos de como construir e, em
seguida, usar uma rede binomial unidimensional padrão para avaliar opções americanas e
européias. Uma vez que esta rede forma a base para outras técnicas de redes unidimensionais
e multidimensionais, discutiremos sua construção com algum detalhe. Um programa de
computador completo para uma rede binomial padrão é fornecido no trecho de código 5.11,
e o usaremos como base para nossas discussões. Os resultados do uso desse código são
apresentados na Fig. 5.2. Para

Figura 5.2 O erro no valor estimado, est_val, de um put americano usando uma
rede binomial padrão. Os parâmetros utilizados foram: T = 1,0, S = 105,0, X = 105,0,
r = 0,1, q = 0,02, ÿ = 0,3. O valor muito preciso (acc_val) foi 9,2508 e foi calculado
usando uma rede binomial padrão de 6.000 passos. O erro no valor estimado foi
obtido como est_val ÿ acc_val.
Machine Translated by Google

Opções americanas de ativo único 121

referência fácil, listaremos agora os parâmetros de entrada usados por este programa de
computador:
S0 o preço atual do ativo subjacente, S o preço de exercício a volatilidade
x do ativo o vencimento da opção em anos a taxa de juros livre de risco
sigma
T
r
q o rendimento contínuo de dividendos se put for
colocar igual a 1 então a opção é uma opção de venda, se put for igual a
0 então é uma opção de compra is_american se is_american for igual a 1
então é uma
Opção americana, se is_american for igual a 0, então é uma
Opção européia o
M número de passos de tempo na rede

Discutiremos agora com mais detalhes as questões computacionais envolvidas em cada etapa
do cálculo.

Calcule os valores das constantes usadas pela rede


Primeiro calcule os valores de várias constantes que serão usadas, consulte o trecho de código
5.5.
Por conveniência, usamos as variáveis p_u e p_d para armazenar, respectivamente, as
probabilidades de salto para cima e para baixo descontadas pela taxa de juros r em um intervalo
de tempo; esses valores serão usados mais tarde, quando trabalharmos de trás para frente na
rede para calcular o valor da opção atual.

Atribua os valores de ativos aos nós da rede


Mostraremos agora que o número de preços de ativos diferentes, LSn, para uma rede de
recombinação de n etapas é 2n + 1.
Os nós em uma rede de recombinação podem ser considerados como sendo compostos de
dois tipos: aqueles que correspondem a um passo de tempo par e aqueles que correspondem a
um passo de tempo ímpar .
Isso ocorre porque o conjunto de valores de ativos de nó, ET , para um intervalo de tempo par é
distinto do conjunto de valores de ativos de nó, OT , para um intervalo de tempo ímpar. Embora

dt = T/(duplo)M; t1 =
sigma*quadrado(dt); u =
exp(t1); d = exp(-t1); a =
exp((rq)*dt); p = (a - d)/(u -
d); if ((p < zero) || (p > 1.0))
printf ("Erro p fora do
intervalo\n"); desconto = exp(-r*dt);

p_u = desconto*p; p_d


= desconto*(1,0-p);

Trecho de código 5.5 Um fragmento de código que calcula os valores de várias configurações de rede
ficar em pé.
Machine Translated by Google

122 Finanças Computacionais Usando C e C#

s[M] = S0; for (i


= 1; i <= M; ++i) { s[M+i] = u*s[M+i-1]; s[Mi]
= d*s[M-i+1];

Trecho de código 5.6 Um fragmento de código que atribui os diferentes valores de ativos
da rede binomial ao array de armazenamento s usando as taxas de salto para cima e para
baixo ued definidas na Seção 3.4.1. O valor do ativo atual S é atribuído ao elemento da
matriz central s[M], onde M é o número de intervalos de tempo na rede. Os elementos da
matriz acima do centro são S[M+i] = Sui, i = 1,...,M, e os elementos da matriz abaixo do
centro são S[Mi] = Sdi, i = 1,...,M.

ET ÿOT = ÿ, os elementos de ET e OT para qualquer par consecutivo de intervalos de tempo são


relacionados pelo fator multiplicativo constante simples d. Além disso, para uma etapa de tempo
uniforme, há um nó central correspondente ao preço atual do ativo S0, e os nós restantes são
organizados simetricamente sobre isso, consulte o trecho de código 5.6.
Essas características são ilustradas na Fig. 5.1, para uma rede padrão com seis intervalos de
tempo.
O número de preços de ativos distintos em uma rede é, portanto, a soma do número de nós
nas duas últimas etapas de tempo. Como o número de nós no i-ésimo passo de tempo, Si, é i +
1 (ver Fig. 5.1), para uma rede de n passos de tempo temos:

Sn = n + 1 e Snÿ1 = n

Isso significa que o número de valores de ativos diferentes em uma rede de etapas de tempo n é:

LSn = Sn + Snÿ1 = 2n + 1

O número de nós em uma rede de passo de tempo n, LN n, é:

n
(n + 1)(n + 2) (i
LN n = + 1) =
2
i=0

onde usamos o fato de que LN é a soma de uma


n progressão aritmética com primeiro termo 1,
incremento 1 e último termo n + 1.
Pode-se pensar inicialmente que, para precificar opções, é necessário precificar valores.
armazene o valor do ativo de cada nó da rede, o que implicaria no armazenamento do n
LN. No entanto, esse não é o caso. Precisamos apenas armazenar o número de valores de ativos
diferentes na rede; ou seja, valores LSn.
Armazenar valores LSn em vez de idade n pode resultar em economias dramáticas de armazenamento
LN. Por exemplo, uma rede precisa de 1000 passos tem LN = 2001 × n 2002 × 1/2 = 2003001,
enquanto o valor correspondente de LSn é apenas 2 × 1000 + 1 = 2001.

Calcule o payoff da opção nos nós terminais


O valor atual de uma opção é avaliado começando na maturidade da opção, no final da árvore e
trabalhando de trás para frente. Os valores das opções para os nós terminais da árvore são
dados apenas pelo payoff (no vencimento) da opção; esse
Machine Translated by Google

Opções americanas de ativo único 123

if (((M+1)/2) == (M/2)) { /* então M é par */


se (coloque)
v[M/2] = MAX(X - s[M],zero);
outro
v[M/2] = MAX(s[M]-X,zero);
}
P1 = 2*M;
P2 = 0;
para (i = 0; i < (M+1)/2; ++i) {
if (put) { v[Mi] =
MAX(X - s[P1],zero); v[i]
= MAX(X - s[P2],zero);

} else
{ v[Mi] = MAX(s[P1]-X,zero); v[i]
= MAX(s[P2]-X,zero);
}
P1 = P1 - 2;
P2 = P2 + 2;
}

Trecho de código 5.7 Um fragmento de código que calcula os pagamentos para puts e calls nos
nós terminais da rede. Os pagamentos são atribuídos aos elementos da matriz v e são calculados
usando o preço de exercício, X, e os valores de ativos previamente calculados armazenados na
matriz s; como antes M é o número de passos de tempo na rede.

independe se a opção é americana ou européia. Para uma rede com n passos de


tempo existem n + 1 nós terminais, com valores de opção, fn,j ,j = 0,...,n.

Para calcular os valores das opções americanas e européias vanilla, com exer
cise o preço E, então começaremos com os seguintes valores de nó terminal:

para opções de venda:

fn,j = max E ÿ Suj dnÿj , 0 ,j = 0,...,n,

e para opções de chamada:

fn,j = max Suj dnÿj ÿ E, 0 , j = 0,...,n

O código de computador usado para fazer isso é o trecho de código 5.7.

Iterar para trás através da rede


A probabilidade de mover do nó (i, j) no tempo it para o nó (i + 1,j + 1) no tempo (i +
1)t é p, e a probabilidade de mover do nó (i, j) no tempo para o nó (i + 1,j) no tempo (i
+ 1)t é 1 ÿ p. Se assumirmos que não há exercício inicial, então:

E
f eu, j = exp(ÿrt) pfi+1,j+1 + (1 ÿ p)fi+1,j , jin ÿ 1, 0 ji
(5.3.21)
Machine Translated by Google

124 Finanças Computacionais Usando C e C#

Considerando o exercício antecipado, para uma opção americana, temos:


A E
f eu, j = max E ÿ Si,j ,f eu j
(5.3.22)

ou para uma opção de compra americana:

A E
f = max Si,j ÿ E,f i,j , ji N ÿ 1, 0 ji, i,j (5.3.23)

E
onde f é dado
trechopela Eq. (5.3.21).
de código i,j O
5.8 funciona
de trás para frente na rede e usa o array v para armazenar os valores das opções.

A cada intervalo de tempo, os valores de opção recém-calculados sobrescrevem


aqueles calculados no intervalo de tempo anterior. Este processo continua até que o
segundo intervalo de tempo (m1 = 2) seja alcançado. Uma técnica diferente é usada,
que não sobrescreve os valores de opção e, portanto, permite que os gregos sejam
calculados nas proximidades do nó da rede raiz R. Se os gregos não forem necessários,
continue trabalhando para trás na rede até a raiz o nó R (m1 = 0) é alcançado, e o valor
atual da opção é então dado por v[0] (ou seu equivalente multidimensional).

Os valores de opção em todos os nós da rede nas etapas de tempo 0, 1 e 2 são


acessíveis pelo trecho de código 5.9.

P2 = 0; for
(m1 = M-1; m1 >= 2; --m1) {
P2 = P2 + 1;
P1 = P2;
for (n =0; n <= m1; ++n) {
if ((v[n] == zero) && (v[n+1] == zero)) {
espera = zero;
}
outro

espera = p_d*v[n] + p_u*v[n+1]; if (é_americano)


{
se (coloque)
v[n] = MAX(manter,Xs[P1]);
outro
v[n] = MAX(manter,s[P1]-X);
}
outro
v[n] = espera;
P1 = P1 + 2;
}
}

Trecho de código 5.8 Código de computador que funciona de forma iterativa para trás
através da rede computando os valores de opção em cada intervalo de tempo. A matriz v
contém os valores de opção calculados a partir da etapa de tempo anterior e estes são
sobrescritos com valores de opção calculados para a etapa de tempo atual. A iteração para
na segunda etapa de tempo, pois não queremos sobrescrever valores na matriz v que são
necessários para calcular os gregos na vizinhança do nó raiz.
Machine Translated by Google

Opções americanas de ativo único 125

jj = 2; for
(m1 = 2; m1 >= 1; --m1) { ind = M-m1+1; for (n
=0; n < m1; ++n) {

espera = p_d*v[5-jj-m1-1] + p_u*v[5-jj-m1]; if (is_american) { if (put)


v[5-jj] = MAX(hold,Xs[ind]);

outro
v[5-jj] = MAX(manter,s[ind]-X);
}
outro
v[5-jj] = espera; --jj; em
= em + 2;

} *valor = v[5];

Trecho de código 5.9 Fragmento de código ilustrando como os valores de opção são armazenados para as duas primeiras
etapas de tempo para que os gregos possam ser calculados nas proximidades do nó raiz R.

Tabela 5.4 Valores dos nós da rede nas proximidades do nó raiz R

Etapa de tempo do nó Elemento da matriz de recursos valor do ativo Elemento da matriz de opções

R 0 s[M] S v[5]
S 1 s[M+1] Eles são v[4]
T 1 s[M-1] SD v[3]
EM 2 s[M+2] Su2 v[2]
EM 2 s[M] S v[1]
EM 2 s[M-2] Sd2 em[0]

Calculando os gregos: ÿ,ÿ e ÿ


Descreveremos agora como calcular as estatísticas de hedge da opção (gregos).
Deixe o valor da opção e o valor do ativo no nó da rede k serem denotados por fk
e Sk , respectivamente. Assim, por exemplo, ST representa o preço do ativo no nó
T e fT é o valor da opção correspondente no nó T. A Tabela 5.4 fornece detalhes
dos valores dos nós da rede nas proximidades do nó raiz R.
O cálculo de cada grego é agora considerado.
Delta
A definição de ÿ é a taxa de variação do valor da opção com o preço do ativo e todos
os outros parâmetros permanecendo fixos. Assim, ÿf ÿS

= f
D=
S
onde f é o valor da opção de mudança correspondente à mudança no preço do ativo S. Idealmente,
gostaríamos de avaliar essa derivada parcial no nó raiz R (m1=0); no entanto, não podemos
porque precisamos de pelo menos dois nós de rede para calcular um valor. O melhor que
podemos fazer é avaliar a derivada no primeiro passo de tempo (m1=1) da seguinte forma: fS ÿ
fT SS ÿ ST
v[4] ÿ v[3]
D= =
s[M + 1] ÿ s[M ÿ 1]
Machine Translated by Google

126 Finanças Computacionais Usando C e C#

Gama A
definição de ÿ é a taxa de variação de ÿ com o preço do ativo e todos os outros
parâmetros permanecendo fixos. Assim, ÿ2f ÿS2
ÿÿ
C= =
ÿS

Para avaliar ÿ precisamos de pelo menos dois valores de ÿ. O mais próximo que isso
pode ser alcançado do nó raiz R é no passo de tempo 2, onde temos:
ÿÿ ÿ ÿÿ
VW C = ultravioleta

Sÿ ÿ Sÿ
ultravioleta VW

com os pontos médios


1
Sÿ = {SU + SV }
ultravioleta
2

e os valores de ÿ nos pontos médios Sÿ , respectivamente.


e Sÿ denotado por ÿÿ e ÿÿ VW ,
ultravioleta VW ultravioleta

Como fU ÿ fV SU ÿ SV fV ÿ fW SV ÿ SW

ÿÿ ultravioleta
=

ÿÿ V W =

e
1
Sÿ ÿ Sÿ = {SU ÿ SW }
ultravioleta VW 2
Nós temos

v[2] ÿ v[1] s[M


ÿÿ ultravioleta
=
+ 2] ÿ s[M]
v[1] ÿ v[0]
ÿÿ V W =
s[M] ÿ s[M ÿ 2]

O valor de ÿ pode, portanto, ser aproximado como:

2{ÿÿ ÿ ÿÿ }
C= ultravioleta VW
s[M + 2] ÿ s[M ÿ 2]
teta
A definição de ÿ é a taxa de variação do valor da opção com o tempo todas as outras
parâmetros permanecem fixos. Por isso,
ÿfÿ f
= ÿt =
t

O mais próximo do nó raiz R que pode ser calculado é sobre o intervalo de tempo do
intervalo de tempo 0 ao intervalo de tempo 2. Obtemos então a seguinte aproximação:
fV ÿ fR =
v[1] ÿ v[5]
ÿ=
2t 2t
Machine Translated by Google

Opções americanas de ativo único 127

O trecho de código 5.10 calcula os ÿ,ÿ que , e ÿ usando as aproximações que


acabamos de discutir.

Vega
A definição de V é a taxa de variação do valor da opção com volatilidade:
ÿf
V=
ÿÿ
Em uma rede binomial padrão, V não pode ser calculado diretamente. Uma abordagem
simples é usar duas redes binomiais da seguinte forma:
fÿ+ÿ ÿ fÿ
V=
p

onde fÿ+ÿ é o valor de opção calculado usando uma rede binomial com volatilidade ÿ +
ÿ, e fÿ é o valor de opção calculado usando outra rede binomial com volatilidade de ÿ;
todos os outros parâmetros da rede permanecem constantes.
A volatilidade implícita das opções americanas pode ser calculada usando o método
descrito para as opções européias na Seção 5.4.4; no entanto, neste caso, o valor da
opção e os gregos são calculados usando uma rede binomial (consulte o trecho de código 5.11).

/* atribui o valor de delta (obtido de m1 = 1) */


gregos[1] = (v[4]-v[3])/(s[M+1]-s[M-1]); /* atribui o valor de gama
(use os valores no intervalo de tempo m1 = 2) */ dv1 = v[2] - v[1]; ds1 = s[M+2] - s[M]; dv2 = v[1] - v[0]; ds2 = s[M]
- s[M-2]; h = 0,5*(s[M+2] - s[M-2]); gregos[0] = ((dv1/ds1) - (dv2/ds2))/h; /* atribui o valor de teta */ greeks[2] =
(v[1]-*valor)/(2.0*dt); /* também pode escrever: greeks[2] = (v[1]-v[5])/(2.0*dt); */

Trecho de código 5.10 Um fragmento de código que calcula os valores de Greeks, Delta, Gamma e
Theta, nas proximidades do nó da rede raiz R.

void standard_lattice(double *value, double greeks[], double S0,_ double X, double sigma, double T, double
r, double q, long put, long is_american, long M, long *iflag)

{
/* Parâmetros de entrada:
===================

S0 - o preço atual do ativo subjacente - o preço de exercício - a volatilidade


x - o tempo até o vencimento
sigma
T
r - A taxa de juros
q - o rendimento contínuo de dividendos - se a
colocar opção de venda for 0, então uma opção de compra, caso contrário, uma opção de venda
is_american - se is_american for 0, então uma opção européia, caso contrário, uma opção americana
M - o número de passos de tempo
Parâmetros de saída:
==================
valor - o valor da opção, - a saída de estatísticas
grego[] de hedge da seguinte forma: greeks[0] é gamma, greeks[1]_
é delta, gregos[2] é theta,
iflag - um indicador de erro.
*/
...
/* Aloca os arrays s[2*M+1], e v[M+1] */

Trecho do código 5.11.


Machine Translated by Google

128 Finanças Computacionais Usando C e C#

dt = T/(duplo)M; t1 =
sigma*quadrado(dt); u = exp(t1);
d = exp(-t1); a = exp((rq)*dt); p =
(a - d)/(u - d); if ((p < zero) || (p >
1.0)) printf ("Erro p fora do
intervalo\n"); desconto = exp(-
r*dt); p_u = desconto*p; p_d = desconto*(1,0-p);

/* atribui os valores de ativos 2*M+1 */ s[M] = S0; for (i = 1;


i <= M; ++i) { s[M+i] = u*s[M+i-1]; s[Mi] = d*s[M-i+1];

}
/* Descubra se o número de intervalos de tempo, M, é par ou ímpar */ if (((M+1)/2) == (M/2)) { /* então
M é par */ if (put ) v[M/2] = MAX(X - s[M],zero); senão v[M/2] = MAX(s[M]-X,zero);

}
/* Calcula os valores das opções no vencimento */
P1 = 2*M;
P2 = 0; for
(i = 0; i < (M+1)/2; ++i) { if (put) { v[Mi] = MAX(X -
s[P1],zero); v[i] = MAX(X - s[P2],zero);

} else
{ v[Mi] = MAX(s[P1]-X,zero); v[i] = MAX(s[P2]-
X,zero);
}
P1 = P1 - 2;
P2 = P2 + 2;
}
/* agora trabalha de trás para frente através da treliça para calcular o valor da opção atual */
P2 = 0; for
(m1 = M-1; m1 >= 2; --m1) {
P2 = P2 + 1;
P1 = P2; for
(n =0; n <= m1; ++n) {
if ((v[n] == zero) && (v[n+1] == zero)) { espera = zero;

}
outro
espera = p_d*v[n] + p_u*v[n+1]; if (is_american)
{ if (put) v[n] = MAX(hold,Xs[P1]); senão v[n] =
MAX(manter,s[P1]-X);

} else
v[n] = espera;
P1 = P1 + 2;
}
}
/* Os valores v[0], v[1] & v[2] correspondem aos nós para m1 = 2, v[3] & v[4] correspondem_
os nós para m1 = 1 e o valor da opção (*value)
é o nó para m1 = 0, v[5]. Para um determinado intervalo de tempo, v[0]_ corresponde ao preço mais baixo do ativo, v[1] ao próximo
mais baixo, etc. */

jj = 2; for
(m1 = 2; m1 >= 1; --m1) { ind = M-m1+1; for (n
=0; n < m1; ++n) {

espera = p_d*v[5-jj-m1-1] + p_u*v[5-jj-m1]; if (is_american) { if (put) v[5-


jj] = MAX(hold,Xs[ind]); outro

Trecho de código 5.11 (continuação).


Machine Translated by Google

Opções americanas de ativo único 129

v[5-jj] = MAX(manter,s[ind]-X);

} else
v[5-jj] = espera; --jj; em
= em + 2;

} *valor = v[5];
if(gregos) {
/* atribui o valor de delta (obtido de m1 = 1) */ greeks[1] = (v[4]-v[3])/(s[M+1]-s[M-1]);

/* atribui o valor de gama (use os valores no intervalo de tempo m1 = 2) */


dv1 = v[2] - v[1]; ds1 =
s[M+2] - s[M]; dv2 = v[1] - v[0];
ds2 = s[M] - s[M-2]; h =
0,5*(s[M+2] - s[M-2]); gregos[0]
= ((dv1/ds1) - (dv2/ds2))/h; /* atribui o valor
de teta */ greeks[2] = (v[1]-*valor)/(2.0*dt); /* também pode
escrever: y gregos[2] = (v[1]-v[5])/_ (2.0*dt); */

Trecho de código 5.11 Função para calcular o valor de uma opção usando uma rede binomial
padrão.

5.3.3 Rede binomial com uma variável de controle


A técnica de variável de controle pode ser usada para aumentar a precisão que uma rede
binomial padrão fornece para o valor de uma opção de baunilha americana. Envolve usar a
mesma estrutura binomial padrão para avaliar tanto uma opção americana quanto a opção
européia equivalente. A fórmula de Black-Scholes é então usada para calcular o valor exato
da opção europeia. Se assumirmos que o erro na precificação da opção européia é o mesmo
da opção americana, podemos obter uma estimativa melhor para o valor da opção americana.

Quando aplicado à avaliação de uma opção de venda americana, isso pode ser ex
pressionado da seguinte forma:

Erro de preço europeu, E = pBS(S,E,ÿ) ÿ pL(S,E,ÿ)


Erro de precificação americano, A = Pÿ(S,E,ÿ) ÿ PL(S,E,ÿ)

onde normalmente S é o valor atual do ativo, E é o preço de exercício e ÿ é o vencimento da


opção. Além disso, pBS(S,E,ÿ) é o valor de Black–Scholes da opção de venda européia,
pL(S,E,ÿ) é a estimativa da rede binomial da opção de venda européia, Pÿ(S,E,ÿ) é o valor
exato (desconhecido) da opção de venda americana e PL(S,E,ÿ) é a estimativa da rede
binomial da opção de venda americana.

= A temosÿentão:
Fazendo E pBS(S,E,ÿ) pL(S,E,ÿ) =
Pÿ(S,E,ÿ) ÿ PL(S,E,ÿ)
que no rearranjo produz:
Pÿ(S,E,ÿ) = pBS(S,E,ÿ) ÿ pL(S,E,ÿ) + PL(S,E,ÿ)
Assim, usamos Pÿ(S,E,ÿ) como a estimativa de variável de controle aprimorada para o valor
da opção de venda americana. Claro, exatamente a mesma abordagem pode ser usada para
obter uma estimativa melhor para o valor de uma opção de compra americana.
Machine Translated by Google

130 Finanças Computacionais Usando C e C#

O trecho de código 5.12 mostra o uso da técnica de variável de controle em uma


rede binomial padrão para fornecer estimativas aprimoradas para o valor e as
estatísticas de hedge de uma opção americana.

/* Configure os arrays como na rede padrão */


...
for (i = 0; i < (M+1)/2; ++i) { /* Calcular os valores das opções no vencimento */
if (put) { a_v[Mi]
= MAX(X - s[P1],zero); a_v[i] = MAX(X - s[P2],zero);

} else
{ a_v[Mi] = MAX(s[P1]-X,zero); a_v[i] =
MAX(s[P2]-X,zero);

} e_v[i] = a_v[i]; e_v[Mi] =


a_v[Mi];
P1 = P1 - 2;
P2 = P2 + 2;
}
/* agora trabalha de trás para frente através da treliça para calcular o valor da opção atual */
P2 = 0; for
(m1 = M-1; m1 >= 2; --m1) {
P2 = P2 + 1;
P1 = P2; for
(n =0; n <= m1; ++n) { if ((a_v[n] == zero)
&& (a_v[n+1] == zero))
espera = zero;
outro
espera = p_d*a_v[n] + p_u*a_v[n+1]; if (put) a_v[n] =
MAX(hold,Xs[P1]); outro

a_v[n] = MAX(manter,s[P1]-X); if ((e_v[n] ==


zero) && (e_v[n+1] == zero)) e_v[n] = zero; else e_v[n] = p_d*e_v[n] +
p_u*e_v[n+1];

P1 = P1 + 2;
}
}
/* Os valores americanos são armazenados no array a_v e os valores europeus no array_
e_v. A indexação da
matriz é a mesma da rede padrão */

jj = 2; for
(m1 = 2; m1 >= 1; --m1) { ind = M-m1+1; for (n
=0; n < m1; ++n) {

espera = p_d*a_v[5-jj-m1-1] + p_u*a_v[5-jj-m1]; if (put) a_v[5-jj] =


MAX(hold,Xs[ind]);

outro
a_v[5-jj] = MAX(hold,s[in]-X); e_v[5-jj] = p_d*e_v[5-
jj-m1-1] + p_u*e_v[5-jj-m1]; --jj; em = em + 2;

}
}
/* v1 = Aproximação binomial americana, v2 = Aproximação binomial europeia, temp =_ valor exato (europeu) de Black-Scholes */
black_scholes(&temp,bs_greeks,S0,X,sigma,T,r,q,put,&iflagx); *valor = (a_v[5] - e_v[5]) + temp; /* retorna a aproximação da variável de controle
*/ if(greeks) {

/* atribui o valor de delta (obtido de m1 = 1) */ a_delta = (a_v[4]-a_v[3])/(s[M+1]-s[M-1]);


e_delta = (e_v[4]-e_v[3])/(s[M+1]-s[M-1]); gregos[1] = a_delta - e_delta + bs_gregos[1]; /*
atribui o valor de gama (use os valores no intervalo de tempo m1 = 2) */ dv1 = a_v[2] -
a_v[1];

Trecho do código 5.12.


Machine Translated by Google

Opções americanas de ativo único 131

ds1 = s[M+2] - s[M]; dv2 =


a_v[1] - a_v[0]; ds2 = s[M] -
s[M-2]; h = 0,5*(s[M+2] - s[M-2]);

a_gama = ((dv1/ds1) - (dv2/ds2))/h; dv1 = e_v[2] -


e_v[1]; dv2 = e_v[1] - e_v[0]; e_gama = ((dv1/ds1) -
(dv2/ds2))/h; greeks[0] = (a_gamma - e_gamma) +
bs_greeks[0]; /* atribui o valor de theta */ a_theta =
(a_v[1]-a_v[5])/(2.0*dt); e_theta = (e_v[1]-e_v[5])/(2.0*dt); gregos[2]
= (a_theta - e_theta) + bs_greeks[2];

Trecho de código 5.12 Função para calcular o valor e as estatísticas de hedge de uma opção
americana usando uma rede binomial com uma variável de controle.

Finalmente, devemos mencionar que a técnica de controle variável não se aplica apenas
às opções de baunilha americanas. O método é bastante geral e pode ser usado para obter
estimativas aprimoradas para qualquer integral (ou opção exótica), desde que uma solução
precisa (forma fechada) de uma integral semelhante seja conhecida. Um uso comum do
método de variável de controle é melhorar a precisão das estimativas de Monte Carlo.

5.3.4 A rede binomial com BBS e BBSR


Aqui consideramos o método Binomial Black-Scholes (BBS) e também o método Binomial
Black-Scholes com extrapolação de Richardson (BBSR) (ver Broadie e DeTemple (1996)).
Assim como o método de variável de controle discutido na seção anterior, ambas as técnicas
podem ser usadas em conjunto com uma rede binomial padrão para melhorar os resultados
calculados.
Vamos primeiro discutir o método BBS.

O método BBS
O método BBS é idêntico à rede binomial padrão, exceto que no último intervalo de tempo
(ou seja, pouco antes do vencimento da opção) a fórmula de Black-Scholes é usada para
calcular os valores da opção no vencimento. Para uma rede binomial com n passos de
tempo, isso envolve a avaliação da fórmula de Black-Scholes em cada um dos n nós no
penúltimo passo de tempo; ver Fig. 5.1. No trecho de código 5.13, definimos a função
bs_lattice que incorpora o método BBS em uma rede binomial padrão. O leitor deve ter
notado que bbs_lattice é bastante negligente em relação à quantidade de armazenamento
necessária; consulte a Seção 5.3.2. Ele usa uma matriz de tamanho LN em vez de LSn para
armazenar n os
ficapreços
como dos ativos da rede; a modificação para usar um array de tamanho LSn
exercício.

Os benefícios de usar a abordagem BBS para precificar uma opção de compra americana
são ilustrados na Figura 5.3. Aqui comparamos os resultados obtidos usando a função
bbs_lattice com aqueles calculados pela função standard_ lattice, a rede binomial padrão do
trecho de código 5.11. Pode-se ver claramente que o método BBS é significativamente mais
preciso do que a abordagem de rede binomial padrão, na qual o erro de precificação de
opções exibe oscilações pronunciadas.
Machine Translated by Google

132 Finanças Computacionais Usando C e C#

void bbs_lattice(double *value, double greeks[], double S0, double X, double sigma, double T,_
duplo r, duplo
q, long put, long M, long *iflag)
{
/* Parâmetros de entrada:
===================
S0 - o preço atual do ativo subjacente - o preço de exercício - a volatilidade
- o tempo até o vencimento - a taxa de juros - o rendimento contínuo de
x sigma dividendos - se a opção de venda for 0, então uma opção de compra,
T caso contrário, uma opção de venda - o número de intervalos de tempo
r
q

colocar
M
Parâmetros de saída:
==================

valor - o valor da opção, greeks[] - a saída das estatísticas de cobertura da seguinte forma:_
greeks[0] é gama, greeks[1] é
delta, greeks[2] é teta, - um indicador de erro.
iflag
*/
...
/* aloca os arrays s[((M+2)*(M+1))/2], e v[M+1] */

dt = T/(duplo)M; t1 =
sigma*quadrado(dt); u = exp(t1);
d = exp(-t1); a = exp((rq)*dt); p =
(a - d)/(u - d); se ((p < zero) || (p
> 1,0)) retornar; /* Probabilidade
inválida */ desconto = exp(-r*dt);
p_u = p*desconto; p_d = (1,0-p)*desconto; jj = 0; s[0] = S0; /* Quanto "maior" o valor de jj, em um
determinado instante de tempo, menor o valor do_ preço do ativo */ for (m1 = 1; m1 <= M-1; ++m1) { /*
Calcular os valores dos ativos até (M-1)º passo de tempo */

for (n = m1; n >= 1; --n) { ++jj; s[jj] = u*s[jj-


m1];

} ++jj;
s[jj] = d*s[jj-m1-1];
}
for (n = 0; n <= M-1; ++n) { /* Use Black-Scholes para a etapa final */
black_scholes(&temp,NULL,s[jj],X,sigma,dt,r,q ,colocar,&iflagx); v[n] = temperatura; --jj;

} for (m1 = M-1; m1 >= 3; --m1) { /* trabalhe para trás através da treliça */
for (n =0; n < m1; ++n) {
if ((v[n] == zero) && (v[n+1] == zero)) {
espera = zero;

} outro
espera = p_d*v[n] + p_u*v[n+1]; if (is_american)
{ if (put) v[n] = MAX(hold,Xs[jj]); else v[n] = MAX(hold,s[jj]-
X);

} else
v[n] = espera; --jj;

}
}
/* Os valores v[0], v[1] e v[2] correspondem aos nós para m1 = 2, v1 e v2 correspondem a_
os nós para m1 = 1 e o valor da opção (*valor)
é o nó para m1 = 0. Para um determinado intervalo de tempo, v[0] corresponde a_ o preço mais baixo do ativo, v[1] ao próximo mais baixo, etc.. * /

Trecho do código 5.13.


Machine Translated by Google

Opções americanas de ativo único 133

espera = p_d*v[0] + p_u*v[1]; if (is_american)


{ if (put) v1 = MAX(hold,Xs[jj]); else v1 =
MAX(hold,s[jj]-X);

}
outro
v1 = espera; --jj;

espera = p_d*v[1] + p_u*v[2]; if (is_american)


{ if (put) v2 = MAX(hold,Xs[jj]); else v2 =
MAX(hold,s[jj]-X);

}
senão v2 =
espera; --jj;
espera = p_d*v1 + p_u*v2; if
(is_american) { if (put) *value =
MAX(hold,Xs[0]); senão *valor =
MAX(manter,s[0]-X);

} else
*valor = espera;
if(gregos) {
/* atribui o valor de delta (obtido de m1 = 1) */ greeks[1] = (v2-v1)/(s[1]-s[2]); /* atribui o
valor de gama (use os valores no intervalo de tempo m1 = 2) */

dv1 = v[2] - v[1]; ds1 = s[3] -


s[4]; dv2 = v[1] - v[0]; ds2 =
s[4] - s[5]; h = 0,5*(s[3] - s[5]);

gregos[0] = ((dv1/ds1) - (dv2/ds2))/h; /* atribui o valor de teta */


greeks[2] = (v[1]-*valor)/(2.0*dt);

}
}

Trecho de código 5.13 A função bbs_lattice que incorpora o método BBS em


uma rede binomial padrão. A fórmula de Black-Scholes é avaliada usando a
função black_scholes, fornecida no trecho de código 4.1.

O método BBSR
O método BBSR aplica a extrapolação de Richardson de dois pontos aos valores BBS
calculados; para mais informações sobre a extrapolação de Richardson, veja Marchuk e
Shaidurov (1983). Neste método, as estimativas de preços de opções de duas redes
BBS, com diferentes números de intervalos de tempo, são combinadas para formar uma
estimativa melhorada.
Aqui usamos o seguinte esquema BBSR para calcular o valor de uma opção de compra
americana:
41
CBBSR(S,E,ÿ, 2n) = CBBS(S,E,ÿ, 2n) ÿ CBBS(S,E,t,n) 3 (5.3.24)
3

onde S é o valor atual do ativo, E é o preço de exercício, ÿ é o vencimento da opção,


CBBS(S,E,ÿ,n) é o valor da opção de compra calculado usando uma rede BBS com n
intervalos de tempo, CBBS(S,E,ÿ, 2n) é o valor da opção de compra calculado usando um
Machine Translated by Google

134 Finanças Computacionais Usando C e C#

Figura 5.3 O erro no valor estimado, est_val, de uma chamada americana usando
uma rede binomial padrão e uma rede binomial BBS. Os parâmetros utilizados foram:
T = 1,0, S = 105,0, E = 105,0, r = 0,1, q = 0,02, ÿ = 0,3. O valor muito preciso (acc_val)
foi 16,1697 e foi calculado usando uma rede binomial padrão de 6.000 passos. O
erro no valor estimado foi obtido como est_val ÿ acc_val.

Rede BBS com 2n passos de tempo, e CBBSR(S,E,ÿ, 2n) é a estimativa BBSR. Calculamos o
valor de uma opção de venda americana usando:
41
PBBSR(S,E,ÿ, 2n) = PBBS(S,E,ÿ, 2n) ÿ PBBS(S,E,t,n) 3 3 (5.3.25)

A Figura 5.4 exibe os resultados calculados do BBSR para uma opção de compra americana
com S = 105,0,ÿ = 1,0,E = 105,0,q = 0,02 e ÿ = 0,3.
Nas Tabelas 5.5 e 5.6 são apresentados os erros no cálculo de uma opção de venda
americana e de uma opção de compra americana; os métodos usados são a rede binomial
padrão, a rede BBS e a rede BBSR. Pode-se ver que a rede BBSR fornece os resultados mais
precisos. Isso não é surpreendente, pois, a partir das Eqs. (5.3.24) e (5.3.25) vemos que
quando usamos uma rede binomial padrão de passo de tempo n ou uma rede BBS de passo
de tempo n, a estimativa BBSR correspondente é obtida usando uma rede BBS de passo de
tempo n e também uma rede 2n passo de tempo da rede BBS. Uma maneira de verificar se a
extrapolação de Richardson está fornecendo maior precisão é comparar os resultados para
uma rede BBS de passo de tempo 2n com aqueles para uma rede BBSR de passo de tempo n.
A inspeção dos resultados mostra que a extrapolação de Richardson de fato levou a uma
melhoria. Por exemplo, na Tabela 5.5 o erro para um 160
Machine Translated by Google

Opções americanas de ativo único 135

Figura 5.4 O erro no valor estimado, est_val, de uma chamada americana, usando
uma rede binomial BBSR. Os parâmetros utilizados foram: T = 1,0, S = 105,0, E =
105,0, r = 0,1, q = 0,02, ÿ = 0,3. O valor muito preciso (acc_val) foi 16,1697 e foi
calculado usando uma rede binomial padrão de 6.000 passos. O erro no valor
estimado foi obtido como est_val ÿ acc_val.

a rede BBS de passo de tempo é 5,0869e-003, enquanto que para uma rede BBSR de passo de tempo 80
é 3,5725e-003; na Tabela 5.6, o erro para uma rede BBS de 80 passos de tempo é 6,3858e-003, e para
uma rede BBSR de 40 passos de tempo é 3,5725e-003.

5.4 Métodos de grade para opções vanilla

5.4.1 Introdução

Na Seção 5.3, discutimos o uso de métodos de rede binomial para avaliar opções européias e americanas.
Os métodos de treliça que descrevemos têm a vantagem de serem bastante fáceis de implementar e podem
avaliar opções simples, como opções de venda e chamadas de baunilha, com precisão razoável . O uso de
probabilidades de salto para cima e para baixo nos nós da rede também é um recurso atraente, pois estão
diretamente relacionados ao processo estocástico que está sendo modelado. No entanto, as técnicas de
treliça têm as seguintes desvantagens:

• Eles exigem pequenos intervalos de tempo para garantir a estabilidade numérica


Machine Translated by Google

136 Finanças Computacionais Usando C e C#

Tabela 5.5 Os erros de precificação para uma opção de compra americana calculados por: uma rede
binomial padrão, uma rede BBS e também uma rede BBSR

n passos rede padrão rede BBS rede BBSR

20 ÿ1.5075eÿ001 3,6187eÿ002 1,2754eÿ002


30 ÿ1.0057eÿ001 2,4526eÿ002 8,6771eÿ003
40 ÿ7.5382eÿ002 1,8612eÿ002 6,6361eÿ003
50 ÿ6.0244eÿ002 1,5036eÿ002 5,4109eÿ003
60 ÿ5.0141eÿ002 1,2639eÿ002 4,5939eÿ003
70 ÿ4.2919eÿ002 1,0922eÿ002 4,0103eÿ003
80 ÿ3.7499eÿ002 9.6302eÿ003 3.5725eÿ003
90 ÿ3.3282eÿ002 8.6236eÿ003 3.2320eÿ003
100 ÿ2.9908eÿ002 7.8171eÿ003 2.9596eÿ003
110 ÿ2.7146eÿ002 7.1565eÿ003 2.7367eÿ003
120 ÿ2.4844eÿ002 6.6053eÿ003 2.5509eÿ003
130 ÿ2.2896eÿ002 6.1385eÿ003 2.3938eÿ003
140 ÿ2.1226eÿ002 5.7382eÿ003 2.2590eÿ003
150 ÿ1.9778eÿ002 5.3909eÿ003 2.1423eÿ003
160 ÿ1.8511eÿ002 5.0869eÿ003 2.0401eÿ003
170 ÿ1.7393eÿ002 4.8186eÿ003 1.9500eÿ003
180 ÿ1.6399eÿ002 4.5799eÿ003 1.8698eÿ003
190 ÿ1.5510eÿ002 4.3663eÿ003 1.7981eÿ003
200 ÿ1.4710eÿ002 4.1740eÿ003 1.7336eÿ003

O erro de precificação é definido como valor estimado ÿ valor exato, onde o valor exato, 16,1697, foi obtido
usando uma rede binomial padrão de 6.000 passos. Os parâmetros de opção usados foram: T = 1,0, S =
105,0, E = 105,0, r = 0,1, q = 0,02 e ÿ = 0,3.

• Há pouco controle sobre onde os nós da rede estão localizados. Isso pode levar a
uma precisão muito baixa ao avaliar certos tipos de opções; por exemplo, aqueles
com barreiras em determinados preços de ativos.
Um método para evitar essas limitações é por meio do uso de grades de diferenças
finitas. Embora esta abordagem não tenha mais a interpretação probabilística da rede
binomial, ela tem as seguintes vantagens: • São necessários menos intervalos de
tempo para garantir a estabilidade numérica • Há controle completo sobre o
posicionamento das linhas de grade e seus nós de grade associados.

5.4.2 Grades uniformes


A equação de Black–Scholes para o valor de uma opção f é dada por: ÿ2f
2 ÿf ÿf 1 ÿ2S2 + (r ÿ q)S = rf + ÿS2 ÿt ÿS
(5.4.1)

Queremos resolver esta equação ao longo da duração da opção, ou seja, do tempo


atual t até o vencimento da opção no tempo t + ÿ . Para fazer isso nós
Machine Translated by Google

Opções americanas de ativo único 137

Tabela 5.6 Os erros de precificação para uma opção de venda americana calculados por: uma rede
binomial padrão, uma rede BBS e também uma rede BBSR

n passos rede padrão rede BBS rede BBSR

20 ÿ6.1971eÿ002 2,3917eÿ002 7,6191eÿ003


30 ÿ4.1648eÿ002 1,6800eÿ002 6,0465eÿ003
40 ÿ3.2264eÿ002 1,1694eÿ002 4,6165eÿ003
50 ÿ2.6538eÿ002 8,4790eÿ003 4,2654eÿ003
60 ÿ2.1069eÿ002 8,7348eÿ003 3,2946eÿ003
70 ÿ1.8298eÿ002 7,2743eÿ003 2,9633eÿ003
80 ÿ1.5885eÿ002 6.3858eÿ003 2.6088eÿ003
90 ÿ1.3977eÿ002 5.9417eÿ003 2.2099eÿ003
100 ÿ1.2612eÿ002 5.3188eÿ003 2.1793eÿ003
110 ÿ1.1338eÿ002 4.9652eÿ003 2.0992eÿ003
120 ÿ1.0239eÿ002 4.6547eÿ003 1.8723eÿ003
130 ÿ9.5208eÿ003 4.1505eÿ003 1.8808eÿ003
140 ÿ8.6142eÿ003 4.0411eÿ003 1.7505eÿ003
150 ÿ8.2382eÿ003 3.6020eÿ003 1.7341eÿ003
160 ÿ7.5811eÿ003 3.5531eÿ003 1.6411eÿ003
170 ÿ7.1097eÿ003 3.3726eÿ003 1.5507eÿ003
180 ÿ6.7887eÿ003 3.1428eÿ003 1.5478eÿ003
190 ÿ6.3033eÿ003 3.1345eÿ003 1.4134eÿ003
200 ÿ6.0276eÿ003 2.9642eÿ003 1.3973eÿ003

O erro de precificação é definido como valor estimado ÿ valor exato, onde o valor exato, 9,2508, foi obtido
usando uma rede binomial padrão de 6.000 passos. Os parâmetros de opção usados foram: T = 1,0, S =
105,0, E = 105,0, r = 0,1, q = 0,02 e ÿ = 0,3.

usará uma grade na qual o preço do ativo S assume ns valores uniformemente


espaçados, Sj = jS,j = 0,...,ns ÿ 1, onde S é o espaçamento entre os pontos da grade.
Se Smax é o valor máximo do ativo que queremos representar, então o espaçamento da grade,
Sÿ, pode ser simplesmente calculado como:

Smax
Sÿ = (5.4.2)
ns ÿ 1

No entanto, como gostaríamos de resolver os valores das opções e gregos no preço


atual do ativo S0, também gostaríamos que uma linha de grade do ativo coincidisse
com o preço atual do ativo. Isso evita o uso de interpolação que é necessária quando
o valor do ativo não corresponde a uma linha de grade. O método pelo qual conseguimos
isso é descrito no trecho de código 5.12. Aqui o usuário fornece a função opt_gfd com
valores para Smax e ns ÿ1 a partir dos quais Sÿ é calculado usando a Eq. (5.4.2). Em
seguida, encontramos o inteiro, n1, que está logo abaixo (ou igual a) o valor S0/Sÿ, e
usamos isso para obter um novo espaçamento de grade S = S0/n1. Isso leva à nova
discretização do preço do ativo Sj = jS,j = 0,...,ns ÿ 1, onde agora garantimos que Sn1
= S0.
Machine Translated by Google

138 Finanças Computacionais Usando C e C#

O usuário também fornece a função opt_gfd com o número de intervalos de tempo para
a grade. Quando há nt intervalos de tempo, a grade tem nt + 1 instantes de tempo
uniformemente espaçados, ti = it,i = 0,...,nt , e o passo de tempo é simplesmente:
t
t= (5.4.3)
nt

Assim como nos métodos de rede binomial, resolveremos a equação para trás no tempo
desde a maturidade (no tempo t + ÿ ) até o presente (tempo t). Assim, conforme resolvemos
a equação, o índice de tempo começará em i = nt (tempo t + ÿ ) e diminuirá para i = 0 (tempo
atual t).
Aqui discutimos o método da grade para resolver a equação de Black-Scholes em termos
de:

• A aproximação por diferenças finitas • As


condições de contorno • Cálculo dos valores
das opções em um determinado instante • Iteração reversa e
exercício antecipado

Cada um desses aspectos será agora considerado separadamente.

A aproximação por diferenças finitas

O valor da opção correspondente ao nó da grade em que ti = it e Sj = jS será denotado por


fi,j . Aproximaremos a derivada parcial de fi,j em relação ao tempo simplesmente como:

ÿf = fi+1,j ÿ fi,j
(5.4.4)
ÿt t

Para os outros termos da Eq. (5.4.1) usaremos o método ponderado, ÿm . Esta técnica
envolve selecionar uma escolha apropriada para ÿm no intervalo 0 ÿm 1 de modo que a
contribuição do nó (i, j) seja uma soma ponderada envolvendo os valores nos nós (i, j) e
(i+1,j). Por exemplo, o termo rf |i,j na Eq. (5.4.1) é aproximado como:

rf |i,j = r ÿmfi+1,j + (1 ÿ ÿm)fi,j (5.4.5)

e o termo ÿS ÿf
|i,j na Eq. (5.4.1) é aproximado como:

ÿf ÿf ÿf = ÿm + (1 ÿ ÿm) ÿS ÿS ÿS i,j i+1,ji,j


(5.4.6)

Usando este método obtemos assim, no nó (i, j), a seguinte versão discretizada da Eq.
(5.4.1):

fi+1,j ÿ fi,j + (r
ÿ q)Sj ÿmf i+1,j + ÿÿ mf i,j
t
1
ÿ2S2j ÿmf (5.4.7)
+2 _ i+1,j + ÿÿ mf i,j = r ÿmfi+1,j + ÿÿ mfi,j
Machine Translated by Google

Opções americanas de ativo único 139

onde para compacidade escrevemos ÿÿ m


= 1 ÿ ÿm, e denotam a parcial ÿ2f
= Aproximações porÿfdiferenças
|i,j . ÿS ÿS2
finitas
derivadas wrt S no nó (i, j) como: f i,j |i,j e f podem
derivadas eu j
= considerando
ser para essasuma
obtidas
expansão de Taylor sobre o ponto fi,j . Procedemos da seguinte forma:

fi,j+1 = fi,j + f i,jS + 1f (S)2 (5.4.8)


2 i, j

fi,jÿ1 = fi,j ÿ f i,jS + 1f (S)2 (5.4.9)


2 i, j

Subtraindo a Eq. (5.4.9) da Eq. (5.4.8) obtemos:

fi,j+1 ÿ fi,jÿ1 = 2f i,jS


e assim

f eu, j
= fi,j+1 ÿ fi,jÿ1 (5.4.10)
2S
Adicionando Eqs. (5.4.9) e (5.4.8) obtemos:

fi,j+1 + fi,jÿ1 = 2fi,j + f S2


eu j

que dá:

f eu, j
= fi,j+1 ÿ 2fi,j + fi,jÿ1 (5.4.11)
S2

A aproximação de diferenças finitas completa para a equação de Black-Scholes


pode então ser encontrada substituindo as aproximações para as primeiras e
segundas derivadas parciais, dadas nas Eqs. (5.4.10) e (5.4.11), em (5.4.7).
Obtemos assim:

rt ÿmfi+1,j + ÿÿ mfi,j (r ÿ
q)jtA1 = fi+1,j ÿ2j 2tA2
ÿ fi,j + + (5.4.12)
2 2
onde usamos o fato de que Sj = jS, e para compacidade definimos os termos:

A1 = ÿmfi+1,j+1 ÿ ÿmfi+1,jÿ1 + ÿÿ mfi,j+1 ÿ ÿÿ mfi,jÿ1


e

A2 = ÿmfi+1,j+1 + ÿmfi+1,jÿ1 ÿ 2ÿmfi+1,j + ÿÿ mfi,j+1 + ÿÿ mfi,jÿ1 ÿ 2ÿÿ

mfi,j

A coleta de termos semelhantes em fi,j , fi+1,j , etc. resulta em:

B1fi,jÿ1 + B2fi,j + B3fi,j+1 + C1fi+1,jÿ1 + C2fi+1,j


+ C3fi+1,j+1 = 0 (5.4.13)
Machine Translated by Google

140 Finanças Computacionais Usando C e C#

onde

ÿÿÿ m(r ÿ q)jt ÿÿ mÿ2j 2t


B1 = +
2 2
B2 = ÿ1 ÿ rtÿÿ m ÿ ÿÿ mÿ2j 2t
ÿÿ m(r ÿ q)jt ÿÿ mÿ2j 2t
B3 = + 2 ÿmÿ2j 2t
2
ÿm(r ÿ q)jt
C1 = ÿ

2 2
C2 = 1 ÿ rtÿm ÿ ÿmÿ2j 2t ÿmÿ2j 2t
ÿm(r ÿ q)jt
C3 = + 2
2

Como estamos resolvendo a equação para trás no tempo e queremos determinar os valores
de opção no tempo índice i a partir dos valores de opção conhecidos (fi+1,j+1, fi+1,j e
fi+1,jÿ1) no índice de tempo i + 1. Isso pode ser obtido rearranjando a Eq. (5.4.13) da
seguinte forma:

ajfi,jÿ1 + bjfi,j + cjfi,j+1 = Ri+1,j (5.4.14)

onde o lado direito, Ri+1,j , é:

Ri+1,j = ¯ajfi+1,jÿ1 + b¯ jfi+1,j + ¯cjfi+1,j+1 (5.4.15)

Os seis coeficientes são:


t
aj = (1 ÿ ÿm) 2
(r ÿ q)j ÿ ÿ2j 2 (5.4.16)

bj = 1 + (1 ÿ ÿm)tr + ÿ2j 2 (5.4.17)


t
cj = ÿ(1 ÿ ÿm) 2 (r ÿ q)j + ÿ2j 2 (5.4.18)

t
a¯j = ÿÿm (r ÿ q)j ÿ ÿ2j 2 (5.4.19)
2

b¯ j = 1 ÿ ÿmt r + ÿ2j 2 (5.4.20)


t
c¯j = ÿm (r ÿ q)j + ÿ2j 2 (5.4.21)
2

Para cada valor de j Eq. (5.4.14) nos dá uma relação entre três valores de
opção, fi+1,jÿ1, fi+1,j , fi+1,j+1 no índice de tempo i + 1, e três valores de
opção fi,jÿ 1, fi,j , fi,j+1 no tempo índice i.
Esta situação é mostrada na Fig. 5.5 onde rotulamos os nós da grade que contribuem
para o valor de opção f5,5 no nó da grade E. Estes são os valores de opção conhecidos:

nó A: f6,6, nó B: f6,5 e nó C: f6,4


Machine Translated by Google

Opções americanas de ativo único 141

e os valores de opção desconhecidos

nó D: f5,6, nó E: f5,5, e nó F: f5,4.

Antes de resolvermos a Eq. (5.4.14), vamos considerar brevemente suas características para
diferentes valores do parâmetro de peso ÿm.
Quando ÿm = 1, os valores dos coeficientes na Eq. (5.4.14) são aj = cj = 0 e bj = 1. Isso
significa que a Eq. (5.4.14) reduz-se a: fi,j = ¯ajfi+1,jÿ1 + b¯ jfi+1,j + ¯cjfi+1,j+1

Isso é chamado de método explícito e pode ser visto que o valor de opção desconhecido fi,j ,
no nó da gradefi+1,jÿ1
(i, j) é,apenas
fi+1,j , fi+1,j+1.
uma soma Esta
ponderada
é a situação
dosmais
valores
simples
de opção
de lidar
(conhecidos)
e, na verdade,
corresponde a uma rede trinomial. No entanto, possui propriedades numéricas ruins e
geralmente requer um tamanho de passo muito pequeno para obter resultados precisos; ver
Smith (1985).

Quando ÿm = 1, o valor da opção desconhecida fi,j depende não apenas dos valores da
opção conhecida fi+1,jÿ1, fi+1,j , fi+1,j+1 (como no método explícito acima), mas também nos
valores das opções vizinhas desconhecidas fi,jÿ1 e fi,j+1. Agora é necessário resolver um
conjunto de equações simultâneas para calcular o valor fi,j . Isso é, portanto, chamado de
método implícito; ver Smith (1985).

O método implícito ÿm = 0 também é chamado de método totalmente implícito, pois agora


o valor desconhecido fi,j depende apenas dos valores vizinhos fi,jÿ1, fi,j+1 e seu valor anterior ,
fi+1,j , no intervalo de tempo i + 1. Isso pode ser mostrado(5.4.16)–(5.4.21).
substituindo ÿm =Obtemos
0 nas Eqs.
então
a¯j = ¯cj = 0 e b¯ = 1, o que significa que a Eq. (5.4.14) reduz
j
para:

ajfi,jÿ1 + bjfi,j + cjfi,j+1 = fi+1,j


O método implícito ÿm = 0,5 também é denominado método de Crank-Nicolson.
Este método, usado pela primeira vez por John Crank e Phyliss Nicolson em 1946 (ver Crank
e Nicolson (1947)), calcula fi,j dando igual peso às contribuições do intervalo de tempo i + 1 e
do intervalo de tempo i. Substituindo ÿm = 0,5 na Eq. (5.4.16) para a Eq. (5.4.21) obtemos os
seguintes coeficientes de Crank–Nicolson:

t
aj =ÿ¯aj = (r ÿ q)j ÿ ÿ2j 2
4
t
bj = 1 + r + ÿ2j 2
2
t
b¯ = 1 ÿ j r + ÿ2j 2
2
ÿt (r
ÿ q)j + ÿ2j 2 cj =ÿ¯cj =
4
Notamos que, como estamos resolvendo para trás no tempo, mas indexando o tempo na
direção direta, nossos valores de ÿm correspondentes a implícito e explícito são
Machine Translated by Google

142 Finanças Computacionais Usando C e C#

diferente dos normalmente utilizados. Por exemplo, em Smith (1985) ÿm = 0 é o método explícito
e ÿm = 1 é o método implícito; o método de Crank-Nicolson ainda é ÿm = 0,5.

As condições de fronteira

Para resolver a Eq. (5.4.14) no instante em que precisamos obter os valores das opções em: o
limite superior do ativo, o limite inferior do ativo e os valores iniciais que são especificados no
vencimento da opção.
Aqui calculamos os valores de limite usando o payoff independente do tempo, no j-ésimo índice
de ativos
opções dentro da grade. Se E é o preço de exercício, então a chamada vanilla pj , as
têm retornos:

pj = max(jS ÿ E, 0), j = 0,...,ns ÿ 1,

e as opções de venda vanilla têm retornos:

pj = max(E ÿ jS, 0), j = 0,...,ns ÿ 1 Valores do limite

superior do ativo No limite superior j = ns ÿ1 e (ns ÿ1)S


= Smax; onde notamos que para a grade ser útil precisamos de Smax > E.

Aqui assumimos que Smax > E e assim para opções de compra:

pnsÿ1 = Smáx ÿ E

e para opções de venda:

pnsÿ1 = 0

O valor da opção no limite superior, denotado por fBU, é definido como pnsÿ1 e
temos fi,nsÿ1 = fBU,i = 0,...,nt .

Valores do limite inferior do ativo


No limite inferior j = 0, e o valor de jS é zero.
Portanto, para opções de chamada:

p0 = 0

e para opções de venda:

p0 = E

O valor da opção no limite inferior, denotado por fBL, é definido como p0, e temos fi,0 = fBL,i =
0,...,nt .

Valores limite no vencimento da opção No


vencimento da opção (i = nt) os valores iniciais da opção (limite) são os pagamentos
mencionados anteriormente. Se E é o preço de exercício, então para opções de compra vanilla:

fnt,j = max(jS ÿ E, 0), j = 0,...,ns ÿ 1,


Machine Translated by Google

Opções americanas de ativo único 143

e para opções de venda vanilla:

fnt,j = max(E ÿ jS, 0), j = 0,...,ns ÿ 1

Isso é ilustrado na Fig. 5.5 para uma opção de venda vanilla com valor do ativo atual S0 =
20, exercício, E = 25 e vencimento ÿ = 2. O espaçamento do preço do ativo da grade é S =
5 e o incremento de tempo é t = 0,2 . No vencimento da opção, correspondente ao índice
de tempo i = 10, o valor da opção de venda é zero para todos os índices de ativos j 5.

Cálculo dos valores das opções em um determinado instante de tempo

Tendo encontrado os valores de limite da opção, estamos agora em posição de resolver a


Eq. (5.4.14) no instante de tempo ti = it.
Primeiro notamos que como fi,0 = fBL e fi,nsÿ1 = fBU Eq. (5.4.14) só precisa
a ser resolvido para valores do índice de ativos j no intervalo j = 1 a j = ns ÿ 2.
Agora lidamos com as seguintes situações:

• Caso 1: j = 1, a linha de grade de ativos logo acima do limite inferior • Caso


2: j = ns ÿ 2, a linha de grade de ativos logo abaixo do limite superior • Caso 3:
todas as outras linhas de grade de ativos não incluídas no Caso 1 ou Caso 2

e considere a forma que a Eq. (5.4.14) assume em cada condição.

Caso 1: j = 1
Substituindo j = 1 na Eq. (5.4.14) obtemos:

a1fi,0 + b1fi,1 + c1fi,2 = ¯a1fi+1,0 + b¯ 1fi+1,1 + ¯c1fi+1,2

Agora, como fi,0 = fBL, isso se torna:

b1fi,1 + c1fi,2 = (a¯1 ÿ a1)fBL + b¯ 1fi+1,1 + ¯c1fi+1,2

ou equivalente:

b1fi,1 + c1fi,2 = Ri+1,1 (5.4.22)

onde

Ri+1,1 = (a¯1 ÿ a1)fBL + b¯ 1fi+1,1 + ¯c1fi+1,2 (5.4.23)

Caso 2: j = ns ÿ 2
Substituindo j = ns ÿ 1 na Eq. (5.4.14) obtemos:

ansÿ2fi,nsÿ3 + bnsÿ2fi,nsÿ2 + cnsÿ2fi,nsÿ1


= ¯ansÿ2fi+1,nsÿ3 + b¯ nsÿ2fi+1,nsÿ2 + ¯cnsÿ 2fi+1,nsÿ1

Como fi,nsÿ1 = fBU , isso dá:

ansÿ2fi,nsÿ3 + bnsÿ2fi,nsÿ2
= ¯ansÿ2fi+1,nsÿ3 + b¯ nsÿ2fi+1,nsÿ2 + (c¯nsÿ2 ÿ cnsÿ2)fBU
Machine Translated by Google

144 Finanças Computacionais Usando C e C#

ou equivalente:

ansÿ2fi,nsÿ3 + bnsÿ2fi,nsÿ2 = Ri+1,nsÿ2 (5.4.24)


onde

Ri+1,nsÿ2 = ¯ansÿ2fi+1,nsÿ3 + b¯ nsÿ2fi+1,nsÿ2 + (c¯nsÿ2 ÿ cnsÿ2)fBU (5.4.25)


Caso 3
Nesse caso, os valores de contorno não entram nas expressões e simplesmente
reapresentamos a Eq. (5.4.14) como:

ajfi,jÿ1 + bjfi,j + cjfi,j+1 = Ri+1,j , j = 3,...,ns ÿ 3, (5.4.26)

onde como antes do lado direito, Ri+1,j , é:

Ri+1,j = ¯ajfi+1,jÿ1 + b¯ jfi+1,j + ¯cjfi+1,j+1 (5.4.27)


Agora podemos reunir todas as informações nas Eqs. (5.4.23)–(5.4.27) e represente-o pelo
seguinte sistema tridiagonal:

b1 c1 00 0 fi,1
ÿ 0 a2 b2 c2 000 0 0 . 0 0 000 . 0 ÿÿ fi,2 ÿ
ÿ ÿ ÿ ÿ

ÿ . ÿ ÿ . ÿ

ÿ ÿ ÿ ÿ

ÿ . ÿ ÿ . ÿ

ÿ ÿ ÿ ÿ

000 anosÿ3 bilhõesÿ3 cnsÿ3.000 fi,nsÿ3


ÿ 0 anosÿ2 bilhõesÿ2 ÿ ÿ
fi,nsÿ2 ÿ
Ri+1,1
ÿ Ri+1,2 ÿ
ÿ ÿ

.
= ÿ

ÿ
ÿ

ÿ
(5.4.28)
ÿ . ÿ

ÿ ÿ

Ri+1, nsÿ3
ÿ Ri+1,nsÿ2 ÿ

Em notação matricial Eq. (5.4.28) pode ser escrita como:

Ax = R (5.4.29)
onde A é a (ns ÿ 2) × (ns ÿ 2) matriz tridiagonal contendo os coeficientes conhecidos aj ,j =
2,...,ns ÿ2, bj ,j = 1,...,ns ÿ2, e cj ,j = 1,...,ns ÿ3.
O vetor R denota o lado direito conhecido, Ri+1,j ,j = 1,...,ns ÿ 2, e o vetor x contém os
valores de opção desconhecidos que desejamos calcular, fi,j ,j = 1,...,ns ÿ 2.

É bem conhecido que, se a matriz A é não singular, a Eq. (5.4.29) pode ser resolvido
usando uma decomposição LU. Aqui nós fatoramos a n × n matriz A como:

A = LU

onde L é uma matriz triangular inferior n × n com 1s na diagonal e U é uma matriz triangular
superior n × n. Ilustramos a decomposição LU para uma matriz 4 × 4 completa abaixo:
Machine Translated by Google

Opções americanas de ativo único 145

a1,1 a1,2 a1,3 a1,4


ÿ a2,1 a2,2 a2,3 a2,4 ÿ
ÿ ÿ

a3,1 a3,2 a3,3 a3,4


ÿ a4,1 a4,2 a4,3 a4,4 1 0 ÿ
00 u1,1 u1,2 u1,3 u1,4 0
= ÿ
1 00 ÿÿ u2,2 u2,3 u2,4 0 0 u3,3 ÿ
ÿ ÿ ÿ ÿ (5.4.30)
l2,1 l3,1 l3,2 1 0 u3,4
ÿ l4,1 l4,2 l4,3 1ÿ ÿ 000 u4.4 ÿ
Se A é uma matriz tridiagonal, então a decomposição LU assume a forma mais simples:

a1,1 a1,2 0
ÿ 0 a2,1 a2,2 a2,3 0 a3,2 ÿ
ÿ ÿ
0 a3,3 a3,4 0 a4,3
ÿ 0 a4,4 1 0 00 l2,1 ÿ
0 l3,2 0 0 l4,3 u1,1 u1,2 0 0 0 u2,2
1 00
= ÿÿ
ÿÿ
ÿ ÿ
u2,3 0 0 0 u3,3 u3,4 ÿ
ÿ (5.4.31)
10
ÿ 1 ÿ ÿ 000 u4.4 ÿ
onde pode ser visto que agora tanto L quanto U são bidiagonais.
Uma vez encontrada a decomposição LU de A, é possível resolver para x na Eq.
(5.4.29) usando um método de dois estágios (ver, por exemplo, Golub e Van Loan
(1989)). Aqui, a eliminação direta é usada para resolver Ly = R e, em seguida, a
substituição inversa é aplicada a Ux = y. Assim, podemos escrever o procedimento como:
Ax = (LU)x = L(Ux) = Ly = R
Agora forneceremos trechos de código que mostram como resolver o sistema tridiagonal
(ns ÿ 2) × (ns ÿ 2) representado pela Eq. (5.4.29). Esses trechos estão, de fato, contidos
no trecho de código maior 5.18, que exibe o código C completo para a função de
precificação de opções opt_gfd. Se o leitor precisar de mais detalhes sobre o código
preciso usado para precificação de opções, esse código deve ser consultado. (Deve-se
observar que no trecho de código 5.18, o tempo é indexado usando j e o preço do ativo
usando o índice i. Modificamos os índices para os trechos de código menores fornecidos
abaixo para que, como seria de esperar, o tempo seja indexado usando i, e preço do
ativo usando j . O autor pede desculpas por qualquer inconveniente que isso possa
causar.) Aqui, por brevidade, assumiremos que todas as matrizes necessárias já foram
alocadas e carregadas com as informações relevantes.
Primeiro, precisamos calcular a decomposição LU da matriz tridiagonal A.
O código para conseguir isso é fornecido no trecho de código 5.14. Aqui usamos as três
matrizes a seguir para armazenar os elementos da matriz tridiagonal A: a matriz b contém
os elementos da diagonal, a matriz c contém os elementos da diagonal superior e a matriz
a contém os elementos da diagonal inferior.
Deve-se notar que não calculamos explicitamente os elementos da matriz L.
Isso ocorre porque todos os elementos diagonais de L são conhecidos como 1, e
os elementos subdiagonais de L podem ser calculados a partir dos elementos
diagonais de U usando l[j] = a[j]/u[j-1]. Além disso, não precisamos calcular os
elementos da diagonal superior de U, pois sabemos que eles são iguais à diagonal superior.
Machine Translated by Google

146 Finanças Computacionais Usando C e C#

u[1] = b[1];
if (u[1] == 0.0) printf ("ERRO no array u \n"); for(j=2; j <=ns-2; ++j) { u[j] = b[j] -
a[j]*c[j-1]/u[j-1]; if (u[j] == 0.0) printf ("ERRO no array u \n");

Trecho de código 5.14 Código de computador que calcula os elementos diagonais da matriz U,
em uma decomposição LU de uma matriz tridiagonal A. Os elementos da matriz A são armazenados
nas seguintes matrizes: matriz b contém os elementos diagonais, matriz c contém a diagonal
superior elementos, e a matriz a contém os elementos diagonais inferiores. Os elementos diagonais
de U são armazenados no array u para uso posterior, nos trechos de código 5.15 e 5.16.

trabalho[1] = rhs[1]; for(j=2;


j<=ns-2; ++j) { trabalho[j] = rhs[j] -
a[j]*trabalho[j-1]/u[j-1];
}

Trecho de código 5.15 Código de computador que usa eliminação direta para resolver o sistema
triangular inferior Ly = R, onde y é armazenado no array work.

opt_vals[ns-2] = trabalho[ns-2]/u[ns-2]; for(j = ns-2; j >= 1;


--j)
opt_vals[j] = (trabalho[j] - c[j]*opt_vals[j+1])/u[j];

Trecho de código 5.16 Código de computador que usa substituição inversa para resolver o
sistema triangular superior Ux = y. No instante de tempo ti = it, os elementos de x são os valores
de opção calculados fi,j , i = 1,...,nsÿ2.

elementos da matriz original A, e estão contidos na matriz c; ver, por exemplo, Hager
(1988).
Tendo calculado a decomposição LU, podemos agora resolver o sistema triangular
inferior Ly = R usando eliminação direta; isso é mostrado no trecho de código 5.15.

No trecho de código 5.15, usamos os dois arrays a seguir: o array rhs, que é usado
para armazenar os elementos do lado direito R, e o array work, que é usado como
espaço de trabalho e para armazenar o vetor de solução computado y.
Como mencionado anteriormente, os elementos subdiagonais de L são dados por l[j] =
a[j]/u[j-1]. Isso significa que no trecho de código 5.15, a linha:

trabalho[j] = rhs[j] ÿ a[j] ÿ trabalho[j ÿ 1]/u[j ÿ 1];

é de fato equivalente a:

trabalho[j] = rhs[j] ÿ l[j] ÿ trabalho[j ÿ 1];

onde l[j],j=2,..,ns-2, contém os elementos subdiagonais de L, se tivéssemos


(desnecessariamente) decidido alocar espaço para um array extra chamado l.
Estamos agora em condições de resolver o sistema triangular Ux = y usando a
substituição inversa. O código para conseguir isso é fornecido no trecho de código
5.16. Aqui, o array work contém os valores de y calculados anteriormente, os elementos
diagonais de U estão contidos no array u e (como mencionado anteriormente) os
elementos diagonais superiores de U são armazenados no array a.
Machine Translated by Google

Opções americanas de ativo único 147

No trecho de código 5.16, a matriz opt_vals contém o vetor de solução x. Como seu nome
sugere, o conteúdo da matriz opt_vals são, na verdade, os valores de opção calculados, fi,j ,j =
1,...,ns ÿ 2, na Eq. (5.4.28) e represente a solução da equação diferencial parcial de Black-
Scholes no instante de tempo ti = it com base nos valores de opção fi+1,j ,j = 1,...,ns ÿ 2
calculados anteriormente.

Iteração reversa e exercício inicial


A equação de Black-Scholes pode ser resolvida no intervalo de tempo t até t+ÿ resolvendo
iterativamente a Eq. (5.4.28). Nós iteramos para trás no tempo resolvendo a Eq. (5.4.28) na i-
ésima etapa de tempo e, em seguida, usando os valores calculados para resolver a Eq. (5.4.28)
para o (i ÿ 1)ésimo passo de tempo. Os valores das opções no tempo atual t são obtidos quando
o índice de tempo i = 0 é atingido. Pode-se ver que o método da grade produz ns ÿ 2 valores de
opções, f0,j ,j = 1,...,ns ÿ 2, que correspondem aos preços atuais dos ativos:

Sj = jS, j = 1, ...,ns ÿ 2
0

Conforme mencionado anteriormente, o preço do ativo S0 coincide com o índice da grade j = n1.
Portanto S0 = Sn1 e o0 ,valor da opção para o preço atual do ativo S0 é dado por f0,n1 .

Isso contrasta com os métodos de rede discutidos no Capítulo 4, que produzem um único
valor de opção correspondente ao nó raiz.
Os valores de opções obtidos usando os métodos de grade que acabamos de descrever são
para opções europeias básicas. No entanto, as opções europeias baunilha podem ser avaliadas
com mais precisão usando a fórmula de precificação de opções de Black-Scholes discutida no
Capítulo 4. A importância das grades de diferenças finitas é que, modificando ligeiramente nosso
método iterativo reverso, podemos levar em conta a possibilidade de exercício antecipado e,
assim, precificar as opções americanas.

Isso pode ser obtido usando o trecho de código 5.17 para modificar os preços das opções
contidos no array opt_vals da seguinte forma:

if (put) { /* a put */
for(j=1; j<=ns-2; ++j)
opt_false[j] = MAX(opt_false[j],Es[j]);

} else { /* uma chamada */


for(j=1; j<=ns-2; ++j)
opt_vals[j] = MAX(opt_vals[j],s[j]-E);
}

Trecho de código 5.17 Código de computador que modifica os valores de opção calculados
contidos no array opt_vals para incluir a possibilidade de exercício antecipado; isso é necessário
se quisermos determinar o valor das opções americanas. Aqui s[j] contém o valor do ativo no
índice do ativo j , opt_vals[j] contém o valor da opção (calculado pelo trecho de código 5.16) no
índice do ativo j , e E é o preço de exercício.
Machine Translated by Google

148 Finanças Computacionais Usando C e C#

Figura 5.5 Um exemplo de grade uniforme, que pode ser usada para estimar o valor de
uma opção vanilla que vence em dois anos. Os parâmetros da grade são: ns = nt = 10, t =
0,2, S = 5 e Smax = 50. Os parâmetros da opção são E = 25, S0 = 20 e ÿ = 2,0. Como de
costume, denotamos os valores de opção do nó da grade por fi,j , onde tempoi ée oj éíndice
o índice
de de
ativos. Os valores das opções dos nós da grade no vencimento para uma venda vanilla são
assim rotulados como val,f10,j , j = 0,..., 10, onde val é o valor da opção no nó; estes são
mostrados no limite da grade à direita. Como E = 25, apenas os nós com j < 5 têm valores
de opção diferentes de zero.

Agora que sabemos como resolver a equação de Black-Scholes é possível incluir, sem
muita dificuldade, características mais exóticas como períodos de lock out, barreiras,
abatimentos, etc.
A rotina opt_gfd resolve a equação de Black-Scholes usando uma grade uniforme.
O preço do ativo é definido para uma das linhas da grade, o que significa que a interpolação
não é necessária.

5.4.3 Grades não uniformes

Na seção anterior mostramos como resolver a equação de Black-Scholes usando uma grade
uniforme. Embora esta abordagem forneça soluções satisfatórias para muitos problemas de
precificação de opções, há situações em que é importante poder colocar linhas de grade em
locais que não correspondem àqueles disponíveis em uma grade uniforme. Aumentar a
densidade das linhas de grade em regiões de interesse pode levar a uma maior precisão nos
valores estimados das opções e também nas estimativas das estatísticas de hedge (os gregos).

Aqui fornecemos um exemplo que ilustra os benefícios do uso de grades não uniformes na
avaliação das opções de barreira de chamadas de saída e saída. Mais tarde em
Machine Translated by Google

Opções americanas de ativo único 149

Na seção 5.4.6 damos mais um exemplo que mostra o uso de grades não uniformes para avaliar
as opções de barreira dupla.
O objetivo desta seção é mostrar como discretizar a equação de Black-Scholes usando uma
grade não uniforme e derivar uma expressão (ver Eq. (5.4.39)) que seja equivalente à Eq. (5.4.14).
Embora o sistema tridiagonal de equações que temos de resolver nesta seção seja diferente
daquele da Seção 5.4, o método de solução é exatamente o mesmo. Isso significa que, uma vez
derivada a Eq. (5.4.39) todas as outras informações necessárias para avaliar as opções européias
e americanas estão disponíveis na Seção 5.4 sob os títulos: • As condições de contorno • Cálculo
dos valores das opções em um determinado instante • Iteração reversa e exercício antecipado .

Vamos agora considerar a aproximação por diferenças finitas para um não uniforme
grade e, em seguida, mostre como avaliar a opção de barreira de chamada para baixo e para fora.

A aproximação por diferenças finitas Aqui

consideramos como discretizar a equação de Black-Scholes usando uma grade não uniforme, na
qual tanto o intervalo de preço do ativo S quanto o intervalo de tempo t não são constantes, mas
podem variar ao longo da grade.
Permitir um intervalo de tempo não constante é bastante simples. O passo de tempo ocorre
tanto na primeira derivada fi,j (veja a Eq. (5.4.4)) quanto nas equações de valor de opção (veja as
Eqs. (5.4.14)–(5.4.21)) como a constante t. Para incorporar a, portanto, é necessário apenas
, definir
enésimo intervalo de tempo e, em seguida, t = ti,
continuar comno o
intervalo
métododedetempo variável,
solução descritoti,ina
= 0,nt
Seção
5.4.

A incorporação de intervalos de preços de ativos não constantes requer mais trabalho.


Isso ocorre porque as aproximações de diferenças finitas para a primeira e a segunda derivadas
f e f nas Eqs.fi,j(5.4.10)
. e (5.4.11) são baseados em uma expansão de Taylor i,ji,j , sobre o ponto

Vamos agora derivar expressões para essas derivadas.


Xÿ = Sj+1 ÿ Sj e jdepois
= Sj usarmos
ÿ Sjÿ1 e X+
umaSeexpansão
fizermosj de Taylor sobre fi+1,j temos

2
+ i+1,j
1f2 X+j (5.4.32)
fi+1,j+1 = fi+1,j + f i+1,jX+ j

e também
2
+2 1 f i+1,j Xÿ j (5.4.33)
fi+1,jÿ1 = fi+1,j ÿ f i+1,jXÿ j

Multiplicando a Eq. (5.4.32) por Xÿ vezes


j ae Eq.
somando-o
(5.4.33),adá
X+ j

X+ fi+1,jÿ1 + Xÿ fi+1,j+1 j j
2 2
= Xÿ j 1 fi+1,j + X+ fi+1,j X+j Xÿ + Xÿ jj X+j
j + f i+1,j 2
Machine Translated by Google

150 Finanças Computacionais Usando C e C#

Portanto
X+ fi+1,j ÿ X+ fi+1,jÿ1 + Xÿ fi+1,j+1 ÿ Xÿ fi+1,jjj j
= j
1f
2 i+1,j (X+ )2Xÿ + (Xÿ j )2X+
j j j

Então

2{X+ j fi+1,jÿ1 + Xÿ fi+1,j+1 ÿ fi+1,j (Xÿ )} jj j


+ X+
=
fi +1,j
(X+ j )2Xÿ j + (Xÿ j )2X+ j
(5.4.34)

Para calcular f, rearranjamos a Eq. (5.4.33) para obter i+1,j

2
Xÿ j
1 ÿf i+1,jXÿ j = fi+1,jÿ1 ÿ fi+1,j ÿ f i+1,j 2

e
1
= fi+1,j ÿ fi+1,jÿ1 (5.4.35)
fi +1,j Xÿ j +2 f i+1,jXÿ j

Se agora substituirmos por fi+1,j , da Eq. (5.4.34), na Eq. (5.4.35) temos

= fi+1,j ÿ fi+1,jÿ1
fi +1,j Xÿ j

{X+ + X+
j fi+1,jÿ1 ÿ (Xÿ )fi+1,j + Xÿ fi+1,j+1}Xÿ jjjj
+
(X+ j )2Xÿ j + (Xÿ j )2X+ j

o que simplifica para dar

(X+ )2(fi+1,j
j ÿ fi+1,jÿ1) ÿ (Xÿ )2fi+1,j +
j (Xÿ )2fi+1,j+1 j
=
fi +1,j
(X+ j )2Xÿ + (Xÿ jj )2X+ j

para que finalmente tenhamos

(Xÿ j )2fi+1,j+1 + ((X+ j )2 ÿ (Xÿj )2)fi+1,j ÿ (X+ j)2fi+1,jÿ1


=
fi +1,j
(X+ j )2Xÿ + (Xÿ jj )2X+ j
(5.4.36)

Como na Seção 5.4, podemos agora substituir as expressões para i+1,jf i+1,j
e f dadas
nas Eqs. (5.4.36) e (5.4.34), na Eq. (5.4.7) a equação discretizada de Black–
Scholes. Se deixarmos D = (X+ j )2Xÿj )2X+ obtemos então
j + (Xÿ j

rt ÿmfi+1,j + ÿÿ mfi,j
(r ÿ q)SjtA1 =
ÿ2S2j tA2
fi+1,j ÿ fi,j + + (5.4.37)
D D
Machine Translated by Google

Opções americanas de ativo único 151

onde ÿÿ = 1 ÿ ÿm, e
m

2 2
A1 = ÿm fi+1,j+1 Xÿ j ÿ fi+1,jÿ1 X+ j
2 2
ÿ X+j
ÿ fi+1,j Xÿ j
2 2 2 2
+ ÿÿm fi,j+1 Xÿ j ÿ X+j
ÿ fi,jÿ1 X+ j ÿ fi,j Xÿ j
e

+ X+
j + Xÿ
A2 = ÿm fi+1,j+1Xÿ ÿ fi+1,j fi+1,j jÿ1X+ j j

ÿÿ m fi,j+1Xÿ ÿ fi,j Xÿ jjj


+ fi,jÿ1X+ j + X+ +
Juntando os termos semelhantes, obtemos:

B1fi,jÿ1 + B2fi,j + B3fi,j+1 + C1fi+1,jÿ1 + C2fi+1,j


+ C3fi+1,j+1 = 0 (5.4.38)
onde

ÿÿÿ m(r ÿ q)Sjt(X+ )2 (1 ÿ ÿ)ÿ2S2 tX + j


j j
B1 = +
D D

ÿÿ mÿ2S2
j
t(Xÿ ) j j + X+
B2 = ÿ1 ÿ rtÿÿ m
ÿ

m(r ÿ q)Sjt{(Xÿ j
)2 ÿ (X+ )2}j ÿÿ
ÿ

)2 ÿÿ m(r ÿ q)Sjt(Xÿ j tXÿ j


ÿÿ mÿ2S2
j
B3 = +
D D

ÿmÿ2S2j tX + j ÿm(r ÿ q)Sjt(X+ )2 j


C1 = ÿ

D D

ÿm(r ÿ q)Sjt{(Xÿ j )2 ÿ (X+ )2}j


C2 = 1 ÿ rtÿm ÿ
D

ÿmÿ2S2j t{Xÿ } jj + X+
ÿ

)2 ÿm(r ÿ q)Sjt(Xÿ j ÿmÿ2S2j tXÿ j


C3 = +
D D
Como estamos resolvendo a equação de Black-Scholes para trás no tempo, vamos
reorganizar a Eq. (5.4.38) como:

ajfi,jÿ1 + bjfi,j + cj = Ri+1,j onde o (5.4.39)


lado direito Ri+1,j é:

Ri+1,j = ¯ajfi+1,jÿ1 + b¯ jfi+1,j + ¯cjfi+1,j+1 (5.4.40)


Machine Translated by Google

152 Finanças Computacionais Usando C e C#

e os coeficientes são

)2 ÿ2S2j X+j
j
aj = ÿÿ mt(r ÿ q)Sj (X+ D
ÿ

(5.4.41)
D

p2S2 (Xÿ ) jj +
j rX+
+
bj = 1 + tÿÿ m
D

ÿ q)Sj {(Xÿ )2 ÿ (X+ )2} (r


+ j j
(5.4.42)
D
)2 ÿ2S2j Xÿ j
j
cj = ÿÿ mtÿ(r ÿ q)Sj (Xÿ D
ÿ

(5.4.43)
D
X+j (r ÿ q)Sj (X+ )2j
a¯j = ÿmtÿ2S2 j
ÿ

(5.4.44)
D D
b¯ = 1 ÿ ÿmrt j
)2 ÿ (X+ )2} p2S2 {Xÿ } jj j+ X+
j j
ÿ ÿmt(r ÿ q)Sj {(Xÿ +
D D
(5.4.45)
)2 ÿ2S2j Xÿ j
j +
c¯j = ÿmt(r ÿ q)Sj (Xÿ D (5.4.46)
D

Aqui a Eq. (5.4.39), como é o caso da Eq. (5.4.14) na Seção 5.4, fornece a relação entre
os três valores de opção fi+1,jÿ1, fi+1,j , fi+1,j+1 no índice de tempo i + 1 e os três valores
de opção fi,jÿ1, fi,j , fi,j+1 no tempo índice i. Também pode ser visto que a Eq. (5.4.39) é
o equivalente de grade não uniforme da Eq. (5.4.14) dada na Seção 5.4. Mostraremos
agora que as Eqs. (5.4.39) e (5.4.14) são idênticos quando uma grade uniforme é usada,
ou seja, X+ j . Procedemos da seguinte forma: Seja X+ j So = Xÿ
j

= Xÿ j = S e Sj = jS.

2 2
D = X+j Xÿ + Xÿ jj X+j

(X+ )2 (Xÿ j )2 (S)2 1


= 2(S)3 j = = =
D D 2(S)3 2S
X+j Xÿ j 1
= =
D D 2S2

(X+ j )2 ÿ (Xÿ )2
j =0
D
Se substituirmos os valores acima nas Eqs. (5.4.41)–(5.4.46) obtemos as
seguintes expressões para os coeficientes na Eq. (5.4.39).
Machine Translated by Google

Opções americanas de ativo único 153

ÿ2S2j t
_
aj = (1 ÿ ÿm)t(r ÿ q)Sj
ÿ

= (1 ÿ ÿm) (r ÿ q)j ÿ ÿ2j 2


2S 2S2 2
ÿ2S2 j bj =
1 + t(1
ÿ ÿm) r + S2 = 1 + (1 ÿ ÿm)tr + ÿ2j 2

ÿ2S2j
_
cj = (1 ÿ ÿm)tÿ(r ÿ q)Sj
ÿ

2S 2S2
t
= ÿ(1 ÿ ÿm) (r ÿ q)j + ÿ2j 2
2
p2S2j t
_ (r ÿ q)Sj (r ÿ q)j ÿ ÿ2j 2
a¯j = ÿmt 2S2
ÿ

= ÿÿm
2S 2

ÿmÿ2S2 j t
b¯ = 1 ÿ ÿmrt ÿ j = 1 ÿ ÿmt r + ÿ2j 2
S2
ÿ2S2 j t
c¯j = ÿmt(r ÿ q)Sj + = ÿm (r ÿ q)j + ÿ2j 2
2S S2 2

Pode-se ver que esses coeficientes são idênticos aos dados na Seção 5.4.2 Eqs. (5.4.16)–
(5.4.21).
Agora fornecemos exemplos de uso de grades não uniformes para avaliar as opções de
call europeias de down and out.

Avaliação de uma opção de compra para baixo e para fora

Aqui, a precisão aprimorada que pode ser alcançada usando grades não uniformes em vez
de grades uniformes é ilustrada nas Figs. 5.7 e 5.8. As grades uniformes são construídas
usando o método descrito na Seção 5.4 e no trecho de código 5.18.
Ou seja, uma linha de grade de ativo é definida para coincidir com o preço atual do
ativo S0, e as outras linhas de grade são posicionadas acima e abaixo de S0 com um
espaçamento uniforme de S. A desvantagem dessa abordagem é que haverá um erro
de precificação não especificado que depende da distância, ds, do nível da barreira, B, ao

void opt_gfd(double theta_m, double asset_price, double sigma, double r, double T,


ataque duplo, is_american longo, put longo, double *option_value, double greeks[], double q, long pns,
long nt, double smax, long *iflag)
{
/* Parâmetros de entrada:
===================

theta_m - o valor de theta usado para o método da diferença finita, - o preço atual do ativo subjacente, - a
sigma volatilidade, - a taxa de juros, - o tempo até o vencimento, - o preço de exercício, - se is_american
preço_ativo_ativo for 0, então uma opção européia , caso contrário, um americano_
r
T
batida
is_american
opção,

Trecho do código 5.18.


Machine Translated by Google

154 Finanças Computacionais Usando C e C#

- se a opção de venda for 0, então uma opção de compra, caso contrário, uma
opção de venda, - o rendimento contínuo de dividendos, - o índice máximo de
coloca q pns ativos na grade, correspondente ao superior_
limite,
nt - o número de intervalos de tempo, - o preço
smax máximo do ativo.
Parâmetros de saída:
option_value greeks[] - o valor da opção, - a saída de estatísticas
de hedge da seguinte forma: greeks[0] é gamma, greeks[1]_ é delta e greeks[2] é theta, - um indicador de erro.

iflag
*/
duplo *a,*b,*c,*a1,*b1,*c1,*opt_vals,*vals,*rhs,*s,*trabalho,*u; duplo ds,dt; longo i,j; duplo
tmp,t2,time_2mat; longo n1,n2,ind=0; duplo sig2, temp[4];

if (asset_price >= smax) printf ("ERROR preço do ativo >= smax"); n1 = piso((asset_price/
smax)*(double)pns); n2 = pns - n1; ds = preço_do_ativo/(duplo)n1; dt = T/(duplo)nt; ns = n1+n2+1;

/* tamanho do intervalo de tempo */

/* Nota: Agora nps = ns-1. Como definimos as linhas de grade de ativos 0...ns-1, este é o grid_ máximo
linha; correspondente ao limite
superior. O limite inferior está na linha de grade de ativos 0, e resolvemos para_ valores de opção entre a linha de grade de ativos 1 e a linha de
grade de ativos ns-2 */

/* Aloca (todos os tamanhos ns+1) os arrays: a, b, c, a1, b1, c1, opt_vals, vals, rhs, s, work_
e você */
...
s[0] = 0,0; s[n1]
= preço_do_ativo; for(i=1;
i<=n1-1; ++i ) /* definir preços abaixo do preço_do_ativo */
s[i] = (duplo)i * ds;
for(i=1; i<= n2+1; ++i ) /* definir preços acima do preço_do_ativo */
s[n1+i] = preço_do_ativo + (duplo)i * ds;

/* Configura os coeficientes RHS e LHS a[], b[] ec[] são os coeficientes LHS
para os valores das opções desconhecidas (etapa de tempo j) a1[], b1[] e c1[] são os valores dos coeficientes RHS para os preços
das opções conhecidas (etapa de tempo j+1).
Nota: a1, b1 e c1 são usados para formar o vetor RHS rhs[] do sistema tridiagonal. */
sig2 = sigma*sigma; t2 = dt/
2,0; tmp = 1,0-teta_m; /* 1 -
theta (para o método theta) */ for( i=1; i<=ns-2; ++i) { /* Atribui elementos da matriz
tridiagonal (ns-2)*(ns-2) * /
a[i] = -i*(i*sig2-(rq))*t2*tmp; a1[i] = i*(i*sig2-
(rq))*t2*theta_m;; c[i] = -i*(i*sig2+(rq))*t2*tmp; c1[i] = i*(i*sig2+
(rq))*t2*theta_m;; b[i] = 1,0+r*dt*tmp+(i*i*sig2)*dt*tmp; b1[i]=
1,0-(i*i*sig2+r)*dt*theta_m;

}
/* Executa a decomposição LU da matriz tridiagonal com:
elementos diagonais contidos no array b[], elementos diagonais superiores contidos no_ array c[] e elementos diagonais inferiores no array a[].
Armazene os elementos de U, mas não os de L (serão calculados a partir de U)

Matriz U: Os elementos diagonais de U são armazenados na matriz u[] e os elementos diagonais_ superiores de U são apenas c[].

Matriz L: Para a matriz triangular inferior L, os elementos da diagonal são 1 e os elementos da diagonal inferior são l[i] = a[i]/u[i-1], onde u[] é a
diagonal superior de U. * /

u[1] = b[1]; if (u[1]


== 0.0) printf ("ERRO no array u \n"); for(i=2; i <=ns-2; ++i) {

u[i] = b[i] - a[i]*c[i-1]/u[i-1];

Trecho de código 5.18 (continuação).


Machine Translated by Google

Opções americanas de ativo único 155

if (u[i] == 0.0) printf ("ERRO no array u \n");


}
/* Define os valores das opções no vencimento. Observação: opt_vals[0] e opt_vals[ns-1] são os menores e_
superior
(put/call) valores de limite de preço de opção. */ if (!put) { /* uma
chamada */ for( i=0; i<ns; ++i )

opt_vals[i] = MAX(s[i]-strike, 0.0 );


}
else { /* a put */ for( i=0; i<ns;
++i)
opt_vals[i] = MAX(strike - s[i], 0.0);
}
/* A partir dos valores das opções no vencimento (t = nt*dt) calcula os valores anteriores (nt-1)*dt_
etc.. */
for( j=nt-1; j>=-2; --j) { /* Vai dois passos além do tempo atual (0) para que possa avaliar_ theta */ time_2mat = Tj*dt; for(i=2; i<=ns-3; ++i) /*
configura os rhs da equação para o método Crank-Nicolson */ rhs[i] = a1[i]*opt_vals[i-1]+b1 [i]*opt_vals[i]+c1[i]*opt_vals[i+1];

/* Incorporar as condições de contorno nos limites de valor de ativo superior/inferior */ rhs[1] = (a1[1]-a[1])*opt_vals[0]+
b1[1]*opt_vals[1]+c1[ 1]*opt_vals[2]; rhs[ns-2] = a1[ns-2]*opt_vals[ns-3]+b1[ns-2]*opt_vals[ns-2]+(c1[ns-2]-c[ns-2]) _
*opt_vals[ns-1];

/* Resolva o sistema triangular inferior Ly = b, onde y é armazenado no array work[].


Calcule os elementos de L daqueles de U, l[i] = a[i]/u[i-1]. */
trabalho[1] = rhs[1]; for( i=2;
i<=ns-2; ++i ) trabalho[i] = rhs[i] - {
a[i]*trabalho[i-1]/u[i-1];
}
/* Resolva o sistema triangular superior (ns-2)*(ns-2) Ux = y (onde x = opt_vals) */
opt_vals[ns-2] = trabalho[ns-2]/u[ns-2]; for( i = ns-2; i >= 1;
--i ) opt_vals[i] = (work[i] - c[i]*opt_vals[i+1])/u[i]; if
(is_american) { /* leva em consideração o exercício antecipado de opções
americanas */ if (put) { /* a put */

for(i=1; i<=ns-2; ++i)


opt_vals[i] = MAX(opt_vals[i],strike-s[i]);

} else { /* uma chamada */


for(i=1; i<=ns-2; ++i)
opt_vals[i] = MAX(opt_vals[i],s[i]-strike);
}

} if (j==0) { for
(i=0; i < ns; ++i)
vals[i] = opt_vals[i];
}
if ((j==1)||(j==2)||(j==-1)||(j==-2)) { /* Armazena valores de opção para que possa calcular_ theta */ temp[ ind] = opt_vals[n1]; ++ind;

}
}
if (gregos) {
/* Calcula gama (precisão de 4ª ordem) */
grego[0] = (-falso[n1+2]+16,0*falso[n1+1]-30,0*falso[n1]+16,0*falso[n1-1]-falso[n1-2])_ /(12,0 *ds*ds); /* Calcula delta (precisão de 4ª
ordem) */

gregos[1] = (-vals[n1+2]+8,0*vals[n1+1]-8,0*vals[n1-1]+vals[n1-2])/(12,0*ds);
/* Calcula teta (precisão de 4ª ordem) */ greeks[2] = (-
temp[0]+8,0*temp[1]-8,0*temp[2]+temp[3])/(12,0*dt);
/* Nota: também pode calcular theta como greeks[2] = (-temp[0]+4.0*temp[1]-3.0*vals[n1])
/(2,0*dt); */ }
*option_value =
vals[n1]; /* Valor da opção de retorno */
}

Trecho de código 5.18 Função para calcular o valor de uma opção vanilla usando uma grade
uniforme.
Machine Translated by Google

156 Finanças Computacionais Usando C e C#

linha de grade de ativos mais próxima. Além disso, à medida que o número de pontos de
ativos, ns, aumenta, a magnitude de ds oscilará na faixa de 0 a S/2.
Quando ds ÿ 0 a grade será precisa, mas quando |ds| ÿ S/2 haverá um grande erro de
precificação. Isso dá origem aos erros de preços oscilantes mostrados nas Figs. 5.7 e 5.8.

As grades não uniformes são construídas usando as técnicas mencionadas anteriormente


nesta seção e também o trecho de código 5.19. Agora, independentemente de ns,
organizamos uma linha de grade de ativos para coincidir com o valor atual do ativo, S0, e
outra linha de grade de ativos para coincidir com B, o preço de barreira do ativo. Na Fig.
5.6, isso corresponde a definir BL como B e não usar BU .
Pode ser visto nas Figs. 5.7 e 5.8 que neste caso o erro de precificação é muito menor,
e também não apresenta as oscilações pronunciadas que são produzidas por uma grade
uniforme. No trecho de código 5.19 fornecemos o programa de computador que foi usado
para obter os valores de grade não uniformes para as opções de chamada para baixo e
para fora apresentadas nas Figs. 5.7 e 5.8. Embora este programa lide apenas com opções
européias, ele pode ser facilmente alterado, usando as mesmas técnicas do trecho de
código 5.18, para lidar com opções de estilo americano; isso é deixado como um exercício
para o leitor.

Figura 5.6 Uma grade não uniforme na qual o espaçamento da grade é reduzido próximo ao tempo
atual t, e também na vizinhança do preço do ativo 25; isso pode levar a uma maior precisão nos
valores de opção calculados e nos gregos associados. As linhas de grade também são colocadas
a preços de ativos de BU e BL; isso permite a avaliação precisa das opções que possuem barreiras
nos preços desses ativos.
Machine Translated by Google

Opções americanas de ativo único 157

void barreira_downout(nível_barreira duplo, theta_m duplo, preço_ativo duplo, sigma duplo,_


double r, double T, double
strike, long put, double *option_value, double greeks[], double q, long ns,_ long nt, double smax, long *ifail)

{
/* ns - o número de intervalos de ativos
nt - o número de intervalos de tempo
*/
double *a,*b,*c,*a1,*b1,*c1,*opt_vals,*vals,*rhs,*s,*trabalho,*u; double ds,time_step; longo
i,j,barrier_index; duplo tmp,t2,time_2mat,zero = 0,0; longo n1,n2,ind=0,ns1; duplo
sig2,temp[4],ds_plus,ds_minus,temp1,temp2,temp3; duplo D;

n1 = piso((asset_price/smax)*(double)ns); if (n1 < 3) { printf


("aumentar o número de pontos do ativo \n");

} n2 = ns - n1; ds
= preço_do_ativo/(duplo)n1; time_step =
T/(duplo)nt; ns1 = n1+n2+2; /* número /* tamanho do intervalo de tempo */
de nós - incluindo linha de grade extra*/ /* aloca os arrays necessários (todos de tamanho
ns1+1): a, b, c, a1, b1, c1, opt_vals,_ vals, rhs, s, work, você */

...
/* definir preços abaixo do preço_do_ativo */
s[0] = zero; s[n1] = preço_do_ativo; for(i=1; i
< n1; ++i)

s[i] = (duplo)i * ds; /* definir


preços acima do preço_do_ativo */ for(i=1; i<=
n2+2; ++i ) {
s[n1+i] = preço_do_ativo + (duplo)i * ds;
}
/* descobre o índice correspondente ao nível_barreira */ índice_barreira = 0;
while(barrier_level > s[barrier_index]) { ++barrier_index;

}
if (barrier_level != s[barrier_index]) { /* decrementa o índice de barreira */
--barrier_index;
}
if (s[barrier_index] != nível_barreira) { /* então a barreira não corresponde_
para uma linha de grade existente, então crie outro_ um*/ para
(i=1; i < ns1-barrier_index; ++i) {

s[barrier_index+1+i] = s[barrier_index] + (double)i*ds;


}
++barrier_index;
s[barrier_index] = nível_barreira; if
(n1>barrier_index) { ++n1;

} /* configura os coeficientes RHS e LHS a[], b[] e c[] são os coeficientes LHS
para os valores das opções desconhecidas (etapa de tempo j) a1[], b1[] e c1[] são os valores dos coeficientes RHS para os preços
das opções conhecidas (etapa de tempo j+1).
Nota: a1, b1 e c1 são usados para formar o vetor RHS rhs[] do sistema tridiagonal_. */ sig2 = sigma*sigma; t2 =
time_step/2.0; tmp = 1,0-teta_m; /* 1 - theta (para o método theta) */ /* atribui elementos da matriz tridiagonal
(ns1-2)*(ns1-2) */ for( i=1; i<=ns1-2; ++i) {

ds_plus = s[i+1]-s[i]; ds_menos =


s[i] - s[i-1];
D = ((ds_plus*ds_plus*ds_minus) + (ds_minus*ds_minus*ds_plus)); temp1 = tmp*time_step/
D; a[i] = temp1*((rq)*s[i]*ds_plus*ds_plus) -temp1*ds_plus*(s[i]*s[i]*sig2); temp1 =
theta_m*time_step/D; a1[i] = -(temp1*((rq)*s[i]*ds_plus*ds_plus) -temp1*ds_plus*(s[i]*s[i]*sig2)); temp1 =
(ds_menos*ds_menos)/D; temp2 = ds_menos/D;

Trecho do código 5.19.


Machine Translated by Google

158 Finanças Computacionais Usando C e C#

c[i] = -time_step*tmp*(temp1*s[i]*(rq)+(sig2*s[i]*s[i]*temp2)); c1[i] = time_step*theta_m*(temp1*s[i]*(rq)


+(sig2*s[i]*s[i]*temp2)); temp1 = ((ds_minus*ds_minus) - (ds_plus*ds_plus))/D; temp2 = (ds_menos+ds_mais)/
D; b[i] = 1,0+time_step*tmp*(r+((rq)*s[i]*temp1)+(s[i]*s[i]*sig2)*temp2); b1[i] = 1,0-time_step*theta_m*(r+
((rq)*s[i]*temp1)+(s[i]*s[i]*sig2)*temp2);

}
/* Executa a decomposição LU da matriz tridiagonal com: elementos diagonais contidos_
na matriz b[], elementos
da diagonal superior contidos na matriz c[] e elementos da diagonal inferior na matriz a[].

Armazene os elementos de U, mas não os de L (serão calculados a partir de U)


Matriz U: Os elementos diagonais de U são armazenados na matriz u[] e os elementos diagonais superiores de U são
apenas c[].
Matriz L: Para a matriz triangular inferior L, os elementos da diagonal são 1 e os_ elementos da diagonal inferior são l[i] = a[i]/
u[i-1], onde u[] é a diagonal superior de U. * /u[1] = b[1]; if (u[1] == zero) printf ("erro no array u \n"); for( i=2; i <=ns1-2; ++i) { u[i]
= b[i] - a[i]*c[i-1]/u[i-1]; if (u[i] == zero) printf ("erro no array u \n");

}
/* Define os valores das opções no vencimento. Nota: opt_vals[0] e opt_vals[ns1-1] são os mais baixos e_
valores
de limite de preço de opção superior (put/call). */ if (!put) { /* uma
chamada */ for( i=0; i<ns1; ++i ) opt_vals[i] = MAX(s[i]-strike, zero );

/* agora modifica os valores das opções para incluir a barreira */ for( i=0; i <=
barreira_index; ++i ) opt_vals[i] = zero;

} else { /* a put */ for( i=0;


i<ns1; ++i) opt_vals[i] =
MAX(strike - s[i], zero);
}
/* A partir dos valores das opções no vencimento, t = nt*time_step, calcula os valores nos tempos
(nt-1)*time_step até 0 (hora atual) */ for( j=nt-1; j>=-2; - -j) { /* vai dois passos além do tempo
atual para que possa avaliar_ theta */

time_2mat = Tj*time_step; /* configura


os rhs da equação para o método Theta */ for(i=2; i<=ns1-3; ++i)

rhs[i] = a1[i]*opt_vals[i-1]+b1[i]*opt_vals[i]+c1[i]*opt_vals[i+1]; /* incorpora as condições de contorno1 nos


limites de valor de ativo superior/inferior */ rhs[1] = (a1[1]-a[1])*opt_vals[0]+ b1[1]*opt_vals[1]+c1[ 1]*opt_vals[2]; rhs[ns1-2] =
a1[ns1-2]*opt_vals[ns1-3]+b1[ns1-2]*opt_vals[ns1-2]+(c1[ns1-2]-c[ns1-2]) _ *opt_vals[ns1-1]; /* Resolva o sistema triangular inferior
Ly = b, onde y é armazenado no array work[].

Calcule os elementos de L daqueles de U, l[i] = a[i]/u[i-1]. */


trabalho[1] = rhs[1];
for( i=2; i<=ns1-2; ++i ) trabalho[i] = {
rhs[i] - a[i]*trabalho[i-1]/u[i-1];
}
/* Resolva o sistema triangular superior (ns1-2)*(ns1-2) Ux = y (onde x = opt_vals) */ opt_vals[ns1-2] = work[ns1-2]/u[ns1-2]; for( i
= ns1-2; i >= 1; --i ) opt_vals[i] = (work[i] - c[i]*opt_vals[i+1])/u[i]; if (j==0) { for (i=0; i < ns1; ++i)

vals[i] = opt_vals[i];

} /* armazena valores de opções para que possam calcular theta */ if ((j==1)||


(j==2)||(j==-1)||(j==-2)) { temp [ind] = opt_vals[n1]; ++ind;

} /* agora modifica para barreira */ for( i=0; i


<= barreira_index; ++i ) opt_vals[i] = zero;

}
if (greeks) { /* assume uma grade irregular */ ds_minus = s[n1]-s[n1-1];

Trecho de código 5.19 (continuação).


Machine Translated by Google

Opções americanas de ativo único 159

ds_plus = s[n1+1]-s[n1];
D = (ds_minus*ds_minus*ds_plus) + (ds_plus*ds_plus*ds_minus); temp1 =
ds_minus*ds_minus; temp2 = ds_plus*ds_plus; temp3 = temp1-temp2;

/* GAMA */
greeks[0] = (ds_minus*vals[n1+1]+ds_plus*vals[n1-1]-vals[n1]*(ds_plus+ds_minus))_ /(0.5*D); /* DELTA */

gregos[1] = (temp1*vals[n1+1] - temp2*vals[n1-1] - vals[n1]*temp3)/D;


/* THETA */
greeks[2] = (-temp[0]+8.0*temp[1]-8.0*temp[2]+temp[3])/(12.0*time_step); /* também pode
calcular teta assim: greeks[2] = (-temp[0]+4.0*temp[1]-3.0*vals[n1])/(2.0*time_step); */

}
*valor_opção = vals[n1]; /* Retorna o valor da opção */ /* desaloca
os arrays que foram alocados anteriormente */
...
}

Trecho de código 5.19 Função para calcular o valor de uma opção de barreira europeia para baixo e
para fora usando uma grade não uniforme.

Figura 5.7 O erro absoluto nos valores estimados para uma opção europeia de barreira de chamadas de
saída e saída (B<E) conforme o número de pontos de grade de ativos, ns, varia. Aqui mostramos uma
comparação dos resultados obtidos usando grades uniformes e não uniformes; loga transformações
rítmicas não foram empregadas. O algoritmo para a grade uniforme é descrito na Seção 5.4.2, e o da
grade não uniforme é descrito na Seção 5.4.3. O método Crank-Nicolson (ÿm = 0,5) foi usado e os outros
parâmetros foram E = 50,0, B = 47,5, S0 = 55,0, Smax = 300,0, T = 0,5, ÿ = 0,2, r = log(1,1), q = 0,0, nt =
100.
O valor da opção correta era 7,6512, que foi obtido usando as fórmulas analíticas fornecidas no trecho
de código 4.7.
Machine Translated by Google

160 Finanças Computacionais Usando C e C#

Figura 5.8 O erro absoluto nos valores estimados para uma opção europeia de barreira de
chamadas de saída e saída (E<B) conforme o número de pontos de grade de ativos, ns,
varia. Aqui mostramos uma comparação dos resultados obtidos usando grades uniformes
e não uniformes; loga transformações rítmicas não foram empregadas. O algoritmo para a
grade uniforme é descrito na Seção 5.4.2 e o da grade não uniforme é descrito na Seção
5.4.3. O método Crank-Nicolson (ÿm = 0,5) foi usado e os outros parâmetros foram E =
50,0, B = 52,5, S0 = 65,0, Smax = 300,0, T = 0,5, ÿ = 0,2, r = log(1,1), q = 0,0, nt = 100.
O valor da opção correta era 17,0386, que foi obtido usando as fórmulas analíticas
fornecidas no trecho de código 4.7.

5.4.4 A transformação de log e grades uniformes

Até este ponto, lidamos com a equação padrão de Black-Scholes, que é:

ÿ2S2
ÿf ÿf + (r ÿ q)S = rf + ÿS2 ÿ2f
ÿt ÿS
(5.4.47)
2

No entanto, se introduzirmos a mudança de variável Z = log S, obtemos a seguinte


equação:

ÿf ÿf + b + ÿ2 ÿ2f
ÿt ÿZ = rf (5.4.48)
2 ÿZ2

onde b = r ÿ q ÿ ÿ2/2. Essa forma da equação de Black-Scholes tem propriedades


numéricas benéficas – veja o Apêndice F.
Machine Translated by Google

Opções americanas de ativo único 161

Derivação da Eq. (5.4.48)

Vamos agora derivar uma expressão para a equação logarítmica de Black-Scholes e mostrar
que ela concorda com a Eq. (5.4.48).
Como Z = log S temos
ÿZ
= 1
ÿS S. _ Isto dá:
ÿf = ÿf ÿZ 1 ÿf
=
ÿS ÿZ ÿS SÿZ

ÿ2f ÿ ÿf 1 ÿf 1 ÿ ÿf 1 ÿf 1 ÿZ + ÿ ÿf
= = + =ÿ

ÿS2 ÿS ÿS S2ÿZ _ S ÿS ÿZ S2ÿZ _ S ÿS ÿZ ÿZ


ÿ2f 1 1 ÿ2f ÿf +
=ÿ

ÿS2 S2 ÿZ S2 ÿZ2

Então Eq. (5.4.47) torna-se:

ÿf (r ÿ q)S ÿf + ÿt ÿ2S2 ÿ2S2 ÿ2f ÿf = rf +


ÿ

SÿZ 2S2 ÿZ 2S2 ÿZ2

assim, definindo b = r ÿ q ÿ ÿ2/2, obtemos:


ÿ2ÿZ
ÿf ÿf + b = rf + ÿZ2 ÿ2f
ÿt 2

Vamos agora considerar a discretização por diferenças finitas da Eq. (5.4.48).

O método das diferenças finitas

A aplicação do método das diferenças finitas à equação logarítmica de Black-Scholes é muito


semelhante àquela já descrita nas Seções 5.4.2 e 5.4.3.

O uso do método ÿm na Eq. (5.4.48) resulta em:

fi+1,j ÿ fi,j + b 1
ÿmf i+1,j + ÿÿ mf i,j + ÿ2 Thmf i+1,j + ÿÿ mf i,j
t 2
= r ÿmfi+1,j + ÿÿ mfi,j

onde ÿÿ = 1ÿÿm. Aplicando uma discretização uniforme no nó (i, j) obtemos:


m

btA1 ÿ2tA2 =
fi+1,j ÿ fi,j + rt ÿmfi+1,j + ÿÿ mfi,j + (5.4.49)
2Z 2Z2

onde

A1 = ÿm{fi+1,j+1 ÿ fi+1,jÿ1} + ÿÿ m{fi,j+1 ÿ fi,jÿ1}

A2 = ÿm{fi+1,j+1 ÿ 2fi+1,j + fi+1,jÿ1} + ÿÿ m{fi,j+1 ÿ 2fi,j + fi,jÿ1}

Reunindo os termos semelhantes, obtemos:

B1fi,jÿ1 + B2fi,j + B3fi,j+1 + C1fi+1,jÿ1 + C2fi+1,j + C3fi+1,j+1 = 0


Machine Translated by Google

162 Finanças Computacionais Usando C e C#

onde

ÿÿÿ mbt ÿÿ mÿ2t


B1 = +
2Z 2Z2
ÿÿ mÿ2t
B2 = ÿ1 ÿ rtÿÿ m
ÿ

ÿÿ mbt Z2 ÿÿ mÿ2t
B3 = +
2Z 2Z2
ÿmÿ2t ÿmbt
C1 = ÿ

2Z2 2Z
ÿmÿ2t
C2 = 1 ÿ rtÿm ÿ
Z2
ÿmbt ÿmÿ2t
C3 = +
2Z 2Z2
Se reorganizarmos temos a seguinte equação: ajfi,jÿ1 +
bjfi,j + cj = ¯ajfi+1,jÿ1 + b¯ jfi+1,j + ¯cjfi+1,j+1 onde:

(1 ÿ ÿm)t aj =
bZ ÿ ÿ2 (5.4.50)
2Z2
p2
bj = 1 + (1 ÿ ÿm)tr + Z2 (5.4.51)

ÿ(1 ÿ ÿm)t bZ + ÿ2 cj =
(5.4.52)
2Z2
ÿÿmt bZ ÿ ÿ2 a¯j =
(5.4.53)
2Z2
p2
b¯ = 1 ÿ ÿmt r + j (5.4.54)
Z2
ÿmt c¯j
= bZ + ÿ2 (5.4.55)
2Z2
Pode ser visto que, ao contrário da Seção 5.4.2, os coeficientes nas Eqs. (5.4.50)–
(5.4.55) são independentes do índice de preços dos ativos j .
Quando ÿm = 0,5 (o método Crank-Nicolson) temos os seguintes coeficientes:

t
=ÿ¯aj = bZ ÿ ÿ2 aj
4Z2 p2
t
bj = 1 + r+
2 Z2
t
=ÿ¯cj = ÿ bZ + ÿ2 cj
4Z2 p2
t
b¯ = 1 ÿ j r+
2 Z2
Machine Translated by Google

Opções americanas de ativo único 163

Tabela 5.7 Resultados de avaliação e erros de precificação para uma opção de venda americana
vanilla usando uma grade uniforme com e sem transformação logarítmica; o método implícito e o
método Crank-Nicolson são usados

Valor do tempo ÿm = 0,0 ÿm = 0,5


BS Log BS BS Log BS

0,1 0,7599 1,4733 × 10ÿ2 7,7803 × 10ÿ3 1,4719 × 10ÿ2 7,6716 × 10ÿ3 0,8335
0,2 4,5838 × 10ÿ2 1,2924 × 10ÿ2 4,5682 × 10ÿ2 1,1997 × 10ÿ2 60,89218
0,3 1,04218 10ÿ2 6,3800 × 10ÿ2 1,2567 × 10ÿ2 0,9403 7,4699 × 10ÿ2 1,6559 ×
0,4 10ÿ2 7,3924 × 10ÿ2 1,4655 × 10ÿ2 0,9812 8,0297 × 10ÿ2 1,8471 × 10ÿ2
0,5 7,91ÿ2 7,91ÿ2 1,6041 × 10ÿ2 1,0167 8,2796 × 10ÿ2 1,9125 × 10ÿ2 8,1135
0,6 × 10ÿ2 1,6067 × 10ÿ2 1,0479 8,3285 × 10ÿ2 1,8959 × 10ÿ2 8,1131 × 10ÿ2
0,7 1,0479 8,3285 × 10ÿ2 1,8959 × 10ÿ2 0 × 10ÿ2 1,072528 1,072528 1,072528
0,8 1,072523 10ÿ2 1.8408 × 10ÿ2 7.9803 × 10ÿ2 1.4159 × 10ÿ2 1.1009 8.0829
0,9 × 10ÿ2 1.7756 × 10ÿ2 7.7647 × 10ÿ2 1.3020 × 10ÿ2 1.1237 7.8646 × 10ÿ2
1,0 1. 7,4947 × 10ÿ2 1,1997 × 10ÿ2 1,1445 7,6164 × 10ÿ2 1,6643 × 10ÿ2
1.1 7,1961 × 10ÿ2 1,1174 × 10ÿ2 1,1637 7,3514 × 10ÿ2 1,6290 × 10ÿ2 6,85802
1.2 1 105523 1 105523 ÿ2 1,1813 7,0785 × 10ÿ2 1,6092 × 10ÿ2 6,5594 × 10ÿ2
1.3 1,0143 × 10ÿ2 1,1977 6,8080 × 10ÿ2 1,6042 × 10ÿ2 6,2419 × 10ÿ2 9,9309
1.4 × 10ÿ3 1,2142 6,2129 × 10ÿ3 1,2129 1,2129 × 10ÿ3 1,6128 × 10ÿ2 5,9295
1,5 × 10ÿ2 9,8909 × 10ÿ3

Os valores precisos (obtidos usando uma grade logarítmica transformada com ns = 1000 e nt = 1000)
são apresentados na coluna denominada “Valor”. Os erros absolutos de precificação, ABS (valor
exato ÿ valor estimado) apresentados na coluna rotulada BS foram obtidos usando uma grade
uniforme padrão (conforme descrito na Seção 5.4.2), e aqueles na coluna rotulada Log BS usam uma
grade uniforme e transformação logarítmica conforme explicado nesta seção. O vencimento da opção
variou de 0,1 ano a 1,5 ano, e os demais parâmetros foram: S = 9,0, X = 9,7, r = 0,1, q = 0,0, ÿ =
0,30, Smax = 100,0, ns = 50 e nt = 50.

O método de usar a grade de diferenças finitas para calcular os preços das opções
é idêntico ao já descrito na Seção 5.4.2, que resolve a equação padrão (não
logarítmica) de Black-Scholes. A Tabela 5.7 compara os resultados obtidos com e
sem transformação logarítmica.

5.4.5 A transformação de log e grades não uniformes

Na seção anterior, consideramos o uso de uma grade uniforme para discretizar a


equação de Black-Scholes transformada logaritmicamente:

ÿf ÿf + b = rf + ÿ2
ÿZ2ÿ2f
ÿZ
(5.4.56)
ÿt 2
Machine Translated by Google

164 Finanças Computacionais Usando C e C#

onde
ÿ2
b=rÿqÿ e Z = log S

2 Aqui vamos generalizar esses resultados e usar uma grade não uniforme para resolver
a Eq. (5.4.56).
Nossa descrição será muito breve, pois a maioria dos detalhes já foi discutida nas
seções anteriores. Aqui estamos apenas preocupados com a aproximação de
diferenças finitas e derivamos as equações que precisam ser resolvidas em cada
passo de tempo. Posteriormente, na Seção 5.4.6, aplicaremos nossos resultados para
resolver uma opção de barreira dupla knockout europeia.

A aproximação por diferenças finitas


No nó da grade (i, j) temos
Zÿ j = Zj ÿ Zjÿ1 e Z+ = Zj + 1 ÿ Zj
j Seguindo a Seção 5.4.2, a primeira e a segunda derivadas de f wrt Z são
2{Z+ fi+1,j
(Zÿÿj Z+ fi+1,jÿ1 + Zÿ fi+1,j+1 ÿ Zÿ fi+1, j } j j )2Z+ +
(Z+ )2Zÿ
= j j
fi +1,j
j j j
e
(Zÿ j )2fi+1,j+1 + ((Z+)2 ÿ (Zÿ )2)fi+1,j ÿ (Z+ )2fi+1,jÿ1
= j j
fi +1,j (Z+ )2Zÿ + (Zÿ jjj )2Z+

Então discretizando a Eq. (5.4.56) da maneira usual obtemos

fi+1,j ÿ fi,j +
b ÿmf i+1,j + ÿÿ mf i,j + 1,j
ÿ2ÿmf +i + ÿÿ mf i,j
t 2
= r ÿmfi+1,j + ÿÿ mfi,j = 1
onde ÿÿ ÿ ÿm. Fazendo D = (Z+ )2Zÿ )2Z+
obtemos + (Zÿ j
m j j j

rt ÿmfi+1,j + ÿÿ mfi,j
(5.4.57)
btA1 = ÿ2tA2
fi+1,j ÿ fi,j + + D D
onde
2 2
A1 = ÿm fi+1,j+1 Zÿ j ÿ fi+1,jÿ1 Z+ j
2 2
ÿ Z+j
ÿ fi+1,j Zÿ j
2 2 2 2
+ ÿÿ m ÿ Z+j
fi,j+1 Zÿ j ÿ fi,jÿ1 Z+ j ÿ fi,j Zÿ j

A2 = ÿm fi+1,j+1Zÿ ÿ fi+1,j Zÿ jj + fi+1,jÿ1Z+ + Z+


j j

m fi,j+1Zÿ ÿ fi,j Zÿ jjj + fi,jÿ1Z+ j


+ Z+ + ÿÿ
Machine Translated by Google

Opções americanas de ativo único 165

Reunindo os termos semelhantes, obtemos:

B1fi,jÿ1 + B2fi,j + B3fi,j+1 + C1fi+1,jÿ1 + C2fi+1,j + C3fi+1,j+1 = 0


onde

ÿÿÿ mbt(Z+ )2 j ÿÿ mÿ2tZ+ j


B1 = +
D D
B2 = ÿ1 ÿ rtÿÿ ÿÿ m
mÿ2t(Zÿ j + Z+ ) eu mbt{(Zÿ j )2 ÿ (Z+ )2}
j
ÿÿ
ÿ ÿ

D D
)2 ÿÿ mbt(Zÿ j ÿÿ mÿ2tZÿ
B3 = +

Dÿmÿ2tZ + j Dÿmbt (Z+ )2j


C1 = ÿ

D D
ÿmbt{(Zÿ j )2 ÿ (Z+ )2}
j ÿmÿ2t{Zÿ j + Z+ } j
C2 = 1ÿ rtÿm ÿ ÿ

D D
)2 ÿmbt(Zÿ j ÿmÿ2tZÿ j
C3 = +
D D
Se reorganizarmos temos a seguinte equação:
ajfi,jÿ1 + bjfi,j + cj = ¯ajfi+1,jÿ1 + b¯ jfi+1,j + ¯cjfi+1,j+1 (5.4.58)
onde:
)2 ÿ2Z+ j
aj = (1 ÿ ÿm)tb(Z+ j
ÿ

(5.4.59)
D D
bj = 1 + t(1 ÿ ÿm) ÿ2(Zÿ
+ Z+ ) j j b{(Zÿ j j )2 ÿ (Z+ )2}
×rÿ ÿ

(5.4.60)
D D
)2 ÿ2Zÿ j
cj = (1 ÿ ÿm)tÿb(Zÿ j a¯j =D
ÿ

(5.4.61)
D
b(Z+ )2
j
ÿmtÿ2Z+ j
ÿ

(5.4.62)
D D

b¯ j = 1 ÿ ÿmrt
)2 ÿ (Z+ )2}
j ÿ2{Zÿ j + Z+ } j
ÿ ÿmtb{(Zÿ j + (5.4.63)
D D
)2 ÿ2Zÿ j
c¯j = ÿmtb(Zÿ j + (5.4.64)
D D

A incorporação das condições de contorno e a solução da Eq. (5.4.58) é semelhante


ao já discutido na Seção 5.4.2. Se mais detalhes
Machine Translated by Google

166 Finanças Computacionais Usando C e C#

são necessários O trecho de código 5.19, que usa uma grade não uniforme para resolver a
equação de Black–Scholes transformada em log, pode ser consultado.
= Z+
Quando uma grade uniforme é usada Zÿ j = Z e, portanto,
j
2 2
D = Z+j Z- + Zÿ jj Z+j = 2(Z)3

(Z+ )2
j (Zÿ j )2 (Z)2 1
= = =
D D 2(Z)3 2Z
Z+j Zÿ j 1 (Z+ )2 ÿ (Zÿ )2j
= = j
e =0
D D 2Z2 D
Nestas circunstâncias
(1 ÿ ÿm)t bZ
ÿ ÿ2 aj =
2Z2
p2
bj = 1 + t(1 ÿ ÿm) r ÿ
Z2
ÿb p2
cj = (1 ÿ ÿm)t
ÿ

2Z 2Z2
ÿÿmt bZ ÿ ÿ2 a¯j =
2Z2
p2
b¯ = 1 ÿ ÿmt r + j
Z2
ÿmt
c¯j = 2Z2 bZ + ÿ2
que
são iguais às Eqs. (5.4.50)–(5.4.55) na Seção 5.4.4.

5.4.6 A opção double knockout call O


objetivo desta seção é fornecer um exemplo que ilustre os benefícios obtidos
com o uso da equação de Black-Scholes transformada em log e também de
uma grade não uniforme.
O problema que vamos considerar é a opção de compra europeia de duplo
knockout com preço de exercício E e data dede
barreira
vencimento
com uma
T . Esta
barreira
é umasuperior
opção
em BU e uma barreira inferior em BL. Se, durante a vida da opção, o preço do
ativo ficar acima da barreira superior ou abaixo da barreira inferior, a opção
perde o valor. Se, por outro lado, o preço do ativo ficar entre as barreiras então
a opção tem valor max(ST ÿ E, 0), onde ST é o preço do ativo no tempo T
.
Este problema foi previamente investigado por Boyle e Tian (1998), doravante
referido como BT, que usou um método explícito de diferenças finitas baseado
em uma rede trinômio modificada. O método que usamos aqui é baseado nas
equações de diferenças finitas fornecidas na Seção 5.4.5, e todos os resultados
obtidos usando a função dko_call (consulte o trecho de código 5.20) são
apresentados nas Tabelas 5.8–5.12.
Machine Translated by Google

Opções americanas de ativo único 167

void dko_call(duplo inferior_barreira, duplo superior_barreira, duplo theta_m,


double S0, double sigma_array[], double sigma_times[], long n_sigma, double r, double opt_mat, double X, double *option_value,
double greeks[], double q, long ns_below_S0, long ns_above_S0, long nt, long *iflag)

{
/* Parâmetros de entrada:
===================

barreira_inferior - o preço do ativo correspondente à barreira inferior, - o preço do ativo correspondente


barreira_superior à barreira superior, - o valor de teta usado para o método de diferenças finitas, - o preço
theta_m atual do ativo subjacente, - uma matriz contendo valores da volatilidade: sigma_array[0] é o_
S0 primeiro valor da volatilidade, sigma_array[1] é o segundo valor da volatilidade, etc.,
sigma_array[]

sigma_vezes[] - um array contendo os tempos para diferentes volatilidades:_ sigma_times[0] é o tempo


correspondente à primeira volatilidade, sigma_times[1] é o tempo correspondente à_ segunda
volatilidade, etc., - o número de elementos em sigma_array[] , e sigma_times[], - a taxa de juros, - o tempo até
o vencimento, - o preço de exercício, - o rendimento contínuo de dividendos, - o número de intervalos de ativos
n_sigma abaixo do preço atual S0, - o número de intervalos de ativos acima do preço atual S0, - o número de intervalos de
r tempo.
opt_mat
x
q
ns_below_S0
ns_above_S0 nt

Parâmetros de saída:
==================

option_value - o valor da opção, - a saída de estatísticas


gregos[] de hedge da seguinte forma: greeks[0] é gamma,_
gregos[1] é delta e gregos[2] é theta,
iflag - um indicador de erro.
*/
double *a,*b,*c,*vals,*a1,*b1,*c1,*opt_vals,*rhs,*z,*delta,*gamma,*work,*u; duplo dt,dz,dz1,dz2,zmax,zmin; longo i,j; duplo
tmp,t2,t4,dt2; long ind=0,n1,n2,ns1; double ds,log_asset,sig2,alpha,v2,b_fac,temp[4]; duplo zero = 0,0; índice_barreira longo,
ind2; duplo dz_shift,time_step,log_barrier_level1,log_barrier_level2; duplo temp1, temp2, ds_plus, ds_minus, bb, D; double
curr_time;

if (S0 >= upper_barrier) printf ("ERRO O preço atual do ativo é maior que_ upper_barrier \n"); if (barreira_inferior >= S0)
printf("ERRO A barreira inferior é maior que o preço_ do ativo atual \n"); if (S0 <= zero) printf ("ERROR preço do ativo não é >
0 \n"); if (barreira_superior <=barreira_inferior) printf ("ERRO A barreira_inferior deve ser >_ barreira_inferior \n"); log_asset = log(S0);
log_barrier_level1 = log(barreira_inferior); log_barrier_level2 = log(barreira_superior); dz1 = (log_asset-log_barrier_level1)/
(double)ns_below_S0; n1 = ns_abaixo_S0;

/* Incluir 5 pontos extras acima do preço do ativo para não haver descontinuidade na grade_
espaçamento
que pode afetar adversamente o cálculo dos gregos */
n2 = ns_acima_S0 + 5; dz_shift =
dz1*5.0; /* deslocamento causado por 5 pontos de grade extras */ dz2 = (log_barrier_level2-log_asset-
dz_shift)/(double)ns_above_S0; dt = opt_mat/(duplo)nt; time_step = dt; --n2; ns1 = n1+n2+2;
/* tamanho do intervalo de tempo */

/* Configure os coeficientes RHS e LHS a[], b[] e c[] são os coeficientes LHS para o_
valores de opções
desconhecidas (etapa de tempo j) a1[], b1[] e c1[] são os valores dos coeficientes RHS para os_ preços de opções conhecidas (etapa de tempo
j+1). Nota: a1, b1 e c1 são usados para formar o vetor RHS rhs[] do_ sistema tridiagonal. */

/* Alocar os arrays necessários (todos de tamanho (ns1+2): a,b,c,a1,b1,c1,opt_vals,vals,_


rhs,z,delta,gamma,trabalho,u */

Trecho do código 5.20.


Machine Translated by Google

168 Finanças Computacionais Usando C e C#

...
/* Configura os coeficientes RHS e LHS a[], b[] ec[] são os coeficientes LHS
para os valores das opções desconhecidas (etapa de tempo j) a1[], b1[] e c1[] são os valores dos coeficientes RHS
para os preços das opções conhecidas (etapa de tempo j+1). Nota: a1, b1 e c1 são usados_ para formar o vetor RHS rhs[]
do sistema tridiagonal. */ /* Definir valores de ativos de linha de grade, definir um espaçamento de grade para alinhar com o
preço do ativo, então não_

tem que
interpolar para obter o valor da opção */
z[n1] = log_asset; for (i = 1; i
<=n1; ++i) /* Esta deve ser a malha fina */ z[n1-i] = log_asset - (double)i*dz1;

for (i = 1; i <= 5; ++i) /* Incluir 5 pontos de malha extra finos aqui */


z[n1+i] = log_asset + (duplo)i*dz1; for (i = 6; i <= n2+2; ++i)
{ /* A malha grossa */ j = i - 5; z[n1+i] = z[n1+5] + (duplo)j*dz2;

}
/* Define os valores das opções no vencimento (para uma opção de compra). Observação: opt_vals[0] e opt_vals[ns1-1] são os
valores de limite de
preço de opção inferior e superior (put/call). */
for( i=1; i<ns1; ++i ) opt_vals[i] = {
MAX(exp(z[i])-X, zero);

} opt_vals[0] = zero;
opt_vals[ns1-1] = zero; tmp = 1,0-
teta_m; /* 1 - theta (para o método theta) */ curr_time = -1.0; ind2 = n_sigma - 1; for( j=nt-1;
j>=-2; --j) { /* Iterar do vencimento até o horário atual */ if ((ind2 >= 0) && (curr_time <=
sigma_times[ind2])) {

sig2 = sigma_array[ind2]*sigma_array[ind2]; t2 = time_step/2.0; bb = r


- q - (sig2/2.0); --ind2; for( i=1; i<=ns1-2; ++i) { /* Atribui elementos da
matriz tridiagonal_ (ns1-2)*(ns1-2) */ ds_plus = z[i+1]-z[ eu]; ds_menos
= z[i] - z[i-1]; D = ((ds_plus*ds_plus*ds_minus) +
(ds_minus*ds_minus*ds_plus)); temp1 = tmp*time_step/D; a[i] = temp1*(bb*ds_plus*ds_plus) -temp1*ds_plus*(sig2); temp1 =
theta_m*time_step/D; a1[i] = temp1*ds_plus*(sig2)-temp1*(bb*ds_plus*ds_plus); temp1 = (ds_menos*ds_menos)/D; temp2 = ds_menos/
D; c[i] = -time_step*tmp*(temp1*bb+(sig2*temp2)); c1[i] = time_step*theta_m*(temp1*bb+(sig2*temp2)); temp1 = ((ds_minus*ds_minus)
- (ds_plus*ds_plus))/D; temp2 = (ds_menos+ds_mais)/D; b[i] = 1,0+time_step*tmp*(r+(bb*temp1)+(sig2)*temp2); b1[i] = 1,0-
time_step*theta_m*(r+(bb*temp1)+(sig2)*temp2);

} u[1] = b[1]; if (u[1]


== zero) printf ("ERRO no array u \n");
for( i=2; i <=ns1-2; ++i) {
u[i] = b[i] - a[i]*c[i-1]/u[i-1]; if (u[i] == zero) printf ("ERRO
no array u \n");
}

} hora_corrente = j*dt;
/* Configure os rhs da equação para o método theta */ for(i=2; i<=ns1-3; ++i)

rhs[i] = a1[i]*opt_vals[i-1]+b1[i]*opt_vals[i]+c1[i]*opt_vals[i+1];
/* Incorporar as condições de contorno1 nos limites de valor de ativo superior/inferior */
rhs[1] = (a1[1]-a[1])*opt_vals[0]+ b1[1]*opt_vals[1]+c1[1]*opt_vals[2]; rhs[ns1-2] =
a1[ns1-2]*opt_vals[ns1-3]+b1[ns1-2]*opt_vals[ns1-2]+(c1[ns1-2]-c[ns1-2]) _ *opt_vals[ns1-1];

/* Resolva o sistema triangular inferior Ly = b, onde y é armazenado no array work[]. Calcule o_


elementos de L daqueles de U, l[i] = a[i]/u[i-1]. */ trabalho[1] = rhs[1]; for( i=2; i<=ns1-2;
++i ) trabalho[i] = rhs[i] - a[i]*trabalho[i-1]/u[i-1];
{

Trecho do código 5.20 (continuação).


Machine Translated by Google

Opções americanas de ativo único 169

/* Resolva o sistema triangular superior (ns1-2)*(ns1-2) Ux = y (onde x = vold) */


opt_vals[ns1-2] = trabalho[ns1-2]/u[ns1-2]; for( i = ns1-2; i
>= 1; --i )
opt_vals[i] = (trabalho[i] - c[i]*opt_vals[i+1])/u[i]; if (j==0) { for (i=0; i < ns1; ++i)

vals[i] = opt_vals[i];
}
/* Armazena valores de opções para que possam calcular theta */ if ((j==1)||
(j==2)||(j==-1)||(j==-2)) {
temp[ind] = opt_vals[n1]; ++ind;

}
}
if (gregos) {
/* Calcula gama e delta (precisão de 4ª ordem) */
gregos[1] = (-vals[n1+2]+8,0*vals[n1+1]-8,0*vals[n1-1]+vals[n1-2])/(12,0*dz1); /* Calcular gama (precisão de 4ª ordem) -
usar a regra da cadeia para obter a derivada wrt S */
gregos[0] = (-vals[n1+2]+16,0*vals[n1+1]-30,0*vals[n1]+16,0*vals[n1-1]-vals[n1-2])_ /(12,0 *dz1*dz1); gregos[0] = gregos[0]-
gregos[1]; gregos[0] = gregos[0]/(S0*S0); gregos[1] = gregos[1]/S0; /* Calcula teta (precisão de 4ª ordem) */ greeks[2] = (-
temp[0]+8,0*temp[1]-8,0*temp[2]+temp[3])/(12,0*dt); /* também pode calcular theta como: greeks[2] = (-
temp[0]+4.0*temp[1]-3.0*vals[n1])_ /(2.0*dt); */

} *valor_opção = vals[n1];
}

Trecho de código 5.20 Trecho de código 5.20 Função para calcular o valor e gregos de uma opção
de compra de duplo knockout europeu usando uma grade não uniforme e uma transformação
logarítmica.

Tabela 5.8 Valor estimado de uma opção de compra europeia de double knockout

Etapas de tempo (n) Valor estimado Boyle e Tian (1998)

50 1,4569 1,4238
100 1,4578 1,4437
200 1,4583 1,4495
300 1.4583 1.4524
400 1.4584 1.4542
500 1.4584 1.4553
600 1.4584 1.4557
700 1.4584 1.4559
800 1.4584 1.4563
900 1.4584 1,4565
1000 1.4584 1.4566
2000 1.4584 1,4576
3000 1.4584 1,4578
4000 1.4584 1,4580
5000 1.4584 1.4581

Os valores da coluna dois foram calculados pela função dko_call, e os da coluna três são os
resultados relatados na Tabela 2 de Boyle e Tian (1998). Os parâmetros do modelo foram: preço
do ativo atual S = 95,0, preço de exercício E = 100,0, volatilidade ÿ = 0,25, maturidade ÿ = 1,0,
taxa de juros r = 0,1, dividend yield q = 0,0. O nível da barreira superior é definido em 140,0 e a
barreira inferior é definida em 90,0. Os outros parâmetros usados pela função dko_call foram: nt
= n, ns_below_S0 = n/2, ns_above_S0 = n/2 e ÿm = 0,5 (ou seja, o método Crank–Nicolson).
Machine Translated by Google

170 Finanças Computacionais Usando C e C#

Tabela 5.9 Os valores estimados das opções de call europeias down e out calculados pela função
dko_call

Etapas de tempo Preço das


92 91 ações 90,5 90,4 90,3 90.2

50 2,5652 1,3046 0,6588 0,5282 0,3971 0,2653


100 2,5221 1,2816 0,6466 0,5182 0,3894 0,2601
200 2,5104 1,2758 0,6435 0,5157 0,3875 0,2588
300 2,5080 1,2747 0,6429 0,5152 0,3871 0,2585
400 2,5072 1,2743 0,6427 0,5150 0,3869 0,2584
500 2,5069 1,2742 0,6426 0,5149 0,3869 0,2584
600 2,5067 1,2741 0,6425 0,5149 0,3868 0,2583
700 2,5066 1,2740 0,6425 0,5149 0,3868 0,2583
800 2,5065 1,2740 0,6424 0,5148 0,3868 0,2583
900 2,5065 1,2739 0,6424 0,5148 0,3868 0,2583
1000 2,5064 1,2739 0,6424 0,5148 0,3868 0,2583
2000 2,5063 1,2738 0,6424 0,5148 0,3868 0,2583
formulário fechado 2.5063 1.2738 0,6424 0,5148 0,3868 0,2583

Os parâmetros fixos do modelo foram: preço de exercício E = 100,0, volatilidade ÿ = 0,25, maturidade
ÿ = 1,0, taxa de juros r = 0,1, dividend yield q = 0,0 e a barreira inferior é fixada em 90,0. Os outros
parâmetros usados pela função dko_call foram: nt = n, ns_below_S0 = n/2, ns_above_S0 = n/2,
upper_barrier = 1000,0, lower_barrier = 90,0 e ÿm = 0,5 (ou seja, o método Crank–Nicolson ) .

Tabela 5.10 Os valores estimados das opções de compra europeias de compra e venda calculadas
pela função dko_call

Etapas de tempo preço das ações

92 91 90,5 90,4 90,3 90.2

50 2.5572 1.3005 0,6567 0,5266 0,3958 0,2645


100 2.5181 1.2796 0,6455 0,5174 0,3888 0,2597
200 2.5084 1.2748 0,6429 0,5153 0,3872 0,2586
300 2.5067 1.2741 0,6425 0,5149 0,3869 0,2584
400 2.5062 1.2738 0,6424 0,5148 0,3868 0,2583
500 2.5061 1.2738 0,6424 0,5148 0,3868 0,2583
600 2.5061 1.2737 0,6423 0,5148 0,3867 0,2583
700 2.5060 1.2737 0,6423 0,5147 0,3867 0,2583
800 2.5060 1.2747 0,6423 0,5147 0,3867 0,2583
900 2.5060 1.2737 0,6423 0,5147 0,3867 0,2583
1000 2.5060 1.2737 0,6423 0,5147 0,3867 0,2583
2000 2.5061 1.2737 0,6423 0,5147 0,3867 0,2583
formulário fechado 2.5063 1.2738 0,6424 0,5148 0,3868 0,2583

Os parâmetros fixos utilizados foram: preço de exercício E = 100,0, volatilidade ÿ = 0,25, vencimento ÿ
= 1,0, taxa de juros r = 0,1, dividend yield q = 0,0 e a barreira inferior é fixada em 90,0. Os outros
parâmetros usados pela função dko_call foram: nt = n, ns_below_S0 = n/2, ns_above_S0 = n/2,
upper_barrier = 1000,0, lower_barrier = 90,0 e ÿm = 0,0 (ou seja, o método implícito ) .
Machine Translated by Google

Opções americanas de ativo único 171

Tabela 5.11 Os valores estimados das opções de compra de double knockout europeias calculados
pela função dko_call

Etapas de tempo Preço das


92 91 ações 90,5 90,4 90,3 90.2

50 0.6251 (0.6184) 0.3189 (0.3177) 0.1610 0.1290 0.0969 0.0647 0.6260 (0.6212) 0.3194
100 (0.3184) 0.1613 0.1292 0.0971 0.0649 0.6263 (0.6228) 0.3196 (0.3186) 0.1613 0.1293
200 0.0972 0.0649 0.6263 (0.6236) 0.3196 (0.3187) 0.1613 0.1293 0.0972 0.0649 0.6263
300 ( 0.6242) 0.3196 (0.3189) 0.1613 0.1293 0.0972 0.0649 0.6263 (0.6252) 0.3196 (0.3190)
400 0.1613 0.1293 0.0972 0.0649 0.6263 (0.6253) 0.3196 (0.3191) 0.1613 0.1293 0.0972
500 0.0649 0.6263 (0.6253) 0.3196 (0.3191) 0.1613 0.1293 0.0972 0.0649 0.6263 (0.6255)
600 0.3196 (0.3192) 0.1613 0.1293 0.0972 0.0649 0.6263 (0.6256) 0.3196 (0.3192) 0.1613
700 0.1293 0.0972 0.0649 0.6263 (0.6255) 0.3196 (0.3192) 0.1613 0.1293 0.0972 0.0649
800 0.6263 (0.6260) 0.3196 (0.3195) 0.1613 0.1293 0.0972 0.0649
900
1000
2000

Na coluna 2 e coluna 3, os valores dados em Boyle e Tian (1998), Tabela 5, são apresentados para
comparação. Os parâmetros do modelo fixo foram: preço de exercício E = 100,0, volatilidade ÿ = 0,25,
rendimento de dividendos q = 0,0, vencimento ÿ = 1,0, taxa de juros r = 0,1, a barreira inferior é definida
em 90,0 e a barreira superior é definida em 140,0 . Os outros parâmetros usados pela função dko_call
foram: nt = n, ns_below_S0 = n/2, ns_above_S0 = n/2 e ÿm = 0,5 (ou seja, o método Crank–Nicolson).

Tabela 5.12 Os gregos estimados para opções de compra de duplo knockout europeu calculados pela
função dko_call

Preço do ativo Gama Delta teta

95,0 ÿ0,0165 (ÿ0,0166) 0,2536 (0,2551) 2,3982 (2,3928)


92,0 ÿ0,0141 (ÿ0,0141) 0,2998 (0,3016) 1,0268 (1,0242)
91,0 ÿ0,0129 (ÿ0,0130) 0,3133 (0,3151) 0,5237 (0,5224)
90,5 ÿ0,0123 (ÿ0,0123) 0,3196 (0,3215) 0,2643 (0,2636)
90,4 ÿ0,0121 (ÿ0,0122) 0,3208 (0,3227) 0,2119 (0,2113)
90,3 ÿ0,0120 (ÿ0,0121) 0,3221 (0,3239) 0,1592 (0,1588)
90,2 ÿ0,0119 (ÿ0,0119) 0,3233 (0,3251) 0,1063 (0,1060)

Os parâmetros do modelo fixo: o preço de exercício E = 100,0, volatilidade ÿ = 0,25, rendimento de


dividendos q = 0,0, maturidade ÿ = 1,0, taxa de juros r = 0,1, a barreira inferior é definida em 90,0 e a
barreira superior é definida em 140,0 . Os outros parâmetros usados pela função dko_call foram: nt =
200, ns_below_S0 = 100, ns_above_S0 = 100 e ÿm = 0,5 (ou seja, o método Crank–Nicolson). Os
resultados para ÿm = 0,0 (ou seja, o método implícito) são mostrados entre colchetes; ver Tabela 6,
Boyle e Tian (1998).

A inspeção dos resultados mostra que o método da grade de diferenças finitas


tem maior precisão e convergência mais rápida do que o método proposto por BT. O
Machine Translated by Google

172 Finanças Computacionais Usando C e C#

chave para a precisão alcançada por dko_call é uma combinação de:

• A transformação logarítmica da equação de Black-Scholes • A capacidade


de colocar uma linha de grade na barreira superior BU e também na
limite inferior BL
• O uso de um esquema de diferenças finitas ÿm ponderado, 0 ÿm 1, em vez do método de
diferenças finitas explícito numericamente instável usado por uma rede trinomial que em
nossa notação (consulte a Seção 5.4.2) é equivalente a ÿm = 1.

Deve ser mencionado que a função dko_call poderia, sem muito


dificuldade, ser modificado para lidar

com: • Opções de venda de duplo knockout


americano • Opções de venda de duplo knockout
europeu • Opções de venda de duplo knockout americano

e também uma variedade de outras variações que podem incluir períodos de bloqueio, abatimentos,
etc. Em particular, opções com níveis de barreira variáveis no tempo podem ser tratadas usando
linhas de grade para localizar a posição da barreira em cada instante de tempo.

5.5 Precificação de opções americanas usando uma rede estocástica

Nesta seção, consideramos o uso de simulação de Monte Carlo e redes estocásticas para
precificar opções americanas. Informações sobre o uso da simulação de Monte Carlo para
avaliar opções européias de ativos únicos e multiativos são fornecidas no Capítulo 4 e no
Capítulo 6. A principal dificuldade em usar simulação para avaliar opções americanas é a
necessidade de incorporar políticas ótimas de exercício antecipado. Os algoritmos de
simulação padrão para avaliação de contratos europeus são avançados no tempo. Ou seja,
cada caminho de preço, que contribui para o valor da opção, é gerado avançando do tempo
atual, t, até o vencimento da opção, t + ÿ onde ÿ é a duração da opção. Por exemplo, se ,
houver n etapas de tempo equiespadas de tamanho t e apenas um ativo subjacente, então
usamos os valores do ativo Si,i = 0,...,n, onde Si corresponde ao valor do ativo no iésimo
instante de tempo, ti, e t0 = t. Aqui Si+1 é gerado a partir do valor do ativo anterior Si da
seguinte forma:
Si+1
= dSi para i = 0,...,n ÿ 1 Si (5.5.1)

onde dSi é uma variável aleatória retirada de uma dada distribuição. Quando Si segue GBM,
temos da Eq. (2.3.11) que:

Si+1 p2
= expr ÿ t + ÿi dWi , i = 0,...,n ÿ 1, (5.5.2)
E eu 2

onde dWi ÿ N(0,t) e as definições usuais são usadas para ÿi e r.


Para opções exóticas européias (como opções de barreira dependentes do tempo), o valor
de um caminho de preço específico dependerá dos valores do ativo Si,i = 0,...,n.

Você também pode gostar