Você está na página 1de 166

Herbert Kimura, Jim Heiji Aburaya, Vinicius Amorim Sobreiro e

Leonardo Fernando Cruz Basso

VBA Excel para Finanças: Edição para Iniciantes


Prefácio

Este livro tem por objetivo possibilitar que o usuário iniciante em


programação VBA possa rapidamente desenvolver aplicações na área de
finanças. A partir de exemplos que podem ser compreendidos facilmente, o
livro permite um aprendizado bastante direto, auxiliando o leitor a elaborar
seus próprios algoritmos.
A obra não pretende atender às necessidades do usuário mais experiente,
que já tenha noções de macro no Excel. Em um contexto pragmático, o livro
traz uma abordagem prática, sem se preocupar com um rigor da sintaxe da
linguagem de programação, propiciando um direcionamento para que o leitor
possa rapidamente desenvolver suas próprias funções.
VBA é o acrônimo de Visual Basic for Applications. O VBA é a linguagem
de programação disponível no pacote Office da Microsoft® que permite ao
usuário mais exigente a criação de rotinas e funções que automatizam ou
diminuem sequências complicadas de operações. No Microsoft® Excel, o
ambiente de programação orientada a objetos do VBA envolve uma
linguagem de alto padrão e possibilita o acesso e a utilização dos recursos
disponíveis no programa, como a biblioteca de fórmulas, a interação com a
planilha de dados e o uso de soluções de outros usuários ou empresas.
Para exemplificar o aprendizado da linguagem, ao longo deste livro, serão
abordados temas relevantes em Finanças. Iniciaremos com implementações
simples, que permitirão o entendimento gradativo da estrutura da linguagem e
de aspectos computacionais importantes. Não se trata de uma obra que foca o
entendimento das nuances da computação eletrônica, mas de uma aplicação
prática da microinformática no auxílio de resolução de problemas do dia a dia
em Finanças com a flexibilidade, velocidade e eficiência exigidas pelo
profissional tomador de decisões pressionado pela dinâmica do mercado
financeiro.
Assim, abordaremos inicialmente conceitos básicos de finanças como, por
exemplo, capitalização de juros, para ilustrar as primeiras aplicações de
funções desenvolvidas no Excel. Posteriormente, discutiremos Modelo de
Precificação de Ativos de Capital (CAPM), no qual será permitido um
contato com o VBA de forma bastante simples obtendo o retorno esperado de
um ativo em função de alguns parâmetros. Apresentaremos também o
Modelo de Gordon para avaliação de ações para consolidar conhecimentos
básicos e para exemplificar o uso de parâmetros opcionais.
Na sequência, já demonstrando algumas estruturas de decisão utilizadas
em programação, o cálculo do Valor Presente Líquido (VPL) será
implementado em diversas versões. A cada código-fonte há uma discussão
sobre o tratamento das informações e, quando necessário, apresenta-se o
fluxograma de utilizado pelo algoritmo. A aplicação das funções criadas será
abordada na forma de exemplos e com valores numéricos simulando uma
situação financeira real.
O modelo de Black-Scholes também será abordado, permitindo a
ambientalização do uso de fórmulas inerentes do Microsoft® Excel. É também
discutido no livro, conceitos como Value-at-Risk, DeltaVar, ComponentVar
exemplificando o uso de matrizes de dados. Uma situação complexa que,
utilizando todos os recursos que foram abordados nos capítulos anteriores, é
discutida na obra para exemplificar o uso de programação para problemas de
finanças mais sofisticados.
Um capítulo extra foi adicionado com a utilização de simulação de Monte
Carlo para análise de risco. É importante destacar que essa obra tem como
foco desenvolvimento de funções, sem uma ênfase em sub-rotinas. Os
autores acreditam quea a abordagem de programação de funções permite um
entendimento mais rápido e mais sólido do VBA Excel.
Contexto profissional

Usuários mais avançados podem observar algumas limitações do Excel


relacionados à performance computacional e à adequação das funções
estatísticas presentes. Porém, para a maioria das aplicações em Finanças, o
Excel propicia um ambiente poderoso e amigável para a elaboração de
cálculos e geração de relatórios. Assim, tendo em vista que o Excel é uma
ferramenta amplamente utilizada pelos analistas e administradores
financeiros, abordamos uma nova perspectiva na sua utilização como
ferramenta de modelagem.
Aplicações que envolvem um número elevado de operações podem ser
implementadas em outras linguagens de programação, como por exemplo, C,
C++, Phyton ou R, que permitem controle sobre a utilização da memória do
computador e a otimização do processamento matemático. Estas rotinas
podem ser encapsuladas em bibliotecas de funções e eventualmente acessadas
pelo Excel. No entanto, o custo de desenvolvimento de programas em um
ambiente externo à plataforma do Excel pode ser elevado, não somente em
termos de capacitação técnica no desenvolvimento como também em termos
de auditoria, controle de qualidade e manutenção e atualização das rotinas.
Em geral, é mais fácil encontrar profissionais de Finanças que entendam de
Excel do que de outras linguagens de programação.
Assim, uma forma de aprimorar tanto os aspectos computacionais quanto
os de design de planilhas envolve a programação em VBA Excel. Embora o
uso do VBA exija a adaptação do mecanismo de cálculo para um algoritmo
computacional, ou seja, para a sintaxe de uma linguagem de programação,
suas vantagens são inúmeras:

Em primeiro lugar, a planilha tende a ficar mais clara e concisa, pois


grande parte dos cálculos é realizada no ambiente do VBA, não
necessitando de células na planilha para a realização de cálculos
intermediários. A velocidade de processamento e o uso de memória
também podem ser aprimoradas;
Em segundo lugar, a lógica de programação acaba orientando a
formulação de algoritmos. Assim, no processo de desenvolvimento do
próprio algoritmo, consegue-se identificar passagens desnecessárias ou
mecanismos repetitivos que podem ser automatizados;
Em terceiro lugar, os cálculos tornam-se mais documentáveis e
auditáveis dada a necessidade de estruturação do algoritmo de uma
forma lógica e dentro da sintaxe do VBA. Deste modo, evitam-se
planilhas, no mínimo, confusas, de difícil entendimento e manutenção.
Auditar planilhas sem uma programação de funções é extremamente
complicado. Utilizando a programação em VBA, os processos tornam-
se mais inteligíveis e menos vulnerável a erros; e
Finalmente, a evolução da regulamentação e dos mecanismos de
controle pode fazer com que áreas de auditoria e de validação de
modelos matemáticos comecem a exigir que os algoritmos sejam
desenvolvidos em um ambiente e formato que possam ser mais
facilmente analisados e rastreados. Neste contexto, o uso do VBA Excel
permite o desenvolvimento de planilhas mais profissionais, e observa a
tendência na elaboração de aplicações financeiras mais robustas e
sintonizadas com as exigências mais modernas.

Brasília, Maio, 2017

Herbert Kimura, Jim H. Aburaya, Vinicius A. Sobreiro e Leonardo F. C.


Basso
Capítulo 1
Bem vindo ao Microsoft® Excel

Para iniciarmos o desenvolvimento das rotinas em VBA no Excel é


necessário abrir a janela de edição de código. Na versão 2016, o editor do
Visual Basic é acessado através do menu Desenvolvedor, na faixa de
opções[1] (Figura 1.1), ou, por meio de um atalho, através da combinação de
teclas [ALT] + [F11]. A janela do editor do Visual Basic então se abre
(Figura 1.2). Caso não encontre esta opção, ou esta esteja desabilitada, é
possível que este recurso não tenha sido incluído na instalação original. Neste
caso, reinstale o pacote Office, assegurando que a versão completa foi
instalada.

Figura 1.1: Acesso ao editor do Visual Basic.


Figura 1.2: Janela do editor do Visual Basic.

No Excel 2016, a opção de acesso aos recursos do VBA encontra-se


desabilitada como padrão. Para habilitar estes recursos, deve-se, ao iniciar
uma nova sessão do Excel, clicar sobre o Botão Arquivo (Figura 1.3), para
ter acesso ao botão de Opções do Excel (Figura 1.4):

Figura 1.3: Botão Arquivo do Excel 2016.


Figura 1.4: Opções do Excel 2016.

Ao acessarmos as Opções do Excel, devemos clicar sobre a opção


Personalizar Faixa de Opções (Figura 1.5) e marcar a opção
Desenvolvedor. Clique em OK e observe que o menu Desenvolvedor surge
na barra de menus (Figura 1.6). Ao clicar sobre a guia, o acesso ao editor do
VBA pode ser localizado no canto superior esquerdo (Figura 1.6). Ao clicar
sobre o botão Visual Basic, ou a o atalho dado pelas teclas [ALT] + [F11], a
janela do editor do Visual Basic se abre (Figura 1.7).
Figura 1.5: Mostrar guia Desenvolvedor na Faixa de Opções.

Figura 1.6: Guia Desenvolvedor ativa.

Figura 1.7: Janela do editor Visual Basic.

No ambiente do editor, além das barras tradicionais: barra de título, de


menus e de ferramentas; é possível identificar três janelas filhas, as quais irão
ser exploradas: a janela de navegação do projeto VBA (Project Explorer), a
janela de propriedades e a janela da área de código (Figura 1.7). Estas
janelas filhas podem ser acessadas, quando não visíveis através das opções
correspondentes no menu Exibir ou através das teclas de atalho: [CTRL]+[R],
[F4] e [F7] respectivamente.
Como o objetivo deste livro é apresentar os conceitos de VBA, com
aplicações na área financeira, utilizando o Excel, muitas possibilidades e
funcionalidades do ambiente de programação não serão exploradas. São
inúmeros os recursos disponíveis e, a despeito da grande variedade de obras
sobre o assunto, nenhuma delas esgota o assunto.
Assim, modestamente iremos explorar alguns modelos utilizados em
Finanças e permitir ao leitor que se inicie na arte de programar. Contudo,
mesmo que conhecimentos de computação não sejam necessários
inicialmente, é bem-vinda a leitura de obras voltadas à programação
estruturada e à programação orientada a objetos. Àqueles leitores que
pretendem se tornar desenvolvedores de aplicações, por exemplo, envolvendo
banco de dados profissionais ou interfaces mais sofisticadas com o usuário,
deverão fazê-lo através de leitura de conceitos mais aprofundados sobre o
assunto.
1.1 Visual Basic como Linguagem de Programação

Programar resume-se em instruir o computador a realizar tarefas para nós.


Para tanto, uma linguagem apropriada deve ser empregada. As operações no
processador ocorrem na forma de binária, utilizando palavras e instruções
formadas por bits. Contudo a programação em linguagem binária é
praticamente impossível de ser realizada por seres humanos devido a sua
complexidade. Assim, criam-se ferramentas que transportam nossa intenção
em instruções computacionais, permitindo a utilização de poderosas
máquinas de processamento para efetuar cálculos e automatizar processos.
Neste cenário, o Visual Basic é uma linguagem de programação que
disponibiliza instruções (códigos) que, por serem construídas de forma
lógica, podem ser interpretadas e transformadas (compiladas) em linguagem
de máquina, acessando os diversos recursos disponíveis no ambiente do
sistema operacional.
Estas instruções são interpretadas linha a linha, de cima para baixo, como
uma lista de tarefas a realizar. Para esta lista, dá-se o nome de código-fonte.
Dentro de uma mesma linha, algumas instruções, como as de atribuição, são
interpretadas da direita para a esquerda; outras, como as de tomada de
decisão, são interpretadas da esquerda para a direita. Não se preocupe em
entender os pormenores. Você irá absorver estes conceitos à medida que os
códigos-fonte sejam apresentados e interpretados.
Seguindo esse conceito, não vamos abordar aspectos computacionais sem
sua aplicação imediata. A cada capítulo iremos abordar aspectos do ambiente
de programação do Visual Basic, no momento exato da exigência de um
conhecimento mais aprofundado. Assim, ao tratarmos de variáveis passadas
como argumento de funções, iremos também abordar os tipos de variáveis e
as operações matemáticas disponíveis para ele.
Contudo, vale uma atenção especial, dentre as várias instruções que
utilizaremos, para os blocos de tomada de decisão e os recursivos ou também
chamados de laço. A mais comum instrução para tomada de decisão é sem
dúvida o If Then Else (Se, então, senão). A instrução testa uma condição
(por isso, também é conhecida como instrução condicional) que, em caso
afirmativo (True) executa certo bloco de instruções. Opcionalmente, um
segundo bloco de instruções pode ser executado em caso negativo (False).
Assim, se tivéssemos duas variáveis a e b e uma condição de teste a=b, e o
bloco para a condição True associado a abrir uma caixa com a mensagem:
“As variáveis possuem o mesmo valor.”; poderíamos ter o seguinte código-
fonte.

01 If a=b Then
02 Msgbox “Correto! As variáveis possuem o mesmo valor.”
03 End If

Código 1.1: Código fonte 1.

Note que a instrução If necessita que seu escopo seja delimitado através
de uma palavra-chave para o interpretador: End If. Se tivéssemos a condição
negativa com a mensagem: “As variáveis não possuem o mesmo valor.” o
código tomaria a forma:

01 If a=b Then
02 Msgbox “Correto! As variáveis possuem o mesmo valor.”
03 Else
04 Msgbox “As variáveis não possuem o mesmo valor.”
05 End If

Código 1.2: Código-fonte 2.

Entre as palavras-chaves Then e Else contemplam-se as instruções que


determinaram as ações em caso afirmativo da condição de teste da instrução
If. De forma similar, entre as palavras-chaves Else e End If, as instruções de
tratamento em caso de negação da condição de teste.
Poderíamos ter feito uma outra pergunta, isto é, uma outra condição de
teste. Por exemplo: a é maior que b? Neste caso o operador lógico definido
em Visual Basic é o sinal de “maior que” (>). Vamos ao código.

01 If a>b Then
02 Msgbox “A variável a é maior que a variável b.”
03 Else
04 Msgbox “A variável b é maior que a variável a.”
05 End If

Código 1.3: Código-fonte 3.

Note que nesse código, não estamos contemplando, de maneira ingênua, a


possibilidade de a ser igual a b, como já tratado anteriormente. Um resumo
de operadores lógicos será apresentado na medida em que sejam necessários
em nossos códigos-exemplos.
Já estruturas de laço são importantes mecanismos de programação que
permitem a utilização de algoritmos recursivos, nos quais há a repetição de
uma específica sequência de instruções. Os laços geralmente são quebrados
assim que atingem uma condição. Deste modo, algum tipo de teste é
realizado, antes ou depois, de cada iteração, permitindo controlar a
quantidade de vezes em que a rotina implementada será executada. Em
particular, temos o For Next e o Do Loop. Em nossas rotinas, apenas o For
Next será utilizado. Assim, tratemos de examiná-lo.
Por exemplo: suponha que gostaríamos de gerar o resultado da soma dos
números 1 a 10. Isto é 1+2+3+...+10. Uma possível implementação seria:
01 a=0
02 For i=1 To 10
03 a=a+i
04 Next i

Código 1.4: Código-fonte 4.

Interpretando o código: temos na linha 1 a atribuição do valor zero à


variável a; na linha 2, uma segunda variável, i, tem seu valor inicial igual a 1;
na linha 3 a variável a assume seu próprio valor somado ao valor da variável
i; na linha 3 a variável i é incrementada em uma unidade, retornando a linha 2
onde a instrução For testa a variável i que, neste caso, se i > 10 a próxima
linha a ser executada é a posterior a linha 4.
Um aspecto no VBA que pode causar confusão ao iniciante em
programação envolve a linha 3. Afinal, matematicamente como “a” pode ser
igual a “a + i”? A lógica nessa sintaxe é que, ao se estabelecer “a = a + i”, o
primeiro “a” receberá um valor atualizado igual ao “a” anterior mais o valor
de “i”. Assim, dentro da sintaxe de programação do VBA, a linha indica que a
variável “a” receberá um novo valor que depende de seu valor anterior
adicionado ao valor de “i”.
O incremento em um laço pode ser redefinido através da palavra-chave
Step, atribuindo qualquer valor ao passo de incremento. No exemplo a seguir
vamos tomar incrementos de 0,2 obtendo o valor de 5,2+5,4+5,6+ ...6,0.

01 a=0
02 For i=5.2 To 6 Step 0.2
03 a=a+i
04 Next i

Código 1.5: Código-fonte 5.

As estruturas de decisão e laço no Visual Basic não estão restritas apenas


ao If Then Else e ao For Next. Há ainda variações do tema como o Select
Case, If, For Each Next, Do While, Do Until que podem ser encontradas
em livros especializados em programação Visual Basic. Vamos nos ater às
instruções básicas e nos casos interativos com a planilha de cálculo do Excel,
que já permitem a elaboração de aplicações de grande utilidade.
Capítulo 2
Modelos de juros

O Excel possui uma gama de fórmulas matemáticas que permite a


realização de operações variadas, desde soma e subtração, passando por
métodos estatísticos e funções trigonométricas, até mecanismos para solução
de equações não-lineares. No entanto, em algumas situações, a
implementação de uma função específica pode agilizar o processo de cálculo.
Assim, a utilização mais imediata do VBA do Excel envolve a utilização de
funções definidas pelo usuário, atribuindo características precisas e
detalhadas para um determinado problema ou situação.
Neste capítulo, vamos propor modelos financeiros simples que poderiam
ser facilmente calculados através do uso de funções predefinidas e básicas do
Excel como, por exemplo, operações de soma, subtração, multiplicação e
divisão. Porém, ilustraremos a programação em VBA desenvolvendo funções
específicas que replicam, no ambiente de programação, fórmulas que
comumente são implementadas diretamente na planilha. Esses exemplos,
apesar de básicos, possibilitam que o leitor possa rapidamente compreender
os conceitos mais simples de programação no Excel e já implementar uma
função em VBA.
No decorrer do livro, aplicações mais sofisticadas serão discutidas.
Todavia, é importante que o leitor se familiarize com o ambiente e com a
lógica de programação por meio de exemplos mais diretos. Assim, o objetivo
didático deste capítulo é mostrar como parâmetros são passados às funções
definidas em VBA. Procuraremos evidenciar a sintaxe de desenvolvimento de
funções para utilização no Excel, utilizando, como exemplo, modelos de
capitalização simples e composta.
2.1 Uma breve referência a finanças

Um dos aspectos fundamentais em finanças é a atribuição de juros, que


representam um custo de oportunidade ou o valor do dinheiro no tempo.
Praticamente qualquer operação ou produto financeiro possui algum cálculo
de taxa de juros associado. Na prática, quase todo analista usa funções
matemáticas na planilha para resolver problemas que envolvam valor
presente ou valor futuro. Em linhas gerais, a capitalização é a aplicação de
juros sobre um valor de referência.
Na capitalização simples, a cada período, os juros incidem somente sobre
o valor de referência. Na capitalização composta, os juros incidem sobre o
valor de referência acrescido da remuneração do capital.
2.2 Capitalização simples

No caso da capitalização simples, um investimento de valor presente –


VP, aplicado a uma taxa de juros i por n períodos, tem um valor futuro – VF
dado pela fórmula:

(2.1)

Esta fórmula de capitalização simples será usada para ilustrar como


funções podem ser rapidamente desenvolvidas em VBA. Neste caso, será
implementada uma função que dá como resultado o valor futuro, a partir de
parâmetros de entrada referentes (i) ao valor presente, (ii) à taxa de juros ao
período e (iii) ao número de períodos.
Para discutir o conceito, o caso a seguir ilustra uma operação típica de
mercado financeiro, no qual um investimento em dólar tem juros
capitalizados de forma simples.

Exemplo 2.1: Suponha que um investidor adquira um produto financeiro no


qual aplica um valor presente VP = $100.000. Este produto será resgatado ao
final de n = 3 anos, corrigido por uma taxa anual de i = 5%. Ao final de três
anos, qual o valor futuro VF a ser resgatado pelo investidor considerando
capitalização simples, ou seja, juros incidindo somente no valor inicial
investido?

Resolução:

Ao final do primeiro ano, a taxa de juros de 5% é aplicada sobre o valor


investido $100.000, obtendo-se um total de juros J1, ou seja:
Ao final do segundo ano, novamente a taxa de juros é aplicada sobre o
valor investido, obtendo-se um total de juros J2 de:

