Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
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ções1 (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.
1 Menu localizado na parte superior do Excel com as principais guias e comandos.
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.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 02 03
If a=b Then Msgbox “Correto! As variáveis possuem o mesmo valor.” 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 02 03 04 05
If a=b Then Msgbox “Correto! As variáveis possuem o mesmo valor.” Else Msgbox “As variáveis não possuem o mesmo valor.” 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 02 03 04 05
If a>b Then Msgbox “A variável a é maior que a variável b.” Else Msgbox “A variável b é maior que a variável a.” 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 02 03 04
a=0 For i=1 To 10 a=a+i 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 02 03 04
a=0 For i=5.2 To 6 Step 0.2 a=a+i 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:
VF = VP ∙ (1 + n ∙ i) (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:
J1 = VP ∙ i = 100.000 ∙ 5% = 5.000
Ao final do segundo ano, novamente a taxa de juros é aplicada sobre o valor
investido, obtendo-se um total de juros J2 de:
J2 = VP ∙ i = 100.000 ∙ 5% = 5.000
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.
J3 = VP ∙ i = 100.000 ∙ 5% = 5.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:
VF = VP + J1 + J2 + J3 = 100.000 + 5.000 + 5.000 + 5.000 = 115.000
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:
VF = 100.000 ∙ (1 + 3 ∙ 5%) = 115.000
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 02 03
Function VFCS(VP, N, TJ) As Double VFCS = VP * (1 + N * TJ) 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 02 03
Function VFCS(VP, N, TJ) As Double VFCS = VP * (1 + N * TJ) 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:
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
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‡
Double 8 bytes -1.79769313486231E308 to -4.94065645841247E-324‡ 4.94065645841247E-324 to 1.79769313486232E308†
Currency 8 bytes -922.337.203.685.477.5808 to 922.337.203.685.477.5807
Decimal 14 bytes
+/- 79.228.162.514.264.337.593.543.950.335 7,922816251 (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
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:
VF = VP ∙ (1 + i)n (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:
J1 = VP ∙ i = 100.000 ∙ 5% = 5.000
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:
J2 = (VP + J1) ∙ i = (100.000 + 5.000) ∙ 5% = 5.250
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.
J3 = (VP + J1 + J2) ∙ i = (100.000 + 5.000 + 5.250) ∙ 5% = 5.512,50
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:
VF = VP + J1 + J2 + J3 = 100.000 + 5.000 + 5.250 + 5.512,50 = 115.765,50
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:
VF = 100.000 ∙ (1 + 0,05)3 = $115.762,50
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 02 03
Function VFCC(VP, N, TJ) As Double VFCC = VP * (1 + TJ) ^ N 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:
VF = VP ∙ en∙i (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 02 03
Function VFCN(VV, N, TJ) As Double VFCN = VP * Exp(N * TJ) 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:
𝑅𝐴 = 𝑅𝐹 + 𝛽𝐴 ∙ (𝑅𝑀 − 𝑅𝐹) = 11,0% + 1,3 ⋅ (18,0% − 11,0%)
𝑅𝐴 = 20,1% 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 02 03
Function fncRA(RF, BA, RM) As Double fncRA = RF + BA * (RM - RF) 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 02 03
Function fncBA(RA, RF, RM) As Double fncBA = (RA - RF) / (RM - RF) 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:
𝑅𝐹 =𝑅𝐴 − 𝛽𝐴 ∙ 𝑅𝑀
1 − 𝛽𝐴
(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 02 03
Function fncRF(RA, BA, RM) As Double fncBA = (RA – BA * RM) / (1 - BA) 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:
𝑅𝑀 = 𝑅𝐴 − (1 − 𝛽𝐴) ∙ 𝑅𝐹
𝛽𝐴
(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 02 03
Function fncRM(RA, BA, RF) As Double fncRM = (RA – (1 - BA) * RF) / BA 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:
𝑃𝐴 = ∑𝐷𝑖
(1 + 𝑅𝐴)𝑡𝑖=
𝐷1
(1 + 𝑅𝐴)𝑡1
∞
𝑖=1
+ 𝐷2
(1 + 𝑅𝐴)𝑡2+
𝐷3
(1 + 𝑅𝐴)𝑡3+ ⋯ (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:
𝐷2 = 𝐷1(1 + 𝐺)
𝐷3 = 𝐷2(1 + 𝐺)
Mais genericamente, fazendo substituições sucessivas:
𝐷n+1 = 𝐷1(1 + 𝐺)n (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:
𝑃A = ∑𝐷𝑖
(1 + 𝑅𝐴)𝑖
∞
𝑖=1
=𝐷1
𝑅A − 𝐺 (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 02 03
Function fncPA(DU, RA, G) As Double fncPA = DU / (RA – G) 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 02 03 04
Function fncPAG(DU, RA, Optional G) As Double If IsMissing(G) Then G = 0 fncPAG = DU / (RA – G) 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 02 03 04
Function fncPAG(DU, RA, Optional G) As Double If IsMissing(G) Then fncPA = DU / RA Else
05 06 07
fncPA = DU / (RA – G) End If 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 02 03 04 05 06 07 08
Function fncPAG(DU, RA, Optional G) As Double Select Case IsMissing(G) Case Is True fncPA = DU / RA Case Is False fncPA = DU / (RA – G) End Select 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:
𝑊𝐴𝐶𝐶 = 𝑤𝐸 ∙ 𝑟𝐸 + 𝑤𝐷 ∙ 𝑟𝐷(1 − 𝐼) (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:
𝑉𝑃𝐿 = ∑𝐹𝐶𝑖
(1 + 𝑟𝑖)𝑡𝑖
𝑛
𝑖=0
=
=𝐹𝐶0
(1 + 𝑟0)𝑡0+
𝐹𝐶1
(1 + 𝑟1)𝑡1+
𝐹𝐶2
(1 + 𝑟2)𝑡2+ ⋯ +
𝐹𝐶𝑛
(1 + 𝑟𝑛)𝑡𝑛
(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:
𝑉𝑃𝐿 = ∑𝐹𝐶𝑖
(1 + 𝑟)𝑖+1
𝑛
𝑖=0
=
𝐹𝐶0
(1 + 𝑟)1
𝐹𝐶1
(1 + 𝑟)2+
𝐹𝐶2
(1 + 𝑟)3+ ⋯ +
𝐹𝐶𝑛
(1 + 𝑟)𝑛+1
(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:
𝑉𝑃𝐿 = ∑𝐹𝐶𝑖
(1 + 𝑟𝑖)𝑡𝑖
𝑛
𝑖=0
=−100
(1 + 0,20)0+
110
(1 + 0,20)1+
150
(1 + 0,20)2⇒
𝑉𝑃𝐿 = $ 95,83
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 02 03 04 05 06
Function fncVPL(T, FC, R) As Double Dim i As Integer For i = 1 To T.Count fncVPL = fncVPL + FC(i) / (1 + R(i)) ^ T(i) Next i 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 02 03 04 05 06
Function fncVPL2(T, FC, R) As Double Dim i As Integer For i = 1 To T.Count fncVPL2 = fncVPL2 + FC(i) / (1 + R) ^ T(i) Next i 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 02 03 04 05
Function fncVPL3(T, FC, R) As Double Dim i As Integer If IsArray(R) Then For i = 1 To T.Count fncVPL3 = fncVPL3 + FC(i) / (1 + R(i)) ^ T(i)
06 07 08 09 10 11 12
Next i Else For i = 1 To T.Count fncVPL3 = fncVPL3 + FC(i) / (1 + R) ^ T(i) Next i End If 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 02 03 04 05 06
Function fncVPL4(VPL) As Double Dim i As Integer Dim T, FC, R As Double For i = 1 To VPL.Count Step 3 T = VPL(i) FC = VPL(i+1)
07 08 09 10
R = VPL(i+2) fncVPL4 = fncVPL4 + FC / (1 + R) ^ T Next i End Function
Código 5.4: Código-fonte 20.
O código poderia ser escrito também como:
01 02 03 04 05 06 07
Function fncVPL5(VPL) As Double Dim i As Integer For i = 1 To VPL.Count Step 3 fncVPL5 = fncVPL5 + _ VPL(i + 1) / (1 + VPL(i + 2)) ^ VPL(i) Next i 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 02 03 04
Function fncVPL6(VPL) As Double Dim i, n As Integer Dim T() As Double Dim FC() As Double
05 06 07 08 09 10 11 12 13 14 15 16 17 18
Dim R() As Double n = VPL.Count / 3 ReDim T(1 To n) ReDim FC(1 To n) ReDim R(1 To n) For i = 1 To n T(i) = VPL((i - 1) * 3 + 1) FC(i) = VPL((i - 1) * 3 + 2) R(i) = VPL((i - 1) * 3 + 3) Next i For i = 1 To n fncVPL6 = fncVPL6 + FC(i) / (1 + R(i)) ^ T(i) Next i 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 02 03 04 05 06 07 08
Option Base 1 Function fncVPL6(VPL) As Double Dim i, n As Integer Dim T() As Double Dim FC() As Double ... ...
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:
𝐷𝑢𝑟𝑎𝑡𝑖𝑜𝑛 =∑
𝑡𝑖 ∙ 𝐹𝐶𝑖
(1 + 𝑟)𝑡𝑖
𝑛𝑖=1
∑𝐹𝐶𝑖
(1 + 𝑟)𝑡𝑖
𝑛𝑖=1
(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:
𝑉𝑃 = ∑𝐹𝐶𝑖
(1 + 𝑟)𝑡𝑖
𝑛
𝑖=1
Assim, a duração pode ser reescrita como:
𝐷𝑢𝑟𝑎𝑡𝑖𝑜𝑛 = ∑
(𝑡𝑖 ∙ 𝐹𝐶𝑖)(1 + 𝑟)𝑡𝑖
𝑉𝑃
𝑛
𝑖 =0
(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 02 03 04 05 06 07 08
Function fncDuration(T, FC, R) As Double Dim i As Integer For i = 1 To T.Count fncDuration = fncDuration + _ T(i) * FC(i) / (1 + R) ^ T(i) Next i fncDuration = fncDuration / fncVPL3(T, FC, R) 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:
𝛽𝑃 = ∑ 𝑊𝑖 ∙ 𝛽𝑖
𝑁
𝑖=1
(5.5)
Como resposta, uma possível implementação para esta situação pode ser dada
por:
01 02 03 04 05 06
Function fncBetaCarteira(W,B) As Double Dim i As Integer For i = 1 To W.Count fncBetaCarteira = fncBetaCarteira + W(i) * B(i) Next i 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:
𝑅𝐶 = ∑ 𝑊𝑖 ∙ 𝑅𝑖
𝑁
𝑖=1
= 𝑊1 ∙ 𝑅1 + 𝑊2 ∙ 𝑅2 + ⋯ + 𝑊𝑁 ∙ 𝑅𝑁 (6.1)
no qual Wi representa a participação ou peso do ativo i na carteira, com:
∑ 𝑊𝑖
𝑁
𝑖=1
= 𝑊1 + 𝑊2 + ⋯ + 𝑊𝑁 = 1 (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:
𝑅𝐶 = ∑ 𝑊𝑖 ∙ 𝑅𝑖
𝑁
𝑖=1
= 0,30 ∙ 10% + 0,20 ∙ 14% + 0,50 ∙ 17% = 14,3%
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 02 03 04 05 06 07
Option Base 1 Function fncRC(W, R) As Double Dim i As Integer For i = 1 To W.Count fncRC = fncRC + W(i) * R(i) Next i 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:
𝜎𝐶 = √∑ ∑ 𝑊𝑖 ∙ 𝑊𝑗 ∙ 𝜎𝑖 ∙ 𝜎𝑗 ∙ 𝜌𝑖𝑗
𝑁
𝑗=1
𝑁
𝑖=1
(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:
𝜎𝐶 = √𝑊1 ∙ 𝑊1 ∙ 𝜎1 ∙ 𝜎1 ∙ 𝜌11 + 𝑊1 ∙ 𝑊2 ∙ 𝜎1 ∙ 𝜎2 ∙ 𝜌12 ++𝑊2 ∙ 𝑊1 ∙ 𝜎2 ∙ 𝜎1 ∙ 𝜌21 + 𝑊2 ∙ 𝑊2 ∙ 𝜎2 ∙ 𝜎2 ∙ 𝜌22
𝜎𝐶 = √0,3 ∙ 0,3 ∙ 4% ∙ 4% ∙ 1 + 0,3 ∙ 0,7 ∙ 4% ∙ 8% ∙ 0,6 ++0,7 ∙ 0,3 ∙ 8% ∙ 4% ∙ 0,6 + 0,7 ∙ 0,7 ∙ 8% ∙ 8% ∙ 1
𝜎𝐶 = 7,34%
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 02 03 04 05 06 07 08 09 10 11 12
Option Base 1 Function fncRT(W, Sigma, Rho) As Double Dim i, j As Integer For i = 1 To W.Count For j = 1 To W.Count fncRT = fncRT + _ W(i) * W(j) * Sigma(i) * _ Sigma(j) * Rho(i, j) Next j Next i fncRT = Sqr(fncRT) 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:
𝑉𝑎𝑅99%10 = 200.000 ∙ 2.3263 ∙ 5% ∙ √10 = $73.564
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 02 03 04
Option Base 1 Function fncVaR(M, RT, GC, T) As Double fncVaR = M * RT * Application.NormSInv(GC) * Sqr(T) 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:
𝜎𝑖𝑖 = 𝜌𝑖𝑖 ∙ 𝜎𝑖 ∙ 𝜎𝑖 = 𝜎𝑖2
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 σ = [𝜎11 ⋯ 𝜎1𝑛
⋮ ⋱ ⋮𝜎𝑛1 ⋯ 𝜎𝑛𝑛
] 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 02 03 04 05 06 07 08 09 10 11
Function fncVarCovar(V,CORR) As Variant Dim auxVarCovar() As Double Dim i, j As Integer ReDim auxVarCovar(1 To V.Count, 1 To V.Count) For i = 1 To V.Count For j = 1 To V.Count auxVarCovar(i, j) = CORR(i, j) * V(i) * V(u) Next j Next i fncVarCovar = auxVarCovar 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:
𝑫𝒆𝒍𝒕𝒂𝑽𝒂𝑹 =
[100000 200000 200000] ∙ [3,60 2,10 4,862,10 4,90 1,264,86 1,26 8,10
] ∙ 10−3
√[100000 200000 200000] ∙ [3,60 2,10 4,862,10 4,90 1,264,86 1,26 8,10
] ∙ 10−3 ∙ [100000200000200000
]
∙ 1.65 ∙ √1 ⇒
𝐷𝑒𝑙𝑡𝑎𝑉𝑎𝑅 = [945.29 778.03 1272.26]
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 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18
Function fncDeltaVaR(M, C, Z, T) As Variant Dim auxDeltaVaR() As Double Dim auxMC(), auxMCM As Double Dim i, u As Integer ReDim auxDeltaVaR(1 To M.Count) ReDim auxMC(1 To M.Count) For i = 1 To M.Count For u = 1 To M.Count auxMC(i) = auxMC(i) + M(u) * C(i, u) Next u auxMCM = auxMCM + auxMC(i) * M(i) Next i auxMCM = Sqr(auxMCM) For i = 1 To M.Count auxDeltaVaR(i) = auxMC(i) * Z * Sqr(T) / auxMCM Next i fncDeltaVaR = auxDeltaVaR 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 02 03 04 05 06 07 08 09
Function fncComponentVaR(DeltaVaR, M) As Variant Dim auxComponentVaR() As Double Dim i As Integer ReDim auxComponentVaR (1 To M.Count) For i = 1 To M.Count auxComponentVaR = DeltaVaR(i) * M(i) Next i fncComponentVaR = auxComponentVaR 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 02 03 04 05 06 07 08 09
Function fncBetaVaR(DeltaVaR, M, VaR) As Variant Dim auxBetaVaR() As Double Dim i As Integer ReDim auxBetaVaR (1 To M.Count) For i = 1 To M.Count auxBetaVaR = DeltaVaR(i) * M(i) / VaR Next i fncBetaVaR = auxBetaVaR 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 19741 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
1 Black and Scholes (1973)
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:
𝑐 = 𝑆𝑒−𝑞∙𝑇 ∙ 𝑁(𝑑1) − 𝐾 ∙ 𝑒−𝑟∙𝑇 ∙ 𝑁(𝑑2) (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)
𝑑1 =
ln 𝑆𝐾
+ (𝑟 − 𝑞 +𝑣2
2) ∙ 𝑇
𝑣 ∙ √𝑇
(7.3)
𝑑2 =
ln 𝑆𝐾
+ (𝑟 − 𝑞 −𝑣2
2) ∙ 𝑇
𝑣 ∙ √𝑇
𝑓(𝑥) =1
√2𝜋𝑒−
𝑥2
2
(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 02 03 04 05 06 07 08 09 10
Function fncBSCall(S, K, V, T, R, Q) As Double fncBSCall = S * _ WorksheetFunction_S_Dist( _ (Log(S / K) + T * (R - Q + V ^ 2 / 2)) / _ V * Sqr(T) True) * Exp(-Q * T) - _ K * _ WorksheetFunction.Norm_S_Dist ( _ (Log(S / K) + T * (R - Q - V ^ 2 / 2)) / _ V * Sqr(T) True) * Exp(-R * T) 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 02 03 04
Function fncNormSDist(z) As Double fncNormSDist = Exp(-z^2 / 2) / _ Sqr(2 * Application.Pi()) 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 02 03 04
Function fncNormSDist2(z) As Double fncNormSDist = Exp(-z^2 / 2) / _ Sqr(2 * 3.14159265358979) 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 02 03 04 05 06 07 08 09 10 11
Function fncBSCall(S, K, V, T, R, Optional Q) As Double If IsMissing(Q) Then Q = 0 fncBSCall = S * _ WorksheetFunction.Norm_S_Dist( _ (Log(S / K) + T * (R - Q + V ^ 2 / 2)) / _ V * Sqr(T), True) * Exp(-Q * T) - _ K * _ WorksheetFunction.Norm_S_Dist( _ (Log(S / K) + T * (R - Q - V ^ 2 / 2)) / _ V * Sqr(T), True) * Exp(-R * T) 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 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
Public varCALLT() As String Public varCALLM() As String Public varVCELL() As String Public varVIMPL() As String Public intIndex As Integer Function fncBSCall(S, K, V, T, R, Q) As Double fncBSCall = S * _ WorksheetFunction.Norm_S_Dist( _ (Log(S / K) + T * (R - Q + V ^ 2 / 2)) / _ V * Sqr(T), True) * Exp(-Q * T) - _ K * _ WorksheetFunction.Norm_S_Dist( _ (Log(S / K) + T * (R - Q - V ^ 2 / 2)) / _ V * Sqr(T), True) * Exp(-R * T) End Function Function fncGoalV(CALLT, CALLM, VCELL, VIMPL) As String intIndex = intIndex + 1 ReDim Preserve varCALLT(1 To intIndex) ReDim Preserve varCALLM(1 To intIndex) ReDim Preserve varVCELL(1 To intIndex) ReDim Preserve varVIMPL(1 To intIndex) varCALLT(intIndex) = CALLT.Address varCALLM(intIndex) = CALLM.Value varVCELL(intIndex) = VCELL.Address varVIMPL(intIndex) = VIMPL.Address fncGoalV = “registrado” End Function
29 30 31 32 33 34 35 36 37 38
Sub subGoalV() Dim i As Integer If intIndex = 0 Then Exit Sub For i = LBound(varCALLT) To UBound(varCALLT) Range(varCALLT(i)).GoalSeek Goal:=varCALLM(i), _ ChangingCell:=Range(varVCELL(i)) Range(varVIMPL(i)) = Range(varVCELL(i)) 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:
𝐷𝑒𝑙𝑡𝑎𝐶𝑎𝑙𝑙 =𝜕𝑐
𝜕𝑆= 𝑁(𝑑1) ∙ 𝑒−𝑞∙𝑡 (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.
𝐺𝑎𝑚𝑚𝑎𝐶𝑎𝑙𝑙 =𝜕2𝑐
𝜕𝑆2=
𝑁(𝑑1) ∙ 𝑒−𝑞∙𝑡
𝑆 ∙ 𝜎 ∙ √𝑇 (7.7)
O Gamma da Call mede a sensibilidade do Delta da Call.
𝐾𝑎𝑝𝑝𝑎𝐶𝑎𝑙𝑙 =𝜕𝑐
𝜕𝜎= 𝑁(𝑑1) ∙ 𝑆 ∙ √𝑇 ∙ 𝑒−𝑞∙𝑡 (7.8)
O Kappa da Call mede a variação de preço da opção em função de flutuações na
volatilidade.
𝑅ℎ𝑜𝐶𝑎𝑙𝑙 =𝜕𝑐
𝜕𝑟= 𝑁(𝑑1) ∙ 𝐾 ∙ 𝑇 ∙ 𝑒−𝑟∙𝑡 (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.
𝑇ℎ𝑒𝑡𝑎𝐶𝑎𝑙𝑙 =−𝜕𝑐
𝜕𝑇=
= −𝑁(𝑑1) ∙ 𝑆 ∙ 𝜎 ∙ 𝑒−𝑞∙𝑡
2 ∙ √𝑇− 𝑁(𝑑1) ∙ 𝑆 ∙ 𝑞 ∙ 𝑒−𝑞∙𝑡 − 𝑁(𝑑2) ∙ 𝑟 ∙ 𝐾 ∙ 𝑒−𝑟∙𝑡
(7.10)
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:
𝑝 = −𝑆 ∙ 𝑒−𝑞∙𝑇 ∙ 𝑁(𝑑1) + 𝐾 ∙ 𝑒−𝑟∙𝑇 ∙ 𝑁(−𝑑2) (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:
𝐷𝑒𝑙𝑡𝑎𝑃𝑢𝑡 =𝜕𝑝
𝜕𝑆= (𝑁(𝑑1) − 1) ∙ 𝑒−𝑞∙𝑡 (7.12)
O Delta da Put mede a variação de preço da opção.
𝐺𝑎𝑚𝑚𝑎𝑃𝑢𝑡 =𝜕2𝑝
𝜕𝑆2=
𝑁(𝑑1) ∙ 𝑒−𝑞∙𝑡
𝑆 ∙ 𝜎 ∙ √𝑇 (7.13)
O Gamma da Put mede a sensibilidade do Delta Call.
𝐾𝑎𝑝𝑝𝑎𝑃𝑢𝑡 =𝜕𝑝
𝜕𝜎= 𝑁(𝑑1) ∙ 𝑆 ∙ √𝑇 ∙ 𝑒−𝑞∙𝑡 (7.14)
O Kappa da Put mede a variação de preço da opção em função de sua volatilidade.
𝑅ℎ𝑜𝑃𝑢𝑡 =𝜕𝑝
𝜕𝑟= −𝑁(−𝑑2) ∙ 𝐾 ∙ 𝑇 ∙ 𝑒−𝑟∙𝑡 (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.
𝑇ℎ𝑒𝑡𝑎𝑃𝑢𝑡 = −𝜕𝑝
𝜕𝑇=
= −𝑁(𝑑1) ∙ 𝑆 ∙ 𝜎 ∙ 𝑒−𝑞∙𝑡
2 ∙ √𝑇− 𝑁(𝑑1) ∙ 𝑆 ∙ 𝑞 ∙ 𝑒−𝑞∙𝑡 − 𝑁(−𝑑2) ∙ 𝑟 ∙ 𝐾 ∙ 𝑒−𝑟∙𝑡
(7.16)
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:
𝑆𝑡 = 𝑆𝑡−∆𝑡 ∙ exp [(𝑟 −𝜎2
2) ∙ ∆𝑡 + 𝜎 ∙ 𝑧 ∙ √∆𝑡] (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:
𝑐 =𝑐̅
(1 + 𝑟)𝑇−𝑡 (8.2)
𝑐̅ = 1
𝑁 ∑ 𝑐𝑖
𝑁
𝑖=1
(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:
𝑥1 = 2 ∙ 𝑢1 − 1 𝑥2 = 2 ∙ 𝑢2 − 1
𝑦 = 𝑥12 + 𝑥2
2 (8.4)
Se y ≤ 1 então podemos definir uma variável z dada por
𝑧 = 𝑥1 ∙ √−2 ∙ ln(𝑦)
𝑦 (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 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
Function fncMCCall(S, K, v, T, r, NdT, NSim) As Double Dim dt As Double Dim i, j As Integer Dim x1, x2, y, z As Double Dim St As Double Dim SomaS As Double Dim Premio As Double Randomize dt = T / NdT For i = 1 To NSim St = S 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 das 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 $3,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.
Autores
Prof. Dr. Herbet Kimura
Engenheiro eletrônico formado pelo Instituto Tecnológico da Aeronáutica, com
mestrado em Estatística pelo Instituto de Matemática e Estatística e doutorado em
Administração pela Faculdade de Economia, Administração e Contabilidade, ambos
pela Universidade de São Paulo. Também possui doutorado em Administração de
Empresas pela Fundação Getúlio Vargas.
Na Fundação Getúlio Vargas lecionou as disciplinas de Engenharia Financeira,
Análise de Decisões de Investimentos, Finanças e Gestão de Riscos Usando
Derivativos. Na Universidade Mackenzie, lecionaou, na pós-graduação, as disciplinas
de Métodos Quantitativos em Pesquisa em Administração e Análise de Decisões
Financeiras. Na graduação leciona as disciplinas de Planejamento e Controle
Financeiro, Análise Financeira de Bancos, Sistemas de Informações Gerenciais,
Administração financeira e Estatística Aplicada à Administração.
Atualmente é Professor Titular da Universidade de Brasília. Tem experiência na
área de Administração, Estatística e Engenharia com ênfase em Finanças, Estratégia
e Tecnologia, atuando principalmente nos seguintes temas: gestão de riscos,
avaliação de projetos de inovação, precificação de derivativos e modelos de criação
de valor e de análise de desempenho.
E-mail: [email protected]
Prof. Dr. Jim Heiji Aburaya
Bacharel em Física e Medicina Veterinária, com mestrado em Física Aplicada e
doutorado em Biofísica (biomateriais) e atualmente cursando graduação em
Arquitetura e Urbanismo, todos pela Universidade de São Paulo.
Professor da Universidade Anhembi Morumbi, leciona as disciplinas de
Administração Financeira e Orçamentária, Custos e Orçamento Empresarial e
Matemática do curso de Administração. Físico do Departamento de Física Nuclear
do Instituto de Física da Universidade de São Paulo, desenvolve software e hardware
de controle do Acelerador Linear, além de coordenar projetos científicos no
Laboratório de Implantação Iônica.
Sócio-diretor da empresa Localpet Identificação Animal atua como gerente de
projetos de identificação, rastreabilidade e levantamento epidemiológico de animais
de companhia.
E-mail: [email protected]
Site: http://www.aburaya.com.br
Prof. Dr. Vinicius Amorim Sobreiro
Bacharel em Ciência Econômicas pela Instituição Toledo de Ensino - Toledo,
especialista em Engenharia de Produção com Enfoque em Pesquisa Operacional pela
Universidade Estadual de Londrina - UEL, mestre em Engenharia de Produção
Mecânica pela EESC/USP, e doutor em Engenharia de Produção Mecânica pela
EESC/USP.
Professor adjunto na área de Finanças Empresariais, no Departamento de
Administração, Campus Darcy Ribeiro, da Universidade de Brasília. Leciona a
disciplina Cálculo Financeiro, Finanças I e Finanças II na graduação e Métodos
Inferencias, Métodos de Análise Multivariada na pós-graduação.
E-mail: [email protected]
Prof Tit. Leonardo Fernando Cruz Basso
Bacharel em Engenharia Mecânica pelo Instituto Tecnológico da Aeronáutica,
com especialização em Teoria Econômica pela Universidade de São Paulo, mestre
em Economia pela New School for Social Research, doutor em Economia pela New
School for Social Research e possui pós-doutorado pela Bielefeld University.
Atualmente é professor titular da Universidade Mackenzie, Auxílio financeiro do
Conselho Nacional de Desenvolvimento Científico e Tecnológico e da Ritsumeikan
University. Tem experiência na área de Economia, com ênfase em Teoria Econômica.
Atua principalmente nos seguintes temas: Taxa de câmbio, economia monetária,
valor da moeda.
E-mail: [email protected]
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.