Matemática Financeira e Informática de Gestão



Baixar 2,63 Mb.
Página32/32
Encontro01.07.2018
Tamanho2,63 Mb.
1   ...   24   25   26   27   28   29   30   31   32

Sequências. Quando os elementos do vector são uma série, podemos usar o operador “:” para criá-lo. Por exemplo, se executar v5 <- 1:10 e depois v5, o resultado é [1] 1 2 3 4 5 6 7 8 9 10. Fazendo operações algébricas com este gerador de séries, posso criar series mais complicadas. Por exemplo se executar v5<- (1+0.05)^-(1:10) e depois v5, o resultado é o factor que desconta à taxa anual de 5% os valores futuros ao presente, [1] 0.9523810 0.9070295 0.8638376 0.8227025 0.7835262 0.7462154 0.7106813 0.6768394 0.6446089 0.6139133. Devemos ter cuidado com a precedência do operador “:” pelo que se aconselha a usar parênteses: -(1:10) é diferente de -1:10.

Se eu quiser, por exemplo, um vector de dimensão 10 com 5 em todos os elementos, posso fazer v <- (1:5)*0 + 5.


Ex.3.4. Como criar num vector a sequência (10, 10.5, 11, 11.5, 12)?

R. v <- 10 + (0:4)/2.


Ex.3.5. Num investimento, apliquei 1000€ e recebi 250€, 350€, 450€ a intervalos de um ano. Sendo que a taxa de desconto é de 4.5% ao ano, qual o VAL deste investimento?

Cash.flow<-c(-1000, 250, 350, 450)

Taxa.de.desconto<-0.045

Desconto<-(1+Taxa.de.desconto)^-(0:3)

Vai<-Cash.flow*Desconto

Vai

[1] -1000.0000 239.2344 320.5055 394.3335

Va<-sum(Vai)

Va

[1] -45.9266
Ex.3.6. Apliquei 5000€ a 10 anos. Sendo que as taxas de juro foram 3.1%, 3.7%, 4.1%, 3.9%, 4.2%,4.3%, 4.5%, 3.9%, 3.5%, 3.2%, quanto dinheiro recebi no fim do prazo?

Terei que capitalizar os 10 anos multiplicando as taxas de todos os anos. Para isso uso a função logaritmo, somo os resultados e aplico a função exponencial:



Tx.juro<-c(3.1, 3.7, 4.1, 3.9, 4.2,4.3, 4.5, 3.9, 3.5, 3.2)/100

Capitaliza<-5000*exp(sum(log(Tx.juro+1)))

Capitaliza

[1] 7287.484

Ter dividido por 100 é igual a ter dividido pelo vector



c(100, 100, 100, 100, 100, 100, 100, 100, 100, 100)
Sequências de números aleatórios. O R (contrariamente ao Excel) tem geradores de números aleatórios de muitas funções de distribuição. Se quiser colocar num vector uma sequência com 1000 números aleatórios que seguem Distribuição Normal com, por exemplo, média 10 e desvio padrão 5, basta executar va<-rnorm(10000, mean=10, sd=5). Depois, posso usar este vector nas minhas simulações.
Indexação - Acesso a elementos do vector. Quando pretendo aceder um elemento do vector, uso o índice do elemento que eu quero, entre parênteses rectos. E.g., se quisesse saber a taxa de juro do 2º ano, executava Juros[2]. Posso aceder para o valor desse elemento ou atribuir-lhe um valor (ou cria-lo desde que o vector já exista). E.g., para acrescentar o 4º ano à série fazia Juros[4] <- 0.043.

Também posso querer o valor que tem determinada característica: que tem maior valor, max(Juros), o valor mínimo, min(Juros). E posso saber o índice desse elemento com os comandos which.max(Juros) ou which.min(Juros), respectivamente.