Note que os juros incidem sobre o valor inicial VP. Este procedimento
caracteriza a capitalização simples, por meio da qual os juros são sempre
aplicados a um valor inicial de referência, no caso, ao investimento inicial
dado por VP.
Assim, de maneira análoga, ao final do terceiro ano, o investidor também
recebe juros de 5% sobre o valor investido $100.000.

Ao final do período de aplicação, o investidor deve receber o valor


investido acrescido dos juros obtidos nos três anos. Estabelecendo VF como o
valor futuro a receber no final do período, temos:

Ou seja, o valor de resgate, ao final de 3 anos, de uma aplicação de


$100.000 que paga 5% ao ano, capitalizada de forma simples, é igual a
$115.000. De fato, se substituirmos os dados do exemplo na Equação 2.1,
obtemos:

Usuários com conhecimentos básicos em Excel geralmente implementam


esse cálculo de valor futuro usando as operações na própria planilha. Agora,
vamos utilizar o mesmo exemplo e implementar essa equação utilizando os
recursos do VBA. Nesse primeiro contato, o roteiro passo a passo proposto
pode ser seguido:

• Abra o Excel;
• Inicie o editor do Visual Basic;
• Insira novo módulo através da opção Módulo do menu Inserir (Figura
2.1); e
• Uma nova janela, referente ao módulo inserido, é aberta (Figura 2.2).

Figura 2.1: Opção Módulo do menu Inserir do editor do Visual Basic.


Figura 2.2: Módulo 1.

No editor do módulo, digite o código a seguir:

01 Function VFCS(VP, N, TJ) As Double


02 VFCS = VP * (1 + N * TJ)
03 End Function

Código 2.1: Código-fonte 6.

O resultado deve ser semelhante ao obtido na Figura 2.3.


Figura 2.3: Implementação da função VFCS (Valor Futuro por Capitalização Simples).

Volte ao ambiente da planilha utilizando a barra de tarefas do Windows,


ou do ícone correspondente na barra de ferramentas, ou do atalho [ALT] +
[F11]. Digite os seguintes valores e fórmulas nas células da planilha do
Excel:

• Na célula A1, o texto “VP”;


• Na célula A2, o texto “N”;
• Na célula A3, o texto “TJ”;
• Na célula A4, o texto “VFCS”;
• Na célula B1, o valor correspondente à VP: 100.000;
• Na célula B2, o valor correspondente à N períodos: 3;
• Na célula B3, o valor correspondente à TJ: 5%; e
• Na célula B4, a expressão: “=VFCS(B1;B2;B3)”.

É importante observar que a descrição refere-se a um ambiente Excel no


qual parâmetros não separados por ponto e vírgula, que é o padrão no caso
brasileiro. O resultado deve ser semelhante ao obtido na Figura 2.4. O leitor
pode notar que a medida em que vai escrevendo o nome da função, o próprio
Excel já mostra a sugestão de uso da nova função VFCS criada pelo usuário.

Figura 2.4: Implementação da função VFCS (Valor Futuro por Capitalização Simples).

Você já deve ter notado que o resultado obtido é o mesmo que a solução
demonstrada neste exemplo. Isto é, de $115.000 (Figura 2.5). Você deve ter
percebido que a criação de funções é, de certa forma, simples e facilmente
implementável. Longe das complicações teóricas de programação, iremos
sempre facilitar ao usuário que necessita de aplicação imediata dos
fundamentos aqui descritos. Novamente, insistimos em dizer que são
inúmeras possibilidades de funções definidas pelo usuário, e de rotinas que
podem ser criadas para a solução de praticamente quaisquer modelos
financeiros atuais.
Figura 2.5: Valor obtido da função VFCS.

Vamos voltar ao código e entender sua estrutura:

01 Function VFCS(VP, N, TJ) As Double


02 VFCS = VP * (1 + N * TJ)
03 End Function

Código 2.2: Código-fonte 7.

Note que a numeração das linhas do código-fonte, à esquerda, é apenas


um recurso gráfico, incluído no livro, para que haja uma referência à linha,
cujos comentários estão relacionados. É importante enfatizar que os
comandos em VBA são os mesmos em qualquer linguagem do Excel,
seguindo o idioma inglês. Quando possível, teclas de atalho estarão
indicadas. Perceba que todo o código está grafado em tipografia diferente do
texto.
Neste código temos um exemplo de função. A função está definida entre
duas declarações: Function e End Function. O Visual Basic processa o
código em linhas, isto é, o interpretador do VBA lê a primeira linha do
código, processa-a, passando à segunda linha, e assim sucessivamente. Deste
modo, quando o interpretador encontra a instrução Function
automaticamente reconhece que os parâmetros seguintes são os que darão
funcionalidade a uma função no VBA. Da mesma forma, encontrar End
Function sinaliza o fim do código da função.
Esta maneira como o VBA processa as instruções é utilizada em outras
estruturas de programação como o If e End If, que será abordado nos
códigos de tópicos posteriores. O entendimento deste simples código é vital
para as futuras implementações. Na primeira linha, i.e., na linha 1, temos a
referência à declaração Function, que sinaliza o interpretador do VBA para o
código de uma função, cujo nome foi dado como VFCS, mnemônico e
acrônimo de Valor Futuro por Capitalização Simples. O leitor poderia dar um
nome qualquer para essa função, lembrando que, para usá-la na planilha,
deve usar o nome atribuído no código.
Da fórmula de capitalização simples, sabemos que há algumas variáveis
relevantes: VP (Valor presente), N (Número de períodos de aplicação) e TJ
(Taxa de juros). Assim esses parâmetros devem ser passados como
argumentos ou parâmetros para o código. Essa passagem de parâmetros é
realizada através da sintaxe VFCS(VP,N,TJ). Desta forma, ao acessarmos a
função pelo Excel, há a necessidade de fornecermos valores para cada uma
das variáveis, sejam eles numéricos, ou endereçados a uma célula.
O termo As Double indica ao VBA que a função VFCS foi declarada
como um número do tipo Double, isto é, a célula, ou a rotina que chamar a
função receberá como resposta, um valor do tipo Double. Vale a pena, aqui,
falar um pouco mais sobre os tipos de variáveis. Essencialmente, em VBA,
temos quatro tipos de variáveis: (i) numéricas, (ii) booleanas (lógicas), (iii)
textuais ou (iv) estruturadas numa combinação das três anteriores. As
numéricas, que são os principais alvos de estudo em finanças, podem ser
então (i) escalares ou (ii) vetoriais (matriciais) e podem ter seu escopo de
abrangência conforme o espaço reservado na memória.
Este espaço é definido conforme declaramos no código do programa.
Temos então as do tipo Byte podendo representar números de 0 a 255 e outras
conforme quadro (Tabela 2.1) a seguir:

Tipo de Dado Memória Escopo


Byte 1 byte 0 to 255
Boolean 2 bytes True or False
Integer 2 bytes -32.768 to 32.767
Long 4 bytes -2.147.483.648 to 2.147.483.647

Single 4 bytes -3.402823E38 to -1.401298E-45†


1.401298E-45 to 3.402823E38‡
-1.79769313486231E308 to -4.94065645841247E-324‡
Double 8 bytes
4.94065645841247E-324 to 1.79769313486232E308†
Currency 8 bytes -922.337.203.685.477.5808 to 922.337.203.685.477.5807
+/- 79.228.162.514.264.337.593.543.950.335
7,922816251
Decimal 14 bytes (with 28 decimal places)
+/-0.0000000000000000000000000001
(Lowest decimal number other than zero)
Date 8 bytes January, 1 100 to December, 31 9999
Variant 16 bytes Similar to Double
Tabela 2.1: Tipos de dados utilizados em variáveis no VBA, espaço reservado na memória e escopo de
valores representados.
† ‡
Notas: Valores positivos e valores negativos. Para as versões de 2013 em diante.

O leitor não precisa se preocupar em decorar ou entender detalhadamente


a Tabela 2.1. É importante compreender que uma função gera um resultado
que, no caso da maior parte das aplicações em finanças, será valor um
numérico. O Double simplesmente estabelece que a função gerará um
resultado numérico que pode ser não inteiro, isto é, pode ter diversas casas
decimais. Se o resultado da função pudesse ser somente um valor inteiro
pequeno, no intervalo entre −32.768 e 32.767, então a função poderia ser
declarada como Function VFCS(VP, N, TJ) As Integer. Se o resultado da
função pudesse ser somente um valor inteiro muito grande, fora do intervalo
anterior, então a função poderia ser declarada como Function VFCS(VP, N,
TJ) As Long. No caso, do nosso problema financeiro, obviamente que a
escolha da função como Integer ou Long é inapropriada, pois o valor futuro
pode assumir valores não-inteiros.
Um leitor mais atento poderia questionar porque então não se define uma
função sempre como Double, uma vez que seria mais abrangente que o
Integer e o Long. No entanto, em certas situações, o resultado da função é
intuitivamente inteiro e, desta maneira, declará-la como Integer ou Long é
uma escolha natural. Além disso, através dos números de bytes descritos na
Tabela 2.1, pode-se verificar que um Double ocupa o dobro de memória do
computador do que um Long e o quádruplo de memória que um Integer.
Para aplicações em que memória alocada e velocidade de processamento
sejam essenciais, detalhes como a definição do tipo de dados tornam-se
críticos. Em algumas aplicações financeiras mais sofisticadas, o tempo de
processamento em uma planilha Excel pode demorar horas e, portanto, a
inadequada inicialização de dados pode comprometer ou até mesmo
inviabilizar um cálculo financeiro. Neste livro, as funções que criaremos não
envolvem uma alocação de memória crítica e, portanto, na maioria das
situações as funções serão definidas como Double.
Voltando à descrição da função de capitalização simples. O corpo da
função apresenta uma única linha (linha 2) aonde estamos atribuindo o
retorno da função VFCS, isto é o valor que será passado como resultado da
função, por meio do operador de atribuição =. Operadores matemáticos, neste
caso, aritméticos, foram utilizados para as operações de soma (+) e
multiplicação (*). Há outros operadores aritméticos como segue (Tabela 2.2)
e que também podem ser usados para funções a serem criadas pelo usuário
em VBA.
Operador aritmético Utilização Exemplo
^ Exponenciação 3^2 resulta em 9
* Multiplicação 3*2 resulta em 6
/ Divisão 4/2 resulta em 2
\ Inteiro da Divisão 3\2 resulta em 1
Mod Resto da Divisãi 3 Mod 2 resulta em 0.5
+ Soma 1+2 resulta em 3
- Subtração 3-1 resulta em 2
Tabela 2.2: Operações aritméticas presentes no VBA e exemplos de aplicação.

Parênteses são usados em sua forma habitual, ou seja, podem ser


aninhados e as operações entre os parênteses mais internas precedem as mais
externas, bem como as operações de multiplicação e divisão precedem as
operações de soma e subtração. O quadro anterior está em ordem de
precedência de operações. Assim, na função que criamos, a operação N * TJ
será realizada inicialmente, e o resultado será somado a 1, cujo resultado será
multiplicado a VP e atribuído a VFCS. Finalmente a declaração de fim da
função End Function sinaliza o retorno do valor atribuído à chamada da
função. No exemplo, o retorno da função é apresentado na célula B4.
Resumindo, a função que batizamos como VFCS calcula o valor futuro,
através de capitalização simples, levando-se em consideração os parâmetros
de entrada VP, N e TJ. A fórmula de cálculo de VFCS é VP * (1 + N * TJ).
Na planilha do Excel, após a digitação do código da função, VFCS estará
disponível para ser usada como uma função qualquer do Excel. Para uso da
função na planilha, basta fazer como qualquer outra função. Coloca-se o sinal
de igual, o nome da função e os parâmetros da função.
De acordo com a ordem dos parâmetros no código da função, o valor
presente, o número de períodos e a taxa de juros devem ser incluídos de
forma subsequente. Por exemplo, se a função fosse declarada como Function
VFCS(VP, TJ, N), então a ordem de inclusão de parâmetros na função seria
o valor presente, a taxa de juros e o número de períodos. Assim, a ordem dos
parâmetros definida no código da função deve ser mantida quando a função
for usada na planilha.
2.3 Capitalização composta

Um outro exemplo que pode ajudar a consolidar ideias envolve a


implementação de uma função para obter o valor futuro por meio da
capitalização composta. A capitalização simples tem algumas aplicações,
principalmente no mercado de câmbio, no qual transações podem envolver a
incidência de juros somente sobre o valor inicial. Porém, a maioria das
aplicações, principalmente no caso de produtos financeiros, envolve uma
capitalização denominada de composta. Neste tipo de capitalização os juros
de um período incidem sobre o valor total de um período anterior. Ou seja, na
capitalização composta pode haver incidência de juros sobre juros.
Genericamente, sendo o prazo da aplicação n períodos, a fórmula do valor
futuro VF de um valor presente VP a partir de uma capitalização composta de
uma taxa de juros i é dada por:

(2.2)

Exemplo 2.2: Suponha uma aplicação financeira na qual o investidor obtém


juros capitalizados de forma composta. Como no estudo de caso da
capitalização simples, o objetivo é calcular o valor futuro VF de um
investimento de valor presente VP após um número de n períodos de
capitalização composta, considerando uma taxa de juros igual a i ao período.
Suponha que um investidor adquira um produto financeiro no qual aplica VP
= $100.000. Esse produto será resgatado ao final de n = 3 anos, corrigido por
uma taxa anual i = 5%. Ao final de três anos, qual o valor futuro VF a ser
resgatado pelo investidor, considerando uma capitalização composta?

Resolução:

Ao final do primeiro ano, a taxa de juros de 5% é aplicada sobre o valor


investido R$100.000, obtendo-se um total de juros J1, ou seja:

Ao final do segundo ano, a taxa de juros é aplicada sobre o valor


acumulado, que incorpora o valor investido, bem como os juros do primeiro
período. Assim, os juros eferentes ao segundo ano são dados por J2:

Note que os juros estão incidindo sobre o valor inicial VP, acrescido dos
juros J1. Este procedimento caracteriza a capitalização composta, na qual os
juros são aplicados a um valor inicial de referência, no caso, ao investimento
inicial dado por VP, e também aos juros incorridos em períodos anterior, no
caso J1.
De forma análoga, ao final do terceiro ano, a taxa de juros de 5% é
aplicada sobre o valor investido $100.000 e todos os juros devidos
anteriormente.

Ao final do período de aplicação, o investidor deve receber o valor


investido acrescido dos juros obtidos nos três anos. Estabelecendo VF como o
valor futuro a receber no final do período, temos:

Ou seja, o valor de resgate de uma aplicação de $100.000 que paga 5% ao


ano, capitalizado de forma composta, é igual a $115.762,50. Este resultado
pode ser obtido diretamente pela fórmula dada em 2.2:

Um usuário comum desenvolveria a seguinte planilha:

Figura 2.6: Resolução do exercício utilizando as funções básicas do Excel.

No entanto, um usuário que saiba VBA pode desenvolver uma função no


Excel e incorporá-la em uma biblioteca. Como fizemos para a capitalização
simples, podemos usar a equação acima para exemplificar a programação de
funções usando o ambiente do VBA para Excel. Chamaremos a função de
VFCC, representativo de valor futuro através de capitalização composta. Os
parâmetros da função serão (i) o valor presente VP, (ii) o número de períodos
N e a taxa de juros ao período TJ.

01 Function VFCC(VP, N, TJ) As Double


02 VFCC = VP * (1 + TJ) ^ N
03 End Function

Código 2.3: Código-fonte 7.

Na janela de código, a implementação desta função pode ser realizada em


sequência à função VFCS (Figura 2.7), conforme apresentado a seguir:

Figura 2.7: Implementação da função VFCC (Valor Futuro por Capitalização Composta).

A chamada da função possui os mesmos parâmetros. Utilizando-a na


planilha temos (Figura 2.8):
Figura 2.8: Utilização da função VFCC na planilha.

E o valor obtido é o correspondente a resolução do exemplo dado: (Figura


2.9).

Figura 2.9: Valor obtido da função VFCC.


2.4 Exercício de fixação - Capitalização contínua

A capitalização contínua representa um mecanismo de incidência de juros


que ocorre a todo instante. Em termos conceituais, pode-se dizer que a
capitalização contínua é uma capitalização composta na qual a incidência de
juros ocorre a cada momento de forma contínua e não a cada período de
forma discreta como é o caso das capitalizações simples e composta.
O leitor pode estranhar em um primeiro momento e indagar que tipo de
aplicação possui uma capitalização contínua, na qual os juros sejam
computados a todo instante continuamente. Na prática, este tipo de
capitalização não é usual. Porém, em modelos teóricos de precificação de
produtos financeiros, em algumas situações, a capitalização contínua é
importante. Por exemplo, a fórmula de Black-Scholes, amplamente utilizada
no mercado para precificação de derivativos, pressupõe que a taxa de juros é
capitalizada continuamente.
Sem entramos em detalhes sobre a capitalização contínua, considerando
nosso objetivo de capacitar o leitor no desenvolvimento de funções no VBA
do Excel, nossa proposta é a programação da função específica. Assim, como
exercício de fixação, propomos que o leitor desenvolva uma função em VBA
que permita calcular o valor futuro VF de um investimento de valor presente
VP, aplicado durante n períodos e corrigido por uma taxa de juros i ao
período, com capitalização contínua. A equação do valor futuro com
capitalização contínua é dada por:

(2.3)

No VBA do Excel, a função exponencial é denotada por Exp(). Assim,


pede-se que o leitor desenvolva o código da função de valor futuro com
capitalização contínua, com parâmetros de entrada representativos do valor
presente, do número de períodos e da taxa de juros.

Resposta

Uma possível implementação da função de capitalização composta é


apresentada a seguir:

01 Function VFCN(VV, N, TJ) As Double


02 VFCN = VP * Exp(N * TJ)
03 End Function

Código 2.4: Código-fonte 8.


Capítulo 3
Precificação de ativos

O capítulo anterior permitiu que o leitor se familiarizasse com o ambiente


de programação do Excel. Por meio da construção de funções relativas à
capitalização de juros, o leitor pôde ter contato com algumas sintaxes da
linguagem do VBA e perceber que a programação de funções é extremamente
simples. Em especial, os exemplos servem para mostrar que qualquer
indivíduo com conhecimento do ambiente e da lógica de uma planilha Excel
pode rapidamente programar em VBA.
Neste capítulo, vamos treinar o desenvolvimento de outras funções que,
de certa maneira, são mais interessantes do ponto de vista financeiro. Porém,
como o leitor poderá perceber, o desafio de implementação em VBA não é
muito diferente do que foi conduzido no capítulo anterior. Para um melhor
entendimento dos conceitos financeiros do CAPM, o leitor pode consultar
Brealey, Myers, and Allen (2016).
3.1 Aplicação do modelo de precificação de ativos de capital

Uma ferramenta bastante comum em análises financeiras é o Capital


Asset Pricing Model (CAPM), isto é, o modelo de precificação de ativos de
capital. O CAPM é um modelo amplamente utilizado em finanças e sua
fórmula envolve apenas operações básicas de adição e multiplicação,
facilitando a exposição dos conceitos iniciais do VBA.
O CAPM resume um item fundamental da teoria financeira, que relaciona
retorno esperado com o nível de risco, representando, matematicamente, um
resultado intuitivo de que quanto maior o risco assumido, maior o retorno
esperado.
Embora a demonstração do CAPM seja matematicamente rigorosa, sua
argumentação lógica é relativamente simples. Partindo de algumas premissas,
o modelo de precificação de ativos de capital leva à conclusão de que o
retorno esperado de um ativo é diretamente proporcional ao seu nível de
risco.
Em especial, de acordo com o CAPM, o retorno esperado de um ativo é
maior quanto maior for seu nível de risco sistemático. O risco sistemático é
uma medida da sensibilidade dos retornos de um ativo em relação a uma
carteira representativa do mercado como um todo.
Quando um ativo possui risco sistemático grande, sua sensibilidade com
relação a flutuações do mercado é maior. Uma medida da sensibilidade risco
sistemático de um ativo é comumente chamada de beta (β) do ativo. Pelo
CAPM, um ativo com beta grande, i.e., com risco sistemático elevado, deve
ter maior retorno esperado.
De maneira oposta, um ativo pouco susceptível às flutuações do mercado
como um todo envolve menos risco sistemático e, portanto, um retorno
esperado menor. Em particular, para um retorno esperado de um ativo A, aqui
representado por RA, a derivação do CAPM conduz à seguinte equação, que
associa risco e retorno:

(3.1)

No qual
• RF: retorno esperado do ativo livre de risco;

• βA: sensibilidade risco sistemático associado ao ativo A; e


• RM: retorno esperado do mercado.

Assim, o CAPM estabelece um dos princípios da teoria moderna de


finanças. Quanto maior o risco sistemático βA de um ativo A, maior seu
retorno esperado RA. Mais especificamente, o retorno esperado de um ativo
equivale a uma taxa de juros de uma aplicação sem risco RF adicionada de um
prêmio pelo risco de mercado (RM − RF) ajustado pelo risco sistemático βA do
ativo.
É relevante observar que estamos simplificando a notação do valor
esperado para facilitar a definição de variáveis no código da função em VBA.
Assim, ao invés de usarmos uma notação mais rigorosa E(R) para retorno
esperado, estamos simplesmente estabelecendo o conceito de retorno como R.
3.2 Aplicações do CAPM

O CAPM é utilizado em diversas aplicações em finanças. Por exemplo:


investidores podem estimar preços justos de ações, projetando dividendos
esperados, e trazendo-os a valor presente por uma taxa de retorno, estimada
por meio do CAPM, compatível com o nível de risco dos fluxos de caixa.
A análise de valor de empresas em processos de fusões e aquisições
também leva em consideração, as estimativas de custo de capital baseadas no
CAPM. O estudo de viabilidade de projetos considerando-se técnicas de valor
presente líquido também pode utilizar uma taxa de retorno que desconta
fluxos de caixas, obtida a partir do CAPM.
Adicionalmente, avaliações de criação de valor, como as envolvendo o
Valor Econômico Adicionado ou Economic Value Added (EVA), têm um
custo de capital que pode ser estimado também pelo CAPM. Assim, o CAPM
possui inúmeras aplicações em finanças.
Destaca-se, pela equação 3.1, que o retorno esperado de um ativo RA
depende do retorno RF de um ativo livre de risco, da estimativa do risco
sistemático βA e do retorno esperado do mercado RM.
Tecnicamente, o beta de um ativo, por definição, é a covariância dos
retornos deste ativo com a variância dos retornos do mercado. Porém,
destacando-se da tecnicalidade da definição estatística, como já explicado
anteriormente, o beta é uma medida de sensibilidade de como o ativo flutua
em relação a flutuações do mercado. Uma forma de estimação do beta será
estudada em um capítulo posterior, com auxílio de uma função programada.
A seguir, discute-se um exemplo para ilustrar o uso do CAPM.

Exemplo 3.1: Um analista estimou o beta de uma ação em 1,3. Sabendo que
um investimento em um ativo livre de risco rende 11% ao ano e que o
mercado como um todo tem um retorno esperado de 18% ao ano, obtenha o
retorno esperado da ação.

Resolução:

Aplicando esses valores à equação 3.1 temos:

ao ano

Ou seja, a taxa de retorno esperada do ativo é de 20,1% ao ano. Pelo fato


de o ativo possuir um beta superior a 1, pode-se classificá-lo como ativo
agressivo, com risco sistemático maior que o mercado como um todo. Tendo
um risco sistemático maior que o do mercado, o retorno esperado do ativo
(20,1%) também é maior que o retorno esperado do mercado (18,0%).
O código-fonte que implementa o retorno esperado de um ativo está na
sequência. Note que a função se chama fncRA e possui argumentos de
entrada dados por RF para o retorno esperado do ativo livre de risco, BA para
sensibilidade ou beta, ou risco sistemático associado ao ativo A e RM para o
retorno esperado do mercado.

01 Function fncRA(RF, BA, RM) As Double


02 fncRA = RF + BA * (RM - RF)
03 End Function

Código 3.1: Código-fonte 9.

Na janela do editor do Visual Basic for Applications poderíamos ter a


seguinte situação (Figura 3.1) com um possível resultado obtido na planilha
do Excel (Figura 3.2). Observe que o valor obtido pela aplicação da função é
idêntico ao valor calculado anteriormente no nosso exemplo.
Figura 3.1: Código da função fncRA (Retorno esperado de um ativo A).

Figura 3.2: Valor obtido da função fncRA.


3.3 Beta do ativo

Ainda explorando a questão do risco sistemático, podemos obter outras


fórmulas a partir da fórmula do CAPM, ou seja, se conhecêssemos o retorno
esperado de um certo ativo A (RA), o retorno esperado do ativo livre de risco
(RF), e o retorno esperado do mercado (RM), a sensibilidade risco sistemático
associado ao ativo A (βA) pode ser encontrada por meio de:

(3.2)

Esta fórmula é obtida mediante da manipulação da fórmula 3.1. O código


para implementação da fórmula de βA pode ser o sugerido:

01 Function fncBA(RA, RF, RM) As Double


02 fncBA = (RA - RF) / (RM - RF)
03 End Function

Código 3.2: Código-fonte 10.

O nome da função pode ser qualquer, desde que não esteja na lista dos
termos exclusivos do VBA. Como convenção, neste livro adotaremos que
sempre funções possuam fnc como prefixo. Desta forma, cria-se um padrão e
evita-se que se utilize um nome que já está reservado para o próprio VBA.
Destaca-se ainda que letras maiúsculas e minúsculas não são diferenciados
pelo VBA, isto é, RA e ra, ou ainda rA, referem-se à mesma variável. Mas
adotaremos sempre que as variáveis passadas como argumentos sejam
grafadas em maiúsculas, e que as variáveis auxiliares, utilizadas no corpo da
função sejam grafadas em minúsculas. Insistimos que a escolha destes nomes
é livre. Contudo, a adoção de alguma convenção separando visualmente,
universos de rotinas e funções, variáveis como argumentos e variáveis
auxiliares, permite rapidamente obter informações adicionais sobre como
tratá-los.
3.4 Retorno do ativo livre de risco

Em alguns exercícios de finanças, a incógnita é a taxa de juros livre de


risco RF. Da fórmula do CAPM, equação 3.1, podemos isolar esta variável,
obtendo-se:

(3.3)

Assim, a implementação da função que calcula a taxa de juros livre de


risco a partir das outras variáveis do CAPM pode ser feita a partir das
seguintes linhas de código:

01 Function fncRF(RA, BA, RM) As Double


02 fncBA = (RA – BA * RM) / (1 - BA)
03 End Function

Código 3.3: Código fonte 11.


3.5 Exercício de fixação - Retorno esperado do mercado

A última informação que pode ser obtida da formulação do CAPM é


sobre o retorno esperado do mercado, considerando outros dados. Isolando
RM na fórmula básica do CAPM, na equação 3.1, temos:

(3.4)

Exemplo 3.2: Neste exercício, pede-se que o leitor desenvolva uma função
em VBA na qual, a partir das outras variáveis do CAPM, obtenhase o retorno
esperado do mercado.

Resolução:

Um possível código para a função solicitada no exercício é descrito a


seguir.

01 Function fncRM(RA, BA, RF) As Double


02 fncRM = (RA – (1 - BA) * RF) / BA
03 End Function

Código 3.4: Código-fonte 12.


Capítulo 4
Modelo de Gordon

Em finanças, o preço de praticamente qualquer ativo pode ser estimado


por meio do cálculo do valor presente de fluxos de caixa esperados. Estes
fluxos de caixa projetados são trazidos a valor presente por uma taxa de
desconto RA compatível com o nível de risco. Em particular, no mercado de
ações, os fluxos de caixa relevantes são os dividendos projetados Di que a
empresa deve pagar nos diversos instantes i. Assim, para precificar um ativo
deve-se inicialmente estimar todos os fluxos de caixa futuros e trazê-los a
valor presente, a uma taxa de desconto que pode ser calculada, por exemplo,
usando o CAPM, discutido no capítulo anterior.
Tendo em vista a complexidade de avaliação, principalmente devido à
necessidade de projeção de um número infinito de fluxos de caixa, é
importante o uso de modelos mais simples, pelo menos para uma análise
preliminar. Uma das tarefas do analista é justamente identificar ativos que
estão precificados de forma incorreta, sub ou sobre-avaliados e definir
estratégias para obtenção de lucro.
O modelo de Gordon representa um dos mecanismos mais ágeis e mais
utilizados pelos analistas para avaliar o preço justo de uma ação. Deve-se
entender que o preço justo, ou o preço que o analista acha justo, pode diferir
do preço de mercado, pelo qual o ativo está sendo transacionado. O modelo
geral de precificação de um preço justo é dado pela fórmula do valor presente
líquido aplicado a esta situação:

(4.1)
No qual

• PA: preço justo;


• Di: i-ésimo dividendo;
• RA: retorno esperado do ativo A, em função de seu risco; e
• ti: instante do recebimento do i-ésimo dividendo.

A equação 4.1 pode assustar em um primeira passada de olhos. No


entanto, a equação simplesmente denota que o valor da ação PA é
simplesmente uma somatória de vários dividendos Di, com i variando de 1 a
infinito. Ou seja, o valor de uma ação é dado pela soma de todos os
dividendos que a empresa propiciará ao longo dos próximos instantes ti de
pagamento de proventos. Para se obter o valor justo, cada dividendo é trazido
a valor presente, por um fator (1+ RA)t-i associado a uma capitalização
composta. A equação 4.1 é genérica e pode ser usada para precificar
praticamente qualquer ativo ou projeto. Para ativos e projetos quaisquer, os
dividendos são substituídos por fluxos de caixa.
Enquanto a equação 4.1 descreve o modelo geral para avaliação de ativos,
o modelo de Gordon representa uma simplificação no processo de
precificação. Enquanto na equação 4.1, os dividendos podem ser quaisquer,
no modelo de Gordon, parte-se da suposição de que os dividendos crescem
periódica e indefinidamente a uma taxa constante G. Ou seja, em cada
período, o dividendo equivale ao dividendo anterior corrigido por um fator G.
Uma suposição implícita é que os dividendos são pagos com uma frequência
constante, isto é, em períodos subsequentes.
Obviamente, dificilmente uma empresa propiciará dividendos com esse
comportamento de crescimento constante e periódico. Porém, a ideia do
modelo de Gordon é partir de premissas simplificadoras, para facilitar o
processo de precificação. Apesar de o valor obtido não ser acurado, permite
que um investidor possa rapidamente identificar um valor razoável para a
ação. Além disso, no modelo geral, o investidor teria que projetar infinitos
dividendos para poder calcular a somatória da equação 4.1.
Como veremos a seguir, supondo-se que os dividendos crescem a uma
taxa constante G ao período, simplifica-se o cálculo do preço. Considerando a
premissa do modelo de Gordon, tem-se, portanto, as seguintes relações entre
os dividendos de períodos subsequentes:

Mais genericamente, fazendo substituições sucessivas:

(4.2)

Utilizando propriedades matemáticas, em particular, da soma de infinitas


parcelas de uma progressão geométrica, o modelo de Gordon, com a
suposição de dividendos que crescem indefinidamente a uma taxa G
constante, pode ser reduzido a uma fórmula simples:

(4.3)

A simplicidade do modelo de Gordon representa seu ponto forte e permite


ao analista fazer uma estimativa do preço de uma ação, rapidamente, sem a
necessidade de estimar muitos fluxos de caixa. De fato, é necessário apenas
estimar o fluxo de caixa projetada ao próximo período D1, a taxa de desconto
dos fluxos de caixa RA, a taxa de crescimento de dividendos G. Deve-se
ressaltar que a taxa de desconto RA pode ser obtida através do CAPM,
conforme realizado no capítulo anterior.
A fórmula fundamental do modelo de Gordon pode ser implementada
como sugerido no código a seguir. Note que o nome da função é definido
como fncPA e possui argumentos de entrada dados por DU referente ao
dividendo no instante 1, RA referente à taxa de desconto dos fluxos de caixa
e G referente à taxa de crescimento de dividendos ao período.

01 Function fncPA(DU, RA, G) As Double


02 fncPA = DU / (RA – G)
03 End Function

Código 4.1: Código-fonte 13.

Diversas técnicas podem ser usadas para estimar o próximo fluxo de


caixa. Cada analista deve usar seu poder de avaliação para entender melhor a
empresa e o potencial de geração de caixa e de pagamento de dividendos.
Uma melhor avaliação é o diferencial de um melhor analista. Assim, o
modelo de Gordon serve apenas como uma primeira aproximação de um
valor justo para a ação. Cada analista, de posse de maiores e melhores
informações, pode realizar diferentes projeções de fluxos de caixa, obtendo
diferentes estimativas de dividendos.
Um dos usos mais simples do modelo de Gordon é supor que o último
dividendo pago se repita indefinidamente ao longo dos anos. Neste caso,
considera-se que a taxa de crescimento G é nula e que o dividendo D1 é igual
ao último dividendo pago. Este modelo com G = 0 é bastante comum, pois
não envolve nenhuma projeção e permite uma rápida identificação da ordem
de grandeza do preço justo de uma ação.
Podemos aproveitar este fato para ilustrar como passar parâmetros como
valores opcionais em funções criadas no ambiente do VBA Excel. Ou seja,
para utilizar o modelo de Gordon com taxa de crescimento nula, não há a
necessidade de passar um valor zero à função como um parâmetro nulo.
Basta declarar a variável G como um parâmetro opcional na declaração da
função. Assim, podemos definir que, se este parâmetro não for informado, a
nossa função irá considerá-lo com valor igual a zero. O código-fonte a seguir
possui uma situação possível de implementação:

01 Function fncPAG(DU, RA, Optional G) As Double


02 If IsMissing(G) Then G = 0
03 fncPAG = DU / (RA – G)
04 End Function

Código 4.2: Código-fonte 14.

As novidades encontram-se na primeira e segunda linhas. Na primeira


linha, a variável G possui uma declaração de opcional (Optional), assim, a
obrigatoriedade da variável G ser passada como argumento não existe.
Contudo, a sequência de instruções seguintes deve tratar da possibilidade de
o valor de G não ser passado.
A segunda linha trata disso: Is Missing é uma função do VBA que retorna
o valor lógico verdadeiro (True) se a variável testada está ausente. Assim,
esta linha de código traduz-se como: “Se G não estiver presente, então
atribua a G o valor zero”. A sequência de instruções segue inalterada.
Poderíamos ainda ter outra forma de implementação:
01 Function fncPAG(DU, RA, Optional G) As Double
02 If IsMissing(G) Then
03 fncPA = DU / RA
04 Else
05 fncPA = DU / (RA – G)
06 End If
07 End Function

Código 4.3: Código-fonte 15.

• A linha 2 traduz-se: “Se G não estiver presente, então...”.


• A linha 3 calcula o preço da ação sem o valor de G.
• A linha 4 traduz-se: “Senão”, por exemplo, caso G esteja presente...
• A linha 5 calcula o preço da ação com o valor de G.
• A linha 6 fecha o bloco condicional.

Ou ainda:

01 Function fncPAG(DU, RA, Optional G) As Double


02 Select Case IsMissing(G)
03 Case Is True
04 fncPA = DU / RA
05 Case Is False
06 fncPA = DU / (RA – G)
07 End Select
08 End Function

Código 4.4: Código-fonte 16.

• A linha 2 traduz-se como: “Selecione os casos referentes à presença de


G...”
• A linha 3 traduz-se como: “Caso seja verdadeira...”, por exemplo, G
não está presente
• A linha 4 calcula o preço da ação sem o valor de G.
• A linha 5 traduz-se como: “Caso seja falso...”, por exemplo, G está
presente
• A linha 6 calcula o preço da ação com o valor de G.

• A linha 7 fecha o bloco de seleção “Select Case”

Conforme já discutido, dada sua simplicidade e facilidade de cálculo, o


modelo de Gordon constitui uma primeira abordagem para a estimação do
preço de uma ação. Assim, antes de lançar mão de análises mais detalhadas
ou de outras ferramentas de precificação, o analista pode usar a fórmula
proposta para ter uma noção da ordem de grandeza do preço justo de uma
ação.
4.1 Exercício de fixação - Custo médio ponderado de capital

Na avaliação de empresas ou na análise de viabilidade de projetos, um


parâmetro financeiro importante é o custo médio ponderado de capital,
também conhecido pela sigla em inglês WACC (Weighted Average Cost of
Capital).
O WACC representa a taxa de juros que reflete o risco dos ativos da
empresa e pode, portanto, ser utilizado como taxa de desconto de fluxos de
caixa de uma empresa ou de fluxos de caixa de um projeto com o mesmo
risco da empresa.
A fórmula do WACC é dada por:

(4.4)

na qual

• wE representa a participação do patrimônio líquido no total do passivo


da empresa;
• wD representa a participação da dívida no total do passivo da empresa;

• rE representa o custo de capital ou a taxa de juros compatível com o


risco das ações da empresa;
• rD representa o custo da dívida da empresa; e

• I representa a alíquota marginal do imposto de renda.

Pode-se programar, a partir da equação anterior 4.4, funções que


permitam calcular cada uma das variáveis (WACC, rE, rD, wE, wD, I) a partir
das outras. A variável I deve ser definida como opcional quando servir como
parâmetro de entrada de uma função. Apesar de impostos serem inexoráveis,
em algumas aplicações de WACC pode-se utilizar I = 0 como premissa.
Capítulo 5
Modelos de valor presente

Nos capítulos anteriores, foram discutidas funções em VBA básicas que


poderiam ser facilmente implementadas no ambiente de planilha sem a
necessidade de utilização de programação. Ou seja, o leitor pode estar se
perguntando qual seria a vantagem de se programar no Excel. A partir desse
capítulo, serão estudadas funções mais trabalhosas que justificam o uso de
programação. Para manter o didatismo, as funções serão discutidas
aumentando-se a complexidade gradativamente.
A flexibilidade do Excel em permitir a repetição de um mesmo cálculo
básico em diversas células de uma planilha representa uma característica
extremamente poderosa. Esta facilidade em repetir cálculos implica ganhos
de produtividade consideráveis, pois uma mesma fórmula é replicada em
várias células usualmente adjacentes. A repetição de cálculos pode ser
realizada rapidamente na planilha do Excel, sem a necessidade de
programação. Usuários com conhecimentos básicos de Excel frequentemente
realizam as várias repetições nas próprias células da planilha, tornando-a,
muitas vezes, bastante poluída.
Em algumas situações, os cálculos repetitivos constituem passos
intermediários do resultado de interesse. Por exemplo, para o levantamento
do valor presente líquido, VPL, de um projeto é necessário trazer a valor
presente os vários fluxos de caixa que ocorrem em períodos diferentes. Uma
vez obtidos os valores presentes de cada fluxo, calcula-se o valor presente
líquido consolidando-os. Assim, no ambiente da planilha, o usuário muitas
vezes se vê obrigado a explicitar, em diversas células, alguns cálculos
intermediários, para que estes possam ser utilizados na obtenção do resultado
final de interesse.
Utilizando o VBA do Excel, estes cálculos intermediários podem ser
realizados sem a necessidade de ocupação de células, pois valores auxiliares
são calculados pelo algoritmo e armazenados em variáveis que podem ser
acessadas e processadas para a obtenção do resultado de interesse. A planilha
torna-se mais limpa, com menos células preenchidas.
Neste contexto, considerando que a repetição de cálculos envolve a
entrada de um conjunto de dados de uma mesma natureza como, por
exemplo, fluxos de caixa, o objetivo didático deste capítulo é discutir a
implementação de funções que envolvem parâmetros definidos por intervalos
de células. Esse aspecto representa uma inovação importante em relação às
funções discutidas nos capítulos anteriores, pois permite que um parâmetro
de entrada seja não somente uma célula, mas um conjunto de células. Para
uma discussão sobre os temas deste capítulo o leitor pode consultar a obra de
Fabozzi (1999).
5.1 Uma breve referência a finanças

A partir do problema financeiro básico de cálculo do valor presente


