O objetivo desse trabalho é aplicar os conceitos obtidos nas aulas de práticas em seguros. Desta forma, deve-se escolher dois ativos de uma série histórica de cinco anos, extrair o retorno diário e realizar a análise estatística dos dados. Primeiramente é realizada a análise dos outliers, verificação de liquidez, assimetria, curtose, teste de normalidade e correlação entra as duas séries. Na segunda parte será calculado o valor em risco (VaR) anual da série de retornos e a aplicação do teste de Kupiec para verificação da representação do VaR para mensurar perdas na carteira.

O VaR (VaR, Value at Risk – Valor do risco) é um método de mensuração de risco muito utilizado no mercado financeiro, pois mede o pior cenário de perda esperada associada a um investimento, a partir de um horizonte temporal e um determinado nível de confiança. Neste trabalho, o VaR o será calculado anual e diário com nível de significância de 1 %. Os modelos de VaR abordados serão: VaR normal com média zero, VaR histórico, VaR normal e VaR do EWMA (exponentially weighted moving average). As metodologias diferentes para VaR contribuem para o melhor ajuste da realidade de perdas das intuições financeiras, para validar a adequação o backtesting será aplicado.

Ativos

1. CPFL Energia

A Companhia Paulista de Força e Energia é uma distribuidora de energia no Brasil localizada no estado de São Paulo, fundada em 1912. Inicialmente era uma empresa estatal até novembro de 1997, quando foi privatizada e repassada para o Grupo Votorantim, Bradesco e Camargo Correa, além de fundos de pensão, como a Previ. A empresa possui oito usinas hidrelétricas, trinta e três pequenas centrais hidrelétricas e uma termelétrica, gerando um total de 1.672MW atendendo estados como São Paulo e Rio Grande do Sul. A CPFL Energia tem participação na bolsa de valores oficial do Brasil (B3), sigla CPFE3, e na bolsa de valores de Nova Iorque (NYSE), com sigla CPL.

Cotação

df_cpfl %>% 
DT::datatable()
p <- ggplot2::ggplot(df_cpfl) +
  geom_line(aes(DATA,FECHAMENTO_CPFL),color='blue') +
  labs(x = 'Data', y= 'Preço R$',title='Cotação',subtitle = 'CPFL') 
plotly::ggplotly(p)

2. GOL Linhas Aéreas Inteligentes

A GOL é a maior companhia área brasileira, em número de passageiros, tendo 36% de participação no mercado em 17 anos de fundação. Em 2016 para evitar falência foi vendida 10% de suas ações para a Delta Air Lines. Atualmente com frota de 119 aeronaves para 62 destinos e lucro em 2016 de 1,1 bilhões de reais.

Cotação

df_gol %>% 
DT::datatable()
p <- ggplot2::ggplot(df_gol) +
  geom_line(aes(DATA,FECHAMENTO_GOL),color='orange') +
  labs(x = 'Data', y= 'Preço R$',title='Cotação',subtitle = 'GOL') 

plotly::ggplotly(p)

Retorno

A utilização na série de retorno, ao invés da série de preço, são segundo Campbell, Lo, and MacKinlay (1997) : para os investidores médios, o retorno de um ativo é completo e livre de escala, resumindo a oportunidade de investimento ;as séries de retornos são mais fáceis de lidar do que as séries de preço porque possuem propriedades estatísticas mais atrativas. Podemos destacar como propriedade que a série de retorno é estacionária, possuem a memória longa e persistência dos dados e o movimento nas volatilidades.

Seja \(P_t\) o preço de um ativo no tempo \(t\), o retorno aritmético (retorno simples) dado para a data de \(t-1\) é dado por: \[ { R }_{ t }=\frac { { P }_{ t } }{ { P }_{ t-1 } } -1 . \] E o retorno logarítmo assume a forma:

\[ { r }_{ t } =\ln {(\frac { { P }_{ t } }{ { P }_{ t-1 }})}. \]

1. CPFL Energia

retorno_cpfl <- diff(log(df$FECHAMENTO_CPFL), lag=1)
l_cpfl <- ggplot(retorno_cpfl) + 
  geom_line(aes(x = DATA, y = RETORNO_CPFL),color='black') +
  ggtitle("Retorno CPFL desde 2013")

plotly::ggplotly(l_cpfl)
d_cpfl <- ggplot(retorno_cpfl) + 
  geom_density(aes(x = RETORNO_CPFL),color='black') +
  ggtitle("Dist. Retorno CPFL desde 2013")

plotly::ggplotly(d_cpfl)
h_cpfl <- retorno_cpfl %>% 
  ggplot(aes(x = RETORNO_CPFL)) +
  geom_histogram(alpha = 0.25, binwidth = .01) +
  ggtitle("Retorno CPFL desde 2013")

h_cpfl

2. GOL Linhas Aéreas Inteligentes

retorno_gol <- diff(log(df$FECHAMENTO_GOL), lag=1) 
l_cpfl <- ggplot(retorno_gol) + 
  geom_line(aes(x = DATA, y = RETORNO_GOL),color='black') +
  ggtitle("Retorno Anual GOL desde 2013")

plotly::ggplotly(l_cpfl)
d_gol <- ggplot(retorno_gol) + 
  geom_density(aes(x = RETORNO_GOL),color='orange') +
  ggtitle("Dist. Retorno GOL desde 2013")

plotly::ggplotly(d_gol)
h_gol <- retorno_gol %>% 
  ggplot(aes(x = RETORNO_GOL)) +
  geom_histogram(alpha = 0.25, binwidth = .01) +
  ggtitle("Retorno GOL desde 2013")

h_gol

3. Carteira

Considerando o peso de 50% para cada ação da carteira, temos que o retorno da carteira e a ponderação dos peso de cada ativo (\(i= 1, ... , n\)) na carteria (\(\omega_{i}\)) é dado por: \[ Retorno_{portfolio} = \omega_{1}Retorno_{1} + \omega_{2}Retorno_{2}. \]