Se quiser aceder a vários elementos, uso um vector com os seus índices. E.g., se quiser a taxa de juro do 1º e o 2º ano, executo Juros[c(1,2)]. Notar que tenho que usar o comando de vector c(). Posso também usar o gerador de séries executando Juros[1:2].

Ex.3.7. i) Crie um vector com 1000 número aleatórios que seguem lei normal com média 100 e desvio padrão 50. i) Determine a diferença entre a média dos primeiros 500 valores para os últimos 500 valores. iii) Determine a média dos 100 maiores valores e dos 100 menores valores (use o comando sort( ) para ordenar de forma crescente).

i) serie<-rnorm(1000, mean=100, sd=50)

ii) diferenca<- mean(serie[1:500])-mean(serie[501:1000])

diferenca

iii) ordenados<-sort(serie)

media.menores <- mean(ordenados[1:100])

media.maiores<- mean(ordenados[901:1000])

media.menores

media.maiores
Ex.3.8. Num vector estão os salários anuais de determinado trabalhador que se quer reformar (crie aleatoriamente o vector com 40 elementos com média 600 e d.p. 200). Determine o valor da sua reforma que será 2.2% por cada ano da média dos maiores 10 anos dos últimos 15. (nota: colocando a expressão entre parêntesis, atribui-se a variável e visualiza-se imediatamente o resultado).

salarios<-rnorm(40, mean=600, sd=200)

s.medio<- mean(sort(salarios[26:40])[6:15])

(reforma<-s.medio*length(salarios)*2.2/100)


Filtragem de vectores. Pode acontecer eu precisar retirar do vector os elementos que obedecem a determinado critério. Por exemplo, quero os elementos que são maiores que zero. Para isso uso uma condição no índice: X[X>0]. Reparar que o que está no índice é um vector com a mesma dimensão de X mas em que os elementos são TRUE ou FALSE.

Fig. 3.2. – Exemplo de uma filtragem de um vector



Nota: posso usar como comparações maior >, maior ou igual >=, menor <, menor ou igual <=, igual == (dois iguais), diferente !=. Pode ainda usar-se o “ou” de várias condições com o carácter | ou o “e” com o carácter &. Por exemplo, se quiser os valores maiores que 0 e menores ou iguais a 5 executo X[X>0 & X<=5]. Para negar uma condição uso o carácter !.
Ex.3.9. Suponha que as notas de um disciplina seguem lei normal com média 11.47 valores e desvio padrão de 3.51 valores. i) Crie um vector com 250 “indivíduos”. ii) Retire para outro vector os alunos com nota superior ou igual a 9,5 valores e calcule a percentagem de passados. iii) Substitua os valores maiores que 20 por 20 e os menores que zero por zero. iv) arredonde as notas v) avalie a percentagem de alunos que teve 10 valores.

i) notas <- rnorm(250, mean=11.47, sd=3.51)

ii) passados <- notas [notas>=9.5]



length(passados)/length(notas)

iii) passados[passados > 20] <- 20

passados[passados < 0] <- 0

iv) passados <- trunc(passados)

v) length(passados [passados == 10])
Ex.3.10. Suponha que se prevê que a EURIBOR do próximo ano segue lei normal com média 5% e desvio padrão 3 pontos percentuais mas que nunca poderá ser menor que 0.25% nem maior que 10%. i) Crie um vector com 1000 “indivíduos” com estas características substituindo os valores por estas taxas limite. ii) extraia 2000 e retirando os “errados”.

i) tx.prox.ano <- rnorm(1000, mean=0.05, sd=0.03)

tx.prox.ano [tx.prox.ano < 0.0025] <- 0.0025

tx.prox.ano [tx.prox.ano > 0.1] <- 0.1

ii) tx.prox.ano <- rnorm(2000, mean=0.05, sd=0.03)

tx.prox.ano <- tx.prox.ano [tx.prox.ano >= 0.0025 & tx.prox.ano < 0.1]