líquido VPL, abordaremos com maior ênfase as diversas formas de leitura e
de uso de dados apresentados em intervalos de células. A discussão do VPL
permite ilustrar a flexibilidade do VBA para a resolução de problemas
financeiros. Em particular, evidenciaremos as limitações de funções
predefinidas no Excel. No caso do VPL, a função predefinida no Excel
envolve premissas extremamente restritivas podendo ser aplicada em
situações muito específicas. Ou seja, as funções predefinidas do Excel não
são adequadas para problemas de finanças mais práticos. Assim, em situações
mais genéricas, a implementação de funções em VBA torna-se, portanto,
imprescindível.
Destaca-se que o conceito de valor presente fundamenta diversas
aplicações financeiras como, por exemplo, o estudo de viabilidade de
projetos, a estimativa de preço de ações, a análise de sensibilidade de preços
de ativos de renda fixa, etc.

5.1.1 Modelo geral

Genericamente, um ativo ou um projeto pode ter uma configuração


qualquer de fluxos de caixa, conforme ilustrado na figura a seguir:
Figura 5.1: Fluxos de caixa (FC) genéricos e estrutura temporal de taxas de juros.

Na Figura 5.1 é também apresentada a estrutura temporal de taxa de juros


à vista que representa o custo do dinheiro ri em função do prazo ti. Por
exemplo, o fluxo de caixa FC2, que ocorre no prazo t2, deve ser trazido a
valor presente por uma taxa de juros r2 ao período.
Matematicamente, o Valor Presente Líquido (VPL) é calculado através da
seguinte equação:

(5.1)
É importante observar que fluxos de caixa genéricos envolvem diversos
desembolsos e recebimentos, que ocorrem em períodos diferentes. Não
necessariamente os fluxos de caixa FC0...FCn são iguais nem os intervalos
entre os prazos t0 ... tn de ocorrência dos fluxos de caixa são constantes. Além
disso, cada fluxo FCi que ocorre no prazo i pode ser descontado a uma taxa
de juros ri distinta, refletindo a possibilidade de que a estrutura temporal de
taxa de juros não seja constante. Note que no capítulop anterior, o modelo de
Gordon possui simplificações relevantes como, por exemplo, fluxos
igualmente espaçado se taxa de juros constate.
5.2 Valor presente líquido

As observações apresentadas anteriormente são importantes, pois funções


do Excel para cálculo de valor presente têm limitações extremamente críticas.
Por exemplo, a função VPL do Excel, que calcula o valor presente líquido,
parte da premissa de que os fluxos de caixa são igualmente espaçados ao
longo do tempo. Além disso, o fluxo inicial na função VPL do Excel ocorre
em t0 = 1.
Estes elementos parecem ser detalhes pouco significantes, mas na prática,
têm implicações consideráveis, pois exigem cuidados adicionais por parte do
analista, uma vez que as especificações dos parâmetros da função do Excel
não são imediatas nem genéricas o suficiente. Em particular, o VPL do Excel
considera que o primeiro fluxo ocorre em t0 = 1, o resultado gerado sempre é
defasado em relação ao conceito tradicional de VPL, no qual t0 comumente é
zero.
Adicionalmente, fluxos com prazos que não possuem uma frequência
regular não podem ser trazidos a valor presente através da função VPL já
programada do Excel, uma vez que não há flexibilidade de incorporar fluxos
com prazos chamados de não-convencionais, como por exemplo, que não
acontecem em intervalos iguais. Além disso, usar a função VPL do Excel,
que serve para calcular o valor presente e não o valor presente líquido,
também pode não ser adequado, pois esta função parte da premissa de que os
fluxos de caixa são, além de periódicos, constantes.
Finalmente, na função VPL do Excel, todos os fluxos são descontados a
uma mesma taxa de juros, ou seja, r0 = r1 = r2 = ... = r. Assim, em termos
matemáticos, a função VPL do Excel operacionaliza um caso particular do
VPL dado pela seguinte equação:
(5.2)

Comparando as equações 5.1 e 5.2, deve ficar evidente que a função do


VPL do Excel representa um modelo simplificado, no qual a taxa de juros é
constante e os prazos são igualmente espaçados e inteiros, isto é, não são
permitidos prazos fracionados como, por exemplo, 1,5 anos.
Além disso, conforme já discutido, existe um descompasso no fluxo de
caixa inicial, pois para a função VPL do Excel, o primeiro fluxo, FC1 que
pode representar o investimento inicial em um projeto, não ocorre
imediatamente no instante t0 = 0 ou em um instante arbitrário inicial, mas
somente ao final do primeiro período, isto é, t0 = 1.
Note que, em uma análise do mundo real, o investimento inicial não
precisa ser realizado nem em t0 = 0 ou t0 = 1. Desta forma, a equação 5.1
permite flexibilidade na escolha do momento exato do início do fluxo inicial.
Eventualmente, uma empresa pode estar avaliando um investimento, cujo
primeiro desembolso ocorrerá em 4 meses e meio, por exemplo, e não
imediatamente.
Obviamente, alguns ajustes podem ser utilizados para compatibilizar a
função VPL do Excel com a equação denotada em 5.1. Porém, quando os
fluxos de caixa não obedecem a uma periodicidade constante, como é o caso
da maioria das aplicações financeiras reais, o uso da função do VPL do Excel
fica comprometido, pois os parâmetros desta função não conferem liberdade
o suficiente para o usuário incorporar informação sobre os prazos exatos dos
fluxos de caixa.
Ressalta-se, portanto, que as funções financeiras do Excel, assim como as
de uma calculadora financeira tradicional como a HP-12C, são adequadas
para fins didáticos, não devendo ser utilizadas para aplicações com aspectos
mais genéricos e reais.
Desta forma, mesmo problemas simples não são facilmente avaliados a
partir do uso imediato da função VPL do Excel ou de uma função equivalente
da HP-12C. Exemplificando, o VPL dos fluxos de caixa a seguir não pode ser
analisado sem ajustes dos parâmetros de entrada às funções financeiras do
Excel, pois os fluxos não ocorrem em períodos convencionais, igualmente
espaçados.

Figura 5.2: Exemplo de fluxos de caixa que necessitam de ajustes para o uso da função VPL do Excel.

Portanto, do ponto de vista prático, dadas as limitações das fórmulas


predefinidas do Excel, é mais conveniente desenvolver uma planilha própria
ou uma função específica.
5.2.1 Taxa de juros constante

Suponha que um analista queira calcular o VPL de um projeto, no qual o


investimento inicial é $100 e os fluxos projetados para os próximos dois anos
são iguais a $110 e $150, conforme mostrado na Figura 5.3. Suponha que a
taxa de desconto seja constante ao longo de todo período de análise e
equivalente a 20% ao ano.
Figura 5.3: Exemplo de fluxos de caixa de um projeto.

Usando a equação 5.1 genérica, temos o seguinte cálculo:

Observe que, no caso especial em que o primeiro fluxo ocorre no


momento t0 = 0, a taxa de juros r0 se torna irrelevante, pois (1+0,20)0 = 1.
A planilha a seguir é um possível exemplo de implementação deste
procedimento de cálculo do valor presente líquido no Excel:
Figura 5.4: Exemplo de cálculo do VPL usando o Excel.

5.2.2 Taxa de juros variável

O conceito desenvolvido na planilha em Excel permite também obter o


valor presente líquido considerando casos razoavelmente genéricos, nos quais
os prazos de cada fluxo de caixa ocorrem em instantes sem uma determinada
periodicidade. Além disso, no contexto das aplicações financeiras reais, a
estrutura temporal de taxa de juros à vista não é constante em função do
prazo e, portanto, a premissa de que r0 = r1 = r2 = ... = r na equação 5.2 não é
adequada. Por exemplo, vamos considerar o valor presente líquido dos fluxos
da situação da Figura 5.5.
Figura 5.5: Exemplo de fluxos de caixa de um projeto.

Observe que os prazos não são igualmente espaçados e ainda envolvem


valores que não são inteiros. Por exemplo, o primeiro fluxo ocorre em 0,25
anos, ou seja, em 3 meses, o segundo fluxo em 0,75 anos, isto é, 9 meses e o
último, em 2 anos e 3 meses.
A configuração destes fluxos exige diversos ajustes para serem analisados
a partir da função VPL do Excel. Assim, ao invés de tentar ajustar os dados
para usar uma função predefinida, é mais fácil utilizar os recursos da planilha,
conforme ilustrado a seguir:

Figura 5.6: Exemplo de cálculo do VPL usando o Excel.

Assim, a falta de flexibilidade da função VPL do Excel é facilmente


superada pela estruturação de uma planilha que realiza diversos cálculos em
células intermediárias e totaliza o valor presente líquido, como mostrado na
célula D5 da Figura 5.6.
Praticamente todo usuário de Excel que precisa fazer um cálculo de VPL
com uma configuração de fluxos pouco convencional já desenvolveu uma
planilha semelhante à discutida anteriormente. Porém, uma forma mais
elegante de resolver o problema de valor presente líquido genérico envolve a
elaboração de uma função do Excel que permita uma flexibilidade para
avaliar diversas configurações de fluxos de caixa. Apesar de a aplicação ser
simples, o leitor poderá visualizar a potencialidade do VBA do Excel.
O uso de um exemplo de estruturação de uma função para cálculo do
valor presente líquido possibilita ilustrar como obter parâmetros de entrada
que correspondem a um conjunto de células e não a células individualmente
como feito nos capítulos anteriores. Deve-se ressaltar que, enquanto nas
funções dos capítulos anteriores, nas quais os parâmetros de entrada eram
representados por células individuais, por exemplo, o beta do ativo era
incorporado a partir da leitura de um valor em uma célula, na função
desenvolvida neste capítulo, parâmetros de entrada são representados por um
conjunto de células representativo de uma série de dados.
Observe que o cálculo do VPL envolve uma sequência de valores
correspondentes à série temporal na qual o fluxo de caixa é contabilizado sob
uma taxa de juros correspondente ao período.

5.2.3 Programando em VBA o VPL a uma taxa de juros variável

Como exemplo, podemos supor o fluxo de caixa de um investimento de


$200,00 que gera os seguintes fluxos subsequentes dados pela Tabela 5.1 a
seguir:

t(Meses) Fluxo de Caixa Taxa de Juros Valor Presente


0,0 $-200,00 1,00% $-200,00
0,5 $100,00 1,20% $99,41
1,0 $200,00 1,30% $197,43
2,3 $300,00 1,50% $289,90
2,5 $50,00 1,60% $48,05
3,0 $60,00 1,80% $56,87
4,0 $-40,00 1,90% $-37,10
4,5 $300,00 2,00% $274,42
Valor Presente Líquido $728,99
Tabela 5.1: Exemplo de fluxo de caixa e cálculo do valor presente líquido.

Note que os fluxos de caixa ocorrem em intervalos de tempos variáveis. A


coluna mais a direita representa o cálculo de cada termo do somatório da
fórmula, juntamente com o VPL ao final da coluna. Vamos colocar estes
valores numa planilha do Excel:

• Abra o Excel
• Digite os seguintes valores:

Figura 5.7: Valores do exemplo de cálculo do valor presente líquido.

• Inicie o editor do VBA; e


• Insira novo módulo através da opção “Módulo” do menu “Inserir”
[CTRL] + [M].

Digite o código a seguir:

01 Function fncVPL(T, FC, R) As Double


02 Dim i As Integer
03 For i = 1 To T.Count
04 fncVPL = fncVPL + FC(i) / (1 + R(i)) ^ T(i)
05 Next i
06 End Function
Código 5.1: Código-fonte 17.

Vá para a planilha aberta ou feche o editor do VBA.

• Em B11, digite o texto “VPL”; e


• Digite na célula C11 a fórmula =fncVPL(A2:A9;B2:B9;C2:C9).

O valor que a fórmula recém criada retorna é dado, a seguir, equivalente


ao que foi encontrado na Tabela 5.1 sem a necessidade de células auxiliares
serem preenchidas:

Figura 5.8: Ilustração do valor retornado para a fórmula do valor presente líquido.

Vamos entender o código. A função, desenvolvida pelo usuário, foi


batizada de fncVPL, na qual são passados os argumentos como variáveis
denominadas: T (Prazo), FC (Fluxo de Caixa) e R (Taxa de Juros). Note que
na chamada da função, todas as variáveis estão representando uma série de
dados. O VBA traz flexibilidade para o programador, pois não há a
necessidade de, a priori, se definir o tamanho, i.e., o número de células na
série.
No exemplo, T representa as células A2, A3, A4, A5, A6, A7, A8, A9, ou
ainda, na notação do Excel, a seleção de um conjunto de células no intervalo
A2:A9. O mesmo vale para as outras variáveis, FC e R. Caso os dados de
entrada envolvessem mais fluxos, isto é, células, bastaria na planilha do Excel
selecionar essas células na função fncVPL, não sendo necessário alterar o
código.
Assim, voltando ao código, temos uma nova instrução: Dim que indica ao
interpretador do VBA que seja dimensionado um espaço na memória, de
tamanho apropriado para um número do tipo inteiro (2 bytes), para a variável
i. Ela será usada na próxima instrução. A variável i possui a mesma
representatividade da fórmula do VPL, identificando os termos do somatório.
Assim, o laço For percorre através de i, valores de 1 ao número de termos da
série temporal (Número de células no intervalo A2:A9). Em VBA este valor
pode ser acessado por T.Count.
Count é uma propriedade do argumento passado para a função. Isto é,
quando a função recebe, como argumento, a referência a uma célula ou um
intervalo de células, por exemplo: A2, ou A2:A9 respectivamente, a variável
criada é uma coleção de objetos do tipo célula. A propriedade Count de T
retorna então o número de objetos que a coleção contém, ou seja, o número
de células entre A2:A9. Desse modo, em nosso exemplo i irá percorrer
valores inteiros entre 1 e 8 numa estrutura de laço que calcula o VPL:

fncVPL = fncVPL + FC(i) / (1 + R(i)) ˆ T(i)

O somatório é então implementado como uma soma incremental do


fncVPL com seus termos seguintes. O acesso ao valor de cada termo da série
de dados pode ser feito como no código proposto: FC(i) representa o i-ésimo
termo da série do fluxo de caixa, representado pela variável FC. Utilizamos
então os i-ésimos termos da taxa de juros e do prazo, R(i) e T(i)
respectivamente. Next fecha o laço, incrementando o valor do i, e retornando
para o início do laço. Enquanto i estiver dentro do intervalo [1, T.Count],
definido por i = 1 To T.Count, o código entre o laço For e Next será
executado. Note que a função criada deixa a planilha mais “limpa”.
A sequência de eventos pode ser ilustrada pelo fluxograma a seguir:

Figura 5.9: Fluxograma da função fncVPL.

5.2.4 Programação em VBA do VPL a uma taxa de juros constante

Agora, vamos supor a seguinte situação:

t(Meses) Fluxo de Caixa Taxa de Juros Valor Presente


0,0 $-200,00 1,00% $-200,00
0,5 $100,00 $99,50
1,0 $200,00 $198,02
2,3 $300,00 $293,21
2,5 $50,00 $48,77
3,0 $60,00 $58,24
4,0 $-40,00 $-38,44
4,5 $300,00 $286,86
Valor Presente Líquido = $746,17
Tabela 5.2: Exemplo de fluxo de caixa e cálculo do valor presente líquido.

Os valores das taxas e o fluxo de caixa continuam os mesmos. Mas temos


uma taxa de juros constante durante todo o período, 1,00%. O valor de cada
termo do somatório do VPL está representado pela coluna mais a direita. A
nossa fórmula fncVPL permite obter o valor do VPL, desde que nossa taxa
de juros tenha a mesma dimensão das outras variáveis, que também seja uma
série de dados. Mas pode-se modificar nosso código a permitir que situações
como esta possam ser contempladas com uma fórmula, na qual a taxa de
juros é uma constante. Segue o código:

01 Function fncVPL2(T, FC, R) As Double


02 Dim i As Integer
03 For i = 1 To T.Count
04 fncVPL2 = fncVPL2 + FC(i) / (1 + R) ^ T(i)
05 Next i
06 End Function

Código 5.2: Código-fonte 18.

Note que no código, a taxa de juros perdeu seu índice. Neste caso, a taxa
de juros deve ser um valor numérico, ou uma referência a uma única célula.
Caso seja fornecido um intervalo de células, como no caso anterior, a fórmula
retornará um erro. Observe o resultado para este caso:
Figura 5.10: Ilustração da aplicação da função fncVPL2.

Podemos criar um código que preveja as duas situações: taxa de juros


variável ou constante. Se a taxa de juros for uma série de dados, o código a
ser executado é semelhante ao fncVPL, caso contrário, semelhante ao
fncVPL2:

01 Function fncVPL3(T, FC, R) As Double


02 Dim i As Integer
03 If IsArray(R) Then
04 For i = 1 To T.Count
05 fncVPL3 = fncVPL3 + FC(i) / (1 + R(i)) ^ T(i)
06 Next i
07 Else
08 For i = 1 To T.Count
09 fncVPL3 = fncVPL3 + FC(i) / (1 + R) ^ T(i)
10 Next i
11 End If
12 End Function

Código 5.3: Código-fonte 19.

Uma nova instrução foi acrescentada para decidir o que fazer, caso R seja
uma série de dados, ou um vetor. Para isso, usamos uma função do VBA que
retorna um valor tipo Boolean (True ou False) quando aplicada num objeto.
IsArray(R) retorna True quando R for uma série de dados, isto é, um vetor
de dados. Assim, a estrutura de decisão If... Then... Else pode ser utilizada.
A linha 3 do código (If IsArray(R) Then) pode ser lida como: “Se R for um
vetor, então...”; na linha 5 temos o código utilizando os termos da série da
taxa de juros R(i) para a resposta True da instrução IsArray(R), “Sim, R é
um vetor”. Na linha 7 temos: “Senão...” ou “Se R não for um vetor...”, e
temos o laço For... Next utilizando uma taxa de juros constante para todos os
termos do somatório. A linha 11 com a instrução End If encerra a estrutura
de decisão If... Then... Else.
Agora teste você mesmo. A função fncVPL3 é válida para as duas
situações. Ela prevê tratamentos distintos para a entrada da taxa de juros na
função. Seja numa situação na qual a taxa de juros é constante:

• Em C11 a fórmula “=fncVPL3(A2:A9;B2:B9;C2)”;


• Ou a fórmula “=fncVPL3(A2:A9;B2:B9;0,01)”; e
• Ou uma série de dados pela fórmula
“=fncVPL3(A2:A9;B2:B9;C2:C9)”.

5.2.5 Programação em VBA de modelo geral para VPL

Já que estamos nos familiarizando a trabalhar com vetores de dados,


podemos implementar a fórmula do VPL, trabalhando com uma visão
matricial da situação. Vamos criar uma função, na qual o único argumento
seja a seleção A2:C9, por exemplo, as três colunas numa única seleção:
prazo, fluxo de caixa e taxa de juros, nesta ordem e com valores numéricos
em todas as células (Figura 5.11).
Observe que em C11 a fórmula é “=fncVPL4(A2:C9)”. Podemos fazê-lo
dessa forma porque o Excel interpreta a seleção A2:C9 como um vetor de
dados com a sequência: A2, B2, C2, A3, B3, C3, A4, B4, C4... Ou seja, o
vetor possui referência às células, percorrendo as linhas, uma a uma,
colocando em fila, da esquerda para a direita e de cima para baixo, cada
célula pertencente ao intervalo da seleção. O código, assim, deve tratar esta
característica da lista de valores atribuídos ao argumento passado para a
função (Código-fonte 20).

Figura 5.11: Ilustração da aplicação da função fncVPL4.

A função foi definida com o nome de fncVPL4 e a única variável de


entrada se chama VPL. Este nome pode ser qualquer um, a não ser algum
elemento da lista de termos exclusivos do VBA. Como o cálculo do VPL
envolve três listas de valores, a linha 4 está definida para que o vetor de
dados VPL, indexado pela variável i, seja incrementada, de três em três
unidades, garantindo a varredura de uma linha que correspondem ao tempo,
fluxo de caixa e taxa de juros, relativos ao primeiro item da série,
respectivamente. As linhas 5, 6 e 7, dentro do laço For, atribui cada valor do
vetor em uma variável mnemônica (T, FC e R), declaradas na linha 3, e
calcula iterativamente o VPL na linha 8.

01 Function fncVPL4(VPL) As Double


