Escolar Documentos
Profissional Documentos
Cultura Documentos
www.free-ebooks-download.org
Machine Translated by Google
www.free-ebooks-download.org
Machine Translated by Google
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
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
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.
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
Conteúdo
Prefácio XI
Conteúdo ix
Referências 355
Índice 361
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.
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
(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.
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.
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
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:
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.
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
Obtemos assim
Cov[Ws,Wt] = s
Então
Cov[Ws,Wt] = s ÿ t (2.1.2)
(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).
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
XT = ÿ ÿ dt dZi = ÿ ÿ dt coração
i=1 i=1
Machine Translated by Google
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)
ou equivalente
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
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
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
ou equivalente:
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.
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:
(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
dX2 ÿ b2 dt dZ2, dt 2 ÿ 0, e dX dt ÿ 0
ÿÿ ÿÿ 1 ÿ2ÿ
dÿ = dt + dX + ÿX2 ÿX 2 E dX2 (2.3.3)
ÿt
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
ÿÿ ÿÿ b2 ÿ2ÿ ÿÿ
dÿ = + a + ÿX dt + b dW ÿX (2.3.5)
ÿt 2 ÿX2
dS = ÿS dt + ÿS dW
ÿ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) = =ÿ
ÿÿ = ÿ log(St)
=0
ÿt ÿt
Então
ÿ2
d log(St) = ÿ dt + ÿ dWt onde ÿ = ÿ ÿ (2.3.7)
2
Nós obtemos
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
T T T
d log(St) = ÿt dt + ÿt dWt
t=t0 t=t0 t=t0
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
k(s) ds (2.4.2)
t
0
ou na forma vetorial:
dX = A dt + ÿ dtB dZ = A dt + B dW (2.5.2)
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,
dW ÿ N(0,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:
2
dXi dt = ai dt
dXi dt ÿ 0
onde dÿ = ÿÿ ÿ ÿ.
Agora
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)
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
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ÿ ÿ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
e a regra do produto é
ÿÿ 1 ÿÿ ÿ2ÿ
= , = -X1 , = 0,
ÿX1 x2 ÿX2 x22 ÿX21
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
movimento browniano
Aqui temos:
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]
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]
+ ÿ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.
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
Isso rende:
d X1 = X1
ÿ1 ÿ ÿ2 + ÿ2 2ÿ ÿ1ÿ2ÿ12 dt
x2 x2
X1
+ {ÿ1 dW1 ÿ ÿ2 dW2} (2.6.7)
x2
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
ÿÿ = ÿ ÿXidXi
Xi ÿ2ÿ para i = 1,...,n
= 0 para i =
1,...,n ÿX2
eu
Machine Translated by Google
ÿ2ÿ = ÿ2ÿ
ÿXi ÿXj ÿXj ÿXi
= dXi dXj
ÿ para i = j,i = 1,...,n,j = 1,...,n
XI Xj
ÿÿ
=0
ÿt
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)
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
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
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
t - t0 t1 ÿ t
E[Xt] = Zt e Var[Xt] = t1 ÿ t0 t1
ÿ t0
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
que dá:
t - t0 t1 ÿ t
Wt = Wt0 + ÿt ÿ t0 (Wt1 ÿ Wt0 ) + Zt
t1 - t0 t1 ÿ t0
e simplificando obtemos:
Variáveis, Wt ,da distribuição de P(Wt|{Wt0 ,Wt1 }) podem, portanto, ser geradas usando
Agora
onde
ÿat ÿft
um
t
= ef =
ÿt t ÿt
Yt = Wc2t
o que dá dYt
= c ÿ dt dZt = c dWt
Portanto W t = dYt /c é o movimento browniano.
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
Por isso
Da Eq. (2.9.13) pode ser visto que a média e a variância condicionais são
média incondicional
A média incondicional é
E[YW,t] = 0 (2.9.17)
Deixar
ÿ2 exp(2ÿt)
YW,t = exp(ÿÿt)Wÿt onde ÿt = (2.9.18)
2a
Machine Translated by Google
ÿ2 exp(2ÿs)
YW,s = exp(ÿÿs)Wÿs onde ÿs = (2.9.19)
2a
A covariância é:
Da Eq. (2.1.2)
E[Ws,Wt] = s ÿ t (2.9.21)
Portanto, se st
dWt (2.10.1)
que rende
s=t
Xt exp(ÿt) ÿ Xt0 = ÿ exp(ÿs) dWs
s=0
Vamos agora derivar expressões tanto para a média incondicional quanto para a
variância incondicional de Xt .
O significativo
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 é
a variância
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
= 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
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
1 ÿ exp(ÿ2ÿ dt) dZ
Xt+dt = Xt exp(ÿÿ dt) + p 2ÿ (2.10.15)
1 ÿ exp(ÿ2ÿ dt) 2ÿ
Var[Xt+dt|Xt] = ÿ2
(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 é
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)) 2ÿ
Xt = Xt0 exp ÿÿ(t ÿ t0) + dZt (2.11.4)
ÿ2ÿ
P(Xt|Xt0 ) =
2ÿ(1 ÿ exp(ÿ2ÿ(t ÿ t0)))
Temos assim:
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)))
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)))
a
P Xt|{Xt0 ,Xt1 } = exp{A} (2.11.9)
ÿÿt
Machine Translated by Google
onde
A= - a (B1 + B2 ÿ B3) ÿ
exp(ÿ2ÿ(t1 ÿ t)) 1 ÿ ÿ
× (2.11.10)
2
exp(ÿ2ÿ(t ÿ t0)) 1 ÿ ÿ
× (2.11.11)
2
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
(Xt ÿ ÿt) =ÿ
X2t ÿ ÿ2t ÿ 2Xtÿt
2 Vt 2Vt
= ÿa (B1 + B2 ÿ B3) ÿ (2.11.14)
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
1 ÿ exp(ÿ2ÿ(t1 ÿ t)) 1 ÿ
ÿt = Xt0 exp ÿÿ(t ÿ t0) 2
ÿ 1 ÿ exp(ÿ2ÿ(t
ÿ t0)) 1 ÿ ÿ
+ Xt1 exp ÿÿ(t1 ÿ t) 2
Vamos agora provar que no limite (t1 ÿ t0) ÿ 0 obtém-se o resultado da ponte browniana.
1 ÿ exp(ÿ2ÿ(t1 ÿ t)) 1 ÿ
ÿ = Xt0 exp ÿÿ(t ÿ t0) 2
ÿ 1 ÿ exp(ÿ2ÿ(t
ÿ t0)) 1 ÿ ÿ
+ Xt1 exp ÿÿ(t1 ÿ t) 2
onde:
(t ÿ t0)(t1 ÿ t)
Vt ÿ
t1 - t0
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
Desde
ÿ
ÿ 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
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
que significa:
tb
2 tb
E f (Ws,s) dWs =E f (Ss,s)2 ds
s=ta s=ta
Machine Translated by Google
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.
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.
ÿkt = 1 (k ÿ 1) ÿkÿ2
s ds
2 s=0
dXt = Xt dt + dWt
Machine Translated by Google
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 7. Considere a equação dSt = ÿtSt dt +ÿtSt dWt onde o valor de St no tempo t = 0 é
denotado por S0.
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.
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
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
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.
i=1
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
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:
f (r,ÿ) dr dÿ = f (x,y)Jxy,rÿ dr dÿ
cos ÿ sen ÿ ÿr
Jxy,rÿ = =r
sen ÿ r cos ÿ
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
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
V1 = 1 ÿ V 1
= eÿˆr2/2 e V2 = V 2
ÿˆ
V1 = eÿˆr2/2, V2 =
2ÿ
e
ÿˆr2
log V1 = , rˆ = (ÿ2 log V1) 1/2, e ÿˆ = 2ÿV2
2
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:
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.
Parâmetros de saída:
==================
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
} 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) {
} 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;
}
Se zi,i = 1,...,p, são variáveis normais independentes N(ÿi,ÿ2 ), i = 1,...,p, então variáveis eu
ou equivalente
s2
ÿ2 i = log 1 + 2 m¯ i (3.3.12)
eu
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
eu = exp(zi), i = 1,...,p
Xÿ (3.3.15)
ÿY/n
X ÿ ÿ + ÿÿ/ (3.3.16)
(ÿ ÿ 2) ÿY/ÿ
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.
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
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).
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
= V KTUTUKV T
Machine Translated by Google
Portanto
Cr = XTX = VÿV T
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.
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
ÿ ÿ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
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)
xi,1 = r cos(ÿi,1)
xi,2 = r sin(ÿi,1) cos(ÿi,2)
Machine Translated by Google
onde usamos
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(ÿ3,1) sin(ÿ3,1) cos(ÿ3,2) sin(ÿ3,1)sen(ÿ3,2) cos(ÿ3,3) ··· ÿ
.. .. ..
ÿ . . . ... ÿ
Machine Translated by Google
n
BTB
eu, eu
=
(xi, k) 2 = 1
k=1
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
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
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:
C = AAT (3.4.3)
X ÿ N(0,Ip)
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
C = VK(VK)T
/* Parâmetros de entrada:
===================
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:
==================
Parâmetros de entrada/saída:
=========================
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;
ptre = 2; ptrv
= n+2; ptrw = n*n
+ n + 2;
n1 = n + 1;
TRABALHO(ptrc+(i-1)*n+j-1) = C(i,j);
}
}
}
calc_eigvals_eigvecs (n,&WORK(ptrc),n,&WORK(ptre),&WORK(ptrv),n);
/* O código usa a rotina NAG f02abc */ *irank = 0;
}
*/
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;
}
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;
}
}
*/
/* 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)=X(i)+TRABALHO(ptrv+(k-1)+(i-1)*n)*TRABALHO(ptrw+k-1);
}
printf("%12.4f\n",X(i));
}
*/
retorna 0;
}
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 .
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
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.
...
/* obtém a matriz de covariância Gaussiana SIG, que corresponde ao
matriz de covariância lognormal S. */
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 ).
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
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
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
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:
Se ST < E
A Carteira A vale:
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:
Se ST < E
A Carteira A vale:
Mostramos, portanto, que sob todas as condições o valor da carteira A é o mesmo que o da
carteira B.
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.
opções europeias 63
(4.4.1)
(4.4.3)
ÿ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 +
1 ÿ2S2 +ÿ2f
ÿ = ÿtÿf ÿS2 2 (4.4.6)
ÿt
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
Reorganizando temos:
ÿf ÿf 1 ÿ2S2 ÿ2f
+ S = rf + ÿS2 ÿt ÿS 2 (4.4.9)
ÿ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
ÿ(a1c + a2p) ÿt ÿc ÿp + a2 =
a1 ÿt ÿt
ÿ(a1c + a2p) ÿc ÿp + a2 =
a1 ÿS ÿS
ÿS
e
ÿ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:
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
ÿf
+n ÿiSi dWi (4.4.16)
ÿSi
i=1
ÿf
+n ÿiSiWi ÿSi (4.4.17)
i=1
ÿf
ÿ = ÿf +n E (4.4.18)
ÿE
i=1
ÿf
ÿ = ÿf +n E (4.4.19)
i=1
ÿSi
E dZ2
eu
= 1, i = 1,...,n,
e
ÿ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 ÿ
ÿn ÿf ÿf
ÿiSiWi ÿSi +n ÿiSit ÿSi
i=1 i=1
ÿf
+n ÿiSiWi ÿSi (4.4.21)
i=1
rÿt = ÿ
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)
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 .
St = St St
d (ÿ ÿ r) dt + em dWP
Bt Bt Bt
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
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
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
m-r
= Stÿdt ÿ Stÿ dt + Stÿ dWQ
p
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
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
1
Vt0 = EQ max(ST ÿ E, 0) (4.4.35)
exp(rÿ)
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
ÿ
1
ÿ(X ÿ (r ÿ ÿ2/2)ÿ)2 (4.4.38)
f(X) = ÿ exp
ÿÿ ÿ2ÿ 2s2sq
Machine Translated by Google
(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
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)
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)
ÿ{X ÿ (r ÿ ÿ2/2)ÿ }2
exp(X) exp
2s2sq
ÿ{X ÿ (r + ÿ2/2)ÿ }2
= exp(rÿ) exp
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)
que dá a forma usual da fórmula de Black-Scholes para uma chamada europeia como:
onde
log(S/E) + (r + ÿ2/2)ÿ d1 =
ÿ ÿÿ log(S/E) + (r ÿ ÿ2/2)ÿ = d1 ÿ e
ÿ ÿÿ d2 = ÿ ÿÿ
(4.4.48)
dS = ÿS dt ÿ Sq dt + ÿS dWP dB
(4.4.52)
= rB dt
m-r
dWp = dWQ ÿ dt
p
opções europeias 73
o que resulta em
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
log(E/S)ÿ(rÿq+ÿ2/2)ÿ que .
dá IA = S exp(ÿqÿ)N1(ÿk1) onde k1 = ÿ ÿÿ
Machine Translated by Google
e a fórmula correspondente para uma opção de venda pode ser mostrada (usando paridade de chamada de venda)
como:
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:
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 é
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
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
Vegas:
ÿc ÿp
Vc = = Vp = ÿÿ = S exp(ÿqÿ)n(d1) ÿÿ (4.4.67)
ÿÿ
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:
===================
Parâmetros de saída:
==================
*/
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));
} 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
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.
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
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:
===================
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
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
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:
===================
} *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);
Trecho do código 4.3 Função para calcular a volatilidade implícita das opções europeias.
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
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.
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");
Tabela 4.3 Valores de opções calculados e volatilidades implícitas do trecho de código 4.4
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:
opções europeias 83
' Visual Basic Rotina para calcular o valor de ' uma opção de venda europeia ou de compra
europeia.
Autor: George Levy
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
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
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.
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.1 Introdução
• 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
• 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.
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.
,
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
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
b=X
2
f (X > B) = ÿ ÿ exp2b(X ÿ p2s
b)
pi B=S exp(b)
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
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)
1
ÿ{X ÿ (r ÿ q ÿ ÿ2/2)ÿ }2
f (X > B) = ÿ exp 2s2sq
ÿÿ ÿ2ÿ × 1 ÿ
O valor cdo de uma opção de compra europeia com strike E, satisfazendo E>B, é dado
por: exp(ÿrÿ) ÿ ÿÿ ÿ2ÿ
ÿ
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 =
ÿ ÿÿ
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
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:
===================
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;
}
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;
} 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
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
e observando:
ÿ 2(X ÿ 2b)
ÿ
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
Portanto:
1 2
ÿ{X ÿ (r ÿ q ÿ ÿ2/2)ÿ }2
f (X < B) = ÿ ÿÿ exp
ÿ2ÿ × 1 ÿ pi 2s2sq
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:
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 = ÿ ÿÿ
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
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.
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
t1,t2
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
eu c
Machine Translated by Google
set_seed(semente);
} if (é_put) {
} 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) {
opções europeias 95
}
}
}
double temp = sum_opt_vals / (double)fNumberScenarios;
temperatura de retorno;
}
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.
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)
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
i ÿSÿ
i
ÿ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
eu eu
Sÿ
i+1
= Sÿ eu
ÿ
N1(d1(Sÿ ))ÿ 1 eu
Machine Translated by Google
Sÿi+1 =
N1(d1(Sÿ ))ÿ 1
eu
C(S,E,t)
t1 ÿ t
= SD N1(b1) + N2 a1, ÿb1,
t
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
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:
===================
*/
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 */
}
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
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
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)
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
Parâmetros de saída:
==================
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);
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.
E = 100,0; r =
0,04; sigma =
0,2; T = 2,0; t1 =
1,0; colocar = 0;
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, é:
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:
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:
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
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
ÿ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
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)
e
1 a
ÿ2 = ÿ(ÿ ÿ 1) + (ÿ ÿ 1)2 + 4 h (5.2.17)
2
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
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ÿ
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
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.
ÿ(E ÿ Sÿÿ) ÿ
= p Sÿÿ,E,ÿ + ha1Sÿÿÿ1 (5.2.29)
ÿSÿÿ ÿSÿÿ
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ÿÿ
Quando o lado esquerdo da equação acima é substituído na Eq. (5.2.28) obtemos a seguinte
equação para Sÿÿ:
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
Notamos aqui que A1 > 0 desde, ÿ1 < 0, Sÿÿ > 0, e N1(ÿd1(Sÿÿ)) exp(ÿqÿ) < 1.
S c2
P(S,E,ÿ) = p(S,E,ÿ) + A1 quando S>Sÿÿ
Sÿÿ
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
Sÿ
Sÿ ÿ E = c Sÿ,E,ÿ + 1 ÿ exp(ÿqÿ)N1 d1 Sÿ
c2
LHS Sÿ eu
,E,ÿ = Sÿ eu
ÿE
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
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
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
(5.2.34)
1 - com
Machine Translated by Google
ÿ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
ÿN1(d1(Sÿ )) = n d1 Sÿ eu
eu
ÿd1(Sÿ ) eu
ÿd1(Sÿ ) 1
eu
=
ÿSÿi Sÿ ÿ ÿÿ i
Sÿ ÿc =
eu
i ÿSÿ
i
1 exp(ÿqÿ)N1(d1(Sÿ )) eu
bi = exp(ÿqÿ)N1 d1 Sÿ eu
+ ÿ
c2 c2
ÿ
exp(ÿqÿ)n(d1(Sÿ )) ÿ2ÿ eu
1 1 exp(ÿqÿ)n(d1(Sÿ )) 1 ÿ ÿ
1ÿ ÿÿ
eu
bi = exp(ÿqÿ)N1 d1 Sÿ eu
+
c2 c2
(5.2.35)
Se deixarmos Sÿÿ denotar a i-ésima aproximação do valor crítico do ativo Sÿÿ, então podemos
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ÿ)
(5.2.36)
K (Sÿÿ ,E,t) eu
ÿ(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
ÿ
ÿSÿÿi c1 c1
c1 ÿd1(Sÿÿ ) eu
ÿSÿÿi
Machine Translated by Google
= n d1 Sÿÿ eu
eu
ÿd1(Sÿÿ ) eu
ÿd1(Sÿÿ ) 1
eu
=
ÿSÿÿi Sÿÿÿ ÿÿ i
ÿp(Sÿÿ ,E,ÿ) =
eu
exp(ÿqÿ) N1 d1 Sÿÿ ÿp =
ÿ1
eu
ÿSÿÿ
eu
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
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:
===================
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 (!
}
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;
}
}
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);
}
else
{ *opt_value = X - S0;
}
} *valor_crítico = S_star;
}
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ÿÿ
Os resultados dados nas Tabelas 5.2 e 5.3 foram obtidos usando a função
MBW_approx.
Machine Translated by Google
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.
ÿ2
logSt+t ÿNrÿ t,ÿ2t
St 2
Se usarmos a notação:
St+t
X=
St
ÿ2
ÿ=rÿ t, ÿ2 = ÿ2t
2
log(X) ÿ N ÿ,ÿ2
ou equivalente
X ÿ ÿ,ÿ2
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
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
Como podemos assumir que o valor esperado de X cresce à taxa de juros sem risco, r,
também podemos escrever:
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:
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
Var[St+t] = S2 pu2
t + (1 ÿ p)d2 ÿ S2 exp(2rt)t (5.3.15)
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
a = p + (1 ÿ p)d
que dá:
a-d
p= (5.3.19)
u-d
a2 + b2 = pu2 + (1 ÿ p)d2
Reorganizando temos:
(1 ÿ p)d2u = (1 ÿ p)d = a ÿ pu
então
p u3 ÿ u + a ÿ a2u ÿ b2u = 0
Agora,
A solução é:
= 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
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.
RS = S
SS = Su, ST = Sd
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.
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
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.
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);
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
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.
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
n
(n + 1)(n + 2) (i
LN n = + 1) =
2
i=0
} 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.
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:
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
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.
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
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
jj = 2; for
(m1 = 2; m1 >= 1; --m1) { ind = M-m1+1; for (n
=0; n < m1; ++n) {
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.
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]
= 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
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
Como fU ÿ fV SU ÿ SV fV ÿ fW SV ÿ SW
ÿÿ ultravioleta
=
ÿÿ V W =
e
1
Sÿ ÿ Sÿ = {SU ÿ SW }
ultravioleta VW 2
Nós temos
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
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).
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:
===================
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);
}
/* 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) {
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]);
Trecho de código 5.11 Função para calcular o valor de uma opção usando uma rede binomial
padrão.
Quando aplicado à avaliação de uma opção de venda americana, isso pode ser ex
pressionado da seguinte forma:
= 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
} else
{ a_v[Mi] = MAX(s[P1]-X,zero); a_v[i] =
MAX(s[P2]-X,zero);
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) {
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) {
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.
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
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 */
} ++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.. * /
}
outro
v1 = espera; --jj;
}
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) */
}
}
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
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
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.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:
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
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.
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
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.
Smax
Sÿ = (5.4.2)
ns ÿ 1
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:
ÿ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:
e o termo ÿS ÿf
|i,j na Eq. (5.4.1) é aproximado como:
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
f eu, j
= fi,j+1 ÿ fi,jÿ1 (5.4.10)
2S
Adicionando Eqs. (5.4.9) e (5.4.8) obtemos:
que dá:
f eu, j
= fi,j+1 ÿ 2fi,j + fi,jÿ1 (5.4.11)
S2
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:
mfi,j
onde
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:
t
a¯j = ÿÿm (r ÿ q)j ÿ ÿ2j 2 (5.4.19)
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:
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).
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
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:
pnsÿ1 = Smáx ÿ E
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 .
p0 = 0
p0 = E
O valor da opção no limite inferior, denotado por fBL, é definido como p0, e temos fi,0 = fBL,i =
0,...,nt .
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.
Caso 1: j = 1
Substituindo j = 1 na Eq. (5.4.14) obtemos:
ou equivalente:
onde
Caso 2: j = ns ÿ 2
Substituindo j = ns ÿ 1 na Eq. (5.4.14) obtemos:
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
ou equivalente:
b1 c1 00 0 fi,1
ÿ 0 a2 b2 c2 000 0 0 . 0 0 000 . 0 ÿÿ fi,2 ÿ
ÿ ÿ ÿ ÿ
ÿ . ÿ ÿ . ÿ
ÿ ÿ ÿ ÿ
ÿ . ÿ ÿ . ÿ
ÿ ÿ ÿ ÿ
.
= ÿ
ÿ
ÿ
ÿ
(5.4.28)
ÿ . ÿ
ÿ ÿ
Ri+1, nsÿ3
ÿ Ri+1,nsÿ2 ÿ
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
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
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.
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.
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:
é de fato equivalente a:
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.
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]);
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
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.
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
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.
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.
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
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
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
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
= 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
(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
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
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ÿ2S2
j
t(Xÿ ) j j + X+
B2 = ÿ1 ÿ rtÿÿ m
ÿ
m(r ÿ q)Sjt{(Xÿ j
)2 ÿ (X+ )2}j ÿÿ
ÿ
D D
ÿmÿ2S2j t{Xÿ } jj + X+
ÿ
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
(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+ 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
ÿ2S2j t
_
aj = (1 ÿ ÿm)t(r ÿ q)Sj
ÿ
ÿ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.
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
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,
- 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;
/* 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. * /
/* 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];
} 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
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.
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
{
/* 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;
} 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)
}
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) {
} /* 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) {
}
/* 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[].
}
/* 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;
vals[i] = opt_vals[i];
}
if (greeks) { /* assume uma grade irregular */ ds_minus = s[n1]-s[n1-1];
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 */
}
*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
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.
ÿ2S2
ÿf ÿf + (r ÿ q)S = rf + ÿS2 ÿ2f
ÿt ÿS
(5.4.47)
2
ÿf ÿf + b + ÿ2 ÿ2f
ÿt ÿZ = rf (5.4.48)
2 ÿZ2
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 S2 ÿZ S2 ÿZ2
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
btA1 ÿ2tA2 =
fi+1,j ÿ fi,j + rt ÿmfi+1,j + ÿÿ mfi,j + (5.4.49)
2Z 2Z2
onde
onde
ÿÿ 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
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
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.
ÿf ÿf + b = rf + ÿ2
ÿZ2ÿ2f
ÿZ
(5.4.56)
ÿt 2
Machine Translated by Google
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.
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
D D
)2 ÿÿ mbt(Zÿ j ÿÿ mÿ2tZÿ
B3 = +
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
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.
{
/* Parâmetros de entrada:
===================
Parâmetros de saída:
==================
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. */
...
/* 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;
}
/* 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])) {
} 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];
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
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
Tabela 5.9 Os valores estimados das opções de call europeias down e out calculados pela função
dko_call
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
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
Tabela 5.11 Os valores estimados das opções de compra de double knockout europeias calculados
pela função dko_call
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
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.
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