tx.prox.ano <- tx.prox.ano [1:1000]
Atribuição de nomes às dimensões. Cada vector tem outro “vector escondido” que pode conter nomes. Assim, posso ter um vector cujas dimensões são número e ter no “vector escondido” um nome para cada dimensão. Por exemplo, tenho um vector com as taxas de inflação mensais anualizada (que são números) e quero também guardar o nome dos respectivos meses. Então usaria duas atribuições: primeiro, atribuía as taxas e, segundo, atribuía os nomes dos meses:

Inflacao <- c(0.041, 0.039, 0.037, 0.031, 0.028, 0.032)

names(Inflacao) <- c(“Jan08”, “Fev08”, “Mar08”, “Abr08”, “Mai08”,”Jun08”)

Quando executasse Inflacao, apareceriam não só as taxas como os nomes:




3. Funções.

Eu posso criar uma função que tem uma variável de entrada (que também pode ser um vector) e tem um resultado de saída (que pode ser uma variável ou um vector). Por exemplo, quero dividir as notas dos alunos em “reprovou” ou “passou”. Para isso escrevo num editor de texto a função:



Classifica <-function(nota){

if(nota >= 9.5) decisao<- ”passou” else decisao<- ‘reprovou’

decisao}

Depois copio estas linhas de comando e executo-as no R. Depois eu posso usar essa para classificar se os alunos passaram ou reprovaram. Na sintaxe da função, antes de escrever o comando de saída (i.e., decisao}) é obrigatório mudar de linha.




A função começa sempre pelo objecto que a vai conter, o sinal de atribuição e o comando function seguido do nome das variáveis dentro de parênteses rectos. Depois, abrem-se chavetas que apenas se fecham quando escrevermos o comando a dar o resultado (que tem que ser na última linha). Pode ser necessário abrir e fechar chavetas dentro da função.

A execução condicionada usa o comando if(condição) Caso sim else Caso não.



Ex.3.11. i) Escreva uma função que tem como variáveis o capital inicial, a taxa de juro e o prazo e retorna o capital final (capitalização composta). ii) Determine o capital final se aplicados 1000€ à taxa de juro anual de 5% durante 30 anos. iii) Experimente usar a função para determinar qual o capital final para três situações diferentes (a taxa de juro ser 4%, 5% ou 6%). iv) acrescente uma condição de forma que, se o capital for maior que 50000€, a taxa de juro é maior em 0.5pp e acrescente na saída a taxa de juro. Experimente a função.

i) cc <-function(cap.ini, t.juro, prazo){

resultado<-cap.ini*(1+t.juro)^prazo

resultado}

ii) Executava o comando cc(1000, 0.05, 30) e resultava [1] 4321.942.

iii) cc(1000, c(0.04,0.05,0.06) ,30) e resultava [1] 3243.398 4321.942 5743.491.

iv) cc <-function(cap.ini, t.juro, prazo){

if(cap.ini < 50000) tx<- t.juro else tx<-t.juro+0.005

cap.final<-cap.ini*(1+tx)^prazo

resultado<-c(cap.ini, tx, prazo, cap.final)

names(resultado)<-c(“Cap.ini”, “Tx.juro”, “Prazo”, “Cap.final”)

resultado}


Ex.3.12. i) Escreva uma função que tem como variáveis o rendimento disponível do agregado familiar, se é “casado” ou “solteiro”, o capital pedido, a taxa de juro e o prazo. Resulta que o empréstimo é concedido se for casado e o esforço (prestação a dividir pelo rendimento) for menor ou igual a 30% ou se for solteiro e o esforço for menor ou igual a 35%. ii) Experimente a função para um rendimento de 1000€, “casado”, pedido de 50000€ à taxa de 5%/ano durante 50 anos