02 Dim i As Integer
03 Dim T, FC, R As Double
04 For i = 1 To VPL.Count Step 3
05 T = VPL(i)
06 FC = VPL(i+1)
07 R = VPL(i+2)
08 fncVPL4 = fncVPL4 + FC / (1 + R) ^ T
09 Next i
10 End Function

Código 5.4: Código-fonte 20.

O código poderia ser escrito também como:

01 Function fncVPL5(VPL) As Double


02 Dim i As Integer
03 For i = 1 To VPL.Count Step 3
04 fncVPL5 = fncVPL5 + _
05 VPL(i + 1) / (1 + VPL(i + 2)) ^ VPL(i)
06 Next i
07 End Function

Código 5.5: Código-fonte 21.

Assim, como o primeiro elemento do vetor é o prazo, o segundo elemento


representa o fluxo de caixa, e o terceiro elemento, a taxa de juros. A escolha
do passo 3 para i é acertada para o cálculo dos termos do VPL, já que uma
nova linha se inicia de três em três elementos do vetor e que cada linha
representa cada termo do somatório: T = VPL(i), FC = VPL(i+1) e R =
VPL(i+2). O símbolo “_” indica ao interpretador do VBA que a instrução
contida na próxima linha pertence ao comando em execução. Ou seja:

fncVPL5 = fncVPL5+ _
VPL(i+1)/(1+ VPL(i+2))^VPL(i)
é equivalente a:

fncVPL5 = fncVPL5+ VPL(i+1)/(1+VPL(i+2))^VPL(i)

Poderíamos ter mantido a estrutura do fncVPL apenas acrescentando


algumas instruções para tratar o “super” vetor de dados e criar novos vetores
T, FC e R:

01 Function fncVPL6(VPL) As Double


02 Dim i, n As Integer
03 Dim T() As Double
04 Dim FC() As Double
05 Dim R() As Double
06 n = VPL.Count / 3
07 ReDim T(1 To n)
08 ReDim FC(1 To n)
09 ReDim R(1 To n)
10 For i = 1 To n
11 T(i) = VPL((i - 1) * 3 + 1)
12 FC(i) = VPL((i - 1) * 3 + 2)
13 R(i) = VPL((i - 1) * 3 + 3)
14 Next i
15 For i = 1 To n
16 fncVPL6 = fncVPL6 + FC(i) / (1 + R(i)) ^ T(i)
17 Next i
18 End Function

Código 5.6: Código-fonte 22.

Aqui, mais novidades. Na linha 2, temos a declaração da variável i e


também da variável n como tipo Integer. Estão separados por uma vírgula.
Poderíamos ter escrito também da seguinte forma, em linhas separadas:

Dim i As Integer
Dim n As Integer
As linhas 3, 4 e 5 declaram variáveis com os nomes T, FC e R como
sendo variáveis do tipo Double. Os parênteses vazios representam que estas
variáveis não são escalares, mas possuem uma dimensão, ainda a ser
definida. E da mesma forma, explorado nas variáveis i e n, poderiam ser
escritas como:

Dim T(), FC(), R() As Double

A dimensão será dada pelo número de linhas, ou de termos do somatório


do VPL. Assim, na linha 6, foi atribuída à variável n, o número de linhas, que
corresponde ao total de elementos da seleção, divido por três, já que se trata
de uma seleção de três colunas. Nas linhas 7, 8, e 9 estão o
redimensionamento das variáveis, através da instrução Redim, para que
representem uma série de dados, com índice inicial igual a 1 e limite superior
n (Total de linhas). Se soubéssemos a priori a dimensão destes vetores
poderíamos atribuir suas dimensões já na declaração. Na situação proposta n
= 8, poderíamos ter:

Dim T(1 To 8) As Double


Dim FC(1 To 8) As Double
Dim R(1 To 8) As Double

Porém, a ideia da criação de funções é tem flexibilidade para contemplar


diversas situações, não necessariamente fixando o número de fluxos. O laço
For a seguir trata o “super” vetor, quebrando sua estrutura e atribuindo os
valores correspondentes para os elementos dos vetores T, FC e R. Para i=1
temos T(1)=VPL(1), FC(1)=VPL(2) e R(1)=VPL(3). Na próxima iteração,
i=2, temos T(2)=VPL(4), FC(2)=VPL(5) e R(2)=VPL(6); e assim
sucessivamente. Então, o VPL pode ser calculado em termos destes vetores
criados.
Uma particularidade das linguagens de programação é o fato que, sempre
as variáveis definidas como vetores iniciem seus elementos pelo índice zero.
Por exemplo, a instrução Dim Y(3)As Double tem como resultado um vetor
de valores tipo Double acessados por Y(0), Y(1), Y(2) e Y(3).
Paradoxalmente ao que sugere a instrução, temos quatro elementos no vetor
Y ao invés de três.
Para quem trabalha com computação, esta característica é intrínseca da
área de atuação deste profissional. O primeiro elemento é aquele que possui
índice zero, o segundo que possui índice um e assim suscetivamente. Mas
não é muito usual na vida real.
Em VBA evita-se a inclusão do elemento zero no vetor de dados com a
sintaxe, neste exemplo: Dim Y(1 To 3)As Double, a variável Y representará
os elementos Y(1), Y(2) e Y(3). Ainda em VBA, pode-se adotar como
convenção do ambiente de programação, que os vetores declarados como
Dim Y(3)As Double sejam semelhantes aos declarados como Dim Y(1 To
3)As Double.
Para tanto, deve se instruir o interpretador do VBA com a instrução:
Option Base 1 na primeira linha do corpo do módulo aonde estão sendo
declaradas as funções. Deste modo, o programador em VBA não necessitará
pensar em evitar a declaração de elementos de índice zero no vetor e poderá
acoplar o senso comum ao código: o primeiro elemento é aquele que possui
índice 1, o segundo elemento é aquele que possui índice 2, e assim
sucessivamente. Veja:
01 Option Base 1
02
03 Function fncVPL6(VPL) As Double
04 Dim i, n As Integer
05 Dim T() As Double
06 Dim FC() As Double
07 ...
08 ...

Código 5.7: Código-fonte 23.


5.3 Cálculo de Duração - Duration

Outra situação aonde é utilizado o recurso de seleção de uma série


temporal de dados é a Duração (Duration) dada pela fórmula:

(5.3)

onde ti representa o prazo em que o fluxo de caixa FCi ocorre e r é a taxa


de juros, considerada constante para qualquer prazo
O valor presente VP de uma série de fluxos para uma taxa de juros
constante é dado por:

Assim, a duração pode ser reescrita como:

(5.4)

A Duration representa um parâmetro de prazo médio ponderado dos


fluxos de caixa, no qual a ponderação é dada pelo valor presente de cada
fluxo. As aplicações da Duration são diversas como, por exemplo, na
identificação de estratégias de proteção de posições expostas ao risco de taxa
de juros.
Porém, dentro do escopo deste livro, o objetivo é mostrarmos a lógica de
programação no ambiente VBA Excel, a partir da fórmula 5.4. Destaca-se que
o Excel possui uma função pré-programada e, como no caso do valor presente
líquido, também apresenta certas limitações, tendo um caráter mais didático.
Assim, para aplicações mais profissionais da Duration é conveniente que o
usuário desenvolva suas próprias funções.

5.3.1 Programação em VBA da Duration

A função de valor presente líquido já foi implementada e vamos utilizá-la.


Esta função poderá ser copiada do jeito em que se encontra, já que contempla
a entrada de uma taxa de juros constante. Falta-nos apenas calcular o
somatório do numerador da Duração. Note que o código da implementação
da Duração, a seguir, é muito semelhante ao realizado para o VPL na função
fncVPL3.

01 Function fncDuration(T, FC, R) As Double


02 Dim i As Integer
03 For i = 1 To T.Count
04 fncDuration = fncDuration + _
05 T(i) * FC(i) / (1 + R) ^ T(i)
06 Next i
07 fncDuration = fncDuration / fncVPL3(T, FC, R)
08 End Function

Código 5.8: Código-fonte 24.

Na linha 4 temos o cálculo do denominador da fórmula da Duração (5.4).


Na linha 7, a chamada à função fncVPL3 que necessita dos mesmos
argumentos de entrada que a função fncDuration. Assim, a chamada é
naturalmente com os mesmos parâmetros. Na Figura 5.12 o resultado
esperado para a Duração aplicado aos valores fornecidos na Tabela 5.2.
Note a facilidade de utilizar as funções criadas para outras fórmulas. Este
é um recurso bastante valioso em grandes projetos. Se bem documentadas, as
funções são importantes atalhos, já que a reutilização de partes do código,
como as chamadas às funções já escritas, diminuem linhas de programação e
reduzem o período de desenvolvimento, evitando que muitas partes do código
possuam repetição.

Figura 5.12: Ilustração da aplicação da função fncDuration.


5.4 Exercício de fixação: Beta da carteira

Outro exemplo bastante utilizado em finanças pode ilustrar o uso de


funções com entradas múltiplas. Conforme discutido em capítulo anterior, o
beta é uma medida do risco sistemático e foi utilizado para estimar o retorno
estimado de um ativo. Neste capítulo, vamos calcular o beta de uma carteira
composta por vários ativos, usando uma função de entradas múltiplas. Para
isso, vamos considerar uma carteira formada por N ativos, cada um com
participação ou pesos W1,W2,W3 ...WN e risco sistemático dado por β1,β2,β3
...βN. O beta da carteira é simplesmente uma média ponderada entre os betas
dos ativos e sua participação. Ou seja, o beta do portfólio é dado por:

(5.5)

Como resposta, uma possível implementação para esta situação pode ser
dada por:
01 Function fncBetaCarteira(W,B) As Double
02 Dim i As Integer
03 For i = 1 To W.Count
04 fncBetaCarteira = fncBetaCarteira + W(i) * B(i)
05 Next i
06 End Function

Código 5.9: Código-fonte 25.


Capítulo 6
Análise de carteiras

Um dos princípios fundamentais de finanças envolve a estruturação de


carteiras de ativos. Racionalmente, a formação de carteiras é relevante, pois a
diversificação de ativos tende a diminuir riscos. Ou seja, enquanto carteiras
com poucos ativos são sensíveis a perdas que ocorrem com um dos ativos,
carteiras bem diversificadas são mais imunes a flutuações de ativos
específicos.
Como discutimos no capítulo do CAPM, embora retorno esperado e risco
estejam interligados, nem todo risco é remunerado. De fato, a teoria
financeira estabelece que o risco que pode ser eliminado devido à
diversificação não é remunerado. Neste contexto um investidor deveria
estruturar uma carteira com um número razoável de ativos para eliminar o
risco que é eliminável através da diversificação.
Neste capítulo, vamos estudar aspectos de retorno esperado e risco total
de uma carteira formada por vários ativos, evidenciando alguns mecanismos
de programação relevantes em finanças.
Para o estudo mais elaborado de teoria de carteiras, o livro Elton, Gruber,
Brown, and Goetzmann (2014). Para uma discussão mais completa sobre
VaR uma obra de referência é Jorion (2006).
6.1 Retorno esperado

A fórmula do retorno esperado de uma carteira é bastante intuitiva. O


retorno de uma carteira simplesmente é a média ponderada dos retornos de
cada ativo que compõe a carteira. O fator de ponderação é a participação de
cada ativo no valor da carteira.
Assim, supondo que uma carteira é formada por N ativos, seu retorno
esperado RC é dado por:

(6.1)

no qual Wi representa a participação ou peso do ativo i na carteira, com:

(6.2)

e Ri representa o retorno esperado do ativo i. Note, conforme já discutido


anteriormente, que estamos usando a notação R para retorno esperado, ao
invés de E(R). Por exemplo, suponha que os retornos esperados de três ativos
1, 2 e 3 sejam, respectivamente, 10%, 14% e 17%. O retorno esperado de
uma carteira formada por 30% no ativo 1, 20% no ativo 2 e 50% no ativo 3 é
estimado por:
Observe que o retorno esperado Ri de cada ativo i pode ser obtido usando
o CAPM, por exemplo.

6.1.1 Programação em VBA do retorno esperado

Podemos implementar a função fncRC utilizando duas variáveis como


parâmetros de entrada: W para a participação do ativo i relacionado com o
retorno esperado R do ativo correspondente. Estas variáveis são vetores de
dimensão desconhecida.

01 Option Base 1
02 Function fncRC(W, R) As Double
03 Dim i As Integer
04 For i = 1 To W.Count
05 fncRC = fncRC + W(i) * R(i)
06 Next i
07 End Function

Código 6.1: Código-fonte 26.


Ativo W R
1 0.3 10%
2 0.2 14%
3 0.5 17%
Tabela 6.1: Exemplo de composição de carteira para cálculo do retorno esperado.
6.2 Risco total

Consideremos agora como obter o risco total de uma carteira de ativos.


Em uma abordagem ingênua, é comum pensar que o risco de uma carteira
seria, de modo análogo ao retorno esperado de uma carteira, equivalente à
média ponderada do risco dos ativos que compõem a carteira.
No entanto, esta análise ingênua não leva em consideração um aspecto
que é fundamental na teoria de finanças: a diversificação propicia uma
diminuição do risco. Portanto, o risco de uma carteira deve levar em
consideração eventuais relacionamentos entre os ativos de uma carteira.
Por exemplo, dois ativos podem ter riscos elevados, porém se a correlação
entre eles é pequena, o efeito diversificação é grande. Uma carteira composta
por estes dois ativos pode eventualmente ter baixo risco, pois eventos ruins
que afetam negativamente o retorno de um ativo, não necessariamente
conduzirão a perdas em outro ativo. Se a correlação for negativa, a
diversificação é ainda maior no sentido de redução de riscos, pois eventos
prejudiciais a um ativo geram, em média, resultados satisfatórios para o outro
ativo. Em contrapartida, quando a correlação entre ativos é alta, o efeito
diversificação é baixo, uma vez que os mesmos eventos que causam perda em
um ativo tendem a causar perda no outro.
A teoria de carteiras, proposta por Markowitz, estabelece que o risco σC de
uma carteira composta por N ativos pode ser calculado por meio da equação:

(6.3)

na qual Wi ainda representa a participação do ativo i na carteira, σi


representa o risco total do ativo i, também chamado de volatilidade, e ρij
representa a correlação entre os retornos dos ativos i e j.
Destaca-se que a correlação ρ é uma medida do relacionamento linear
entre duas variáveis, estando no intervalo −1 ≤ ρ ≤ 1. Quanto mais próxima
de 1, a correlação indica que as duas variáveis estão bastante relacionadas
linearmente, sugerindo que eventos que afetam o retorno de um ativo afetam
no mesmo sentido o retorno de outro ativo. Quanto mais próximo de −1, o
valor da correlação indica que as duas variáveis possuem retornos que sofrem
variações opostas, em relação ao retorno esperado, perante os mesmos
eventos. Quando a correlação é negativa, um evento que afeta positivamente
um ativo tende a afetar negativamente o outro. Ressalta-se também que a
correlação entre os retornos de um ativo i com os retornos deste mesmo ativo
i é 1, ou seja, ρij = 1, se i = j.
Para exemplificar o conceito, podemos considerar o caso de uma carteira
formada por dois ativos: 1 e 2; cujas participações na carteira são W1 = 0,3 e
W2 = 0,7, riscos equivalentes a σ1 = 4% e σ2 = 8% e correlação ρ12 = ρ21 = 0,6.
Aplicando a equação 6.3, temos:

6.2.1 Programação em VBA do risco total

Para um número genérico de N ativos na carteira, vamos estabelecer um


formato de entrada de dados que seja intuitivo e, ao mesmo tempo, facilite a
programação da função de cálculo do risco de uma carteira. Uma possível
implementação pode ser realizada da seguinte forma:
01 Option Base 1
02 Function fncRT(W, Sigma, Rho) As Double
03 Dim i, j As Integer
04 For i = 1 To W.Count
05 For j = 1 To W.Count
06 fncRT = fncRT + _
07 W(i) * W(j) * Sigma(i) * _
08 Sigma(j) * Rho(i, j)
09 Next j
10 Next i
11 fncRT = Sqr(fncRT)
12 End Function

Código 6.2: Código-fonte 27.

Para uma carteira composta de vários ativos, por exemplo, o descrito na


Tabela 6.2 com cinco ativos, o somatório da Equação 6.3 teria 25 termos.
Manualmente o cálculo poderia causar confusão. Contudo, a função criada de
forma bastante simples retorna o valor do risco total esperado da carteira sem
nenhum esforço.

Ρ
Assets W σ
1 2 3 4 5
1 0,1 0 1 0,1 0,2 0,3 -0,7
2 0,1 0,05 0,1 1 0,1 0,1 0,2
3 0,2 0,05 0,2 0,2 1 -0,2 0,4
4 0,3 0,1 0,3 0,1 -0,2 1 0,2
5 0,3 0,2 -0,7 0,2 0,4 0,2 1
Tabela 6.2: Exemplo de composição de carteira para cálculo do risco total.

No código não há novidades. Os parâmetros de entrada são variáveis


vetoriais para a participação do ativo (W), para a correspondente
sensibilidade risco (Sigma) e para a correlação entre os ativos, representado
por um vetor que é tratado bidimensionalmente (Rho), Tabela 6.2.
A matriz de correlações pode ser usada facilmente, pois o VBA interpreta
linhas e colunas da matriz de forma natural. Outra forma de acesso aos
componentes desse vetor é dado pela variável i e j.

Figura 6.1: Ilustração da aplicação da função fncRT.

Na figura anterior temos a utilização da função aplicada sobre as


informações sobre os ativos que compõe uma carteira fictícia (Tabela 6.2). O
valor do risco total esperado encontrado é de 7,66%.
6.3 Mensuração do risco - VaR (Value-at-Risk)

A teoria de carteiras serve como base para uma técnica de mensuração de


riscos extremamente usada no mercado financeiro: o Value-at-Risk ou como é
comumente chamado, VaR. De fato, a regulamentação financeira
internacional exige que bancos apresentem, dentre as diversas informações
sobre riscos, o VaR de suas carteiras.

6.3.1 Aplicações básicas para mensuração de riscos

O VaR é definido como a perda máxima potencial em um determinado


horizonte de tempo com um determinado grau de confiança. Um exemplo
ajuda a esclarecer o conceito de VaR. Suponha que uma instituição financeira
possua um VaR de $7 milhões, para o horizonte de tempo de um dia e grau de
confiança de 95%. Este VaR indica que, com 95% de confiança, esta carteira
pode vir a perder, no máximo, $ 7 milhões de um dia para o outro. Como o
VaR não é dado com 100% de confiança, existem 5% de chances de a carteira
vir a perder mais do que $ 7 milhões de um dia para o outro. Porém, são
apenas 5% de chance.
Note que a informação do VaR é importante, pois permite uma estimativa
de perda máxima da carteira. Existem diversos mecanismos de mensuração
do VaR como, por exemplo, simulação histórica, simulação de Monte Carlo e
modelo de Variâncias-Covariâncias.
O modelo de Variâncias-Covariâncias é derivado da teoria de carteiras
que foi estudada no tópico anterior. Supondo que a distribuição de retornos
de uma carteira segue uma distribuição normal, a fórmula do VaR para o
horizonte de tempo de T períodos e grau de confiança p, por meio do modelo
de Variâncias-Covariâncias, é dada por:
(6.4)

Aonde M é o valor da carteira, zp é um parâmetro que reflete o grau de


confiança na estimativa do VaR, obtido a partir de propriedades da
distribuição normal, σC é o risco total da carteira, que pode ser obtido
conforme discutido anteriormente e T é o horizonte de tempo da estimativa.
Na prática, o VaR é geralmente obtido para horizontes de tempo de 1, 5
ou 10 dias e para graus de confiança de 95%, 97,5%, 99% e até 99,9%.
Considerando as propriedades da distribuição normal, o valor de zp referente
ao grau de confiança p segue os valores da Tabela 6.4. Assim, se uma carteira
possui um VaR de $2 milhões para o horizonte de tempo de 10 dias e grau de
confiança de 99%, então esta carteira pode perder, no máximo, $ 2 milhões
de hoje até 10 dias, com 99% de probabilidade. Ou seja, existem somente 1%
de chances de a carteira vir a perder mais do que $ 2 milhões. Por exemplo, o
VaR de uma carteira que vale M = $200.000, cujo risco é σC = 5% ao dia, para
o horizonte de tempo de 10 dias e grau de confiança de 99% é dado por:
p zp
95,0% 1,6449
97,5% 1,9600
99,0% 2,3263
99,9% 3,0902
Tabela 6.4: Grau de confiança da distribuição normal.

