Buscar

VBA Excel para Financas_ Edicao - Herbert Kimura

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 166 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 166 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 166 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Herbert Kimura, Jim Heiji Aburaya, Vinicius Amorim Sobreiro e
Leonardo Fernando Cruz Basso
 
 
 
 
 
 
 
 
 
 
 
 
 
 
VBA Excel para Finanças: Edição para Iniciantes
Prefácio
 
Este livro tem por objetivo possibilitar que o usuário iniciante em
programação VBA possa rapidamente desenvolver aplicações na área de
finanças. A partir de exemplos que podem ser compreendidos facilmente, o
livro permite um aprendizado bastante direto, auxiliando o leitor a elaborar
seus próprios algoritmos.
A obra não pretende atender às necessidades do usuário mais experiente,
que já tenha noções de macro no Excel. Em um contexto pragmático, o livro
traz uma abordagem prática, sem se preocupar com um rigor da sintaxe da
linguagem de programação, propiciando um direcionamento para que o leitor
possa rapidamente desenvolver suas próprias funções.
VBA é o acrônimo de Visual Basic for Applications. O VBA é a linguagem
de programação disponível no pacote Office da Microsoft® que permite ao
usuário mais exigente a criação de rotinas e funções que automatizam ou
diminuem sequências complicadas de operações. No Microsoft® Excel, o
ambiente de programação orientada a objetos do VBA envolve uma
linguagem de alto padrão e possibilita o acesso e a utilização dos recursos
disponíveis no programa, como a biblioteca de fórmulas, a interação com a
planilha de dados e o uso de soluções de outros usuários ou empresas.
Para exemplificar o aprendizado da linguagem, ao longo deste livro, serão
abordados temas relevantes em Finanças. Iniciaremos com implementações
simples, que permitirão o entendimento gradativo da estrutura da linguagem e
de aspectos computacionais importantes. Não se trata de uma obra que foca o
entendimento das nuances da computação eletrônica, mas de uma aplicação
prática da microinformática no auxílio de resolução de problemas do dia a dia
em Finanças com a flexibilidade, velocidade e eficiência exigidas pelo
profissional tomador de decisões pressionado pela dinâmica do mercado
financeiro.
Assim, abordaremos inicialmente conceitos básicos de finanças como, por
exemplo, capitalização de juros, para ilustrar as primeiras aplicações de
funções desenvolvidas no Excel. Posteriormente, discutiremos Modelo de
Precificação de Ativos de Capital (CAPM), no qual será permitido um
contato com o VBA de forma bastante simples obtendo o retorno esperado de
um ativo em função de alguns parâmetros. Apresentaremos também o
Modelo de Gordon para avaliação de ações para consolidar conhecimentos
básicos e para exemplificar o uso de parâmetros opcionais.
Na sequência, já demonstrando algumas estruturas de decisão utilizadas
em programação, o cálculo do Valor Presente Líquido (VPL) será
implementado em diversas versões. A cada código-fonte há uma discussão
sobre o tratamento das informações e, quando necessário, apresenta-se o
fluxograma de utilizado pelo algoritmo. A aplicação das funções criadas será
abordada na forma de exemplos e com valores numéricos simulando uma
situação financeira real.
O modelo de Black-Scholes também será abordado, permitindo a
ambientalização do uso de fórmulas inerentes do Microsoft® Excel. É também
discutido no livro, conceitos como Value-at-Risk, DeltaVar, ComponentVar
exemplificando o uso de matrizes de dados. Uma situação complexa que,
utilizando todos os recursos que foram abordados nos capítulos anteriores, é
discutida na obra para exemplificar o uso de programação para problemas de
finanças mais sofisticados.
Um capítulo extra foi adicionado com a utilização de simulação de Monte
Carlo para análise de risco. É importante destacar que essa obra tem como
foco desenvolvimento de funções, sem uma ênfase em sub-rotinas. Os
autores acreditam quea a abordagem de programação de funções permite um
entendimento mais rápido e mais sólido do VBA Excel.
 
Contexto profissional
 
Usuários mais avançados podem observar algumas limitações do Excel
relacionados à performance computacional e à adequação das funções
estatísticas presentes. Porém, para a maioria das aplicações em Finanças, o
Excel propicia um ambiente poderoso e amigável para a elaboração de
cálculos e geração de relatórios. Assim, tendo em vista que o Excel é uma
ferramenta amplamente utilizada pelos analistas e administradores
financeiros, abordamos uma nova perspectiva na sua utilização como
ferramenta de modelagem.
Aplicações que envolvem um número elevado de operações podem ser
implementadas em outras linguagens de programação, como por exemplo, C,
C++, Phyton ou R, que permitem controle sobre a utilização da memória do
computador e a otimização do processamento matemático. Estas rotinas
podem ser encapsuladas em bibliotecas de funções e eventualmente acessadas
pelo Excel. No entanto, o custo de desenvolvimento de programas em um
ambiente externo à plataforma do Excel pode ser elevado, não somente em
termos de capacitação técnica no desenvolvimento como também em termos
de auditoria, controle de qualidade e manutenção e atualização das rotinas.
Em geral, é mais fácil encontrar profissionais de Finanças que entendam de
Excel do que de outras linguagens de programação.
Assim, uma forma de aprimorar tanto os aspectos computacionais quanto
os de design de planilhas envolve a programação em VBA Excel. Embora o
uso do VBA exija a adaptação do mecanismo de cálculo para um algoritmo
computacional, ou seja, para a sintaxe de uma linguagem de programação,
suas vantagens são inúmeras:
 