w <- c(0.5,0.5)
w_1 <- w[1]
w_2 <- w[2]

asset1 <- retorno_cpfl[,2]
asset2 <- retorno_gol[,2]

portfolio_returns <-   
  (w_1 * asset1) + 
  (w_2 * asset2)

names(portfolio_returns) <- "RETORNO"
l_portfolio <- ggplot(portfolio_returns) + 
  geom_line(aes(x = DATA, y = RETORNO),color='blue') +
  ggtitle("Retorno desde 2013")

plotly::ggplotly(l_portfolio)
d_portfolio <- ggplot(portfolio_returns) + 
  geom_density(aes(x = RETORNO),color='blue') +
  ggtitle("Dist. Retorno desde 2013")

plotly::ggplotly(d_portfolio)
h_portfolio <- portfolio_returns %>% 
  ggplot(aes(x = RETORNO)) +
  geom_histogram(alpha = 0.25, binwidth = .01) +
  ggtitle("Retorno desde 2013")

h_portfolio

Analise de Dados

1. Outliers

Os retornos outliers de mínimo (retornos negativos) estão concentradas no ano de 2016, onde o Brasil enfrentava uma das piores crises da história com o recuo do produto interno bruto (PIB) em 3,6%. Além do desemprego, que representava mais de 14 milhões em 2017, que contribuiu para a mudança de habito da população brasileira. Observa-se que esse cenário impactou mais o ativo das linhas áreas Gol. Após a crise, as ações tanto da CPFL em 30/11/2017 apresentaram a pior perda do período, com um retorno negativo de 18,8% devido a uma oferta pública de aquisição da chinesa State Grid. Apesar do maior retorno das ações da GOL, na visualização do boxplot os ativos da GOL são mais voláteis que CPFL, elevando assim a variação da carteira.

CPFL

summary(retorno_cpfl$RETORNO_CPFL)
##       Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
## -0.1863296 -0.0070643  0.0000000  0.0003317  0.0076142  0.0853016

GOL

summary(retorno_gol$RETORNO_GOL)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -0.224440 -0.023592 -0.002844  0.000444  0.021819  0.407641

Carteira

summary(portfolio_returns$RETORNO)
##       Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
## -1.142e-01 -1.357e-02 -8.027e-05  3.879e-04  1.406e-02  2.125e-01
df_gol <- retorno_gol %>% 
  mutate(ACAO = 'GOL') %>% 
  select(DATA,RETORNO = RETORNO_GOL,ACAO)

df_cpfl <- retorno_cpfl %>% 
  mutate(ACAO = 'CPFL') %>% 
  select(DATA,RETORNO = RETORNO_CPFL,ACAO)
  
df_carteira <- portfolio_returns %>% 
  mutate(ACAO = 'CARTEIRA') %>% 
  select(DATA,RETORNO = RETORNO,ACAO)

df_diferente <- rbind(df_gol,df_cpfl,df_carteira)

bp <- ggplot(data = df_diferente, aes(x = ACAO, y = RETORNO,fill = ACAO)) +
  geom_boxplot()

plotly::ggplotly(bp)

2.Liquidez

Em relação a liquidez, ambos os ativos possuem uma série de preços comparáveis gerando assim uma liquidez em ambos os papeis apesar da alta volatilidade da Gol.

3.Assimetria

A assimetria mede, em estatística, a simetria da distribuição de probabilidade de uma determinada distribuição real da variável aleatória. Assim, o valor da assimetria pode ser positivo (esquerda), negativo(direita) ou indefinido. A fórmula da assimetria é dada por:

\[ \hat{\gamma} = \frac{1}{(T-1)}\sum\frac{(x_{i}-\hat{\mu)^{3}}}{\sigma^{3}}. \]

Onde \(n\) é o número de observações é \(x_{i}\) é a observação no instante \(i\), \(\mu\) a média e \(\sigma\) o desvio-padrão.

Desta forma na série analisada, a assimetria da Cpfl é negativa por outro lado o a assimetria Gol é positiva, desta forma a assimetria resultante na carteira é positiva. Se comparada a normal, com assimetria igual a zero, tanto a carteira quanto os ativos individuas possuem uma leve assimetria.

CPFL

assimetria_CPFL <- skewness(retorno_cpfl$RETORNO_CPFL)
assimetria_CPFL
## [1] -0.7723908

GOL

assimetria_GOL <- skewness(retorno_gol$RETORNO_GOL)
assimetria_GOL
## [1] 1.17609

CARTEIRA

assimetria_CARTEIRA <- skewness(portfolio_returns$RETORNO)
assimetria_CARTEIRA
## [1] 0.7513172

4.Curtose

CPFL

A curtose mede, em estatística, o comportamento do “achatamento” distribuição de probabilidade de uma determinada distribuição real da variável aleatória. O valor referência da curtose é 3, que é o valor da distribuição normal. A fórmula da curtose é dada por:

\[ \hat{\delta} = \frac{1}{(n-1)}\sum\frac{(x_{i}-\hat{\mu)^{4}}}{\sigma^{4}}. \]

Onde \(n\) é o número de observações é \(x_{i}\) é a observação no instante \(i\), \(\mu\) a média e \(\sigma\) o desvio-padrão. Todas as séries possuem distribuição leptocúrtica.

curtose_CPFL <- kurtosis(retorno_cpfl$RETORNO_CPFL)
curtose_CPFL
## [1] 13.04983

GOL

curtose_GOL <- kurtosis(retorno_gol$RETORNO_GOL)
curtose_GOL
## [1] 13.62494

CARTEIRA

curtose_CARTEIRA <- kurtosis(portfolio_returns$RETORNO)
curtose_CARTEIRA
## [1] 10.11531

5.Correlação

A correlação entre os ativos é postiva e baixa

cor(x=retorno_cpfl[,2],y=retorno_gol[,2])
##              RETORNO_GOL
## RETORNO_CPFL   0.2281535

6.Normalidade