Ou seja, com 99% de chances, essa carteira pode vir a perder no máximo,
de hoje até 10 dias, $73.564. Há somente 1% de chances de a carteira perder
mais de $73.564 neste mesmo período.

6.3.2 Programação em VBA do VaR (Value-at-Risk)

Vamos inicialmente a uma proposta de código:

01 Option Base 1
02 Function fncVaR(M, RT, GC, T) As Double
03 fncVaR = M * RT * Application.NormSInv(GC) * Sqr(T)
04 End Function

Código 6.3: Código-fonte 28.

A novidade aqui é a utilização de uma função do Excel (INV.NORM)


que retorna o valor de corte z dado um grau de confiança. Esta função no VBA
é acessada por Application.NormSInv que utiliza como parâmetro de
entrada o a confiança com que se deseja obter a estimativa de perda máxima.
Como exemplo, vamos utilizar a composição da carteira dada na Tabela
6.2, onde calculamos o risco da carteira utilizando a função fncRT. Vamos
supor que a carteira valha $100.000, e iremos calcular o valor do risco, num
grau de confiança de 95%, e um horizonte de tempo de 10 dias. A figura
seguinte ilustra a aplicação da função na planilha do Excel.
Figura 6.2: Ilustração da aplicação da função fncVaR.

O valor encontrado é de $50.937, indicando que, com 95% de confiança,


a carteira não perderá mais do que cerca de 51 mil reais no horizonte de
tempo de 10 dias, se não houver modificação de sua composição.
Para ilustrar os códigos-fonte na janela do editor do Visual Basic, temos
na Figura 6.3 o aspecto da implementação das duas funções utilizadas.

Figura 6.3: Ilustração da janela de código com a implementação das funções fnvRT e fncVaR.
Ainda, a função fncRT poderia estar aninhada a função fncVaR na
chamada pela planilha. Isto é, poderíamos ter calculado o VaR sem
necessidade da referência às células contendo o valor de RT, nem mesmo às
com os valores de M, GC e T, com a chamada à função conforme a Figura
6.4.

Figura 6.4: Ilustração da aplicação da função fncVaR com parâmetros numéricos e chamada à função
fncRT.
6.4 Modelo de Variâncias - Covariâncias do VaR

Na prática, em geral, os dados de entrada no modelo de VaR envolvem,


além dos parâmetros de horizonte de tempo e grau de confiança, o volume de
cada ativo na carteira dado por um vetor M e uma matriz que representa as
variâncias de cada ativo e as covariâncias entre os ativos.
De fato, o leitor mais atento talvez tenha ficado com uma dúvida
filosófica. Em nenhum momento levamos em consideração, pelo menos
explicitamente, variâncias e covariâncias. O modelo de variâncias-
covariâncias é equivalente ao modelo que depende do risco da carteira, que
discutimos na seção anterior. Simplesmente, ao invés de utilizarmos riscos e
correlações, usamos variâncias e covariâncias. A relação de igualdade entre
esses parâmetros é dada a seguir:

(6.5)

aonde ρij é a correlação entre os retornos dos ativos i e j; e σi é a


volatilidade do ativo i. Note que, para i = j, temos:

pois ρii = 1, conforme já discutido anteriormente. O parâmetro σi2


representa a variância dos retornos do ativo i.
Agora, fica claro porque o modelo de VaR discutido até o momento é
chamado de modelo de variâncias-covariâncias. A partir das posições em
cada ativo, dado por um vetor M, e da matriz de variâncias-covariâncias C, o
VaR para o horizonte de tempo de T dias e grau de confiança p, pode ser
obtido com auxílio da equação a seguir:

(6.6)

aonde σ = e M’ é a transposta de M.

Note que, neste caso, M é um vetor com a posição de cada ativo na


carteira, em valores monetários. Assim, ao invés de termos um vetor W com
as participações de cada ativo na carteira, temos um vetor M com os valores
de exposição em cada ativo.
Na discussão a seguir, vamos programar uma função que calcula o VaR
por meio do modelo de variâncias-covariâncias. Inicialmente, vamos ilustrar
como obter a matriz de variâncias-covariâncias a partir das volatilidades e das
correlações. Posteriormente, vamos desenvolver a função que calcula o VaR
utilizando a Equação 6.6.

6.4.1 Matriz de variâncias e covariâncias

Os termos da matriz que relaciona as variâncias e covariâncias entre os


ativos de uma carteira são dados por:

(6.7)

aonde ρij é a correlação entre os ativos e, σi e σj as volatilidades do i-ésimo


e j-ésimo ativo respectivamente.
Como exemplo, vamos supor a seguinte carteira composta pelos Ativos 1,
2 e 3:

Ativo Exposição Volatilidade


1 $100.000 0.06
2 $200.000 0.07
3 $200.000 0.09
Tabela 6.5: Carteira exemplo, composta por três ativos.

Os parâmetros de correlação entre os ativos são:

Correlação Ativo 1 Ativo 2 Ativo 3


Ativo 1 1,0 0,5 0,9
Ativo 2 0,5 1,0 0,2
Ativo 3 0,9 0,2 1,0
Tabela 6.6: Coeficientes de correlação entre os ativos da carteira exemplo.

Através da fórmula expressa em 6.7, a matriz de Variâncias-Covariâncias


pode ser encontrada:

Var-Covar Ativo 1 Ativo 2 Ativo 3


Ativo 1 3,60E-3 2,10E-3 4,86E-3
Ativo 2 2,10E-3 4,90E-3 1,26E-3
Ativo 3 4,86E-3 1,26E-3 8,10E-3
Tabela 6.7: Coeficientes de Variância-Covariância entre os ativos da carteira exemplo.

6.4.2 Programação em VBA para obtenção da matriz de variâncias e


covariâncias

Para mostrar como podemos implementar a funcionalidade de retornar


uma matriz como resultado de uma função na planilha do Excel, podemos
criar uma função que retorna os valores de Variância-Covariância, conforme
dado pela fórmula 6.7. O código pode ser escrito como:
01 Function fncVarCovar(V,CORR) As Variant
02 Dim auxVarCovar() As Double
03 Dim i, j As Integer
04 ReDim auxVarCovar(1 To V.Count, 1 To V.Count)
05 For i = 1 To V.Count
06 For j = 1 To V.Count
07 auxVarCovar(i, j) = CORR(i, j) * V(i) * V(u)
08 Next j
09 Next i
10 fncVarCovar = auxVarCovar
11 End Function

Código 6.4: Código-fonte 29.

Como a função fncVarCovar retorna um vetor de dados, não podemos


declará-la como Double, como vimos até agora. Devemos declará-la como
Variant, para que retorne um tipo de dado compatível com a matriz desejada.
Na linha 2, declaramos uma variável auxVarCovar como um vetor de dados,
cuja dimensão foi ignorada. A correta dimensão foi definida na linha 4,
conforme a dimensão do vetor de volatilidades. No exemplo, a
representatividade da variável auxVarCovar é de uma matriz 3x3. Esta será
alocada à saída (linha 11). Nas linhas 5 a 10, o cálculo dos termos da matriz
de Variância-Covariância, lembrando que a matriz de variâncias
(volatilidade) V é uma sequência de valores respectivos aos ativos, e CORR
é uma sequência de valores de correlação da matriz, em fila, da esquerda para
a direita, de cima para baixo, conforme já discutido.
Utilizamos os valores do exemplo (Tabela 6.6 e Tabela 6.7) para mostrar
o resultado da função:
Figura 6.5: Ilustração da aplicação da função fncVarCovar.

Após inserir os valores das tabelas citadas, deve-se selecionar o espaço da


planilha aonde os dados, que retornarão da chamada à função fncVarCovar,
serão colocados. Na Figura 6.5, a seleção F7:H9 corresponde a uma matriz
3x3, para os resultados, já que os valores de entrada possuem ordem 3:
volatilidades, expressadas em C2:C4; e matriz de correlação, em F2:H4. A
tecla [F2] nos permite a entrada da chamada a função:
[F7]:=fncVarCovar(C2:C4;F2:H4). Pressione simultaneamente [SHIFT] +
[CTRL] + [ENTER]. O resultado encontra-se na figura seguinte. Observe que
esse mecanismo possibilita que uma função gera um resultado no formato de
matriz.
Figura 6.6: Ilustração dos resultados da aplicação da função fncVarCovar.
6.5 Delta VaR - Sensibilidade do VaR frente ao ativo

O Delta VaR é uma medida de sensibilidade do VaR da carteira em


relação a pequenas alterações nas posições de cada ativo da carteira. Assim,
constitui um parâmetro que permite identificar quais ativos, dentro do
contexto da carteira, mais contribuiriam para o aumento ou diminuição do
risco.
O Delta VaR pode ser calculado através da fórmula:

(6.8)

Continuando com o exemplo anterior, podemos calcular o Delta VaR,


para um intervalo de confiança de 95%, aonde z = 1,65, e um horizonte de
tempo de um dia, no qual T = 1. Assim, temos:

Uma aplicação direta dos resultados do Delta VaR, para o exemplo


proposto, é a possibilidade de avaliar variações da estimativa do VaR, frente a
uma variação na posição do ativo. Se um aumento de $1 na posição do ativo
1 fosse realizado, esperar-se-ia aproximadamente um aumento no VaR, o
equivalente a $0,0945.
Assim, dentro do contexto da carteira, pode-se identificar que a redução
do VaR poderia ser mais rapidamente obtida com a diminuição de exposição
no ativo 3. Para cada $1 a menos no ativo 3, espera-se uma diminuição de
aproximadamente $0,1272 no VaR.
Deve-se ressaltar que o Delta VaR é uma aproximação semelhante à
obtida por meio do conceito matemático de derivada. Assim, os valores dados
pelo Delta VaR representam valores aproximados do verdadeiro aumento ou
diminuição do VaR quando $1 é adicionado em cada ativo. Quanto maior a
variação no ativo, menor a acuidade do Delta VaR.

6.5.1 Programação em VBA para obtenção do Delta VaR

O código a seguir representa uma solução para o Delta VaR:

01 Function fncDeltaVaR(M, C, Z, T) As Variant


02 Dim auxDeltaVaR() As Double
03 Dim auxMC(), auxMCM As Double
04 Dim i, u As Integer
05 ReDim auxDeltaVaR(1 To M.Count)
06 ReDim auxMC(1 To M.Count)
07 For i = 1 To M.Count
08 For u = 1 To M.Count
09 auxMC(i) = auxMC(i) + M(u) * C(i, u)
10 Next u
11 auxMCM = auxMCM + auxMC(i) * M(i)
12 Next i
13 auxMCM = Sqr(auxMCM)
14 For i = 1 To M.Count
15 auxDeltaVaR(i) = auxMC(i) * Z * Sqr(T) / auxMCM
16 Next i
17 fncDeltaVaR = auxDeltaVaR
18 End Function

Código 6.5: Código-fonte 30.


Novamente, uma variável auxiliar, de nome auxDeltaVaR foi declarada,
a qual dará a fncDeltaVar a estrutura de dados necessária para que a função
retorne os resultados esperados. Aqui, calculamos o denominador e o
numerador, como parte da implementação da Equação 6.8, separadamente,
aonde as variáveis auxMC e auxMCM, as representam, respectivamente.
Estas variáveis nos auxiliarão a acelerar o processamento da função (linhas 7
a 13). Assim:

auxMC = M0 · C
auxMCM = M0 · C · M
Na linha 13 temos a função Sqr() sobre o auxMCM atribuindo a ela
mesma, sua raiz quadrada. Os componentes do vetor são então calculados no
laço das linhas 14 a 16, e atribuído de resultados à função, na linha 17. O
resultado esperado é o seguinte:

Figura 6.7: Ilustração dos resultados da aplicação da função fncDeltaVaR.

Lembre z pode ser calculado por meio de uma chamada a um recurso do


Excel a partir do grau de confiança: z = Application.NormSInv(p) aonde p é
o grau de confiança, conforme apresentado a seguir.
6.6 Component VaR - Contribuição do ativo na formação do VaR

O Component VaR representa um vetor que mostra qual a contribuição de


cada ativo para o VaR total da carteira. Note que o DeltaVaR aplicado sobre
os valores da composição da carteira (M), permite a obtenção dos valores dos
componentes do VaR:

(6.9)

A Tabela 6.8 ilustra valores que podem ser encontrados, usando o


exemplo foi discutido na seção sobre DeltaVar. A grande aplicabilidade do
ComponentVaR é identificar quais os ativos que mais estão afetando o VaR.
Por exemplo, a carteira total possui um VaR de $50.459, do qual $9.453
decorre da posição no ativo 1, $15.561 decorre da posição no ativo 2 e
$25.445 decorre da posição no ativo 3.

Ativo Exposição Delta VaR Component VaR


1 $100.000 0,094529 $9,453
2 $200.000 0,077803 $15,561
3 $200.000 0,127226 $25,445
VaR = $50.459
Tabela 6.8: Componentes do VaR, aproximado pelo Delta VaR, da carteira exemplo.

Pode-se perceber que, embora os ativos 2 e 3 tenham mesma exposição


em valores monetários ($200.000), dentro do contexto das volatilidades e
correlações, o ativo 3 representa a maior parte do VaR da carteira.
O Component VaR poderia ser usado em qualquer aplicação que envolva
uma segregação do VaR. Por meio do método de Variâncias-Covariâncias,
por exemplo, o Component VaR poderia ser utilizado para identificar qual
trader tem maior contribuição para o VaR de uma tesouraria, ou qual unidade
de negócio contribui com a maior parte do risco medido pelo VaR de uma
instituição financeira.

6.6.1 Programação em VBA para obtenção do Component VaR

Uma possível codificação, sem novidades:

01 Function fncComponentVaR(DeltaVaR, M) As Variant


02 Dim auxComponentVaR() As Double
03 Dim i As Integer
04 ReDim auxComponentVaR (1 To M.Count)
05 For i = 1 To M.Count
06 auxComponentVaR = DeltaVaR(i) * M(i)
07 Next i
08 fncComponentVaR = auxComponentVaR
09 End Function

Código 6.7: Código-fonte 32.

Exercício 6.1: O Beta VaR é o percentual que cada componente do VaR


representa no risco total medido pelo VaR. Dentro do modelo de variâncias-
covariâncias, o Beta VaR pode ser calculado da seguinte forma:

(6.10)

A tabela a seguir ilustra valores que podem ser encontrados:

Ativo Representação Delta VaR Beta Var


1 $100,000 0,094529 18,73%
2 $200,000 0,077803 30,84%
3 $200,000 0,127226 50,53%
Tabela 6.9: Componentes do VaR, aproximado pelo Delta VaR, da carteira exemplo.

Resolução
Uma possível codificação, sem novidades, para cálculo do Beta VaR é
apresentada a seguir.

01 Function fncBetaVaR(DeltaVaR, M, VaR) As Variant


02 Dim auxBetaVaR() As Double
03 Dim i As Integer
04 ReDim auxBetaVaR (1 To M.Count)
05 For i = 1 To M.Count
06 auxBetaVaR = DeltaVaR(i) * M(i) / VaR
07 Next i
08 fncBetaVaR = auxBetaVaR
09 End Function

Código 6.7: Código-fonte 32.


Capítulo 7
Precificação de Derivativos

O Excel possui diversas ferramentas para cálculos matemáticos e análises


estatísticas. No ambiente da planilha, essas ferramentas são comumente
acessadas a partir de funções predefinidas ou por meio de procedimentos que
envolvem rotinas já incorporadas nos menus.
Por exemplo, funções exponenciais, logarítmicas e trigonométricas podem
ser facilmente acessadas nas células. Adicionalmente, existem diversas outras
ferramentas que possibilitam cálculos mais elaborados para a obtenção de,
por exemplo, raízes ou ponto de máximo ou mínimo.
Neste contexto, o objetivo didático deste capítulo é mostrar como o
usuário pode utilizar funções ou rotinas mais elaboradas que já estão
incorporadas no Excel no ambiente de desenvolvimento das macros. Para
exemplificar a chamada de funções ou uso de ferramentas, analisaremos
contratos de opções, que constituem importantes instrumentos do mercado
financeiro.
Em particular, o exemplo básico deste capítulo tratará da chamada da
função de distribuição normal acumulada, para precificação de opções e de
uso do add-in Atingir metas, para estimação da volatilidade implícita. Como
nos capítulos anteriores, faremos uma breve contextualização dos conceitos
financeiros, discutiremos algumas aplicações e apresentaremos funções
implementadas em VBA do Excel.
Leitores com maior interesse em aprofundar conhecimentos sobre o
mercado de opções podem buscar detalhes de opções em Hull (2014).
7.1 Modelo de Black-Scholes (B-S)

Os contratos de opções constituem produtos financeiros denominados de


derivativos. Os derivativos recebem este nome, pois representam produtos
financeiros cujo valor depende de outro ativo, chamado de ativo-objeto.
Esses instrumentos financeiros possibilitam o estabelecimento de
estratégias que dificilmente poderiam ser estruturadas com a utilização de
quaisquer outros produtos do mercado financeiro. Neste capítulo, nosso
intuito é exemplificar, por meio da obtenção de um preço justo para os
contratos de opções, o uso de ferramentas predefinidas no Excel.
Existem basicamente dois contratos de opções tradicionais: (i) as opções
de compra, também denominadas de calls e (ii) as opções de venda, também
chamadas de puts. O investidor que compra uma opção, independentemente
de comprar uma call ou uma put, é denominado titular. O investidor que
vende uma opção é chamado de lançador. As opções representam direitos a
serem exercidos em alguma data.
Em um contrato de call, isto é, de opção de compra, o titular tem o direito
de comprar um ativo-objeto, em uma data futura, por um preço
predeterminado. Este preço determinado é denominado preço de exercício da
opção. Em uma call, o titular da opção só exerce seu direito quando lhe for
conveniente, ou seja, quando puder comprar o ativo por um preço atrativo.
Ou seja, o titular da call exerce seu direito de compra quando o preço do
ativo na data de vencimento for maior que o preço de exercício.
Já em um contrato de put, isto é, opção de venda, o titular possui um
direito de vender um ativo-objeto em uma determinada data por um preço
pré-estabelecido. Esse preço predefinido é chamado de preço de exercício.
Assim, no caso de opção de venda, o titular exerce seu direito quando, na
data de vencimento do contrato, o preço do ativo-objeto for menor que o
preço de exercício.
Pela descrição dos produtos, a posição dos titulares das opções parece ser
bastante confortável, pois podem exercer seu direito, de compra no caso da
call ou de venda no caso da put, quando lhes é conveniente. Porém, este
direito tem um preço. Para obterem uma opção, os titulares devem pagar
antecipadamente um valor denominado prêmio da opção.
Este prêmio corresponde ao valor pago pelo direito de compra, no caso de
uma call, ou pelo direito de venda, no caso de uma put, do ativo-objeto, por
um preço pré-estabelecido. Em contrapartida, o lançador da opção recebe o
prêmio para ficar obrigado a atender ao direito do titular, caso a opção seja
exercida.
Assim, em uma call, quando o titular exerce seu direito de compra, o
lançador tem a obrigação de vender o ativo-objeto pelo preço predefinido. No
caso de uma put, quando o titular exerce seu direito de venda, o lançador tem
a obrigação de comprar o ativo-objeto pelo preço pré-estabelecido. Pode-se
perceber que a posição do lançador é mais arriscada, pois o titular da opção
só exerce seu direito quando lhe é conveniente. Neste cenário de exercício da
opção, o titular opera o ativo-objeto a um preço satisfatório, porém, o
lançador incorre em uma perda.
Considerando o fato de que, na data de vencimento, o titular da opção
somente exerce seu direito quando lhe é conveniente, o lançador da opção, no
momento da operação com a opção, cobra um valor, isto é, o prêmio, para
correr o risco de ter que operar o ativo-objeto em condições desfavoráveis na
data de vencimento.
Uma questão fundamental em teoria de finanças é justamente identificar
um modelo que permita definir um preço justo para o prêmio a ser pago por
um direito de operar um determinado ativo-objeto, por um preço fixo já
definido anteriormente, em uma data futura.
O conceito de opções, apesar de simples, não é facilmente assimilável. A
assimetria entre direitos e obrigações de titulares e lançadores de opções
torna a compreensão das opções um pouco mais difícil. Além disso, esta
assimetria torna o mecanismo de precificação de opções, ou seja, a definição
de um valor justo para o prêmio, bastante complexo. De fato, a precificação
de opções desafiou o mercado financeiro durante décadas, tendo sido
primeiramente resolvida com os estudos seminais de Fisher Black, Myron
Scholes em 1973 e Robert Merton em 1974[2] que culminou na fórmula de
Black-Scholes.
A fórmula de Black-Scholes reflete um dos modelos financeiros mais
utilizados no mundo. Praticamente qualquer trader de derivativos já
desenvolveu uma planilha que simula a fórmula de Black-Scholes. Apesar da
derivação desta fórmula ser engenhosa e complexa, uma das características
interessantes é sua facilidade de implementação computacional em planilha
eletrônica.

