120

Herbert Kimura, Jim Heiji Aburaya, Vinicius Amorim Sobreiro e

  • 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.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 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)

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

com o passar do tempo.

Capítulo 8

Simulação de Monte Carlo

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

simulações. A flexibilidade do Excel na estruturação de planilhas com diversos

cenários é extremamente útil, principalmente quando se deseja identificar

potenciais resultados sob condições ou premissas variadas. Orçamentos de vendas

e outros demonstrativos financeiros podem ser simulados por meio desses

diferentes cenários. Desta forma, por exemplo, podem-se identificar resultados em

situações de mercado ótimas, regulares ou ruins.

A simulação de um número pequeno de cenários pode ser realizada facilmente

no ambiente de planilha. Porém, algumas aplicações financeiras envolvem a

projeção de uma quantidade elevada de cenários, que podem ultrapassar milhares

de situações.

Já apresentamos anteriormente o modelo de Black-Scholes para precificação de

opções. Esse modelo tem uma fórmula analítica que possibilita que o prêmio de uma

opção do tipo européia, isto é, com possibilidade de exercício somente no

vencimento, seja calculado facilmente utilizando-se funções predefinidas do Excel.

Vamos estudar neste capítulo, a Simulação de Monte Carlo que possui aplicações

em precificação de derivativos financeiros e em mensuração de riscos, já que, em

diversas aplicações, as fórmulas analíticas são difíceis ou até mesmo impossíveis de

serem derivadas.

Assim, alguns produtos financeiros prescindem de técnicas alternativas para que

possam ser avaliadas. Para esses casos, mecanismos de simulação podem ser

utilizados. Uma das ferramentas mais importantes em finanças envolve o uso de

simulações computacionais como a de Monte Carlo.

O leitor mais interessado em aplicações gerais de Monte Carlo para precificação

e gestão de riscos pode encontrar textos interessantes em Monte Carlo:

Methodologies and Applications for Pricing and Risk Management editado por Bruno

Dupire, Great Britain: Risk Books, 1998.

8.1 Introdução

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

aleatórios. Ao invés de se chegar a uma solução única, como nos casos em que se

utilizam fórmulas analíticas, na Simulação de Monte Carlo procura-se projetar um

grande número de potenciais resultados. A média destes possíveis resultados

representa uma estimativa da solução.

Portanto, a Simulação de Monte Carlo possibilita estimar uma solução como, por

exemplo, o valor esperado de um produto financeiro, a partir de cenários futuros

projetados utilizando-se um procedimento aleatório. Em geral, nas aplicações em

finanças, são utilizadas, no mínimo, 5.000 a 10.000 simulações de trajetórias de

preços ou taxas.

No ambiente de planilha, a simulação de um número tão grande de cenários pode

dificultar a estruturação e a visualização de células relevantes. Porém, dentro do

VBA Excel, a Simulação de Monte Carlo é facilmente programada e o resultado final

pode ser inserido em uma única célula.

Deve-se ressaltar, no entanto, que, dependendo da avaliação empreendida e do

mecanismo que modela o comportamento de preços ou taxas, a execução do

programa em VBA pode ser demorada. Assim, se por um lado, a Simulação de Monte

Carlo possui grande flexibilidade para a resolução de problemas complexos, por

outro lado, exige recursos computacionais de maneira bastante intensa.

8.2 Formulação matemática

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

opção do tipo europeu, iremos implementar um algoritmo simples de Simulação de

Monte Carlo para avaliar esse tipo de opção. Dessa maneira, dentro do nosso

objetivo de enfatizar o aprendizado de técnicas computacionais em finanças,

podemos levar em consideração um conceito financeiro já apresentado e comparar

resultados no uso de técnicas diferentes para abordar um mesmo problema de

precificação.

Neste livro, não levaremos em consideração técnicas para aprimorar o

desempenho computacional da simulação de Monte Carlo. Assim, por exemplo,

vamos supor que o algoritmo de geração de números aleatórios do Excel seja

adequado, pelo menos para a geração de uma amostra de 5.000 observações

extraídas de uma distribuição uniforme.

Adicionalmente, não será foco de nossa discussão a otimização através do uso

de variáveis de controle ou de variáveis antitéticas que possibilitam ganho de

velocidade na Simulação de Monte Carlo.

8.2.1 Modelo de precificação

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

titular tem o direito de, se desejar, comprar um ativo-objeto, por um preço de

exercício K no vencimento T. No caso de uma opção de venda ou put option, o

titular tem o direito de, se desejar, vender um ativo-objeto, por um preço de

exercício K no vencimento T.

Vamos considerar inicialmente call options do tipo europeu, no qual o titular

pode exercer seu direito de compra somente na data de vencimento T. A opção de

venda será analisada mais adiante.

Em um momento inicial qualquer t, o preço do ativo-objeto, digamos, uma ação,

possui um determinado valor St. Até o vencimento na data T, o preço da ação pode

flutuar. O grande elemento associado a um produto financeiro é a incerteza. Por

exemplo, nunca se sabe qual será o preço de uma ação em uma data futura.

Assim, no vencimento da opção, o preço da ação St pode estar tanto acima quanto

abaixo do preço de exercício K. Eventualmente, em um caso bastante especial e

pouco provável, o preço da ação no vencimento pode ser exatamente o preço de

exercício K.

Tendo em vista que o preço da ação pode assumir diferentes valores no

vencimento, a Simulação de Monte Carlo fundamenta-se na geração de um número

elevado de possíveis cenários. Ou seja, a partir de um modelo de difusão de preços,

pode-se projetar possíveis preços da ação para a data de vencimento.

Para cada possível valor da ação no vencimento, a opção pode ter um

determinado valor. O método de Monte Carlo consiste na obtenção de um valor

médio da opção no vencimento, calculado a partir de inúmeras simulações do preço

da ação. Finalmente, esse valor médio é trazido a valor presente, obtendo-se uma

estimativa do prêmio da opção.

A ideia, portanto, baseia-se na projeção de preços da ação a cada variação de

tempo ∆t. Considerando um modelo de difusão de preços baseado em uma

distribuição lognormal, temos que o preço St+∆t em um instante t+∆t, é dado pelo

preço St no instante anterior t corrigido por um fator que depende da taxa de juros

livre de risco r, da volatilidade σ e de uma variável z representativa da incerteza.

No caso do modelo tradicional, z representa uma variável aleatória com

distribuição normal padronizada, ou seja, com média nula e desvio-padrão unitário.

A equação a seguir ilustra o processo de difusão de preços do ativo-objeto:

𝑆𝑡 = 𝑆𝑡−∆𝑡 ∙ 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.