Em primeiro lugar, a planilha tende a ficar mais clara e concisa, pois
grande parte dos cálculos é realizada no ambiente do VBA, não
necessitando de células na planilha para a realização de cálculos
intermediários. A velocidade de processamento e o uso de memória
também podem ser aprimoradas;
Em segundo lugar, a lógica de programação acaba orientando a
formulação de algoritmos. Assim, no processo de desenvolvimento do
próprio algoritmo, consegue-se identificar passagens desnecessárias ou
mecanismos repetitivos que podem ser automatizados;
Em terceiro lugar, os cálculos tornam-se mais documentáveis e
auditáveis dada a necessidade de estruturação do algoritmo de uma
forma lógica e dentro da sintaxe do VBA. Deste modo, evitam-se
planilhas, no mínimo, confusas, de difícil entendimento e manutenção.
Auditar planilhas sem uma programação de funções é extremamente
complicado. Utilizando a programação em VBA, os processos tornam-
se mais inteligíveis e menos vulnerável a erros; e
Finalmente, a evolução da regulamentação e dos mecanismos de
controle pode fazer com que áreas de auditoria e de validação de
modelos matemáticos comecem a exigir que os algoritmos sejam
desenvolvidos em um ambiente e formato que possam ser mais
facilmente analisados e rastreados. Neste contexto, o uso do VBA Excel
permite o desenvolvimento de planilhas mais profissionais, e observa a
tendência na elaboração de aplicações financeiras mais robustas e
sintonizadas com as exigências mais modernas.
 
Brasília, Maio, 2017
 
Herbert Kimura, Jim H. Aburaya, Vinicius A. Sobreiro e Leonardo F. C.
Basso
Capítulo 1
 
Bem vindo ao Microsoft® Excel
 
Para iniciarmos o desenvolvimento das rotinas em VBA no Excel é
necessário abrir a janela de edição de código. Na versão 2016, o editor do
Visual Basic é acessado através do menu Desenvolvedor, na faixa de
opções[1] (Figura 1.1), ou, por meio de um atalho, através da combinação de
teclas [ALT] + [F11]. A janela do editor do Visual Basic então se abre
(Figura 1.2). Caso não encontre esta opção, ou esta esteja desabilitada, é
possível que este recurso não tenha sido incluído na instalação original. Neste
caso, reinstale o pacote Office, assegurando que a versão completa foi
instalada.
 
Figura 1.1: Acesso ao editor do Visual Basic.
Figura 1.2: Janela do editor do Visual Basic.
 
No Excel 2016, a opção de acesso aos recursos do VBA encontra-se
desabilitada como padrão. Para habilitar estes recursos, deve-se, ao iniciar
uma nova sessão do Excel, clicar sobre o Botão Arquivo (Figura 1.3), para
ter acesso ao botão de Opções do Excel (Figura1.4):
 
Figura 1.3: Botão Arquivo do Excel 2016.
Figura 1.4: Opções do Excel 2016.
 
Ao acessarmos as Opções do Excel, devemos clicar sobre a opção
Personalizar Faixa de Opções (Figura 1.5) e marcar a opção
Desenvolvedor. Clique em OK e observe que o menu Desenvolvedor surge
na barra de menus (Figura 1.6). Ao clicar sobre a guia, o acesso ao editor do
VBA pode ser localizado no canto superior esquerdo (Figura 1.6). Ao clicar
sobre o botão Visual Basic, ou a o atalho dado pelas teclas [ALT] + [F11], a
janela do editor do Visual Basic se abre (Figura 1.7).
Figura 1.5: Mostrar guia Desenvolvedor na Faixa de Opções.
 
Figura 1.6: Guia Desenvolvedor ativa.
Figura 1.7: Janela do editor Visual Basic.
 
No ambiente do editor, além das barras tradicionais: barra de título, de
menus e de ferramentas; é possível identificar três janelas filhas, as quais irão
ser exploradas: a janela de navegação do projeto VBA (Project Explorer), a
janela de propriedades e a janela da área de código (Figura 1.7). Estas
janelas filhas podem ser acessadas, quando não visíveis através das opções
correspondentes no menu Exibir ou através das teclas de atalho: [CTRL]+[R],
[F4] e [F7] respectivamente.
Como o objetivo deste livro é apresentar os conceitos de VBA, com
aplicações na área financeira, utilizando o Excel, muitas possibilidades e
funcionalidades do ambiente de programação não serão exploradas. São
inúmeros os recursos disponíveis e, a despeito da grande variedade de obras
sobre o assunto, nenhuma delas esgota o assunto.
Assim, modestamente iremos explorar alguns modelos utilizados em
Finanças e permitir ao leitor que se inicie na arte de programar. Contudo,
mesmo que conhecimentos de computação não sejam necessários
inicialmente, é bem-vinda a leitura de obras voltadas à programação
estruturada e à programação orientada a objetos. Àqueles leitores que
pretendem se tornar desenvolvedores de aplicações, por exemplo, envolvendo
banco de dados profissionais ou interfaces mais sofisticadas com o usuário,
deverão fazê-lo através de leitura de conceitos mais aprofundados sobre o
assunto.
 
1.1 Visual Basic como Linguagem de Programação
 