i) A prestação resolve
conc.credito <-function(rendimento, est.civil, capital, tx.juro, prazo){

tx.juro.mensal=(1+tx.juro)^(1/12)-1

encargo=capital*tx.juro.mensal/(1-(1+ tx.juro.mensal)^(-prazo*12))

esforço=encargo/rendimento

if(est.civil==”casado”)

{if(esforço<=0.3) decisao <-“Conceder” else decisao <- “Não conceder”}

else

{if(esforço<=0.35) decisao <-“conceder” else decisao <- “Não conceder”}

Resultado <- c(encargo, esforço, decisao)

names(Resultado) <- c(“Encargo mensal”, “Esforço”, “Decisão”)

Resultado}
ii) conc.credito(1000,"casado",50000,0.05,50)


Execução repetida – comando for( ). As funções que apresentei executam uma porção de computações sobre as variáveis de dimensão unitária. Por vezes mesmo estas funções processam informação quando substituímos as variáveis unitárias por vectores (ver o exemplo do exercício Ex.3.6. i). No entanto, na generalidade das vezes isso não acontece sendo necessário repetir os cálculos para cada um dos elementos. Para isso usamos for( ).
Ex.3.13. A taxa de juro futura é uma variável aleatória de distribuição normal com determinada média e d.p. i) Escreva uma função que, com o capital, a média da taxa de juro anual, o seu desvio padrão e o prazo em anos, determina a prestação mensal média e o seu desvio padrão (sorteando um vector com 10000 taxas de juro). ii) Experimente para 50000€, a 30 anos, taxa média de 5% e d.p. de 2 pontos percentuais (corrigido o + por – 5Jan).

i) prestacao <-function(capital, media, desv.padrao, prazo){

taxas<- rnorm(10000, mean=media, sd= desv.padrao)

prest<-0

for(i in 1:10000){

tx.juro.mensal<- (1+taxas[i])^(1/12)-1

prest[i] <-capital*tx.juro.mensal/(1-(1+ tx.juro.mensal)^(-prazo*12))

}

c(mean(prest),sd(prest))}
Também poderia tirar o for e usar apenas vectores (acrescentei 5Jan)

prestacao <-function(capital, media, desv.padrao, prazo){

taxas<- rnorm(10000, mean=media, sd= desv.padrao)

prest<-0

#tirava o ciclo for e usava a “reciclagem” dos vectores

tx.juro.mensal<- (1+taxas)^(1/12)-1

prest <-capital*tx.juro.mensal/(1-(1+ tx.juro.mensal)^(-prazo*12))

c(mean(prest),sd(prest))}
ii) prestacao(50000,0.05,0.02,30) e resulta [1] 267.57672 57.95934.
Nota. Como vão ser executados vários comandos dentro do ciclo for( ) é necessário usar chavetas (abrir no princípio do ciclo e fechar no fim). Usei indentamento dos comandos executados dentro do ciclo for( ) para tornar mais fácil a leitura dos comandos. Os objectos (variáveis, vectores, etc.) criados dentro da função são destruídos no fim da execução.
Ex.3.14. Faça uma função que implemente o exercício Ex.2.20 assumindo que as vendas, em média, iniciais são 50 unidades e crescem à taxa de 5% ao ano e aumentam 5% ao ano, que o risco das vendas, do preço, do custo fixo e do custo variável é relativo e a taxa segue distribuição normal e a variabilidade é 6%. ii) Realize uma simulação. iii) Estime o erro de cálculo.