Neste trabalho para verificar a normalidade da série serão utilizados os testes de Jacque Bera e Shapiro Wilk e o Q-Q plot será utilizado na para a comparação da distribuição dos retornos observados e a da distribuição normal.

O teste Jacque Bera é um teste godness-of-fit que verifica se a curtose e assimetria da distribuição real se assemelha da distribuição normal. O teste é dado por:

\[ JB = \frac{n-k+1}{6}(\gamma^{2}+ \frac{(\delta-3)^{2}}{4 }. \]

Onde \(n\) é o número de observações é o numero de regressores \(\gamma\) a assimetria e \(\delta\) a curtose.

A estatística teste usada é a distribuição de Qui-quadrado com dois graus de liberdades. A hipótese nula é que a assimetria é zero e o curtose 3 (distribuição normal).

O teste de The Shapiro–Wilk tem a hipótese nula que a amostra de \(x_{1},...,x_{n}\) são provenientes população de distribuição normal.

\[ W=\frac{(\sum_{i=1}^{n}a_{i}x_{(i)})^{2}}{\sum_{i=1}^{n}(x_{i}-\bar{x})^{2}}. \]

Onde é \(x_{i}\) é a observação no instante \(i\),\(\bar{x}\) é a média da amostra, e \(a_{i}\) uma constante.

O Q-Q plot é a comparação do quantil de duas distribuições e quanto melhor o ajuste, os pontos do Q-Q plot pertencerá a reta onde \(x=y\). Neste caso será comparada a distribuição dos retornos e uma distribuição normal referente a esse retorno.

Em todos os testes realizados os retornos (cpfl, gol e carteira) não se aproximam a uma distribuição normal.

CPFL

library(tseries)

ts_cpfl <- as.ts(retorno_cpfl[,2])

jarque.bera.test(ts_cpfl)
## 
##  Jarque Bera Test
## 
## data:  ts_cpfl
## X-squared = 5341.6, df = 2, p-value < 2.2e-16
hist(ts_cpfl,freq=F,main = "Histograma CPFL",ylab= 'densidade',xlab = 'retorno')

d = seq(range(ts_cpfl)[1]-3*sd(ts_cpfl),range(ts_cpfl)[2]+3*sd(ts_cpfl),0.001)

lines(d,dnorm(d,0,sd(ts_cpfl)))

#grafico de probabilidades normais
qqnorm(ts_cpfl)
qqline(ts_cpfl)

#teste de normalidade de Shapiro-Wilk

shapiro.test(ts_cpfl)  
## 
##  Shapiro-Wilk normality test
## 
## data:  ts_cpfl
## W = 0.9158, p-value < 2.2e-16

GOL

ts_gol <- as.ts(retorno_gol[,2])

jarque.bera.test(ts_gol)
## 
##  Jarque Bera Test
## 
## data:  ts_gol
## X-squared = 6118.5, df = 2, p-value < 2.2e-16
hist(ts_gol,freq=F,main = "Histograma Gol",ylab= 'densidade',xlab = 'retorno')

d = seq(range(ts_gol)[1]-3*sd(ts_gol),range(ts_gol)[2]+3*sd(ts_gol),0.001)

lines(d,dnorm(d,0,sd(ts_gol)))

#grafico de probabilidades normais
qqnorm(ts_gol)
qqline(ts_gol)

#teste de normalidade de Shapiro-Wilk

shapiro.test(ts_gol)  
## 
##  Shapiro-Wilk normality test
## 
## data:  ts_gol
## W = 0.90654, p-value < 2.2e-16

Carteira

ts_carteira <- as.ts(portfolio_returns[,2])

jarque.bera.test(ts_carteira)
## 
##  Jarque Bera Test
## 
## data:  ts_carteira
## X-squared = 74.558, df = 2, p-value < 2.2e-16
hist(ts_carteira,freq=F,main = "Histograma Carteira",ylab= 'densidade',xlab = 'retorno')
d = seq(range(ts_carteira)[1]-3*sd(ts_carteira),range(ts_carteira)[2]+3*sd(ts_carteira),0.001)
lines(d,dnorm(d,0,sd(ts_carteira)))

#grafico de probabilidades normais
  qqnorm(ts_carteira)
  qqline(ts_carteira)

  #teste de normalidade de Shapiro-Wilk
  
  shapiro.test(ts_carteira)  
## 
##  Shapiro-Wilk normality test
## 
## data:  ts_carteira
## W = 0.95478, p-value < 2.2e-16

Analise de Risco

Value At Risk (VaR)

O VaR é uma medida de risco, que mede as perdas de uma determinada distribuição de um ativo atraves de um determinado nível de significância (\(\alpha\)). Desta forma, utiliza-se metricas estatisticas para mensurar as perdas. O VaR pode ser classificado em paramétrico (VaR Normal, EWMA, etc) e não paramétrico (simulação histórica, Monte Carlo, etc). Neste trabalho para o cálculo do Var será cálculado diareamente e anualmente; o intervalo de confiança será de \(99%\) (\(\alpha = 0,01\))

1. Histórico

O VaR histórico é dado por: \[VaR_{\alpha} =F_{Y}^{-1}(1-\alpha ).\] Onde \(\alpha\) é o nível de signficancia e \(F_{Y}^{-1}\) a inversa da distribuição. Assim o VaR é o \(\alpha\) quantil da distribuição.

CPFL
total_vol <- nrow(retorno_cpfl) - 251  

vol_cpfl <- c()
var_historico_cpfl <- c()
media_vol_cpfl <- c()
for (i in 1:total_vol) {
  fim_retornos <- i + 251
  media_vol_cpfl[i] <- mean(retorno_cpfl$RETORNO_CPFL[i:fim_retornos])
  vol_cpfl[i] <- sd(retorno_cpfl$RETORNO_CPFL[i:fim_retornos])
  var_historico_cpfl[i] <- quantile(retorno_cpfl$RETORNO_CPFL[i:fim_retornos],0.01)
  
}



vol_cpfl <- cbind.data.frame(DATA = retorno_gol$DATA[252: nrow(retorno_gol)],vol_cpfl,var_historico_cpfl,media_vol_cpfl)





vol_cpfl %<>% mutate(VAR_NORMAL_MEDIA_ZERO =  vol_cpfl * qnorm(0.01, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE),
                   VAR_NORMAL_MEDIA =  media_vol_cpfl  - vol_cpfl * qnorm(0.99, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE),
                   VAR_HISTORICO_ANUAL = var_historico_cpfl * sqrt(252),
                   VAR_NORMAL_MEDIA_ZERO_ANUAL = VAR_NORMAL_MEDIA_ZERO * sqrt(252),
                   VAR_NORMAL_MEDIA_ANUAL =   VAR_NORMAL_MEDIA * sqrt(252))

vol_cpfl %<>% left_join(retorno_cpfl, by="DATA")
var_anual <- ggplot(data = vol_cpfl) +
  geom_line(aes(y= - VAR_HISTORICO_ANUAL, x =DATA)) +
  labs(title = "VaR Historico Anual CPFL",x = 'Data', y= 'Retorno') 
ggplotly(var_anual)
var_diario <- ggplot(data = vol_cpfl) +
  geom_line(aes(y= - var_historico_cpfl, x =DATA)) +
  labs(title = "VaR Historico Diário CPFL",x = 'Data', y= 'Retorno')
ggplotly(var_diario)
GOL
total_vol <- nrow(retorno_gol) - 251  

vol_gol <- c()
var_historico_gol <- c()
media_vol_gol <- c()
for (i in 1:total_vol) {
  fim_retornos <- i + 251
  media_vol_gol[i] <- mean(retorno_gol$RETORNO_GOL[i:fim_retornos])
  vol_gol[i] <- sd(retorno_gol$RETORNO_GOL[i:fim_retornos])
  var_historico_gol[i] <- quantile(retorno_gol$RETORNO_GOL[i:fim_retornos],0.01)
  
}



vol_gol <- cbind.data.frame(DATA = retorno_gol$DATA[252: nrow(retorno_gol)],vol_gol,var_historico_gol,media_vol_gol)





vol_gol %<>% mutate(VAR_NORMAL_MEDIA_ZERO =  vol_gol * qnorm(0.01, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE),
                   VAR_NORMAL_MEDIA =  media_vol_gol  - vol_gol * qnorm(0.99, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE),
                   VAR_HISTORICO_ANUAL = var_historico_gol * sqrt(252),
                   VAR_NORMAL_MEDIA_ZERO_ANUAL = VAR_NORMAL_MEDIA_ZERO * sqrt(252),
                   VAR_NORMAL_MEDIA_ANUAL =   VAR_NORMAL_MEDIA * sqrt(252))

vol_gol %<>% left_join(retorno_gol, by="DATA")
var_anual <- ggplot(data = vol_gol) +
  geom_line(aes(y= -VAR_HISTORICO_ANUAL, x =DATA)) +
  labs(title = "VaR Historico Anual GOL",x = 'Data', y= 'Retorno') 
ggplotly(var_anual)
var_diario <- ggplot(data = vol_gol) +
  geom_line(aes(y= - var_historico_gol, x =DATA)) +
  labs(title = "VaR Historico Diário GOL",x = 'Data', y= 'Retorno')
ggplotly(var_diario)
Carteira
total_vol <- nrow(portfolio_returns) - 251  

vol_port <- c()
var_historico_port <- c()
media_vol_port <- c()
for (i in 1:total_vol) {
  fim_retornos <- i + 251
  media_vol_port[i] <- mean(portfolio_returns$RETORNO[i:fim_retornos])
  vol_port[i] <- sd(portfolio_returns$RETORNO[i:fim_retornos])
  var_historico_port[i] <- quantile(portfolio_returns$RETORNO[i:fim_retornos],0.01)
  
}



vol_port <- cbind.data.frame(DATA = portfolio_returns$DATA[252: nrow(portfolio_returns)],vol_port,var_historico_port,media_vol_port)





vol_port %<>% mutate(VAR_NORMAL_MEDIA_ZERO =  vol_port * qnorm(0.01, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE),
                   VAR_NORMAL_MEDIA =  media_vol_port  - vol_port * qnorm(0.99, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE),
                   VAR_HISTORICO_ANUAL = var_historico_port * sqrt(252),
                   VAR_NORMAL_MEDIA_ZERO_ANUAL = VAR_NORMAL_MEDIA_ZERO * sqrt(252),
                   VAR_NORMAL_MEDIA_ANUAL =   VAR_NORMAL_MEDIA * sqrt(252))

vol_port %<>% left_join(portfolio_returns, by="DATA")
var_anual <- ggplot(data = vol_port) +
  geom_line(aes(y= -VAR_HISTORICO_ANUAL, x =DATA)) +
  labs(title = "VaR Historico Anual Carteira",x = 'Data', y= 'Retorno') 
ggplotly(var_anual)
var_diario <- ggplot(data = vol_port) +
  geom_line(aes(y= -var_historico_port, x =DATA)) +
  labs(title = "VaR Historico Diário Carteira",x = 'Data', y= 'Retorno')
ggplotly(var_diario)

3. Normal

O VaR Normal pode ser dividido em média zero, ou seja é considero o \(\mu= 0\) e com média, onde deve-se calcular a média da distribuição.

3.1 Média Zero

O VaR histórico é dado por:

\[VaR^{zero}_{\alpha} =Z_{\alpha}*{\sigma}.\]

Onde \(\alpha\) é o nível de signficancia e \(Z_{\alpha}\) o valor da tabela normal para a \(\alpha\) e $ $ a volatilidade.

CPFL
var_anual <- ggplot(data = vol_cpfl) +
  geom_line(aes(y=-VAR_NORMAL_MEDIA_ZERO_ANUAL, x =DATA)) +
  labs(title = "VaR Normal Media Zero Anual CPFL",x = 'Data', y= 'Retorno') 
ggplotly(var_anual)
var_diario <- ggplot(data = vol_port) +
  geom_line(aes(y=-VAR_NORMAL_MEDIA_ZERO, x =DATA)) +
  labs(title = "VaR Normal Media Zero  Diário CPFL",x = 'Data', y= 'Retorno')
ggplotly(var_diario)
GOL
var_anual <- ggplot(data = vol_gol) +
  geom_line(aes(y=-VAR_NORMAL_MEDIA_ZERO_ANUAL, x =DATA)) +
  labs(title = "VaR Normal Media Zero  Anual GOL",x = 'Data', y= 'Retorno') 
ggplotly(var_anual)
var_diario <- ggplot(data = vol_gol) +
  geom_line(aes(y=-VAR_NORMAL_MEDIA_ZERO, x =DATA)) +
  labs(title = "VaR Normal Media Zero  Diário GOL",x = 'Data', y= 'Retorno')
ggplotly(var_diario)
Carteira
var_anual <- ggplot(data = vol_port) +
  geom_line(aes(y=-VAR_NORMAL_MEDIA_ZERO_ANUAL, x =DATA)) +
  labs(title = "VaR Normal Media Zera Anual  Carteira",x = 'Data', y= 'Retorno') 
ggplotly(var_anual)
var_diario <- ggplot(data = vol_port) +
  geom_line(aes(y=-VAR_NORMAL_MEDIA_ZERO, x =DATA)) +
  labs(title = "VaR Normal Media Zera Diário Carteira",x = 'Data', y= 'Retorno')
ggplotly(var_diario)

3.2 Com Média

O VaR histórico é dado por:

\[VaR_{\alpha} =\mu - Z_{\alpha}*{\sigma}.\]

Onde \(\alpha\) é o nível de signficancia e \(Z_{\alpha}\) o valor da tabela normal para a \(\alpha\), \(\sigma\) a volatilidade e \(\mu\) a média.

CPFL
var_anual <- ggplot(data = vol_cpfl) +
  geom_line(aes(y=-VAR_NORMAL_MEDIA_ANUAL, x =DATA)) +
  labs(title = "VaR Normal Anual CPFL",x = 'Data', y= 'Retorno') 
ggplotly(var_anual)
var_diario <- ggplot(data = vol_cpfl) +
  geom_line(aes(y=-VAR_NORMAL_MEDIA, x =DATA)) +
  labs(title = "VaR Normal Diário CPFL",x = 'Data', y= 'Retorno')
ggplotly(var_diario)
GOL
var_anual <- ggplot(data = vol_gol) +
  geom_line(aes(y=-VAR_NORMAL_MEDIA_ANUAL, x =DATA)) +
  labs(title = "VaR Normal Anual GOL",x = 'Data', y= 'Retorno') 
ggplotly(var_anual)
var_diario <- ggplot(data = vol_gol) +
  geom_line(aes(y=-VAR_NORMAL_MEDIA, x =DATA)) +
  labs(title = "VaR Normal Diário GOL",x = 'Data', y= 'Retorno')
ggplotly(var_diario)
Carteira
var_anual <- ggplot(data = vol_port) +
  geom_line(aes(y=-VAR_NORMAL_MEDIA_ANUAL, x =DATA)) +
  labs(title = "VaR Normal Anual Carteira",x = 'Data', y= 'Retorno') 
ggplotly(var_anual)
var_diario <- ggplot(data = vol_port) +
  geom_line(aes(y=-VAR_NORMAL_MEDIA, x =DATA)) +
  labs(title = "VaR Normal Diário Carteira",x = 'Data', y= 'Retorno')
ggplotly(var_diario)

2. EWMA

O EWMA (exponentially weighted moving average), estima a volatilidade dos retornos, adicionando um peso \(\lambda\) , valor mais utilizado é \(0,94\), nas observações recentes de retorno e volatidade passadas. Assim, temos que:

\[\sigma_{i,t}=(1-\lambda)r_{i,t-1} + \lambda\sigma_ {i,t-1}\] Onde \(0 \leq \lambda \leq 1\) ,\(r_{i,t-1}\) volatilidade dos retornos no instante \(t-1\) e \(r_{i,t-1}\) retornos no instante \(t-1\).

CPFL
lambda <- 0.94
rets <-retorno_cpfl$RETORNO_CPFL 
n <- length(rets)+1
sig.s <- rep(0, n)
for (i in 2:n) {
  sig.s[i] <- sig.s[i-1]*lambda + (rets[i-1]^2)*(1 - lambda)
}
vol_ewma_cpfl <- sqrt(tail(sig.s, n-1))

ewma_retorno_cpfl <- cbind.data.frame(retorno_cpfl,vol_ewma_cpfl)

ewma_retorno_cpfl %<>% mutate(VOL_EWMA_ANUAL = vol_ewma_cpfl * sqrt(252),
                  VAR_EWMA =  - sqrt(VOL_EWMA_ANUAL * qnorm(0.99)),
                  VAR_EWMA_DIA = - (vol_ewma_cpfl*qnorm(0.99)))


plot_ewma_anual <- ggplot(data =ewma_retorno_cpfl )+
  geom_line(aes(x = DATA, y = -VAR_EWMA,colour = "VaR")) + 
  scale_colour_manual("", breaks = c( "VaR"),
                      values = c( "VaR"="red")) +
   labs(title= 'CPFL  VAR EWMA ANUAL', xlab='DATA', ylab ='RETORNO') 


ggplotly(plot_ewma_anual)
plot_ewma <- ggplot(data =ewma_retorno_cpfl )+
  geom_line(aes(x = DATA, y = -VAR_EWMA_DIA,colour = "VaR")) + 
  scale_colour_manual("", breaks = c( "VaR"),
                      values = c( "VaR"="red")) +
   labs(title= 'CPFL VAR  EWMA DIARIO', xlab='DATA', ylab ='RETORNO') 


ggplotly(plot_ewma)
GOL
lambda <- 0.94
rets <-retorno_gol$RETORNO_GOL 
n <- length(rets)+1
sig.s <- rep(0, n)
for (i in 2:n) {
  sig.s[i] <- sig.s[i-1]*lambda + (rets[i-1]^2)*(1 - lambda)
}
vol_ewma_gol <- sqrt(tail(sig.s, n-1))

ewma_retorno_gol <- cbind.data.frame(retorno_gol,vol_ewma_gol)

ewma_retorno_gol %<>% mutate(VOL_EWMA_ANUAL = vol_ewma_gol * sqrt(252),
                  VAR_EWMA =  - sqrt(VOL_EWMA_ANUAL * qnorm(0.99)),
                  VAR_EWMA_DIA = - (vol_ewma_gol*qnorm(0.99)))


plot_ewma_anual <- ggplot(data =ewma_retorno_gol )+
  geom_line(aes(x = DATA, y = -VAR_EWMA,colour = "VaR")) + 
  scale_colour_manual("", breaks = c( "VaR"),
                      values = c( "VaR"="red")) +
   labs(title= 'GOL  VAR EWMA ANUAL', xlab='DATA', ylab ='RETORNO') 


ggplotly(plot_ewma_anual)
plot_ewma <- ggplot(data =ewma_retorno_gol )+
  geom_line(aes(x = DATA, y = -VAR_EWMA_DIA,colour = "VaR")) + 
  scale_colour_manual("", breaks = c( "VaR"),
                      values = c( "VaR"="red")) +
   labs(title= 'GOL VAR  EWMA DIARIO', xlab='DATA', ylab ='RETORNO') 


ggplotly(plot_ewma)
Carteira
lambda <- 0.94
rets <-portfolio_returns$RETORNO 
n <- length(rets)+1
sig.s <- rep(0, n)
for (i in 2:n) {
  sig.s[i] <- sig.s[i-1]*lambda + (rets[i-1]^2)*(1 - lambda)
}
vol_ewma_port <- sqrt(tail(sig.s, n-1))

ewma_retorno_port <- cbind.data.frame(portfolio_returns,vol_ewma_port)

ewma_retorno_port %<>% mutate(VOL_EWMA_ANUAL = vol_ewma_port * sqrt(252),
                  VAR_EWMA =  - sqrt(VOL_EWMA_ANUAL * qnorm(0.99)),
                  VAR_EWMA_DIA = - (vol_ewma_port*qnorm(0.99)))


plot_ewma_anual <- ggplot(data =ewma_retorno_port )+
  geom_line(aes(x = DATA, y = -VAR_EWMA,colour = "VaR")) + 
  scale_colour_manual("", breaks = c( "VaR"),
                      values = c( "VaR"="red")) +
   labs(title= 'Carteira  VAR EWMA ANUAL', xlab='DATA', ylab ='RETORNO') 


ggplotly(plot_ewma_anual)
plot_ewma <- ggplot(data =ewma_retorno_port )+
  geom_line(aes(x = DATA, y = -VAR_EWMA_DIA,colour = "VaR")) + 
  scale_colour_manual("", breaks = c( "VaR"),
                      values = c( "VaR"="red")) +
   labs(title= 'Carteira VAR  EWMA DIARIO', xlab='DATA', ylab ='RETORNO') 


ggplotly(plot_ewma)

Backtesting

Os testes de ajuste do VaR são conhecidos como backtesting, seu objetivo é verificar se o valor encontrado do VaR mensura a perda ocorrida observada. O número de violações é uma maneira de aplicação do backtesting, comparado com os valores tabelados.

Kupiec

Em 1995 Kupiec desenvolveu regiões de confiança definidas pelos pontos de cauda da razão de log-verossimilhança que possui distribuição qui-quadrado com um grau de liberdade. Assim, verifica-se a quantidade de violação e compara com a quantidade definida na tabela (Kupiec 1995).

backtesting_cpfl <- vol_cpfl %>% 
  mutate(BACKTEST_HISTORICO = ifelse(RETORNO_CPFL < var_historico_cpfl ,1,0),
    BACKTEST_MEDIA_ZERO = ifelse(RETORNO_CPFL <VAR_NORMAL_MEDIA_ZERO ,1,0),
        BACKTEST_MEDIA = ifelse(RETORNO_CPFL <VAR_NORMAL_MEDIA ,1,0))

backtesting_cpfl_ewma <- ewma_retorno_cpfl %>% mutate(BACKTEST_EWMA =  ifelse(RETORNO_CPFL<VAR_EWMA_DIA ,1,0))


backtesting_gol <- vol_gol %>% 
  mutate(BACKTEST_HISTORICO = ifelse(RETORNO_GOL < var_historico_gol ,1,0),
    BACKTEST_MEDIA_ZERO = ifelse(RETORNO_GOL <VAR_NORMAL_MEDIA_ZERO ,1,0),
        BACKTEST_MEDIA = ifelse(RETORNO_GOL <VAR_NORMAL_MEDIA ,1,0))

backtesting_gol_ewma <- ewma_retorno_gol %>% mutate(BACKTEST_EWMA =  ifelse(RETORNO_GOL<VAR_EWMA_DIA ,1,0))



backtesting_port <- vol_port %>% 
  mutate(BACKTEST_HISTORICO = ifelse(RETORNO < var_historico_port ,1,0),
    BACKTEST_MEDIA_ZERO = ifelse(RETORNO <VAR_NORMAL_MEDIA_ZERO ,1,0),
        BACKTEST_MEDIA = ifelse(RETORNO <VAR_NORMAL_MEDIA ,1,0))

backtesting_port_ewma <- ewma_retorno_port %>% mutate(BACKTEST_EWMA =  ifelse(RETORNO<VAR_EWMA_DIA ,1,0))

Histórico

CPFL

plot_historico <- ggplot(data =vol_cpfl ) +
  geom_line(aes(x = DATA, y = RETORNO_CPFL,colour = "CPFL")) + 
  geom_line(aes(x = DATA, y = var_historico_cpfl,colour = "VaR")) + 
  scale_colour_manual("", breaks = c("CPFL", "VaR"),
                      values = c("CPFL"="blue", "VaR"="red")) +
  labs(title= 'CPFL VAR HISTORICO x RETORNO -  1%', xlab='DATA', ylab ='RETORNO') 

ggplotly(plot_historico)

O número de violação do VaR histórico para a série de retornos da ação CPFL é de : 10 . Desta forma, concluimos que o modelo do VaR está aderente dentro do intervalo de probabilidade de grandes perdas (Kupiec 1995) a um nível de confiança de 95%. Todavia, para níveis de confiança de 99% e 97,5% o VaR é conservador.

GOL

plot_historico <- ggplot(data =vol_gol ) +
  geom_line(aes(x = DATA, y = RETORNO_GOL,colour = "GOL")) + 
  geom_line(aes(x = DATA, y = var_historico_gol,colour = "VaR")) + 
  scale_colour_manual("", breaks = c("GOL", "VaR"),
                      values = c("GOL"="blue", "VaR"="red")) +
  labs(title= 'GOL VAR HISTORICO x RETORNO -  1%', xlab='DATA', ylab ='RETORNO') 

ggplotly(plot_historico)

O número de violação do VaR histórico para a série de retornos da ação GOL é de : 22 . Desta forma, concluimos que o modelo do VaR subrepresenta a probabilidade de grandes perdas (Kupiec 1995) a um nível de confiança de 99%. Todavia, para níveis de confiança de 97,5% e 95% o VaR é conservador.

Carteira

plot_historico <- ggplot(data =vol_port ) +
  geom_line(aes(x = DATA, y = RETORNO,colour = "CARTEIRA")) + 
  geom_line(aes(x = DATA, y = var_historico_port,colour = "VaR")) + 
  scale_colour_manual("", breaks = c("CARTEIRA", "VaR"),
                      values = c("CARTEIRA"="blue", "VaR"="red")) +
  labs(title= 'CARTEIRA VAR HISTORICO x RETORNO -  1%', xlab='DATA', ylab ='RETORNO') 

ggplotly(plot_historico)

O número de violação do VaR histórico para a série de retornos da carteira é de : 16 . Desta forma, concluimos que o modelo do VaR está aderente dentro do intervalo de probabilidade de grandes perdas (Kupiec 1995) a um nível de confiança de 99% e 97,5%. Todavia, para níveis de confiança de 95% o VaR é conservador.

Normal Média Zero

CPFL

plot_historico <- ggplot(data =vol_cpfl ) +
  geom_line(aes(x = DATA, y = RETORNO_CPFL,colour = "CPFL")) + 
  geom_line(aes(x = DATA, y = VAR_NORMAL_MEDIA_ZERO,colour = "VaR")) + 
  scale_colour_manual("", breaks = c("CPFL", "VaR"),
                      values = c("CPFL"="blue", "VaR"="red")) +
  labs(title= 'CPFL VaR Normal Média Zero x RETORNO -  1%', xlab='DATA', ylab ='RETORNO') 

ggplotly(plot_historico)

O número de violação do VaR média zero para a série de retornos da ação CPFL é de : 12 . Desta forma, concluimos que o modelo do VaR está aderente dentro do intervalo de probabilidade de grandes perdas (Kupiec 1995) a um nível de confiança de 99% . Todavia, para níveis de confiança de 95% e 90% o VaR é conservador.

GOL

plot_historico <- ggplot(data =vol_gol ) +
  geom_line(aes(x = DATA, y = RETORNO_GOL,colour = "GOL")) + 
  geom_line(aes(x = DATA, y = VAR_NORMAL_MEDIA_ZERO,colour = "VaR")) + 
  scale_colour_manual("", breaks = c("GOL", "VaR"),
                      values = c("GOL"="blue", "VaR"="red")) +
  labs(title= 'GOL VaR Normal Média Zero x RETORNO -  1%', xlab='DATA', ylab ='RETORNO') 

ggplotly(plot_historico)

O número de violação do VaR média zero para a série de retornos da ação GOL é de : 15 . Desta forma, concluimos que o modelo do VaR subrepresenta a probabilidade de grandes perdas (Kupiec 1995) a um nível de confiança de 99%. Para o nível de 97,5% ele é ajustado e para o nível de 95% é conservador.

Carteira

plot_historico <- ggplot(data =vol_port ) +
  geom_line(aes(x = DATA, y = RETORNO,colour = "CARTEIRA")) + 
  geom_line(aes(x = DATA, y = VAR_NORMAL_MEDIA_ZERO,colour = "VaR")) + 
  scale_colour_manual("", breaks = c("CARTEIRA", "VaR"),
                      values = c("CARTEIRA"="blue", "VaR"="red")) +
  labs(title= 'CARTEIRA VAR Normal Média Zero x RETORNO -  1%', xlab='DATA', ylab ='RETORNO') 

ggplotly(plot_historico)

O número de violação do VaR histórico para a série de retornos da carteira é de : 20 . Desta forma, concluimos que o modelo do VaR subrepresenta a probabilidade de grandes perdas (Kupiec 1995) a um nível de confiança de 99%. Para o nível de 97,5% ele é ajustado e para o nível de 95% é conservador.

Normal Média

CPFL

plot_historico <- ggplot(data =vol_cpfl ) +
  geom_line(aes(x = DATA, y = RETORNO_CPFL,colour = "CPFL")) + 
  geom_line(aes(x = DATA, y = VAR_NORMAL_MEDIA,colour = "VaR")) + 
  scale_colour_manual("", breaks = c("CPFL", "VaR"),
                      values = c("CPFL"="blue", "VaR"="red")) +
  labs(title= 'CPFL VaR Normal Média  x RETORNO -  1%', xlab='DATA', ylab ='RETORNO') 

ggplotly(plot_historico)

O número de violação do VaR histórico para a série de retornos da ação CPFL é de : 12 . Desta forma, concluimos que o modelo do VaR subrepresenta a probabilidade de grandes perdas (Kupiec 1995) a um nível de confiança de 99% e 97,5%. Todavia, para níveis de confiança de 95% o VaR é conservador.

GOL

plot_historico <- ggplot(data =vol_gol ) +
  geom_line(aes(x = DATA, y = RETORNO_GOL,colour = "GOL")) + 
  geom_line(aes(x = DATA, y = VAR_NORMAL_MEDIA,colour = "VaR")) + 
  scale_colour_manual("", breaks = c("GOL", "VaR"),
                      values = c("GOL"="blue", "VaR"="red")) +
  labs(title= 'GOL VaR Normal Média x RETORNO -  1%', xlab='DATA', ylab ='RETORNO') 

ggplotly(plot_historico)

O número de violação do VaR Normal Média para a série de retornos da ação GOL é de : 15 . Desta forma, concluimos que o modelo do VaR ajustado a série a probabilidade de grandes perdas (Kupiec 1995) a um nível de confiança de 99%. Todavia, para níveis de confiança de 97,5% e 95% o VaR é conservador.

Carteira

plot_historico <- ggplot(data =vol_port ) +
  geom_line(aes(x = DATA, y = RETORNO ,colour = "CARTEIRA"))  +
  geom_line(aes(x = DATA, y = VAR_NORMAL_MEDIA,colour = "VaR")) + 
  scale_colour_manual("", breaks = c("CARTEIRA", "VaR"),
                      values = c("CARTEIRA"="blue", "VaR"="red")) +
  labs(title= 'CARTEIRA VaR Normal Média x RETORNO -  1%', xlab='DATA', ylab ='RETORNO') 

ggplotly(plot_historico)

O número de violação do VaR histórico para a série de retornos da carteira é de : 20 . Desta forma, concluimos que o modelo do VaR subrepresenta a probabilidade de grandes perdas (Kupiec 1995) a um nível de confiança de 99% . Todavia, para o nivel de confiança de 97,5% ele representa melhor a perda, enquanto que em 95% é conservador.

EWMA

CPFL

plot_ewma <- ggplot(data =ewma_retorno_cpfl )+
  geom_line(aes(x = DATA, y = RETORNO_CPFL,colour = "CPFL")) +
  geom_line(aes(x = DATA, y = VAR_EWMA_DIA,colour = "VaR")) + 
  scale_colour_manual("", breaks = c("CPFL", "VaR"),
                      values = c("CPFL"='blue', "VaR"="red")) +
   labs(title= 'CPFL VAR  EWMA DIARIO', xlab='DATA', ylab ='RETORNO') 


ggplotly(plot_ewma)

O número de violação do VaR EWMA para a série de retornos da ação CPFL é de : 10 . Desta forma, concluimos que o modelo do VaR representa a probabilidade de grandes perdas (Kupiec 1995) a um nível de confiança de 99%. Todavia, para níveis de confiança de 97,5% e 95% o VaR é conservador.

GOL

plot_ewma <- ggplot(data =ewma_retorno_gol )+
  geom_line(aes(x = DATA, y = RETORNO_GOL,colour = "GOL")) +
  geom_line(aes(x = DATA, y = VAR_EWMA_DIA,colour = "VaR")) + 
  scale_colour_manual("", breaks = c("GOL", "VaR"),
                      values = c("GOL"='blue', "VaR"="red")) +
   labs(title= 'GOL VAR  EWMA DIARIO', xlab='DATA', ylab ='RETORNO') 


ggplotly(plot_ewma)

O número de violação do VaR EWMA para a série de retornos da ação GOL é de : 10. Desta forma, concluimos que o modelo do VaR representa a probabilidade de grandes perdas (Kupiec 1995) a um nível de confiança de 99%. Todavia, para niveis de confiança de 97,5% e 95% o VaR é conservador.

Carteira

plot_ewma <- ggplot(data =ewma_retorno_port )+
  geom_line(aes(x = DATA, y = RETORNO,colour = "CARTEIRA")) +
  geom_line(aes(x = DATA, y = VAR_EWMA_DIA,colour = "VaR")) + 
  scale_colour_manual("", breaks = c("CARTEIRA", "VaR"),
                      values = c("CARTEIRA"='blue', "VaR"="red")) +
   labs(title= 'CARTEIRA VAR  EWMA DIARIO', xlab='DATA', ylab ='RETORNO') 


ggplotly(plot_ewma)

O número de violação do VaR EWMA para a série de retornos da carteira é de : 10 . Desta forma, concluimos que o modelo do VaR representa a probabilidade de grandes perdas (Kupiec 1995) a um nível de confiança de 99%. Todavia, para niveis de confiança de 97,5% e 95% o VaR é conservador.

Conclusões

O trabalho teve o objetivo de analisar os métodos e resultados dos modelos de cálculo de risco de dois ativos e de uma carteira hipotética. Mostramos graficamente a comparação do histórico das perdas estimadas pelo VaR com os retornos observados na série, com o objetivo de avaliar se os modelos de VaR testados estão ajustados e qual deles possibilitam uma melhor estimativa para as perdas. O cálculo da validação dos modelos VaR normal média zero, VaR normal, VaR histórico e VaR EWMA foram realizados através dos testes Kupiec. No teste de Kupiec, o modelo EWMA foi o que apresentou melhor ajuste para a série da carteira, ativo CPFL e ativo GOL para todos os intervalos de confiança no VaR analisados 95%, 97,5% e 99%, conforme tabelas abaixo:

CPFL

GOL

Carteira

Assim, para a carteira fictítica montada o modelo EWMA foi o que mensurou melhor a perda, apesar da maneira mais complexa de estimar a volatilidade e a necessidade do conhecimento do parâmetro de decaimento \(\lambda\) (que pode ser estimado).