Programar resume-se em instruir o computador a realizar tarefas para nós.
Para tanto, uma linguagem apropriada deve ser empregada. As operações no
processador ocorrem na forma de binária, utilizando palavras e instruções
formadas por bits. Contudo a programação em linguagem binária é
praticamente impossível de ser realizada por seres humanos devido a sua
complexidade. Assim, criam-se ferramentas que transportam nossa intenção
em instruções computacionais, permitindo a utilização de poderosas
máquinas de processamento para efetuar cálculos e automatizar processos.
Neste cenário, o Visual Basic é uma linguagem de programação que
disponibiliza instruções (códigos) que, por serem construídas de forma
lógica, podem ser interpretadas e transformadas (compiladas) em linguagem
de máquina, acessando os diversos recursos disponíveis no ambiente do
sistema operacional.
Estas instruções são interpretadas linha a linha, de cima para baixo, como
uma lista de tarefas a realizar. Para esta lista, dá-se o nome de código-fonte.
Dentro de uma mesma linha, algumas instruções, como as de atribuição, são
interpretadas da direita para a esquerda; outras, como as de tomada de
decisão, são interpretadas da esquerda para a direita. Não se preocupe em
entender os pormenores. Você irá absorver estes conceitos à medida que os
códigos-fonte sejam apresentados e interpretados.
Seguindo esse conceito, não vamos abordar aspectos computacionais sem
sua aplicação imediata. A cada capítulo iremos abordar aspectos do ambiente
de programação do Visual Basic, no momento exato da exigência de um
conhecimento mais aprofundado. Assim, ao tratarmos de variáveis passadas
como argumento de funções, iremos também abordar os tipos de variáveis e
as operações matemáticas disponíveis para ele.
Contudo, vale uma atenção especial, dentre as várias instruções que
utilizaremos, para os blocos de tomada de decisão e os recursivos ou também
chamados de laço. A mais comum instrução para tomada de decisão é sem
dúvida o If Then Else (Se, então, senão). A instrução testa uma condição
(por isso, também é conhecida como instrução condicional) que, em caso
afirmativo (True) executa certo bloco de instruções. Opcionalmente, um
segundo bloco de instruções pode ser executado em caso negativo (False).
Assim, se tivéssemos duas variáveis a e b e uma condição de teste a=b, e o
bloco para a condição True associado a abrir uma caixa com a mensagem:
“As variáveis possuem o mesmo valor.”; poderíamos ter o seguinte código-
fonte.
 
 
01
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
0203
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:
 
(2.1)
 
Esta fórmula de capitalização simples será usada para ilustrar como
funções podem ser rapidamente desenvolvidas em VBA. Neste caso, será
implementada uma função que dá como resultado o valor futuro, a partir de
parâmetros de entrada referentes (i) ao valor presente, (ii) à taxa de juros ao
período e (iii) ao número de períodos.
Para discutir o conceito, o caso a seguir ilustra uma operação típica de
mercado financeiro, no qual um investimento em dólar tem juros
capitalizados de forma simples.
 
Exemplo 2.1: Suponha que um investidor adquira um produto financeiro no
qual aplica um valor presente VP = $100.000. Este produto será resgatado ao
final de n = 3 anos, corrigido por uma taxa anual de i = 5%. Ao final de três
anos, qual o valor futuro VF a ser resgatado pelo investidor considerando
capitalização simples, ou seja, juros incidindo somente no valor inicial
investido?
 
Resolução:
 
Ao final do primeiro ano, a taxa de juros de 5% é aplicada sobre o valor
investido $100.000, obtendo-se um total de juros J1, ou seja:
 
Ao final do segundo ano, novamente a taxa de juros é aplicada sobre o
valor investido, obtendo-se um total de juros J2 de:
 
 
Note que os juros incidem sobre o valor inicial VP. Este procedimento
caracteriza a capitalização simples, por meio da qual os juros são sempre
aplicados a um valor inicial de referência, no caso, ao investimento inicial
dado por VP.
Assim, de maneira análoga, ao final do terceiro ano, o investidor também
recebe juros de 5% sobre o valor investido $100.000.
 
 
Ao final do período de aplicação, o investidor deve receber o valor
investido acrescido dos juros obtidos nos três anos. Estabelecendo VF como o
valor futuro a receber no final do período, temos:
 
 
Ou seja, o valor de resgate, ao final de 3 anos, de uma aplicação de
$100.000 que paga 5% ao ano, capitalizada de forma simples, é igual a
$115.000. De fato, se substituirmos os dados do exemplo na Equação 2.1,
obtemos:
 
 
Usuários com conhecimentos básicos em Excel geralmente implementam
esse cálculo de valor futuro usando as operações na própria planilha. Agora,
vamos utilizar o mesmo exemplo e implementar essa equação utilizando os
recursos do VBA. Nesse primeiro contato, o roteiro passo a passo proposto
pode ser seguido:
 
• Abra o Excel;
• Inicie o editor do Visual Basic;
• Insira novo módulo através da opção Módulo do menu Inserir (Figura
2.1); e
• Uma nova janela, referente ao módulo inserido, é aberta (Figura 2.2).
 
Figura 2.1: Opção Módulo do menu Inserir do editor do Visual Basic.
 
Figura 2.2: Módulo 1.
 
No editor do módulo, digite o código a seguir:
 
 
01
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áriosestã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
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
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 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.3Capitalização composta
 
