Você está na página 1de 63
Modelagem Atuarial e Financeira na Linguagem R II Sabadão Previdenciário – 18/11 (CCSA – UFPB)
Modelagem Atuarial e Financeira na Linguagem R II Sabadão Previdenciário – 18/11 (CCSA – UFPB)

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!!!

no

O crescimento do

stackoverflow (https://stackoverflow.blog/2017/10/10/impressive-

do

nos últimos

5 anos é destaque

uso

R

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

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

> i <- (z * 2 + 45)/2

> i

[1] 27.5

Importante: os nomes dos objetos

(tabelas, variáveis, etc.) devem começar

sempre com uma letra. Maiúscula e minúscula são consideradas diferentes.

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 45000ao elemento alocado na 3ª posição).

(TORGO, 2006)

Operações com vetores

Um dos aspectos mais poderosos da linguagem R é a possibilidade de vetorizara 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

3

C

7.9

4

D

8.1

Indexação igual à realizada nas matrizes:

turmas.notas[n, m]

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.

Financeira lida com o valor do dinheiro no tempo. • Um valor X após t anos

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

i = 5% a.a.

A(2) = ?

> 100 * (1 + 0.05)^2

[1] 110.25

Modo alternativo:

> At = 100*(1+i)^t

> At

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

(NPV) • Valor presente de uma série de pagamentos: • Possibilita avaliar diversos investimentos de acordo

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)

<- presentValue(cashFlows = cfs1, t = times1, i = 0.05) > NPV1 [1] 241.4709 Qual você
> NPV1 [1] 241.4709 Qual você prefere? > cfs2 <- c(-700, 1000)
> 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:

Anuidades • Portanto, a anuidade imediata paga por n anos é dada por: (CHARPENTIER, 2015)

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

correspondente à anuidade. • Levamos a anuidade para o futuro, conforme equação abaixo: (CHARPENTIER, 2015)

(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 lifecontingenciesconté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

16))*1.02^16

= 0.02,

n

[1] 11958.93

=

16)

+ 20*increasingAnnuity(i = 0.02, n =

(CHARPENTIER, 2015)

Trabalhando com Tábuas de Mortalidade

Tábuas de mortalidade consistem em sequências não crescentes de

ω, 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.

l x , com

x = 0, 1,

,

= +

=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 p x e q x

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 p x - pxt(), e q x - qxt ()

1. A probabilidade de um segurado de 65 anos morrer antes de

alcançar os 85:

> qxt(soa08Act, 65, 20)

[1] 0.6869847

20 65 = 65 85 65

(CHARPENTIER, 2015)

Usando as funções de p x - pxt(), e q x - qxt ()

2. A probabilidade de um participante de um plano de benefícios de

25 anos sobreviver até os 65 anos:

> pxt(soa08Act, 25, 40) [1] 0.7876582

40 25 = 65 25

(CHARPENTIER, 2015)

Esperança de vida

Esperança abreviada de vida - > exn(object = soa08Act)

Esperança completa de vida

> exn(soa08Act, “complete”)

exn(object = soa08Act) • Esperança completa de vida – > exn (soa08Act, “complete”) (CHARPENTIER, 2015)
exn(object = soa08Act) • Esperança completa de vida – > exn (soa08Act, “complete”) (CHARPENTIER, 2015)

(CHARPENTIER, 2015)

Matemática Atuarial

União

da

Matemática

financeira

com

as

sobrevivência e de falecimento.

probabilidades

de

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

até o meu falecimento

receba

R$

para

(Previdência).

que

eu

10.000,00

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

$1 no momento da morte de ( x ) se a morte ocorrer em n anos.

(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$ï

> at2000

lx = tab$lx, interest = 0.06)

x,

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

100000 * Axn(actuarialtable = soaAct, x = 36, n = 3) > P [1] 607.5519 >

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

está vivo. • A anuidade vitalícia para um segurado de idade ( x ) tem o

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

Obrigado pela presença!

email para contato:

presença! email para contato : filipe_pb_duarte@hotmail.com Minicurso: Modelagem Atuarial e Financeira na Linguagem R

Minicurso:

Modelagem Atuarial e Financeira na Linguagem R

presença! email para contato : filipe_pb_duarte@hotmail.com Minicurso: Modelagem Atuarial e Financeira na Linguagem R