VAL <- function(vendas,varia){

n<-10

capital<-500

preco.venda<-5

custo.var<-0.25

tx.desc<-0.1

custo.fixo<-25

custo.var<-3

amortiza<-0

VA<-0

capital <- capital*0.8^(0:9)

amortiza<-capital*0.2

for(i in 1:10000){

vendas.l<-vendas* rnorm(n, mean=1, sd=varia)

preco.l<- preco.venda * rnorm(n, mean=1, sd=varia)

custo.fixo.l<-custo.fixo* rnorm(n, mean=1, sd=varia)

custo.var.l<- custo.var* rnorm(n, mean=1, sd=varia)

cash.flow<-(vendas.l*(preco.l-custo.var.l)-custo.fixo.l)*0.75+amortiza*0.25

VA[i]<- sum(cash.flow*(1+ tx.desc)^(-(1:10))) – capital[1]

}

hist(VA)

resultado<- c(mean(VA), sd(VA))

names(resultado) <- c(“VA médio”, “Desv. Padrão VA”)

resultado}
ii) Para realizar uma simulação, primeiro criava um vector com as vendas executando vendas<-50*1.05^(0:9) (em média, aumentam 5% ao ano) e depois executava VAL(vendas,0.06), vindo o resultado:

Estes valores são idêntico a quando, no Excel, usamos a distribuição uniforme com amplitude 10% (resultou a média 22.5 e o desvio padrão 32.6). Isto acontece porque o desvio padrão da distribuição uniforme em [–1, 1] é 0.577350. O comando hist(VA) faz com que também apareça um histograma de frequências dos 10000 Valores Actuais Líquidos calculados (i.e., da variável VA):



iii) Se realizarmos outra simulação, os resultados serão ligeiramente diferentes o que traduz o permite avaliar “erro do método de Monte Carlo”. Por exemplo, realizando 10 simulações:

res.med<-0

res.d.p<-0

for (i in 1:10){

r<- VAL(vendas,0.06)

res.med[i]<-r[1]

res.d.p[i]<-r[2]}

res.med

[1] 22.52484 22.80492 23.30868 23.25012 22.73774 22.85894 22.51734

[8] 22.23785 23.08483 22.30041

res.d.p

[1] 32.98340 32.99688 33.14808 33.44520 33.16775 33.15001 33.03617

[8] 33.32537 32.74045 32.94507

E depois, calculava o erro absoluto (medido pelo desvio padrão destes 10 valores) e o relativo (d.p. a dividir pelo valor médio do resultado) do resultado médio e do desvio padrão:


c(sd(res.med), sd(res.med)/mean(res.med))

[1] 0.2614978 0.01157774

c( sd(res.d.p), sd(res.d.p)/mean(res.d.p))

[1] 0.3665184 0.01109789

O erro de cálculo andará próximo de 1.1%. Se o erro fosse demasiado grande, para o diminuir, aumentávamos o número de réplicas (e.g., de 10000 para 20000) ou repetíamos (e.g., 100 vezes com um ciclo) a simulação com as 10000 réplicas e achávamos a média (neste caso, o erro “das médias” das 100 simulações seria 100 = 10 vezes menor que o erro de cada simulação individual).



Bibliografia


Brandão, Elísio, 2002, Finanças, Porto Editora, Porto.

Cadilhe, Miguel J. R. e Carlos A. R. Lago, 1994, Matemática Financeira Aplicada, Edições Asa, Porto.

Chaves, Cristina, Elisabete Maciel, Paulo Guimarães e José Carlos Ribeiro, 2000, Instrumentos Estatísticos de Apoio à Economia, McGraw-Hill, Lisboa.

Kohn, Meir, 1994, Financial Institutions and Markets, McGraw-Hill International: NY

Levasseur, Michel e Aimable Quintart, 1998, Finance, Economica, Paris.

Murteira, Bento, Carlos S. Ribeiro, João A. Silva e Carlos Pimenta, 2001, Introdução à Estatística, McGraw-Hill, Lisboa.

Murteira, Bento, 1993, Análise Exploratória de Dados, McGraw-Hill, Lisboa.



Venables, W. N.; D. M. Smith & R Development Core Team, 2008, An Introduction to R, PDF disponível em r-project, http://cran.r-project.org/doc/manuals/R-intro.pdf




1   ...   24   25   26   27   28   29   30   31   32


©livred.info 2017
enviar mensagem

    Página principal