Um outro exemplo que pode ajudar a consolidar ideias envolve a
implementação de uma função para obter o valor futuro por meio da
capitalização composta. A capitalização simples tem algumas aplicações,
principalmente no mercado de câmbio, no qual transações podem envolver a
incidência de juros somente sobre o valor inicial. Porém, a maioria das
aplicações, principalmente no caso de produtos financeiros, envolve uma
capitalização denominada de composta. Neste tipo de capitalização os juros
de um período incidem sobre o valor total de um período anterior. Ou seja, na
capitalização composta pode haver incidência de juros sobre juros.
Genericamente, sendo o prazo da aplicação n períodos, a fórmula do valor
futuro VF de um valor presente VP a partir de uma capitalização composta de
uma taxa de juros i é dada por:
 
(2.2)
 
Exemplo 2.2: Suponha uma aplicação financeira na qual o investidor obtém
juros capitalizados de forma composta. Como no estudo de caso da
capitalização simples, o objetivo é calcular o valor futuro VF de um
investimento de valor presente VP após um número de n períodos de
capitalização composta, considerando uma taxa de juros igual a i ao período.
Suponha que um investidor adquira um produto financeiro no qual aplica VP
= $100.000. Esse produto será resgatado ao final de n = 3 anos, corrigido por
uma taxa anual i = 5%. Ao final de três anos, qual o valor futuro VF a ser
resgatado pelo investidor, considerando uma capitalização composta?
 
Resolução:
 
Ao final do primeiro ano, a taxa de juros de 5% é aplicada sobre o valor
investido R$100.000, obtendo-se um total de juros J1, ou seja:
 
 
Ao final do segundo ano, a taxa de juros é aplicada sobre o valor
acumulado, que incorpora o valor investido, bem como os juros do primeiro
período. Assim, os juros eferentes ao segundo ano são dados por J2:
 
Note que os juros estão incidindo sobre o valor inicial VP, acrescido dos
juros J1. Este procedimento caracteriza a capitalização composta, na qual os
juros são aplicados a um valor inicial de referência, no caso, ao investimento
inicial dado por VP, e também aos juros incorridos em períodos anterior, no
caso J1.
De forma análoga, ao final do terceiro ano, a taxa de juros de 5% é
aplicada sobre o valor investido $100.000 e todos os juros devidos
anteriormente.
 
 
Ao final do período de aplicação, o investidor deve receber o valor
investido acrescido dos juros obtidos nos três anos. Estabelecendo VF como o
valor futuro a receber no final do período, temos:
 
 
Ou seja, o valor de resgate de uma aplicação de $100.000 que paga 5% ao
ano, capitalizado de forma composta, é igual a $115.762,50. Este resultado
pode ser obtido diretamente pela fórmula dada em 2.2:
 
 
Um usuário comum desenvolveria a seguinte planilha:
Figura 2.6: Resolução do exercício utilizando as funções básicas do Excel.
 
No entanto, um usuário que saiba VBA pode desenvolver uma função no
Excel e incorporá-la em uma biblioteca. Como fizemos para a capitalização
simples, podemos usar a equação acima para exemplificar a programação de
funções usando o ambiente do VBA para Excel. Chamaremos a função de
VFCC, representativo de valor futuro através de capitalização composta. Os
parâmetros da função serão (i) o valor presente VP, (ii) o número de períodos
N e a taxa de juros ao período TJ.
 
 
01
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:
 