7.1.1 Formulação de Black-Scholes

A fórmula de Black-Scholes permite estimar, de maneira analítica, um


preço justo para o prêmio de uma opção cujo ativo-objeto seja simples.
Considerando que a opção representa um direito futuro de operar um
determinado ativo-objeto em uma data futura, por um preço de exercício do
direito, pode-se elencar alguns elementos do modelo de precificação: preço à
vista do ativo-objeto (S), preço de exercício do direito (K), prazo referente ao
período de tempo até o vencimento da opção (T).
Além disso, a precificação de opções exige ainda outros parâmetros de
entrada como taxa de juros livre de risco (R) e volatilidade dos retornos do
ativo-objeto (σ). Adicionalmente, no caso em que o ativo-objeto é uma ação,
pode-se levar em consideração no modelo de precificação, uma taxa de
pagamento de dividendos. Sem entramos em detalhes, é importante ressaltar
que na fórmula de Black-Scholes, todos os valores de taxa referem-se a uma
capitalização contínua.
A fórmula de Black-Scholes é dada por:

(7.1)

onde

S = preço à vista do ativo-objeto;


K = preço de exercício da opção;
v = volatilidade do ativo-objeto;
T = prazo para vencimento da opção;
r = taxa de juros livre de risco; e
q = taxa de pagamento de dividendos (opcional).

Com:

(7.2)

(7.3)

(7.4)

(7.5)
onde f(x) é a função que retorna o valor da distribuição normal padrão,
com média em zero e desvio padrão unitário, em função da distância x à
média.
O código exposto na próxima seção remete à implementação da equação
7.1, com a incorporação das variáveis definidas em 7.2, 7.3 e 7.4, utilizando a
chamada à função Norm_S_Dist, do Excel, intrínseca em sua biblioteca, que
fornece uma solução adequada para a Equação 7.4. Para uma discussão
completa de derivativos, Hull (2014).

7.1.2 Programação em VBA da formulação de Black-Scholes

Podemos ver que o código é bastante simples. A fórmula é longa e o


espaço em página é bastante restrito. Assim, como nos diversos códigos
anteriores, utilizamos o caractere underline “_” para indicar ao VBA uma
continuação da instrução na linha posterior. Utilizamos este recurso devido
ao espaço, mas é, também, extremamente útil para organizar, por exemplo, os
termos de um somatório.

01 Function fncBSCall(S, K, V, T, R, Q) As Double


02 fncBSCall = S * _
03 WorksheetFunction_S_Dist( _
04 (Log(S / K) + T * (R - Q + V ^ 2 / 2)) / _
05 V * Sqr(T) True) * Exp(-Q * T) - _
06 K*_
07 WorksheetFunction.Norm_S_Dist ( _
08 (Log(S / K) + T * (R - Q - V ^ 2 / 2)) / _
09 V * Sqr(T) True) * Exp(-R * T)
10 End Function
Código 7.1: Código-fonte 34.

As funções pré-programadas do Excel podem ser acessadas, assim como


neste caso com a distribuição cumulativa normal padrão, por meio da
estrutura Application que remete à chamada de uma função f(x) (Equação
7.5) do aplicativo. Existem diversas funções previamente disponíveis no
Excel para serem utilizadas, do mesmo modo que são utilizadas em planilha.
Não é o escopo desta obra fazer referência a todas elas. Para tanto, a ajuda do
Excel é valiosa. Observe ainda que podemos utilizar outras funções chamadas
Sqr() e Exp(), que retornam a raiz quadrada e o valor de e elevado ao
argumento passado, respectivamente. A Tabela 7.1 contém algumas funções
matemáticas presentes no VBA e a Tabela 7.2 as funções derivadas a partir
delas.
A função f(x) (Equação 7.4) poderia ser implementada, caso não houvesse
disponível no VBA do Excel, conforme sugestão a seguir:

01 Function fncNormSDist(z) As Double


02 fncNormSDist = Exp(-z^2 / 2) / _
03 Sqr(2 * Application.Pi())
04 End Function

Código 7.2: Código-fonte 35.

Note que o valor de π que utilizamos é o retorno de uma função do Excel,


chamada Pi() que não requer argumentos. Neste caso, π possui nível de
precisão dado pelo valor 3,14159265358979. Mas poderíamos ser, ainda
mais, independentes do Excel e definir o valor de π sem recorrer a uma
fórmula:

01 Function fncNormSDist2(z) As Double


02 fncNormSDist = Exp(-z^2 / 2) / _
03 Sqr(2 * 3.14159265358979)
04 End Function

Código 7.3: Código-fonte 36.

Voltando a codificação de fncBSCall, vamos alterá-lo para que o valor de


Q seja opcional na função, com valor zero quando ignorado pela chamada
esta função:
01 Function fncBSCall(S, K, V, T, R, Optional Q) As Double
02 If IsMissing(Q) Then Q = 0
03 fncBSCall = S * _
04 WorksheetFunction.Norm_S_Dist( _
05 (Log(S / K) + T * (R - Q + V ^ 2 / 2)) / _
06 V * Sqr(T), True) * Exp(-Q * T) - _
07 K*_
08 WorksheetFunction.Norm_S_Dist( _
09 (Log(S / K) + T * (R - Q - V ^ 2 / 2)) / _
10 V * Sqr(T), True) * Exp(-R * T)
11 End Function

Código 7.4: Código-fonte 37.

Informamos ao interpretador do VBA que a variável Q é opcional, a partir


da instrução Optional (linha 1). Na linha 2 possui um tratamento sobre o
valor de Q caso esteja faltando [IsMissing(Q)] ele seja inicializado com o
valor zero.

Função Utilização Exemplo


Abs() Módulo Abs(-9) retorna 9
Atn() Arco tangente Atn(1) retorna π/4
Cos() Cosseno Cos(1.5708) retorna 0
Exp() Exponencial Exp(0) retorna 1
Log() Logaritmo natural Log(1) retorna 0
Rnd() Randômico Rnd(0.1) retorna 0.7056
Sqn() Sinal Sqn(-9) retorna -1
Sin() Seno Sin(1.5708) retorna 1
Sqr() Raiz Quadrada Sqn(9) retorna 3
Tan() Tangente Tan(9.7854) retorna 1
Tabela 7.1: Operações aritméticas presentes no VBA e exemplos de aplicação.

Nomes das funções Cálculo realizado


Secante Sec(X) = 1/Cos(X)
Co-secante Cosec(X) = 1/Sin(X)
Inverso Cotan(X) = 1/Tan(X)
Seno inverso Arcsin(X) = Atn(X/Sqr(-X*X+1))
Co-seno inverso Arccos(X) = Atn(-X/Sqr(-X*X+1)) + 2*Atn(1)
Secante inversa Arcsec(X)=Atn(X/Sqr(X*X–1))+Sgn((X) – 1)*(2*Atn(1))
Co-secante inversat Arccosec(X) = Atn(X/Sqr(X*X–1)) +(Sgn(X)–1)*(2*Atn(1))
Co-tangente inversa Arccotan(X) = Atn(X) + 2*Atn(1)
Seno hiperbólico Sinh(X) = (Exp(X)–Exp(-X))/2
Co-seno hiperbólico Cosh(X) = (Exp(X)+Exp(-X))/2
Tangente hiperbólica Tanh(X)=(Exp(X)–Exp(-X))/(Exp(X)+Exp(-X))
Secante hiperbólica Sech(X) = 2/(Exp(X)+Exp(-X))
Co-secante hiperbólica Cosech(X) = 2/(Exp(X)–Exp(-X))
Có-tangente hiperbólica Cotanh(X)=(Exp(X)+Exp(-X))/(Exp(X)-Exp(-X))
Seno hiperbólico inverso Arcsinh(X) = Log(X+Sqr(X*X+1))
Co-seno hiperbólico inverso Arccosh(X) = Log(X+Sqr(X*X–1))
Tangente hiperbólica inversa Arctanh(X) = Log((1+X) / (1–X))/2
Secante hiperbólica inversa Arcsech(X) = Log((Sqr(-X*X+1) + 1)/X)
Co-secante hiperbólica inversa Arccosech(X)=Log((Sgn(X)* Sqr(X*X+1)+1)/X)
Co-tangente hiperbólica inversa Arccotanh(X) = Log((X+1)/(X–1))/2
Logaritmo de base N Logn(X) = Log(X)/Log(N)
Tabela 7.2: Algumas funções matemáticas derivadas, obtidas das básicas presentes no VBA.
7.2 Cálculo da Volatilidade implícita

A discussão anterior permitiu identificar os parâmetros necessários para a


precificação de uma opção. Utilizando a fórmula de Black-Scholes, o
investidor pode ter uma estimativa do prêmio justo a ser pago ou cobrado por
uma opção. Deve-se destacar que praticamente todos os parâmetros da
fórmula de Black-Scholes são observáveis.
O parâmetro S equivale ao preço à vista do ativo-objeto, cuja informação é
refletida nas transações com o ativo-objeto que estão sendo realizadas no
mercado. O parâmetro K, representativo do preço de exercício, é estabelecido
no contrato da opção. O prazo para o vencimento T pode ser facilmente
calculado tomando-se o intervalo de tempo entre o instante atual e o instante
do vencimento da opção que, por sua vez, também é definida previamente no
contrato. A taxa de juros livre de risco r representa o custo prefixado do
dinheiro associado ao prazo para o vencimento. Essa taxa de juros também é
facilmente observada no mercado, em função de transações que refletem o
custo de oportunidade de empréstimos considerados de baixíssimo risco.
Assim, na fórmula de Black-Scholes, S, K, T, r são extraídos facilmente a
partir do levantamento de operações atuais no mercado financeiro e de
capitais ou a partir das especificações do contrato de opção. Os outros dois
parâmetros, ou seja, a volatilidade v e a taxa q de pagamentos de dividendos,
não são diretamente observáveis.
Para fins de simplificação da exposição, vamos considerar que o
parâmetro opcional q referente à taxa de pagamento de dividendos seja
omitido em nossa discussão. Com isso, podemos considerar que o único
parâmetro que não é direta e facilmente levantado é a volatilidade dos
retornos do ativo-objeto. A volatilidade representa um grau de dispersão dos
retornos do ativo-objeto. A volatilidade deve refletir a dispersão de retornos
até a data de vencimento da opção.
Note que essa análise é prospectiva, envolvendo uma estimativa do grau
de dispersão de retornos que ocorrerão no futuro. Como em qualquer
processo de estimação, pode haver incertezas associadas ao valor da
volatilidade a ser considerada no modelo. Apesar de a volatilidade na fórmula
de Black-Scholes envolver dispersão de retornos futuros, uma das formas
através das quais o mercado projeta a volatilidade futura envolve a utilização
de dados passados.
Porém, como o passado pode não representar adequadamente o futuro, os
participantes do mercado financeiro lançam mão de uma engenharia reversa.
Considerando que existe um preço de mercado para o prêmio das opções,
pode-se buscar identificar qual a volatilidade que torna o prêmio calculado
pela fórmula de Black-Scholes igual ao prêmio transacionado no mercado.
Exemplificando, suponha uma opção de compra com preço de exercício K
= 100, prazo para o vencimento igual a T = 2 meses. O ativo-objeto da opção
é uma ação que está sendo negociada ao preço de S = 102 e que apresenta
uma volatilidade histórica equivalente a v = 3% ao mês. Considere que a taxa
de pagamentos de dividendos é nula, ou seja, q = 0 e que a taxa de juros livre
de risco é igual a r = 1% ao mês. Usando a fórmula de Black-Scholes
implementada anteriormente, temos um valor teórico para o prêmio da opção
equivalente a $4,44. Para o cálculo do valor teórico, estamos supondo que a
volatilidade dos retornos do ativo-objeto durante o prazo até o vencimento
será igual à volatilidade histórica utilizada na fórmula de precificação.
Porém, como já dissemos, a volatilidade histórica pode não representar
adequadamente a verdadeira volatilidade que o mercado projeta para o ativo-
objeto durante o período até o vencimento da opção. Se o mercado acha que a
volatilidade até o vencimento será efetivamente diferente da volatilidade que
ocorreu no passado, provavelmente o valor teórico da opção será distinto do
valor do prêmio que está sendo transacionado pelos investidores.
Suponha que após calcular o prêmio teórico da opção, o investidor
verifica que o prêmio negociado no mercado é de CallMercado = $5,30, bem
diferente de seu resultado teórico de CallTeórico = $4,44. Tendo em vista que a
volatilidade representa o único item sujeito à estimação, tendo sido obtido
por meio de dados históricos, o investidor pode querer investigar qual seria a
volatilidade com a qual o mercado está trabalhando.
Uma das formas de identificar qual a volatilidade que o mercado espera
para o ativo-objeto é chutar valores de volatilidade de tal forma que o
resultado teórico obtido a partir da fórmula de Black-Scholes se iguale ao
valor de mercado. No jargão de mercado, este procedimento permite a
obtenção da volatilidade implícita. Ou seja, a volatilidade implícita representa
a volatilidade que está embutida no preço de mercado de uma opção. No
nosso exemplo, a volatilidade histórica que usamos para estimar o prêmio da
opção está incompatível com o valor estimado pelo mercado.
No ambiente da planilha do Excel pode-se obter a volatilidade implícita,
isto é, a volatilidade que iguala o valor teórico da fórmula de Black-Scholes,
com o valor negociado pelo mercado, utilizando um procedimento simples.
Vamos inicialmente criar a situação mencionada em uma planilha, conforme
apresentado na Figura 7.1:
Figura 7.1: Ilustração da aplicação da função fncBSCall.

Note que apenas inserimos os valores do modelo em B1, B2, B3, B4, B5 e
B6; em B8 realizamos do cálculo do CallTeórico´ com a função criada
fncBSCall. O valor que se obtém é de 4,44. Para obtermos a volatilidade
implícita recorremos à ferramenta de “Atingir meta” da opção de “Teste de
Hipóteses” do conjunto de opções da paleta “Dados”, conforme a figura a
seguir:

Figura 7.2: Acesso ao recurso “Atingir meta” do Excel 2016.


A seguinte janela se abre:

Figura 7.3: Recurso “Atingir meta” do Excel.

Vamos preenchê-la da seguinte forma:

Figura 7.4: Valores do exemplo para “Atingir meta”.


Lembrando que em B8 está a nossa função fncBSCall e em B3 a
volatilidade teórica, traduz-se a utilização desses valores na ferramenta
“Atingir meta” como: “Varie o valor da célula B3 para que a célula B8 atinja
o valor 5,30”. A janela seguinte que se abre:

Figura 7.5: Indicação de conclusão com sucesso de “Atingir meta”.

Após um clique sobre o botão “OK”, a célula B3 assume o valor da


volatilidade que garante à célula B8 o valor de mercado do ativo, neste caso
$5,30. O valor encontrado, 4% é a volatilidade implícita.
Figura 7.6: Dados atualizados após o uso de “Atingir meta”.

7.2.1 Programação em VBA para cálculo da volatilidade implícita

A ferramenta de “Atingir Metas” é bastante útil, contudo para vários


cenários, é desgastante acessar a ferramenta a cada utilização. Note nque o
usuário, a cada mudança do preço de mercado, por exemplo, teria que acessar
manualmente os menus para calcular a volatilidade implícita. Assim, vamos
criar uma possível solução que automatize o processo. Vamos então criar
uma lista de cenários, com valores de mercado entre $5,00 e $5,50:
Figura 7.7: Vários cenários para o uso de “Atingir meta”.

Além dos valores já discutidos, há uma coluna com rótulo “Auxiliar” e


outra com “v implícita”, nas quais serão colocados a saída da função auxiliar
criada e o valor da volatilidade implícita atingida pela ferramenta do Excel,
respectivamente.
Para facilitar a compreensão, reproduzimos abaixo, todo o código-fonte,
do módulo associado à planilha:

01 Public varCALLT() As String


02 Public varCALLM() As String
03 Public varVCELL() As String
04 Public varVIMPL() As String
05 Public intIndex As Integer
06
07 Function fncBSCall(S, K, V, T, R, Q) As Double
08 fncBSCall = S * _
09 WorksheetFunction.Norm_S_Dist( _
10 (Log(S / K) + T * (R - Q + V ^ 2 / 2)) / _
11 V * Sqr(T), True) * Exp(-Q * T) - _
12 K*_
13 WorksheetFunction.Norm_S_Dist( _
14 (Log(S / K) + T * (R - Q - V ^ 2 / 2)) / _
15 V * Sqr(T), True) * Exp(-R * T)
16 End Function
17
18 Function fncGoalV(CALLT, CALLM, VCELL, VIMPL) As String
19 intIndex = intIndex + 1
20 ReDim Preserve varCALLT(1 To intIndex)
21 ReDim Preserve varCALLM(1 To intIndex)
22 ReDim Preserve varVCELL(1 To intIndex)
23 ReDim Preserve varVIMPL(1 To intIndex)
24 varCALLT(intIndex) = CALLT.Address
25 varCALLM(intIndex) = CALLM.Value
26 varVCELL(intIndex) = VCELL.Address
27 varVIMPL(intIndex) = VIMPL.Address
28 fncGoalV = “registrado”
29 End Function
30
31 Sub subGoalV()
32 Dim i As Integer
33 If intIndex = 0 Then Exit Sub
34 For i = LBound(varCALLT) To UBound(varCALLT)
35 Range(varCALLT(i)).GoalSeek Goal:=varCALLM(i), _
36 ChangingCell:=Range(varVCELL(i))
37 Range(varVIMPL(i)) = Range(varVCELL(i))
38 Next i
End Sub

Código 7.5: Código-fonte 37.

Da linha 6 a 15 há o código da função fncBSCall, já discutido. Nas linhas


1 a 5 temos as declarações de variáveis públicas, i.e., que pode ser acessada
de qualquer parte do código, como String, que correspondem ao valor do
CallMercado (varCALLM), aos endereços das células onde se encontram o
valor de CallTeórico (varCALLT), da volatilidade do modelo (varVCELL) e
onde será retornado o valor da volatilidade implícita frente ao valor de
mercado (varVIMPL). Estes endereços são passados a estas variáveis nas
linhas 23 a 27 do corpo da função fncGoalV. Nesta função temos o
incremento da variável intIndex também declarada pública (linha 5) e
corresponde a tamanho do vetor de varCALLM, varCALLT, varVCELL e
varVIMPL. Note que estes vetores são redimensionados por meio da nossa
conhecida declaração Redim, mas agora com a opção Preserve. Assim, a
cada chamada da função, o vetor aumenta de tamanho (intIndex), sem perda
de dados nas posições subjacentes, e a cada chamada à função, temos o
registro dos endereços na qual a ferramenta “Atingir meta” deve agir. A linha
27 retorna à célula o texto “registrado” indicando que o cenário está na lista
de ação da ferramenta. A função fncGoalV aplicada à coluna auxiliar, frente
aos valores dos cenários, assume os resultados a seguir:

Figura 7.8: Uso da função fncGoalV em vários cenários para o uso de “Atingir meta”.

As linhas 30 a 38 não contém uma função, e sim uma sub-rotina, tratada


