Escolar Documentos
Profissional Documentos
Cultura Documentos
Financeira na Linguagem
R
II Sabadão Previdenciário – 18/11 (CCSA – UFPB)
Minicurso
Palestrante: Filipe Coelho de Lima Duarte
Conteúdo do minicurso
• Introdução à linguagem R
• Tipos de Objetos no R
• Aplicações em Matemática Financeira no R
• Trabalhando com Tábuas de Mortalidade no R
• Matemática Atuarial no R
O que é a linguagem R?
• Linguagem de programação e um ambiente para computação
estatística e gráficos (R Development Core Team, 2006).
• Linguagem de programação especializada em computação com dados
(TORGO, 2006).
• R é altamente expansível com o uso de pacotes, que são bibliotecas
para funções específicas ou áreas de estudo específicas.
• Além disso é gratuito!!!
• O crescimento do uso do R nos últimos 5 anos é destaque no
stackoverflow (https://stackoverflow.blog/2017/10/10/impressive-
growth-r/).
Instalação do R
• Download através do link: http://www.r-project.org.
• Faça download da versão mais recente.
• Sempre esteja atento às novas atualizações.
O ambiente do R: Console
Fundamentos da Linguagem R
• O R é uma linguagem baseada em objetos (TORGO, 2006).
• Tudo o que você usa no R fica guardado na memória sob a forma de um
objeto.
• Todos objetos têm um nome associado.
• Os objetos podem ser de diferentes tipos. Ex.:
• Números
• Textos
• Vetores
• Matrizes
• Expressões
• Chamadas a funções e etc.
Primeiros comandos
• Para armazenar algo num objeto usamos o operador de atribuição:
“<-”
• Vamos guardar um número (4.5) no objeto chamado taxa_de_juros:
> taxa_de_juros <- 4.5
• Para visualizar o conteúdo do objeto, basta digitar o nome do objeto
na linha de comando.
> taxa_de_juros
[1] 4.5
Operações matemáticas
• Somando-se dois valores:
> 10 + 5
[1] 15
• soma: +
• subtração: -
• produto: *
• divisão: /
• potência: ^
• divisão inteira: % / %
• resto de divisão inteira: %%
Atribuições de expressões
• Podemos também atribuir expressões numéricas a objetos:
> z <- 5
> w <- z^2
>w
[1] 25 • Importante: os nomes dos objetos
(tabelas, variáveis, etc.) devem começar
sempre com uma letra.
> i <- (z * 2 + 45)/2 • Maiúscula e minúscula são consideradas
>i diferentes.
[1] 27.5
Tipos de Objetos
• Os elementos dos objetos podem ser:
A. logical: Binário (TRUE ou FALSE, 1 ou 0).
B. numeric: Números reais.
C. complex: Números complexos.
D. character: Caracteres (ex.: “Oi mundo!”).
Operadores lógicos
• == igual a
• != diferente de
• < menor que
• > maior que
• <= menor ou igual a
• >= maior ou igual a
• ! não
• | ou
•& e
Funções
• Servem para facilitar os cálculos do usuário.
• Ex.: como calcula-se a média, mediana e a variância?
• Existem milhares de funções inseridas nos pacotes que podem ser
carregados.
• É possível também criar o seu próprio pacote com suas funções.
• Exemplos de funções:
• mean( ) – média.
• sqrt( ) – raiz quadrada
Vetores
• Objeto mais básico para guardar dados (TORGO, 2006).
• Vetor estrutura de dados que armazena um conjunto de valores do
mesmo tipo (ex.: números, caracteres, etc.).
• O tamanho do vetor é um número de elementos que ele contém, e
pode ser obtido com a função length( ).
> v <- c(4, 7, 23.5, 76.2, 80)
>v
[1] 4.0 7.0 23.5 76.2 80.0
Vetores
• Todos os vetores podem ter um elemento especial que é o NA – valor desconhecido.
• Se temos os lucros trimestrais de uma empresa desconhecidos guardados num vetor:
> lucros <- c(234000, 245000, NA, 124500)
> lucros
[1] 234000 245000 NA 124500
• os elementos de um vetor podem ser obtidos através de um índice (indexação).
• Esse número é colocado entre colchetes:
> lucros[2]
[1] 245000
> lucros[3] <- 45000 (atribuindo o valor “45000” ao elemento alocado na 3ª posição).
(TORGO, 2006)
Operações com vetores
• Um dos aspectos mais poderosos da linguagem R é a possibilidade de “vetorizar” a maioria das suas
funções. Exemplo:
> N <- 10000000
> a <- rnorm(N) – (gerar números aleatórios conforme uma Normal)
> b <- rnorm(N)
• Abordagem “vetorizada” - mais rápido no R
> c <- a * b
• Abordagem tradicional
> d <- rep(NA, N)
> for(i in 1:N){
d[i] <- a[i] * b[i]
>}
• Portanto, usar as operações vetoriais
Filtros em vetores
• Podemos selecionar um conjunto de elementos do vetor utilizando
filtros:
vetor[expressão-lógica]
(CHARPENTIER, 2015)
Valor Presente Líquido (NPV)
• Valor presente de uma série de pagamentos:
(CHARPENTIER, 2015)
Exemplo de NPV
• Qual investimento você prefere dado que i = 0.05?
A. Investir $500 hoje e receber $100, 200, 300, 250 no final dos
quatros anos; ou
B. Investir $700 hoje e receber $1000 após dois anos.
(CHARPENTIER, 2015)
Exemplo do NPV
# vamos aplicar no R:
> cfs1 <- c(-500, 100, 200, 300, 250)
> times1 <- 0:4
> NPV1 <- presentValue(cashFlows = cfs1, t = times1, i = 0.05)
> NPV1
[1] 241.4709 Qual você prefere?
> cfs2 <- c(-700, 1000)
> times2 <- c(0,2)
> NPV2 <- presentValue(cashFlows = cfs2, t = times2, i = 0.05)
> NPV2
[1] 207.0295
(CHARPENTIER, 2015)
Anuidades
• Anuidades são séries de pagamentos realizadas em intervalos iguais
de tempo.
• Se os pagamentos são realizados por um período fixo do tempo, a
anuidade é chamada de “anuidade certa”.
• Se os pagamentos são feitos no final de cada período por n períodos,
dizemos que a anuidade é “anuidade imediata”.
• Caso os pagamentos sejam realizados no início dos períodos, dizemos
que a anuidade é “anuidade antecipada”.
(CHARPENTIER, 2015)
Anuidades
• Portanto, a anuidade imediata paga por n anos é dada por:
(CHARPENTIER, 2015)
Exemplo (anuidade)
• Vamos precificar as seguintes anuidades:
1. Calcule o valor presente de uma anuidade imediata para os valores
de $100 pagos anualmente por 5 anos a uma taxa de juros de 9%.
2. Suponha que uma companhia emite ações que pagam dividendos
no final de cada ano no valor de $10 indefinidamente, e o custo de
capital é de 6%. Qual seria o valor da ação no início do ano?
3. Qual montante você deve investir hoje a uma taxa de 6% composta
anual, de tal forma que você possa sacar $5000 no início de cada
ano pelos próximos 5 anos?
(CHARPENTIER, 2015)
Exemplo 1
> i <- 0.09
> n <- 5
> 100*(1-(1+i)^(-n))/i
[1] 388.9651
# Usando a função annuity():
> 100 * annuity(i = 0.09, n = 5, type = “immediate”)
[1] 388.9651
(CHARPENTIER, 2015)
Exemplo 2
> 10 * annuity(i = 0.06, n = Inf)
[1] 166.6667
(CHARPENTIER, 2015)
Exemplo 3
> 5000 * annuity(i = 0.06, n = 5, type = “due”)
[1] 22325.53
(CHARPENTIER, 2015)
Valor acumulado da anuidade no futuro
• De maneira similar, é possível computar o valor futuro capitalizado
correspondente à anuidade.
• Levamos a anuidade para o futuro, conforme equação abaixo:
(CHARPENTIER, 2015)
Exemplo do valor acumulado futuro
• Qual será o valor acumulado se eu depositar $5.000,00 todo início de
ano pelos próximos 5 anos? Assuma uma taxa de juros anual de 6%.
> annuity(i = 0.06, n = 5, type = "due")*5000*1.06^5
[1] 29876.59
(CHARPENTIER, 2015)
Séries de Pagamentos crescentes e
decrescentes
• O pacote “lifecontingencies” contém funções para calcular o valor presente de
crescimento (IA)n e decrescimento (DA)n aritméticos das anuidades.
• Exemplo: Os seguintes pagamentos estão para ser recebidos: $500 no final do 1º
ano; $520 no final do 2º ano; $540 no final do 3º ano, etc... até o último
pagamento no valor de $800. Usando uma taxa de juros efetiva anual de 2%,
determine:
a) O valor presente desses pagamentos no tempo 0.
b) O valor acumulado futuro desses pagamentos no período do último
pagamento.
(CHARPENTIER, 2015)
Exemplo
a) O valor presente dos pagamentos:
Podemos considerar uma anuidade fixa de $480 mais um aumento aritmético
de $20.
> 480*annuity(i = 0.02, n = 16) + 20*increasingAnnuity(i = 0.02, n = 16)
[1] 8711.431
(CHARPENTIER, 2015)
Como criar uma tábua de mortalidade no R
• 1ª Abordagem: usando a função new( )
> tabua1 <- new("lifetable", x = seq(0, 10, 1), lx = seq(from = 1000, to = 0, by =
-100), name = "Tábua de mortalidade 1")
x lx px ex
1 0 1000 0.9000000 4.5
2 1 900 0.8888889 4.0
3 2 800 0.8750000 3.5
4 3 700 0.8571429 3.0
5 4 600 0.8333333 2.5
6 5 500 0.8000000 2.0
7 6 400 0.7500000 1.5
8 7 300 0.6666667 1.0
9 8 200 0.5000000 0.5
(CHARPENTIER, 2015)
Como criar uma tábua de mortalidade no R
• 2ª Abordagem: usando a função probs2lifetable( )
> tabua2 <- probs2lifetable(probs = seq(from = 0.1, to = 1, by = 0.1), radix =
100000, type = "qx", name = "Tábua de mortalidade 2")
x lx px ex
1 0 100000.00 0.9 2.660216
2 1 90000.00 0.8 1.955795
3 2 72000.00 0.7 1.444744
4 3 50400.00 0.6 1.063920
5 4 30240.00 0.5 0.773200
6 5 15120.00 0.4 0.546400
7 6 6048.00 0.3 0.366000
8 7 1814.40 0.2 0.220000
9 8 362.88 0.1 0.100000
(CHARPENTIER, 2015)
Transformando a tábua em data frame
• É possível transformar a tábua de mortalidade em um data frame:
> tabuaDF1 <- as(tabua1, “data.frame”)
> class(tabuaDF1)
[1] “data.frame”
(CHARPENTIER, 2015)
Importando a tábua do The Society of
Actuaries (SoA)
• Dentro do pacote “lifecontingencies” é possível acessar uma a tábua
do SoA usando o seguinte comando:
> data(soa08Act) # acessa a tábua 08
> soa08Act
• Usa a taxa de juros de 6% a.a.
(CHARPENTIER, 2015)
Usando as funções de px e qx
• Calcule:
1. A probabilidade de um segurado de 65 anos morrer antes de
alcançar os 85.
2. A probabilidade de um participante de um plano de benefícios de
25 anos sobreviver até os 65 anos.
Usando as funções de px - pxt(), e qx - qxt ()
•1. A probabilidade de um segurado de 65 anos morrer antes de
alcançar os 85:
(CHARPENTIER, 2015)
Usando as funções de px - pxt(), e qx - qxt ()
•2. A probabilidade de um participante de um plano de benefícios de
25 anos sobreviver até os 65 anos:
(CHARPENTIER, 2015)
Esperança de vida
• Esperança abreviada de vida -
> exn(object = soa08Act)
(CHARPENTIER, 2015)
MatemáticaAtuarial
Matemática Atuarial
Matemática Atuarial
• União da Matemática financeira com as probabilidades de
sobrevivência e de falecimento.
• Ex.1: Qual o valor do prêmio que um segurado deve pagar hoje para
que o beneficiário receba R$ 100.000,00 quando ele (segurado)
falecer (Seguros de Vida).
• Ex.2: Qual o valor da contribuição que eu devo pagar por 30 anos para
que eu receba R$ 10.000,00 até o meu falecimento (Previdência).
Precificando Seguros de Vida
• Etapas:
1. Defina as hipóteses financeiras e demográficas.
2. Determine o valor presente atuarial dos fluxos de caixa.
3. Determine o prêmio, levando em consideração a possibilidade de se
pagar apenas um valor ou em forma de pagamentos periódicos.
(CHARPENTIER, 2015)
Precificando Seguros de Vida
• Notação utilizada no pacote:
• x – idade do segurado no início do contrato;
• n – tempo do contrato;
• m – período de diferimento (carência);
• i – taxa de juros;
• k – representa pagamentos fracionados (default = 1).
Exemplos
• Os exemplos vão utilizar uma tábua da SoA com i = 6%.
• Os benefícios são pagos no final de cada período.
• O contrato de seguro de vida padrão que vamos considerar será o
temporário de n-anos que paga $1 no momento da morte de (x) se a
morte ocorrer em n anos.
• O valor esperado do contrato é:
(CHARPENTIER, 2015)
Exemplos
• Gerar uma tábua de mortalidade (comutação) usando taxa de juros de 6%.
> data(soaLt)
> soaAct <- new(“actuarialtable”, x = soaLt$x, lx = soaLt$Ix, interest = 0.06)
> soaActDf <- as(soaAct, “data.frame”)
• Criando uma tábua de comutação atuarial a partir de uma planilha:
• # exemplo de criação de uma tábua de mortalidade com base em uma at-2000
> tab <- read.csv(file.choose(), header = TRUE, sep = ";") #escolher o arquivo
> at2000 <- new("actuarialtable", x = tab$ï..x, lx = tab$lx, interest = 0.06)
> at2000
Exemplo de precificação de Seguro de Vida
• Qual o prêmio único de um seguro de vida temporário de 3 anos para um
segurado com 36 anos, dado que o valor do benefício é de $100.000,00,
e pago ao beneficiário caso o segurado faleça?
• Solução: use a função Axn( )
> P <- 100000 * Axn(actuarialtable = soaAct, x = 36, n = 3)
>P
[1] 607.5519
> P1 <- 100000 * Axn(actuarialtable = at2000, x = 36, n = 3)
> P1
[1] 221.1907
Precificando anuidades aleatórias
• Anuidades vitalícias imediatas antecipadas são séries de pagamentos
realizadas nos inícios de cada ano enquanto o segurado está vivo.
• A anuidade vitalícia para um segurado de idade (x) tem o seguinte
valor atuarial:
(CHARPENTIER, 2015)
Exemplo de precificação de anuidade
vitalícia
• A anuidade tem função axn( )
• Qual o valor presente atuarial de $100 pagos no início de cada ano para
uma pessoa de 65 anos até a sua morte?
> VPA <- 100 * axn(actuarialtable = soaAct, x = 65)
> VPA
[1] 989.6928