(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
carteirarepresentativa do mercado como um todo.
Quando um ativo possui risco sistemático grande, sua sensibilidade com
relação a flutuações do mercado é maior. Uma medida da sensibilidade risco
sistemático de um ativo é comumente chamada de beta (β) do ativo. Pelo
CAPM, um ativo com beta grande, i.e., com risco sistemático elevado, deve
ter maior retorno esperado.
De maneira oposta, um ativo pouco susceptível às flutuações do mercado
como um todo envolve menos risco sistemático e, portanto, um retorno
esperado menor. Em particular, para um retorno esperado de um ativo A, aqui
representado por RA, a derivação do CAPM conduz à seguinte equação, que
associa risco e retorno:
 
(3.1)
 
No qual
• RF: retorno esperado do ativo livre de risco;
• βA: sensibilidade risco sistemático associado ao ativo A; e
• RM: retorno esperado do mercado.
 
Assim, o CAPM estabelece um dos princípios da teoria moderna de
finanças. Quanto maior o risco sistemático βA de um ativo A, maior seu
retorno esperado RA. Mais especificamente, o retorno esperado de um ativo
equivale a uma taxa de juros de uma aplicação sem risco RF adicionada de um
prêmio pelo risco de mercado (RM − RF) ajustado pelo risco sistemático βA do
ativo.
É relevante observar que estamos simplificando a notação do valor
esperado para facilitar a definição de variáveis no código da função em VBA.
Assim, ao invés de usarmos uma notação mais rigorosa E(R) para retorno
esperado, estamos simplesmente estabelecendo o conceito de retorno como R.
 
3.2 Aplicações do CAPM
 
O CAPM é utilizado em diversas aplicações em finanças. Por exemplo:
investidores podem estimar preços justos de ações, projetando dividendos
esperados, e trazendo-os a valor presente por uma taxa de retorno, estimada
por meio do CAPM, compatível com o nível de risco dos fluxos de caixa.
A análise de valor de empresas em processos de fusões e aquisições
também leva em consideração, as estimativas de custo de capital baseadas no
CAPM. O estudo de viabilidade de projetos considerando-se técnicas de valor
presente líquido também pode utilizar uma taxa de retorno que desconta
fluxos de caixas, obtida a partir do CAPM.
Adicionalmente, avaliações de criação de valor, como as envolvendo o
Valor Econômico Adicionado ou Economic Value Added (EVA), têm um
custo de capital que pode ser estimado também pelo CAPM. Assim, o CAPM
possui inúmeras aplicações em finanças.
Destaca-se, pela equação 3.1, que o retorno esperado de um ativo RA
depende do retorno RF de um ativo livre de risco, da estimativa do risco
sistemático βA e do retorno esperado do mercado RM.
Tecnicamente, o beta de um ativo, por definição, é a covariância dos
retornos deste ativo com a variância dos retornos do mercado. Porém,
destacando-se da tecnicalidade da definição estatística, como já explicado
anteriormente, o beta é uma medida de sensibilidade de como o ativo flutua
em relação a flutuações do mercado. Uma forma de estimação do beta será
estudada em um capítulo posterior, com auxílio de uma função programada.
A seguir, discute-se um exemplo para ilustrar o uso do CAPM.
 
Exemplo 3.1: Um analista estimou o beta de uma ação em 1,3. Sabendo que
um investimento em um ativo livre de risco rende 11% ao ano e que o
mercado como um todo tem um retorno esperado de 18% ao ano, obtenha o
retorno esperado da ação.
 
Resolução:
 
Aplicando esses valores à equação 3.1 temos:
ao ano
 
Ou seja, a taxa de retorno esperada do ativo é de 20,1% ao ano. Pelo fato
de o ativo possuir um beta superior a 1, pode-se classificá-lo como ativo
agressivo, com risco sistemático maior que o mercado como um todo. Tendo
um risco sistemático maior que o do mercado, o retorno esperado do ativo
(20,1%) também é maior que o retorno esperado do mercado (18,0%).
O código-fonte que implementa o retorno esperado de um ativo está na
sequência. Note que a função se chama fncRA e possui argumentos de
entrada dados por RF para o retorno esperado do ativo livre de risco, BA para
sensibilidade ou beta, ou risco sistemático associado ao ativo A e RM para o
retorno esperado do mercado.
 
 
01
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:
 
(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:
 
(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:
 
(4.1)
 
No qual
 
• PA: preço justo;
• Di: i-ésimo dividendo;
• RA: retorno esperado do ativo A, em função de seu risco; e
• ti: instante do recebimento do i-ésimo dividendo.
 
A equação 4.1 pode assustar em um primeira passada de olhos. No
entanto, a equação simplesmente denota que o valor da ação PA é
simplesmente uma somatória de vários dividendos Di, com i variando de 1 a
infinito. Ou seja, o valor de uma ação é dado pela soma de todos os
dividendos que a empresa propiciará ao longo dos próximos instantes ti de
pagamento de proventos. Para se obter o valor justo, cada dividendo é trazido
a valor presente, por um fator (1+ RA)t-i associado a uma capitalização
composta. A equação 4.1 é genérica e pode ser usada para precificar
praticamente qualquer ativo ou projeto. Para ativos e projetos quaisquer, os
dividendos são substituídos por fluxos de caixa.
Enquanto a equação 4.1 descreve o modelo geral para avaliação de ativos,
o modelo de Gordon representa uma simplificação no processo de
precificação. Enquanto na equação 4.1, os dividendos podem ser quaisquer,
no modelo de Gordon, parte-se da suposição de que os dividendos crescem
periódica e indefinidamente a uma taxa constante G. Ou seja, em cada
período, o dividendo equivale ao dividendo anterior corrigido por um fator G.
Uma suposição implícita é que os dividendos são pagos com uma frequência
constante, isto é, em períodos subsequentes.
Obviamente, dificilmente uma empresa propiciará dividendos com esse
comportamento de crescimento constante e periódico. Porém, a ideia do
modelo de Gordon é partir de premissas simplificadoras, para facilitar o
processo de precificação. Apesar de o valor obtido não ser acurado, permite
que um investidor possa rapidamente identificar um valor razoável para a
ação. Além disso, no modelo geral, o investidor teria que projetar infinitos
dividendos para poder calcular a somatória da equação 4.1.
Como veremos a seguir, supondo-se que os dividendos crescem a uma
taxa constante G ao período, simplifica-se o cálculo do preço. Considerando a
premissa do modelo de Gordon, tem-se, portanto, as seguintes relações entre
os dividendos de períodos subsequentes:
 
 
Mais genericamente, fazendo substituições sucessivas:
 
(4.2)
 
Utilizando propriedades matemáticas, em particular, da soma de infinitas
parcelas de uma progressão geométrica, o modelo de Gordon, com a
suposição de dividendos que crescem indefinidamente a uma taxa G
constante, pode ser reduzido a uma fórmula simples:
 
(4.3)
 
A simplicidade do modelo de Gordon representa seu ponto forte e permite
ao analista fazer uma estimativa do preço de uma ação, rapidamente, sem a
necessidade de estimar muitos fluxos de caixa. De fato, é necessário apenas
estimar o fluxo de caixa projetada ao próximo período D1, a taxa de desconto
dos fluxos de caixa RA, a taxa de crescimento de dividendos G. Deve-se
ressaltar que a taxa de desconto RA pode ser obtida através do CAPM,
conforme realizado no capítulo anterior.
A fórmula fundamental do modelo de Gordon pode ser implementada
como sugerido no código a seguir. Note que o nome da função é definido
como fncPA e possui argumentos de entrada dados por DU referente ao
dividendo no instante 1, RA referente à taxa de desconto dos fluxos de caixa
e G referente à taxa de crescimento de dividendos ao período.
 
 
01
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
05
06
07
Function fncPAG(DU, RA, Optional G) As Double
If IsMissing(G) Then
fncPA = DU / RA
Else
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 ferramentasde precificação, o analista pode usar a fórmula
proposta para ter uma noção da ordem de grandeza do preço justo de uma
ação.
 
4.1 Exercício de fixação - Custo médio ponderado de capital
 
Na avaliação de empresas ou na análise de viabilidade de projetos, um
parâmetro financeiro importante é o custo médio ponderado de capital,
também conhecido pela sigla em inglês WACC (Weighted Average Cost of
Capital).
O WACC representa a taxa de juros que reflete o risco dos ativos da
empresa e pode, portanto, ser utilizado como taxa de desconto de fluxos de
caixa de uma empresa ou de fluxos de caixa de um projeto com o mesmo
risco da empresa.
A fórmula do WACC é dada por:
 
(4.4)
 
na qual
 
• wE representa a participação do patrimônio líquido no total do passivo
da empresa;
• wD representa a participação da dívida no total do passivo da empresa;
• rE representa o custo de capital ou a taxa de juros compatível com o
risco das ações da empresa;
• rD representa o custo da dívida da empresa; e
• I representa a alíquota marginal do imposto de renda.
 
Pode-se programar, a partir da equação anterior 4.4, funções que
permitam calcular cada uma das variáveis (WACC, rE, rD, wE, wD, I) a partir
das outras. A variável I deve ser definida como opcional quando servir como
parâmetro de entrada de uma função. Apesar de impostos serem inexoráveis,
em algumas aplicações de WACC pode-se utilizar I = 0 como premissa.
Capítulo 5
 
Modelos de valor presente
 
Nos capítulos anteriores, foram discutidas funções em VBA básicas que
poderiam ser facilmente implementadas no ambiente de planilha sem a
necessidade de utilização de programação. Ou seja, o leitor pode estar se
perguntando qual seria a vantagem de se programar no Excel. A partir desse
capítulo, serão estudadas funções mais trabalhosas que justificam o uso de
programação. Para manter o didatismo, as funções serão discutidas
aumentando-se a complexidade gradativamente.
A flexibilidade do Excel em permitir a repetição de um mesmo cálculo
básico em diversas células de uma planilha representa uma característica
extremamente poderosa. Esta facilidade em repetir cálculos implica ganhos
de produtividade consideráveis, pois uma mesma fórmula é replicada em
várias células usualmente adjacentes. A repetição de cálculos pode ser
realizada rapidamente na planilha do Excel, sem a necessidade de
programação. Usuários com conhecimentos básicos de Excel frequentemente
realizam as várias repetições nas próprias células da planilha, tornando-a,
muitas vezes, bastante poluída.
Em algumas situações, os cálculos repetitivos constituem passos
intermediários do resultado de interesse. Por exemplo, para o levantamento
do valor presente líquido, VPL, de um projeto é necessário trazer a valor
presente os vários fluxos de caixa que ocorrem em períodos diferentes. Uma
vez obtidos os valores presentes de cada fluxo, calcula-se o valor presente
líquido consolidando-os. Assim, no ambiente da planilha, o usuário muitas
vezes se vê obrigado a explicitar, em diversas células, alguns cálculos
intermediários, para que estes possam ser utilizados na obtenção do resultado
final de interesse.
Utilizando o VBA do Excel, estes cálculos intermediários podem ser
realizados sem a necessidade de ocupação de células, pois valores auxiliares
são calculados pelo algoritmo e armazenados em variáveis que podem ser
acessadas e processadas para a obtenção do resultado de interesse. A planilha
torna-se mais limpa, com menos células preenchidas.
Neste contexto, considerando que a repetição de cálculos envolve a
entrada de um conjunto de dados de uma mesma natureza como, por
exemplo, fluxos de caixa, o objetivo didático deste capítulo é discutir a
implementação de funções que envolvem parâmetros definidos por intervalos
de células. Esse aspecto representa uma inovação importante em relação às
funções discutidas nos capítulos anteriores, pois permite que um parâmetro
de entrada seja não somente uma célula, mas um conjunto de células. Para
uma discussão sobre os temas deste capítulo o leitor pode consultar a obra de
Fabozzi (1999).
 
5.1 Uma breve referência a finanças
 
A partir do problema financeiro básico de cálculo do valor presente
líquido VPL, abordaremos com maior ênfase as diversas formas de leitura e
de uso de dados apresentados em intervalos de células. A discussão do VPL
permite ilustrar a flexibilidade do VBA para a resolução de problemas
financeiros. Em particular, evidenciaremos as limitações de funções
predefinidas no Excel. No caso do VPL, a função predefinida no Excel
envolve premissas extremamente restritivas podendo ser aplicada em
situações muito específicas. Ou seja, as funções predefinidas do Excel não
são adequadas para problemas de finanças mais práticos. Assim, em situações
mais genéricas, a implementação de funções em VBA torna-se, portanto,
imprescindível.
Destaca-se que o conceito de valor presente fundamenta diversas
aplicações financeiras como, por exemplo, o estudo de viabilidade de
projetos, a estimativa de preço de ações, a análise de sensibilidade de preços
de ativos de renda fixa, etc.
 
5.1.1 Modelo geral
 
Genericamente, um ativo ou um projeto pode ter uma configuração
qualquer de fluxos de caixa, conforme ilustrado na figura a seguir:
Figura 5.1: Fluxos de caixa (FC) genéricos e estrutura temporal de taxas de juros.
 
Na Figura 5.1 é também apresentada a estrutura temporal de taxa de juros
à vista que representa o custo do dinheiro ri em função do prazo ti. Por
exemplo, o fluxo de caixa FC2, que ocorre no prazo t2, deve ser trazido a
valor presente por uma taxa de juros r2 ao período.
Matematicamente, o Valor Presente Líquido (VPL) é calculado através da
seguinte equação:
 
(5.1)
 
É importante observar que fluxos de caixa genéricos envolvem diversos
desembolsos e recebimentos, que ocorrem em períodos diferentes. Não
necessariamente os fluxos de caixa FC0...FCn são iguais nem os intervalos
entre os prazos t0 ... tn de ocorrência dos fluxos de caixa são constantes. Além
disso, cada fluxo FCi que ocorre no prazo i pode ser descontado a uma taxa
de juros ri distinta, refletindo a possibilidade de que a estrutura temporal de
taxa de juros não seja constante. Note que no capítulop anterior, o modelo de
Gordon possui simplificações relevantes como, por exemplo, fluxos
igualmente espaçado se taxa de juros constate.
 
5.2 Valor presente líquido
 
As observações apresentadas anteriormente são importantes, pois funções
do Excel para cálculo de valor presente têm limitações extremamente críticas.
Por exemplo, a função VPL do Excel, que calcula o valor presente líquido,
parte da premissa de que os fluxos de caixa são igualmente espaçados ao
longo do tempo. Além disso, o fluxo inicial na função VPL do Excel ocorre
em t0 = 1.
Estes elementos parecem ser detalhes pouco significantes, mas na prática,
têm implicações consideráveis, pois exigem cuidados adicionais por parte do
analista, uma vez que as especificações dos parâmetros da função do Excel
não são imediatas nem genéricas o suficiente. Em particular, o VPL do Excel
considera que o primeiro fluxo ocorre em t0 = 1, o resultado gerado sempre é
defasado em relação ao conceito tradicional de VPL, no qual t0 comumente é
zero.
Adicionalmente, fluxos com prazos que não possuem uma frequência
regular não podem ser trazidos a valor presente através da função VPL já
programada do Excel, uma vez que não há flexibilidade de incorporar fluxos
com prazos chamados de não-convencionais, como por exemplo, que não
acontecem em intervalos iguais. Além disso, usar a função VPL do Excel,
que serve para calcular o valor presente e não o valor presente líquido,
também pode não ser adequado, pois esta função parte da premissa de que os
fluxos de caixa são, além de periódicos, constantes.
Finalmente, na função VPL do Excel, todos os fluxos são descontados a
uma mesma taxa de juros, ou seja, r0 = r1 = r2 = ... = r. Assim, em termos
matemáticos, a função VPL do Excel operacionaliza um casoparticular do
VPL dado pela seguinte equação:
 
(5.2)
 
Comparando as equações 5.1 e 5.2, deve ficar evidente que a função do
VPL do Excel representa um modelo simplificado, no qual a taxa de juros é
constante e os prazos são igualmente espaçados e inteiros, isto é, não são
permitidos prazos fracionados como, por exemplo, 1,5 anos.
Além disso, conforme já discutido, existe um descompasso no fluxo de
caixa inicial, pois para a função VPL do Excel, o primeiro fluxo, FC1 que
pode representar o investimento inicial em um projeto, não ocorre
imediatamente no instante t0 = 0 ou em um instante arbitrário inicial, mas
somente ao final do primeiro período, isto é, t0 = 1.
Note que, em uma análise do mundo real, o investimento inicial não
precisa ser realizado nem em t0 = 0 ou t0 = 1. Desta forma, a equação 5.1
permite flexibilidade na escolha do momento exato do início do fluxo inicial.
Eventualmente, uma empresa pode estar avaliando um investimento, cujo
primeiro desembolso ocorrerá em 4 meses e meio, por exemplo, e não
imediatamente.
Obviamente, alguns ajustes podem ser utilizados para compatibilizar a
função VPL do Excel com a equação denotada em 5.1. Porém, quando os
fluxos de caixa não obedecem a uma periodicidade constante, como é o caso
da maioria das aplicações financeiras reais, o uso da função do VPL do Excel
fica comprometido, pois os parâmetros desta função não conferem liberdade
o suficiente para o usuário incorporar informação sobre os prazos exatos dos
fluxos de caixa.
Ressalta-se, portanto, que as funções financeiras do Excel, assim como as
de uma calculadora financeira tradicional como a HP-12C, são adequadas
para fins didáticos, não devendo ser utilizadas para aplicações com aspectos
mais genéricos e reais.
Desta forma, mesmo problemas simples não são facilmente avaliados a
partir do uso imediato da função VPL do Excel ou de uma função equivalente
da HP-12C. Exemplificando, o VPL dos fluxos de caixa a seguir não pode ser
analisado sem ajustes dos parâmetros de entrada às funções financeiras do
Excel, pois os fluxos não ocorrem em períodos convencionais, igualmente
espaçados.
 
Figura 5.2: Exemplo de fluxos de caixa que necessitam de ajustes para o uso da função VPL do Excel.
 
Portanto, do ponto de vista prático, dadas as limitações das fórmulas
predefinidas do Excel, é mais conveniente desenvolver uma planilha própria
ou uma função específica.
 
5.2.1 Taxa de juros constante
 
Suponha que um analista queira calcular o VPL de um projeto, no qual o
investimento inicial é $100 e os fluxos projetados para os próximos dois anos
são iguais a $110 e $150, conforme mostrado na Figura 5.3. Suponha que a
taxa de desconto seja constante ao longo de todo período de análise e
equivalente a 20% ao ano.
Figura 5.3: Exemplo de fluxos de caixa de um projeto.
 
Usando a equação 5.1 genérica, temos o seguinte cálculo:
 
Observe que, no caso especial em que o primeiro fluxo ocorre no
momento t0 = 0, a taxa de juros r0 se torna irrelevante, pois (1+0,20)0 = 1.
A planilha a seguir é um possível exemplo de implementação deste
procedimento de cálculo do valor presente líquido no Excel:
 
Figura 5.4: Exemplo de cálculo do VPL usando o Excel.
 
5.2.2 Taxa de juros variável
 
O conceito desenvolvido na planilha em Excel permite também obter o
valor presente líquido considerando casos razoavelmente genéricos, nos quais
os prazos de cada fluxo de caixa ocorrem em instantes sem uma determinada
periodicidade. Além disso, no contexto das aplicações financeiras reais, a
estrutura temporal de taxa de juros à vista não é constante em função do
prazo e, portanto, a premissa de que r0 = r1 = r2 = ... = r na equação 5.2 não é
adequada. Por exemplo, vamos considerar o valor presente líquido dos fluxos
da situação da Figura 5.5.
Figura 5.5: Exemplo de fluxos de caixa de um projeto.
 
Observe que os prazos não são igualmente espaçados e ainda envolvem
valores que não são inteiros. Por exemplo, o primeiro fluxo ocorre em 0,25
anos, ou seja, em 3 meses, o segundo fluxo em 0,75 anos, isto é, 9 meses e o
último, em 2 anos e 3 meses.
A configuração destes fluxos exige diversos ajustes para serem analisados
a partir da função VPL do Excel. Assim, ao invés de tentar ajustar os dados
para usar uma função predefinida, é mais fácil utilizar os recursos da planilha,
conforme ilustrado a seguir:
 
Figura 5.6: Exemplo de cálculo do VPL usando o Excel.
 
Assim, a falta de flexibilidade da função VPL do Excel é facilmente
superada pela estruturação de uma planilha que realiza diversos cálculos em
células intermediárias e totaliza o valor presente líquido, como mostrado na
célula D5 da Figura 5.6.
Praticamente todo usuário de Excel que precisa fazer um cálculo de VPL
com uma configuração de fluxos pouco convencional já desenvolveu uma
planilha semelhante à discutida anteriormente. Porém, uma forma mais
elegante de resolver o problema de valor presente líquido genérico envolve a
elaboração de uma função do Excel que permita uma flexibilidade para
avaliar diversas configurações de fluxos de caixa. Apesar de a aplicação ser
simples, o leitor poderá visualizar a potencialidade do VBA do Excel.
O uso de um exemplo de estruturação de uma função para cálculo do
valor presente líquido possibilita ilustrar como obter parâmetros de entrada
que correspondem a um conjunto de células e não a células individualmente
como feito nos capítulos anteriores. Deve-se ressaltar que, enquanto nas
funções dos capítulos anteriores, nas quais os parâmetros de entrada eram
representados por células individuais, por exemplo, o beta do ativo era
incorporado a partir da leitura de um valor em uma célula, na função
desenvolvida neste capítulo, parâmetros de entrada são representados por um
conjunto de células representativo de uma série de dados.
Observe que o cálculo do VPL envolve uma sequência de valores
correspondentes à série temporal na qual o fluxo de caixa é contabilizado sob
uma taxa de juros correspondente ao período.
 
5.2.3 Programando em VBA o VPL a uma taxa de juros variável
 
Como exemplo, podemos supor o fluxo de caixa de um investimento de
$200,00 que gera os seguintes fluxos subsequentes dados pela Tabela 5.1 a
seguir:
 
t(Meses) Fluxo de Caixa Taxa de Juros Valor Presente
0,0 $-200,00 1,00% $-200,00
0,5 $100,00 1,20% $99,41
1,0 $200,00 1,30% $197,43
2,3 $300,00 1,50% $289,90
2,5 $50,00 1,60% $48,05
3,0 $60,00 1,80% $56,87
4,0 $-40,00 1,90% $-37,10
4,5 $300,00 2,00% $274,42
Valor Presente Líquido $728,99
Tabela 5.1: Exemplo de fluxo de caixa e cálculo do valor presente líquido.
 
Note que os fluxos de caixa ocorrem em intervalos de tempos variáveis. A
coluna mais a direita representa o cálculo de cada termo do somatório da
fórmula, juntamente com o VPL ao final da coluna. Vamos colocar estes
valores numa planilha do Excel:
 
• Abra o Excel
• Digite os seguintes valores:
Figura 5.7: Valores do exemplo de cálculo do valor presente líquido.
 
• Inicie o editor do VBA; e
• Insira novo módulo através da opção “Módulo” do menu “Inserir”
[CTRL] + [M].
 
Digite o código a seguir:
 
 
01
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
06
07
08
09
10
11
12
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)
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
07
08
09
10
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)
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

Outros materiais