no Excel como uma macro, identificado com a declaração Sub na primeira
linha do corpo da rotina (linha 30). Foi assim elaborado porque a ferramenta
“Atingir meta” deve ser implementada em uma macro, devido a iteração
necessária para atingir os valores requeridos.
A sub-rotina possui uma declaração de uma variável i (inteira), na linha
31; um teste na linha 32, que prevê o uso incorreto da sub-rotina quando as
variáveis vetoriais, em questão, não possuem dados, i.e., não há argumentos
na lista de processamento (intIndex = 0), e saindo da sub-rotina neste caso;
um laço For...Next entre as linhas 33 e 37 varre todos os cenários, desde a
posição inferior do vetor LBound (Lower Bound) e a posição superior
UBound (Upper Bound); uma chamada ao recurso “Atingir meta”, na linha
34; uma cópia do valor encontrado na célula alvo para a volatilidade
implícita, na linha 36.
Cabe aqui uma explicação pormenorizada de tudo o que fizemos. Quando
passamos referências à células a variáveis de uma função, como em:
Function fncGoalV(CALLT, CALLM, VCELL, VIMPL) As String
cada uma das variáveis carrega consigo informações sobre a célula
passada. Assim, quando acessamos CALLT.Address, o valor retornado é o
endereço da célula passada, que nos permite registrar sua coordenada. Assim,
utilizamos na linha:
Range(varCALLT(i)).GoalSeek Goal:=varCALLM(i), _
ChangingCell:=Range(varVCELL(i))
já que o recurso necessita das coordenadas (endereços) da célula para
“Definir célula” e “Alternando célula”, e do valor de “Para valor”, como visto
na Figura 7.5.
A instrução seguinte (linha 35):
Range(varVIMPL(i)) = Range(varVCELL(i))
utiliza um objeto Range que representa uma célula, ou um conjunto delas,
dado pelo endereço passado como argumento. Deste modo, a célula, cujo
endereço está na lista varVIMPL assume o valor que está na célula, cujo
endereço está definido em varVCELL.
Podemos então, dadas as explicações e aplicação da fncGoalV, acessar a
sub-rotina por meio do botão “Macros” da paleta “Desenvolvedor” (Figura
7.10). No Excel 2016, utilize a opção “Macros”, dentro do item “Macro” do
menu “Ferrramentas” (Figura 7.11).
Figura 7.9: Acesso a macros no Excel 2016.

A janela de macros disponíveis se abre (Figura 7.12). Execute a subrotina


subGoalV clicando no botão “Executar”. Os valores para a volatilidade
implícita, para os diferentes cenários, frente às células referenciadas, são
encontrados e apresentados (Figura 7.13).

Figura 7.10: Janela de acesso às macros.7.3 Exercício de fixação.


Figura 7.11: Valores de volatilidades implícitas encontrados com auxílio da ferramenta de “Atingir
meta”.
7.3 Exercício de fixação

7.3.1 Gregas das opções de compra (Delta da Call, Gamma da Call,


Kappa da Call, Theta da Call, Rho da Call)

O modelo de Black-Scholes permite obter outras informações, conhecidas


como gregas das opções, dada pelas equações:

(7.6)

O Delta da Call mede a variação de preço da opção em função de


flutuações no preço do ativo-objeto.

(7.7)

O Gamma da Call mede a sensibilidade do Delta da Call.


(7.8)

O Kappa da Call mede a variação de preço da opção em função de


flutuações na volatilidade.

(7.9)

O Rho da Call mede a variação de preço da opção em função de


potenciais alterações na taxa de juros livre de risco.

O Theta Call mede a perda de valor esperada no prêmio da opção com o


passar do tempo.
7.4 Exercício de fixação: Precificação de opção de venda

Para as opções de venda, a formulação de Black-Scholes é ligeiramente


diferente da Equação 7.1:

(7.11)

7.4.1 Gregas das opções (Delta da Put, Gamma da Put, Kappa da Put,
Theta da Put, Rho da Put)

As gregas de opções para a opção de venda (put) sofre também


modificações. Assim:

(7.12)

O Delta da Put mede a variação de preço da opção.

(7.13)

O Gamma da Put mede a sensibilidade do Delta Call.

(7.14)

O Kappa da Put mede a variação de preço da opção em função de sua


volatilidade.
(7.15)

O Rho da Put mede a variação de preço da opção em função da taxa de


juros livre de risco.

O Theta da Put mede a perda de valor esperada no prêmio da opção de


venda, com o passar do tempo.
Capítulo 8
Simulação de Monte Carlo

Uma das principais aplicações do Excel em finanças envolve a realização


de simulações. A flexibilidade do Excel na estruturação de planilhas com
diversos cenários é extremamente útil, principalmente quando se deseja
identificar potenciais resultados sob condições ou premissas variadas.
Orçamentos de vendas e outros demonstrativos financeiros podem ser
simulados por meio desses diferentes cenários. Desta forma, por exemplo,
podem-se identificar resultados em situações de mercado ótimas, regulares ou
ruins.
A simulação de um número pequeno de cenários pode ser realizada
facilmente no ambiente de planilha. Porém, algumas aplicações financeiras
envolvem a projeção de uma quantidade elevada de cenários, que podem
ultrapassar milhares de situações.
Já apresentamos anteriormente o modelo de Black-Scholes para
precificação de opções. Esse modelo tem uma fórmula analítica que
possibilita que o prêmio de uma opção do tipo européia, isto é, com
possibilidade de exercício somente no vencimento, seja calculado facilmente
utilizando-se funções predefinidas do Excel.
Vamos estudar neste capítulo, a Simulação de Monte Carlo que possui
aplicações em precificação de derivativos financeiros e em mensuração de
riscos, já que, em diversas aplicações, as fórmulas analíticas são difíceis ou
até mesmo impossíveis de serem derivadas.
Assim, alguns produtos financeiros prescindem de técnicas alternativas
para que possam ser avaliadas. Para esses casos, mecanismos de simulação
podem ser utilizados. Uma das ferramentas mais importantes em finanças
envolve o uso de simulações computacionais como a de Monte Carlo.
O leitor mais interessado em aplicações gerais de Monte Carlo para
precificação e gestão de riscos pode encontrar textos interessantes em Monte
Carlo: Methodologies and Applications for Pricing and Risk Management
editado por Bruno Dupire, Great Britain: Risk Books, 1998.
8.1 Introdução

A lógica da Simulação de Monte Carlo é a geração de possíveis cenários


futuros aleatórios. Ao invés de se chegar a uma solução única, como nos
casos em que se utilizam fórmulas analíticas, na Simulação de Monte Carlo
procura-se projetar um grande número de potenciais resultados. A média
destes possíveis resultados representa uma estimativa da solução.
Portanto, a Simulação de Monte Carlo possibilita estimar uma solução
como, por exemplo, o valor esperado de um produto financeiro, a partir de
cenários futuros projetados utilizando-se um procedimento aleatório. Em
geral, nas aplicações em finanças, são utilizadas, no mínimo, 5.000 a 10.000
simulações de trajetórias de preços ou taxas.
No ambiente de planilha, a simulação de um número tão grande de
cenários pode dificultar a estruturação e a visualização de células relevantes.
Porém, dentro do VBA Excel, a Simulação de Monte Carlo é facilmente
programada e o resultado final pode ser inserido em uma única célula.
Deve-se ressaltar, no entanto, que, dependendo da avaliação empreendida
e do mecanismo que modela o comportamento de preços ou taxas, a execução
do programa em VBA pode ser demorada. Assim, se por um lado, a
Simulação de Monte Carlo possui grande flexibilidade para a resolução de
problemas complexos, por outro lado, exige recursos computacionais de
maneira bastante intensa.
8.2 Formulação matemática

Apesar da fórmula de Black-Scholes propiciar um valor para o prêmio de


uma opção do tipo europeu, iremos implementar um algoritmo simples de
Simulação de Monte Carlo para avaliar esse tipo de opção. Dessa maneira,
dentro do nosso objetivo de enfatizar o aprendizado de técnicas
computacionais em finanças, podemos levar em consideração um conceito
financeiro já apresentado e comparar resultados no uso de técnicas diferentes
para abordar um mesmo problema de precificação.
Neste livro, não levaremos em consideração técnicas para aprimorar o
desempenho computacional da simulação de Monte Carlo. Assim, por
exemplo, vamos supor que o algoritmo de geração de números aleatórios do
Excel seja adequado, pelo menos para a geração de uma amostra de 5.000
observações extraídas de uma distribuição uniforme.
Adicionalmente, não será foco de nossa discussão a otimização através do
uso de variáveis de controle ou de variáveis antitéticas que possibilitam
ganho de velocidade na Simulação de Monte Carlo.

8.2.1 Modelo de precificação

Conforme já discutimos, no caso de uma opção de compra ou call option,


o titular tem o direito de, se desejar, comprar um ativo-objeto, por um preço
de exercício K no vencimento T. No caso de uma opção de venda ou put
option, o titular tem o direito de, se desejar, vender um ativo-objeto, por um
preço de exercício K no vencimento T.
Vamos considerar inicialmente call options do tipo europeu, no qual o
titular pode exercer seu direito de compra somente na data de vencimento T.
A opção de venda será analisada mais adiante.
Em um momento inicial qualquer t, o preço do ativo-objeto, digamos,
uma ação, possui um determinado valor St. Até o vencimento na data T, o
preço da ação pode flutuar. O grande elemento associado a um produto
financeiro é a incerteza. Por exemplo, nunca se sabe qual será o preço de uma
ação em uma data futura.
Assim, no vencimento da opção, o preço da ação St pode estar tanto acima
quanto abaixo do preço de exercício K. Eventualmente, em um caso bastante
especial e pouco provável, o preço da ação no vencimento pode ser
exatamente o preço de exercício K.
Tendo em vista que o preço da ação pode assumir diferentes valores no
vencimento, a Simulação de Monte Carlo fundamenta-se na geração de um
número elevado de possíveis cenários. Ou seja, a partir de um modelo de
difusão de preços, pode-se projetar possíveis preços da ação para a data de
vencimento.
Para cada possível valor da ação no vencimento, a opção pode ter um
determinado valor. O método de Monte Carlo consiste na obtenção de um
valor médio da opção no vencimento, calculado a partir de inúmeras
simulações do preço da ação. Finalmente, esse valor médio é trazido a valor
presente, obtendo-se uma estimativa do prêmio da opção.
A ideia, portanto, baseia-se na projeção de preços da ação a cada variação
de tempo ∆t. Considerando um modelo de difusão de preços baseado em uma
distribuição lognormal, temos que o preço St+∆t em um instante t+∆t, é dado
pelo preço St no instante anterior t corrigido por um fator que depende da taxa
de juros livre de risco r, da volatilidade σ e de uma variável z representativa
da incerteza.
No caso do modelo tradicional, z representa uma variável aleatória com
distribuição normal padronizada, ou seja, com média nula e desvio-padrão
unitário. A equação a seguir ilustra o processo de difusão de preços do ativo-
objeto:

(8.1)

Assim, simula-se o preço da ação para o período subsequente até o


vencimento em T, a partir de ajustes dados por z, que são gerados
aleatoriamente. Cada simulação envolve, portanto, a geração de diversos
números aleatórios para a obtenção de uma projeção ou um cenário para o
preço da ação no vencimento.
No vencimento, se o preço St da ação for maior que o preço de exercício K
da call, então o prêmio c da call vale St − K. Se o preço da ação for menor
que o preço de exercício, então não é razoável se exercer a call e, portanto, o
prêmio c vale zero.
Assim, obtém-se o prêmio ci da opção para cada simulação i. A estimativa
do prêmio justo da opção c é calculada com auxílio da média do prêmio em
todas as N simulações trazidas a valor presente:

(8.2)

(8.3)
8.2.2 Geração de números aleatórios

Para a geração de números aleatórios com distribuição normal com média


nula e variância unitária, vamos usar a transformação de Box-Muller. O Excel
possui uma função de geração de números aleatórios com distribuição
normal, porém vamos ilustrar a simulação de Monte Carlo usando o
algoritmo de Box-Muller que se baseia na geração de variáveis u1 e u2 com
distribuição uniforme entre 0 e 1 e posterior transformação em variáveis com
distribuição normal.
Este algoritmo tem a vantagem de não acessar muitas funções da
biblioteca do Excel, o que poderia gerar uma perda de desempenho, apesar
de, no caso discutido, não estarmos tão preocupados com a velocidade de
processamento. Como já mencionamos anteriormente, não vamos programar
Monte Carlo usando técnicas de melhoria de performance. A transformação
de Box-Muller envolve a simulação de variável z com distribuição normal (u1
e u2), a partir de variáveis com distribuição uniforme:

(8.4)

Se y ≤ 1 então podemos definir uma variável z dada por

(8.5)

que possui distribuição normal padronizada.


8.3 Programação em VBA da simulação de Monte Carlo

Vamos inicialmente ao código. A função possui o nome fncMCCall em


alusão a opção de compra (Call) simulado por Monte Carlo (MC). Conforme
a equação 8.1, o modelo necessita de parâmetros: S - preço inicial da opção;
K - preço em exercício da opção; v - volatilidade da opção; T - período de
tempo até o vencimento; e r - taxa de juros livre de risco praticada no
mercado. Precisamos ainda do passo em tempo utilizado para aplicar o
modelo: dt, que é obtido a partir do período até o vencimento T dividido pela
quantidade de pontos temporais utilizado na implementação NdT. O último
parâmetro da função é a quantidade de trajetos simulados NSim, isto é,
quantos possíveis cenários deverão ser simulados. Note que para NSim
grande, o valor obtido do prêmio traduz uma média mais estável. Contudo, o
produto NSim x NdT pode tender a números elevados, podendo inviabilizar
os cálculos computacionais pela quantidade de operações necessárias.

01 Function fncMCCall(S, K, v, T, r, NdT, NSim) As Double


02 Dim dt As Double
03 Dim i, j As Integer
04 Dim x1, x2, y, z As Double
05 Dim St As Double
06 Dim SomaS As Double
07 Dim Premio As Double
08 Randomize
09 dt = T / NdT
10
11
12
13
14
15
16
17
18
19
20
21
22 For i = 1 To NSim
23 St = S
24
25
26

For j = 1 To NdT

Do
x1 = 2 * Rnd() - 1
x2 = 2 * Rnd() - 1
y = x1 ^ 2 + x2 ^ 2
Loop Until y <= 1
z = x1 * Sqr(-2 * Log(y) / y)
St = St * Exp((r - v ^ 2 / 2) * dt + v * Sqr(dt) * z)
Next j
Premio = St - K
If Premio < 0 Then Premio = 0
SomaS = SomaS + Premio
Next i
fncMCCall = (SomaS / NSim) / (1 + r) ^ T
End Function

Código 8.1: Código-fonte 39.

No início do corpo da função (linhas 2 a 7), estão definidas as variáveis


auxiliares utilizadas. As variáveis i e j (linha 3) têm papel de contadores do
número de simulações NSim e de passos temporais utilizados NdT,
respectivamente. NSim e NdT foram passados como argumentos. Na linha 4
definimos as variáveis que serão utilizadas para a geração de números
randômicos numa distribuição normal da transformação de Box-Muller
(Equações 8.4 e 8.5). Na linha 5, St é utilizada para armazenar o preço da
ação no tempo t. Na linha 6, SomaS é utilizada para o somatório da Equação
8.3. Na linha 7, Premio avaliará o preço da opção em relação ao preço em
exercício.
A instrução Randomize na linha 8, indica ao VBA para inicializar o
gerador de números aleatórios interno, acessador pela função Rnd()(linhas 14
e 15), que então será utilizado para obtenção dos valores de z randômico
(linha 18). Rnd() gera números aleatoriamente de forma uniforme entre 0 e 1.
Para satisfazer a condição de y ≤ 1, na Equação 8.4 são gerados números e
testados dentro de um laço Do... Until (linhas 13 a 17). Assim, quando a
condição é alcançada, as operações deixam o laço, e os valores obtidos
podem ser utilizados para cálculo do z (linha 18) e utilizados para o cálculo
de St da Equação 8.1. Foram colocados propositalmente barras de cor mais
clara para melhor visualização dos blocos de laço.
O laço mais externo (For...Next i) implementa as instruções internas ao
laço NSim vezes. Isto é, a rotina de busca de preço da opção em cada um dos
NSim cenários é executada (linhas 10 a 24). Nesta busca, os preços são
submetidos a simulação temporal NdT vezes. Pode-se observar a sua
implementação no laço For...Next j (linhas 12 a 20).
Na linha 21 e 22, o Premio, isto é, a diferença entre o preço da opção
simulado St e o preço em exercício K é avaliado. Como o Premio não pode
ser menor que zero, qualquer St − K < 0 é fixado em um Premio = 0. Na
linha 23, a variável já descrita SomaS adiciona o valor do prêmio (somatório
da Equação 8.3).
Finalmente na linha 25, a função fncMCCall retorna o valor da média do
Prêmio [(SomaS / NSim)] trazidos a valores presentes pelo juros livre de
risco r no período T [(1+ r)T]. Para as condições de uma call:

Parâmetro Variável Valor


Preço da opção S $110
Preço em exercício K $100
Volatilidade v 20%
Período de meio ani T 0,5
Taxa de juros livre de risco r 5%
Tabela 8.1: Parâmetros de uma call para exemplo de simulação de Monte Carlo.
E parâmetros computacionais:

Parâmetro Variável Valor


Passo em tempo NdT 100
Número de simulações NSim 2000
Tabela 8.2: Parâmetros computacionais para exemplo de simulação de Monte Carlo.

tem-se um prêmio médio de $13,83 no exemplo. Assim, a figura a seguir


ilustra um dos possíveis resultados.

Figura 8.1: Simulação de Monte Carlo para prêmio em opção de compra.

Nos computadores atuais, esta simulação precisa de alguns segundos para


rodar dependendo da configuração de seu computador como, por exemplo,
processador e memória RAM. Assim, tome precauções para não travar o
Excel e perder seu código. Salve as modificações na planilha antes de rodar
sua macro de VBA. Vá devagar, NdT e NSim com valores entre 10 e 100, e
avaliando a velocidade das simulações. Você pode ter uma melhor ideia da
Simulação de Monte Carlo alterando alguns parâmetros computacionais para
verificar tempo de execução e variabilidade dos resultados. É importante
observar que, por se basear em simulações de variáveis aleatórias, o
resultado, a cada conjunto de simulações pode diferir. No entanto, se o
número de simulações for grande, a variabilidade dos resultados tende a ser
pequena.
Considerações finais

Por meio de aplicações tradicionais de finanças, buscamos aproximar


didaticamente como o universodo Excel pode rapidamente utilizar o ambiente
de programação do VBA para aprimorar suas planilhas.
Conforme já indicamos, este livro tem como objetivo propiciar ao usuário
iniciante em programação um mecanismo ágil para a compreensão dos
fundamentos para elaboração de planilhas ao mesmo tempo organizadas e
poderosas.
A partir dessa introdução, os usuáriospodemevoluir e testar novos
modelos financeiros e novas formas de explorar o VBA da Excel.
As potencialidades são imensas e o leitor que se aprofundar terá a sua
disposição uma ferramenta extremamente útil e flexível, melhorando o
desempenho em suas atividades. Desejamos a todos os leitores ótimos
avanços em seus estudos.
Referências

Black, F., & Scholes, M. (1973, may). The Pricing of Options and
Corporate Liabilities. Journal of Political Economy, 81(3), 637–654.
Brealey, R. A., Myers, S. C., & Allen, F. (2016). Principles of corporate
finance (12th ed.). New York: McGraw-Hill Education - Europe.
Elton, E. J., Gruber, M. J., Brown, S. J., & Goetzmann, W. N. (2014).
Modern portfolio theory and investment analysis (9th ed.). Hoboken, NJ:
John Wiley & Sons Inc.
Fabozzi, F. J. (1999). Duration, convexity, and other bond risk measures.
Hoboken, NJ: John Wiley & Sons Inc.
Hull, J. C. (2014). Options, futures, and other derivatives. Upper Saddle
River, NJ: Pearson.
Jorion, P. (2006). Value-at-risk: The new benchmark for managing
financial risk. New York, NY: McGraw-Hill Education.
Merton, R. (1974). On The Pricing Of Corporate Debt: The Risk Structure
Of Interest Rates. The Journal of Finance, 29(2), 449-470.
[1]
Menu localizado na parte superior do Excel com as principais guias e comandos.
[2]
Black and Scholes (1973)

Você também pode gostar