Sei sulla pagina 1di 63

Modelagem Atuarial e

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]

• Exemplo: temos um vetor chamado notas e queremos selecionar


apenas os elementos que estão entre o 5 e 8:
> notas <- c(10, 2.8, 3.2, 6.4, 8.1, 9.9, 5.2, 3, 6, 8, 2, 10, 9, 3.5)
> notas[notas >= 5 & notas <= 8]
Matrizes
• Utilizamos quando estamos interessados em armazenar informações em
estrutura de dados com mais de uma dimensão.
• Exemplo: suponha que temos doze números correspondentes às vendas
trimestrais durante o último ano, em três lojas.
> vendas <- matrix(c(45, 23, 66, 77, 33, 44, 56, 12, 78, 23, 78, 90), 3, 4, byrow
= TRUE)
> vendas
• Nas matrizes também é possível dar nomes aos elementos para tornar a
leitura da informação mais legível.
> rownames(vendas) <- c("loja1", "loja2", "loja3")
> colnames(vendas) <- c("1.trim", "2.trim", "3.trim", "4.trim")
> vendas
Filtro em Matrizes
• Indexação segue o seguinte formato:
[n, m] – mostra o elemento da linha “n” e da coluna “m”.
Do exemplo anterior, se eu quiser a informação das vendas da segunda
empresa referente ao 3º trimestre:
> vendas[2, 3]
[1] 56
Data Frames
• Um data frame é um objeto do R que serve para guardar tabelas de
dados.
• Semelhante à matriz mas suas colunas têm nomes e podem conter
dados de tipos diferentes, o que não ocorre na matriz.
• Cada linha possui um conjunto de dados de diferentes tipos (ex.:
indivíduos, idades, empresas, etc.)
• Cada coluna é um vetor.
Data Frames
> turmas <- c(“A”, “B”, “C”, “D”)
> medias.notas <- c(9.2, 8.5, 7.9, 8.1)
> turmas.notas <- data.frame(turmas, medias.notas)
turmas medias.notas
1 A 9.2
2 B 8.5 • Indexação igual à realizada nas matrizes:
3 C 7.9 turmas.notas[n, m]
4 D 8.1 onde n – linha; m - coluna
Data Frames
• Para acessar colunas, utiliza-se o nome do data frame seguido do “$”
e do nome da coluna (vetor).
• Ex.: vamos dizer que eu desejo o vetor das notas.
> turmas.notas$medias.notas
[1] 9.2 8.5 7.9 8.1
• Outras funções:
• names(data_frame)  ver as colunas da tabela
• head(data_frame)  ver as primeiras linhas
• tail(data_frame)  ver as últimas linhas
Matemática Financeira
• Matemática Financeira lida com o valor do dinheiro no tempo.
• Um valor X após t anos se tornará - A(t) = X(1 + i)t - se utilizar os juros
compostos.
• i – representa a taxa de juros efetiva;
• Exemplo:
• X = $ 100
• t = 2 anos Modo alternativo:
• i = 5% a.a.
> At = 100*(1+i)^t
• A(2) = ?
> At
> 100 * (1 + 0.05)^2
[1] 110.25
[1] 110.25
Utilizando funções
• Para trabalhar com as funções atuariais e financeiras implementadas
em pacotes, instale e carregue “lifecontingencies”
> install.packages(“lifecontingencies”)
> library(“lifecontingencies”)

(CHARPENTIER, 2015)
Valor Presente Líquido (NPV)
• Valor presente de uma série de pagamentos:

• Possibilita avaliar diversos investimentos de acordo com os seus fluxos de caixa


esperados.
• A função do valor presente no pacote lifecontingencies é presentVaule( )

(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

Usando a função acumulada:


> 5000*accumulatedValue(i = 0.06, n = 5, type = "due")
[1] 29876.59
(CHARPENTIER, 2015)
Exemplo 2 do valor acumulado
• Uma pessoa quer economizar $100.000,00 em 10 anos para pagar a educação do
seu filho. O fundo pede que os investidores depositem a mesma quantia todo
final de ano. Se a taxa de juros garantida anual é de 5%, quanto seria necessário
depositar todo ano para acumular o valor desejado?
> C <- 100000
> R <- C/accumulatedValue(i = 0.05, n = 10)
>R
[1] 7950,457

(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

b) O valor acumulado futuro:


> (480*annuity(i = 0.02, n = 16) + 20*increasingAnnuity(i = 0.02, n =
16))*1.02^16
[1] 11958.93
(CHARPENTIER, 2015)
Trabalhando com Tábuas de Mortalidade
• Tábuas de mortalidade consistem em sequências não crescentes de lx , com
x = 0, 1, ..., ω, que representam a quantidade de sobreviventes vivos no
início da vida (0 – raiz da tábua) até a última idade (ω).
• Dessa forma, contando sobreviventes, podemos calcular as probabilidades
de sobrevivência e falecimento.
𝑙𝑥+𝑡
𝑡𝑝𝑥 =
𝑙𝑥

𝑙𝑥 − 𝑙𝑥+𝑡
𝑡𝑞𝑥 = 1 − 𝑡𝑝𝑥 =
𝑙𝑥

(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:
𝑙65 − 𝑙85
20𝑞65 =
𝑙65

> qxt(soa08Act, 65, 20)


[1] 0.6869847

(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:

𝑙65
40𝑝25 =
𝑙25

> pxt(soa08Act, 25, 40)


[1] 0.7876582

(CHARPENTIER, 2015)
Esperança de vida
• Esperança abreviada de vida -
> exn(object = soa08Act)

• Esperança completa de vida –


> exn(soa08Act, “complete”)

(CHARPENTIER, 2015)
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

> VPA1 <- 100 * axn(actuarialtable = at2000, x = 65)


> VPA1
[1] 1134
Mais exemplos de anuidades
• No caso de uma anuidade temporária?
• Qual o valor presente atuarial de $1000 pago por um segurado entre
os 25 e 45 anos todo início de ano?
> 1000 * axn(actuarialtable = soaAct, x = 25, n = 45 – 25)
[1] 12008.43

> 1000 * axn(actuarialtable = at2000, x = 25, n = 45 - 25)


[1] 12086.30
Exemplo de Anuidade diferida
• Qual o valor presente atuarial (anuidade diferida) vitalícia de um
segurado de 30 anos, dado que ele precisa esperar 10 anos para
começar a receber?
> axn(actuarialtable = soaAct, x = 30, m = 10)
[1] 8.109623

> axn(actuarialtable = at2000, x = 30, m = 10)


[1] 8.642053
Prêmios anuais periódicos
• Encontre o prêmio periódico anual que um segurado de 25 anos
pagará durante os primeiros 10 anos para um seguro de vida inteira
no valor de $10.000,00?
> P <- 10000 *Axn(at2000, 25)/axn(at2000, 25, 10)
>P
[1] 71.55399
Finalizando
• Você pode buscar na internet o pacote “lifecontingencies”.
• Ele apresenta todas as funções existentes para manipulação de dados
atuariais e aplicações da matemática atuarial.
• Vale a pena estudar!!!
Referências
• CHARPENTIER, Arthur. Computational Actuarial Science with R. The R
Series. CRC Press: Boca Raton, 2015.
• TORGO, Luís. Introdução à Programação em R. Universidade do
Porto: Grupo de Matemática e Informática, 2006.
Minicurso:
Obrigado pela presença! Modelagem Atuarial e Financeira
email para contato: na Linguagem R
filipe_pb_duarte@hotmail.com

Potrebbero piacerti anche