1 Time Series

Conjunto de observações ordenadas no tempo:
* Um possível trajetória de um processo aleatório
* Realização de um processo estocástico

Um TS pode ser contínua ou discreta. * Discreta: vendas diárias
* Contínua: Registro de venda de acordo com o instante que ocorre

Uma série é discreta quando se faz referencia ao tempo entre as observações e não à escala da variável. Tais séries contínuas podem ser discretizadas. Via de regra TS são apresentadas como eventos discretos equi-espaçados.

A principal característica de séries temporais é a existência de alguma forma de dependência entre dados observados em tempos diferentes. O que limita a utilização de modelos estatísticos convencionais desenvolvidos para dados i.i.d.. Estes modelos podem ser utilizados para entender quais são os componentes envolvidos na série para assim tentar estimar valores futuros.

1.1 Processo Estocástico

Do ponto de vista teórico, uma TS é a realização de um processo estocástico. Dado um espaço de probabilidade \((\Omega, A, P)\), um processo estocástico seráa coleçãos de variáveis aleatórias no espaço amostral \(\Omega\), indexadas por um conjunto \(T\), denotado como:

\[\{x(t, \omega), t\in T\ e\ \omega \in \Omega\}\] Note que, entre todas as possibilidades, apenas observamos uma realização de tal processo estocástico.

Uma análise se TS visa:
Observar o mecanismo gerador da TS
Fazer previsões futuras de série (corto e longo prazo)
Descrever o comportamento da TS:
Graficos, diagramas de fispersão e histpgramas, verificar tendências, ciclos e variabilidade sazonal.
Entender componentes constituintes:
Tendência: comportamento principal
Sazonalidade: padrão de repetiçõs por períodos diários, mensais, anuais, etc.

library(dplyr)
plot(AirPassengers)

ruído: diferença aleatória desacoplada de observações anteriores, da tandência e sazonalidade (média zero e comportamento estacionário - não correlacionado a x).

Algumas séries podem mudar sua tendenciaao longo do tempo, por exemplo deixando de ser linear para se tornar exponencial.

Simulação de um processo determinístico \(X_t = 1000 + 0.1t\)

n = 300
x = 1000+0.1*(1:n)
plot.ts(x)

Simulação de um processo de periodicidade 12 \(S_t = 20 sin((2\pi/12)t)\)

s = 20*sin(2*pi/12*(1:n))
plot.ts(s)

Somando termnos \(X_t + S_t\)

plot.ts(x+s)

Simulação de ruído branco $E_t N(0, 25) $

e = rnorm(n, 0.5)
plot.ts(e)

Somando termos \(X_t + S_t + E_t\)

z = x+s+e
plot.ts(z)

Decomposição

z = ts(z, start = 1990, frequency = 12)
plot(decompose(z))

Previsão

h        = 30
dec      = decompose(z)
trend    = dec$trend
sea      = dec$seasonal
e        = dec$random

tempo = 1:n
trend.lm = lm(trend~tempo)
trend.forec = trend.lm$coefficients[[1]] + trend.lm$coefficients[[2]]*((n+1):(n+h)) 
   c(trend, trend.forec) %>%ts(start=end(trend)+c(0,1), frequency = 12) %>%
   plot.ts()

Snave

library(forecast)
sazonal = snaive(sea, h= h)$mean

cbind(sea, sazonal) %>% plot.ts(plot.type = 's', col=c(1,2))

 previsao = trend.forec + sazonal
 cbind(z, previsao) %>% plot.ts(plot.type = 's', col=c(1,2))

Simulação de 100 pontos \(x_t = 5 + 0.35x_{t-1} + 0.6x_{t-6} + \epsilon_t\) com $ i.i.d.N(0,4) $

n = 100 
x = numeric(100)
x[1:6] = c(58.9,60.0,59.8,59.2,58.9,58.7)
for (i in 7:n) {
  x[i] = 5+0.35*x[i-1]+0.6*x[i-6]+rnorm(1,0,2)
}
x = ts(x, start = 2000, frequency = 6)
plot(x)

x.obs = window(x, end=time(x)[90])
x.teste =window(x, start=time(x)[91])
plot(x.obs)

plot(x.teste)

Bootstrap

n_sim = 200
x_matriz = matrix(NA, nrow = n, ncol = n_sim)

Observados

for (a in 1:n_sim) {
  x_matriz[1:90, a] = x.obs
}

Dados Simulados

for (b in 91:100) {
  x_matriz[b, ] = 5+0.35*x_matriz[b-1,]+0.6*x_matriz[b-6,]+rnorm(n_sim,0,2)
}
x_matriz = ts(x_matriz, start = 2000, frequency = 6)
plot(x_matriz, plot.type = 'single')

LI = LS = Pontual = numeric(10)
for (i in 1:10) {
  LI[i] = quantile(x_matriz[90+i, ], prob=0.025)
  LS[i] = quantile(x_matriz[90+i, ], prob=0.975)
  Pontual[i] = mean(x_matriz[90+i,])
}

prev_mat = cbind(LI, Pontual, LS)
colnames(prev_mat) = c("LI95", "Pontual", "LS95")
prev_mat = ts(prev_mat, start = time(x)[91], frequency = 6)
plot(x, ylim = c(55, 100))
points(prev_mat[, 1], col=3, type = 'l')
points(prev_mat[, 2], col=2, type = 'l')
points(prev_mat[, 3], col=3, type = 'l')

2 Decomposição

A decomposição de uma TS pode ser de forma aditiva ou multiplicativa

\[X_t = T_t + S_t + E_t \\ X_t = T_t * S_t * E_t \\\] Tal decomposição visa antes de tudo decompor a TS em componentes mais simples de serem modelados. para obter uma TS sem tendência ou sem sazonalidade basta subrimir o termo correspondente.

Sem Tendência \[Z_t = X_t -T_t \\ X_t = X_t / T_t \\\] Sem Sazonalidade \[T_t = X_t - S_t \\Y_t = X_t / S_t \\\]

plot(decompose(AirPassengers, type = "a"))

plot(decompose(AirPassengers, type = "m"))

2.1 Remoção de Tendência

A decomposição parte da remoção de tendência.

2.1.1 Linear

Como visto pode possuir tendência linear ou polinomial, se TS aditiva ou multiplicativa. Dessa forma a tendência pode ser removida a removendo essa componente de linearidade ou polinomial.

ts = AirPassengers
tempo = time(ts)
fit = lm(ts~tempo)
plot(ts)
lines(x = tempo, y=fit$fitted.values, type = 'l', col="blue")

2.1.2 Polinomial

ts = Nile
time = as.numeric(time(ts))
out2 = lm(ts~poly(time, 2))
out6 = lm(ts~poly(time, 6))
plot(ts)
lines(x = time, y=out2$fitted.values, type = 'l', col="blue")
lines(x = time, y=out6$fitted.values, type = 'b', pch=18, col="red", lty=2)
legend(1880, 600, legend=c("Polinômio de dois Termos", "Polinômio de seis Termos"),
       col=c("blue", "red"), lty=1:2, cex=0.8)

2.2 Filtros para Remoção de Tendência

A maneira mais corriqueira de remoção de tendência é por meio do uso de filtros de suavização.

2.2.1 Médias Móveis

Dentre eles um bastante comum é o filtro de médias móveis de valores do passado filter com sides = 1, que como será visto é um componente de modelos ARMA.

\[SMA_T = \frac{1}{q} \sum_{i = 0}^{q} X_{t-i}\] Quando maior o número de períodos da média móvel, mas suave será a linha de tendência.

ts = AirPassengers
SMA6 = stats::filter(ts, rep(1/6, 6), sides = 1)
SMA12 = stats::filter(ts, rep(1/12, 12), sides = 1)
time = as.numeric(time(ts))
plot(ts)
lines(x = time, y=SMA6, type = 'l', col="blue")
lines(x = time, y=SMA12, type = 'b', pch=18, col="red", lty=2)
legend(1950, 500, legend=c("Média Móvel de 6 períodos", "Média Móvel de 12 períodos"),
       col=c("blue", "red"), lty=1:2, cex=0.8)

Também é possível realizar médias móveis simétricas em que são utilizados valores antes a após o ponto de medida, penalizando valores no inínio e ao fim da série.

Quando esta for simétrica e q impar: \[MM_T = \frac{1}{q}\sum_{i=-s}^{s} X_{t+1},\ onde\ s = (q-1)/2\]

Quando esta for simétrica e q par: \[MM_T = \frac{1}{q}\sum_{i=-s+1}^{s} X_{t+1},\ onde\ s = q/2\] Tomando uma média móvem simétrica de ordem 3: \[MM_T = \frac{1}{3}(X_{t-1}+X_{t}+X_{t+1})\] Tomando uma média móvem simétrica de ordem 4: Nesse caso por não ser simétrica ao redor de t o algoritmo utiliza um ponto a mais a frente (futuro). \[MM_T = \frac{1}{3}(X_{t-1}+X_{t}+X_{t+1}+X_{t+2})\]

MMS3 = stats::filter(ts, rep(1/3, 3), sides = 2)
MMS4 = stats::filter(ts, rep(1/4, 4), sides = 2)
plot(ts)
lines(x = time, y=MMS3, type = 'l', col="blue")
lines(x = time, y=MMS4, type = 'l', pch=18, col="red", lty=1)
legend(1950, 500, legend=c("Média Móvel de ordem 3", "Média Móvel de ordem 4"),
       col=c("blue", "red"), lty=1, cex=0.8)

2.2.1.1 Combinando MA de valores passados e simétricos

MMR5 = stats::filter(ts, rep(1/5, 5), sides = 1)
MMS5 = stats::filter(ts, rep(1/5, 5), sides = 2)
plot(ts)
lines(x = time, y=MMR5, type = 'l', col="blue")
lines(x = time, y=MMS5, type = 'l', pch=18, col="red", lty=1)
legend(1950, 500, legend=c("Média Móvel Retroativa de ordem 5", "Média Móvel Simétrica de ordem 5"),
       col=c("blue", "red"), lty=1, cex=0.8)

2.2.2 Filtro Linear

Nesse caso utilizando tewrmos (p, q) com coeficientes \(a_i\) como pesos que somados devem ser \(\sum a = 1\).

\[MM_l = \sum_{i=-p}^{q} a_iX_{t+i}\] Assim: \[MM_L = 0.2X_{t-i}+0.6X_{t}+0.2X_{t+i}\] Fornece:

MMl3 = stats::filter(ts, c(0.2, 0.6, 0.2), sides = 2)
MMl5 = stats::filter(ts, c(0.018, 0.2, 0.6, 0.2, 0.098), sides = 2)
plot(ts)
lines(x = time, y=MMl3, type = 'l', col="blue")
lines(x = time, y=MMl5, type = 'l', col="red")
legend(1950, 500, legend=c("Média Móvel de Filtro Linear de 3 termos", "Média Móvel de Filtro Linear de 5 termos"),
       col=c("blue", "red"), lty=1, cex=0.8)

2.3 Extração de Sazonalidade

2.3.1 Decomposição Aditiva

Supondo a decomposição de tendência aditiva por meio de \(TS_t = T_t + S_t + E+t\) a TS com tendência ajustada será dada por meio de:

\[Z_t = X_t-T_t = S_t+E_t\] Se a ordem de MA for 13 o ajuste é dados por uma MA simétrica de ordem 13 para considerar seis instantes antes a após o ponto de estimação:

ts = AirPassengers
autoplot(ts)

tendencia = stats::filter(ts, rep(1/13, 13), sides = 2)
z = ts-tendencia # TS sem tendência

plot(ts, main="TS Original", plot.type = "m", lwd=2)

plot(tendencia, main="Componente de Tendência", plot.type = "m", lwd=2)

plot(z, main="Modelo Ajustado sem Tendência", plot.type = "m", lwd=2)

Feito o ajuste de tendência (z) um novo processo de suavização é aplicado para extração da componente de sazonalidade. Nesse exeplo o processo consistirá em avaliar as médias de meses correspondentes onde S de janeiro corresponde à média dos Z dos mezes de janeiro de que se tem registro; o mesmo sendo aplicado aos demais meses.

ts = AirPassengers
ciclos = length(ts)/12
MediasSs = t(matrix(data = z, nrow = 12))
Ss = colMeans(MediasSs, na.rm = T)
Ss = ts(rep(Ss, ciclos), start=start(ts), frequency = frequency(ts))
plot(decompose(Ss, type = 'm'))
## Warning in plot.window(...): relative range of values ( 29 * EPS) is small (axis
## 2)

erro = ts - tendencia - z
plot(cbind(ts, tendencia, z, erro), main="Modelo", plot.type = "m", lwd=2)

3 Biblioteca XTS extensible time-series (xts)

library(xts)
library(dplyr)
library(data.table)
db = fread("../data/dadosFormacaoTimeSeries.csv")
class(db)
## [1] "data.table" "data.frame"
db = as.xts(db)
class(db)
## [1] "xts" "zoo"
head(db)
##            yahoo microsoft citigroup dow_chemical
## 2015-01-02 50.17  44.30501  53.45259     42.48209
## 2015-01-05 49.13  43.89759  51.76803     41.16821
## 2015-01-06 49.21  43.25329  49.94556     40.50662
## 2015-01-07 48.59  43.80284  50.40857     40.44139
## 2015-01-08 50.23  45.09144  51.16711     41.44776
## 2015-01-09 49.72  44.71244  50.02437     41.38253
plot(db$yahoo)

plot.zoo(db$yahoo)

plot.zoo(db$yahoo, main = "Yahoo", sub = "subtitulo",xlab = "aaa", ylab = "nnn", type = "l")

plot.zoo(db$yahoo, main = "Yahoo", sub = "subtitulo",xlab = "aaa", ylab = "nnn", type = "h")

plot.zoo(db$yahoo, main = "Yahoo", sub = "subtitulo",xlab = "aaa", ylab = "nnn", type = "l", col = "blue")

plot.zoo(db$yahoo, main = "Yahoo", sub = "subtitulo",xlab = "aaa", ylab = "nnn", type = "p", col = "blue")
lines(as.zoo(db$yahoo),  col = "red")

plot.zoo(db$yahoo, main = "Yahoo", sub = "subtitulo",xlab = "aaa", ylab = "nnn", type = "h")
lines(as.zoo(db$yahoo),  col = "red")

par(mfrow = c(2, 1))
plot.zoo(db$yahoo, main = "Yahoo", sub = "subtitulo",xlab = "aaa", ylab = "nnn", type = "l", col = "blue")
plot.zoo(db$microsoft, main = "Microsoft", sub = "subtitulo",xlab = "aaa", ylab = "nnn", type = "l", col = "red")

par(mfrow = c(2, 1), mex = 0.6, cex = 0.8)
plot.zoo(db$yahoo, main = "Yahoo", sub = "subtitulo",xlab = "aaa", ylab = "nnn", type = "l", col = "blue")
plot.zoo(db$microsoft, main = "Microsoft", sub = "subtitulo",xlab = "aaa", ylab = "nnn", type = "l", col = "red")

par(mfrow = c(1, 1))
plot.zoo(db$microsoft, main = "Comparativo de Ações", sub = "subtitulo",xlab = "aaa", ylab = "nnn", type = "l", col = "red")
lines(as.zoo(db$citigroup), col = "Blue")
axis(side = 4, at = pretty(db$citigroup))
legend(x = "topleft", legend = c("Microsoft", "Citigroup"), col = c("red", "blue"), lty = c(1,1))
abline(v = TRUE)

par(mfrow = c(1, 1))
plot.zoo(db$microsoft, main = "Comparativo de Ações", sub = "subtitulo",xlab = "aaa", ylab = "nnn", type = "l", col = "red")
lines(as.zoo(db$citigroup), col = "Blue")
lines(as.zoo(db$dow_chemical), col = "green")
legend(x = "topleft", legend = c("Microsoft", "Citigroup", "Dow Chemical"), col = c("red", "blue", "green"), lty = c(1,1))
abline(v = TRUE)

plot(db$microsoft)

plot(db$citigroup)

plot(db$dow_chemical)
abline(v = as.Date("2016-10-05"), col="red", lwd=3, lty=2)

plot.zoo(db$dow_chemical, main = "Dow Chemical")
abline(v = index(db$dow_chemical)[which(index(db$dow_chemical) == as.Date("2016-07-08"))], col = "red")
abline(h = mean(db$dow_chemical), col = "green")

4 Biblioteca Technical Trading Rules (TTR)

library(TTR)
db = fread("../data/appleAcoes.csv")
head(db)
db$Index = as.Date(db$Index)
db = as.xts(db)
class(db)
## [1] "xts" "zoo"
plot.zoo(db, main = "Cotacão Apple")

4.0.1 ROC

Rate of Change / Momentum Description Calculate the (rate of) change of a series over n periods.

retorno = ROC(db)
head(retorno)
##                    Apple
## 2015-01-02            NA
## 2015-01-05 -0.0285760403
## 2015-01-06  0.0000941282
## 2015-01-07  0.0139247906
## 2015-01-08  0.0377025087
## 2015-01-09  0.0010719293
retorno = na.omit(retorno)
plot.zoo(retorno, main = "Rate of Change / Momentum")

par(mfrow = c(1, 2))
plot(db$Apple, main = "Cotacão Apple")
plot.zoo(retorno, main = "Retorno Apple")

par(mfrow = c(1, 1))
hist(retorno, col = "green")
abline(v = mean(retorno), col = "red")
lines(density(retorno), col = "blue")

par(mfrow = c(1, 1))
hist(retorno, col = "green", probability = T, main = "Resultados Apple")
abline(v = mean(retorno), col = "red")
lines(density(retorno), col = "orange", lwd = 3)

boxplot(as.numeric(retorno$Apple))

par(mfrow = c(2, 1))
boxplot(as.numeric(retorno$Apple), horizontal = 1)
boxplot(as.numeric(rnorm(1000)), horizontal = 1)

4.0.2 Correlacão

nn <- 100
tt1 <- sin(2 * pi * seq(nn)/12) - seq(nn)/50
tt2 <- cos(2 * pi * seq(nn)/12) - seq(nn)/10
plot(tt1, tt2)

t1 = rnorm(100, 5, 1)
t3 = t1*pi*runif(1, -25.0, 100)+runif(1, -25.0, 100)
plot(t1, t3)

cor(t1, t3)
## [1] 1
plot(t1, tt1)

cor(t1, tt1)
## [1] -0.06207016

4.0.3 Autocorrelação

tt <- seq(nn)
acf(tt)

plot.acf <- function(ACFobj) {
    rr <- ACFobj$acf[-1]
    kk <- length(rr)
    nn <- ACFobj$n.used
    plot(seq(kk), rr, type = "h", lwd = 2, yaxs = "i", xaxs = "i", 
        ylim = c(floor(min(rr)), 1), xlim = c(0, kk + 1), xlab = "Lag", 
        ylab = "Correlation", las = 1)
    abline(h = -1/nn + c(-2, 2)/sqrt(nn), lty = "dashed", col = "blue")
    abline(h = 0)
}

nn <- 100
tt <- seq(nn)
par(mfrow = c(1, 2))
plot.ts(tt, ylab = expression(italic(x[t])))
line.acf <- acf(tt, plot = FALSE)
plot.acf(line.acf)

tt <- sin(2 * pi * seq(nn)/12)
par(mfrow = c(1, 2))
plot.ts(tt, ylab = expression(italic(x[t])))
sine_acf <- acf(tt, plot = FALSE)
plot.acf(sine_acf)

tt <- sin(2 * pi * seq(nn)/12) - seq(nn)/100
par(mfrow = c(1, 2))
plot.ts(tt, ylab = expression(italic(x[t])))
sili_acf <- acf(tt, plot = FALSE)
plot.acf(sili_acf)

tt <- sin(2 * pi * seq(nn)/12) - seq(nn)/50
par(mfrow = c(1, 2))
plot.ts(tt, ylab = expression(italic(x[t])))
sili_acf <- acf(tt, plot = FALSE)
plot.acf(sili_acf)

tt <- sin(2 * pi * seq(nn)/12) - seq(nn)/10
par(mfrow = c(1, 2))
plot.ts(tt, ylab = expression(italic(x[t])))
sili_acf <- acf(tt, plot = FALSE)
plot.acf(sili_acf)

tt <- sin(2 * pi * seq(nn)/12) - seq(nn)/2
par(mfrow = c(1, 2))
plot.ts(tt, ylab = expression(italic(x[t])))
sili_acf <- acf(tt, plot = FALSE)
plot.acf(sili_acf)

par(mfrow = c(1, 1))
acf(retorno, main = "Autocorrelação de Valores Apple")

acf(retorno, main = "Autocorrelação de Valores Apple", lag.max = 10)

qqnorm(retorno, main = "Verificação de Normalidade")
qqline(retorno, col = "green")

par(mfrow = c(2,2))
hist(retorno, probability = 1, col = "green")
lines(density(retorno), col = "blue")

boxplot(as.numeric(retorno$Apple), horizontal = 1)

acf(retorno, main = "Autocorrelação de Valores Apple")

qqnorm(retorno, main = "Verificação de Normalidade")
qqline(retorno, col = "green")

4.0.4 Multivariados

dados = fread("../data/timeSeriesMultivar.csv")
glimpse(dados)
## Rows: 503
## Columns: 7
## $ Index       <date> 2015-01-05, 2015-01-06, 2015-01-07, 2015-01-08, 2015-01-0…
## $ sp500       <dbl> -0.0277431513, -0.0053304213, 0.0100815421, 0.0165076412, …
## $ citigroup   <dbl> -0.032022201, -0.035839143, 0.009227448, 0.014935802, -0.0…
## $ microsoft   <dbl> -0.0092383657, -0.0147861081, 0.0126252978, 0.0289937264, …
## $ apple       <dbl> -0.0285760376, 0.0000941334, 0.0139247880, 0.0377025087, 0…
## $ dowchemical <dbl> -0.0314161915, -0.0162011345, -0.0016116027, 0.0245801707,…
## $ yahoo       <dbl> -0.0209473321, 0.0016269680, -0.0126790861, 0.0331947093, …
dados$Index = as.Date(dados$Index)
glimpse(dados)
## Rows: 503
## Columns: 7
## $ Index       <date> 2015-01-05, 2015-01-06, 2015-01-07, 2015-01-08, 2015-01-0…
## $ sp500       <dbl> -0.0277431513, -0.0053304213, 0.0100815421, 0.0165076412, …
## $ citigroup   <dbl> -0.032022201, -0.035839143, 0.009227448, 0.014935802, -0.0…
## $ microsoft   <dbl> -0.0092383657, -0.0147861081, 0.0126252978, 0.0289937264, …
## $ apple       <dbl> -0.0285760376, 0.0000941334, 0.0139247880, 0.0377025087, 0…
## $ dowchemical <dbl> -0.0314161915, -0.0162011345, -0.0016116027, 0.0245801707,…
## $ yahoo       <dbl> -0.0209473321, 0.0016269680, -0.0126790861, 0.0331947093, …
dados = as.xts(dados)
class(dados)
## [1] "xts" "zoo"
plot(as.numeric(dados$sp500), as.numeric(dados$apple))
abline(reg = lm(as.numeric(dados$apple) ~as.numeric(dados$sp500)), col = "pink", lwd = 3)
abline(reg = lm(as.numeric(dados$apple) ~as.numeric(dados$apple)), col = "orange", lwd = 3)
abline(reg = lm(as.numeric(dados$apple) ~as.numeric(dados$citigroup)), col = "green", lwd = 3)
abline(reg = lm(as.numeric(dados$apple) ~as.numeric(dados$microsoft)), col = "blue", lwd = 3)
abline(reg = lm(as.numeric(dados$apple) ~as.numeric(dados$dowchemical)), col = "red", lwd = 3)
abline(reg = lm(as.numeric(dados$apple) ~as.numeric(dados$yahoo)), col = "yellow", lwd = 3)

plot(as.numeric(dados$sp500), as.numeric(dados$citigroup))

4.0.4.1 Matriz correlação

Correlação de Pearson: Relação linear entre duas variáveis Correlação de Spearman: Mede a dependencia estatística e a classificação de duas variáveis (não linear - monótona).

cor(dados, method = "pearson")
##                 sp500 citigroup microsoft     apple dowchemical     yahoo
## sp500       1.0000000 0.5097953 0.3743215 0.3576966   0.5217243 0.2900962
## citigroup   0.5097953 1.0000000 0.4841408 0.4291841   0.5085190 0.4029490
## microsoft   0.3743215 0.4841408 1.0000000 0.5133469   0.3954523 0.4329388
## apple       0.3576966 0.4291841 0.5133469 1.0000000   0.3627755 0.3413626
## dowchemical 0.5217243 0.5085190 0.3954523 0.3627755   1.0000000 0.2938749
## yahoo       0.2900962 0.4029490 0.4329388 0.3413626   0.2938749 1.0000000
cor(dados, method = "spearman")
##                 sp500 citigroup microsoft     apple dowchemical     yahoo
## sp500       1.0000000 0.5192579 0.4244237 0.3518853   0.5316235 0.3262037
## citigroup   0.5192579 1.0000000 0.4976477 0.4374850   0.5607511 0.3780730
## microsoft   0.4244237 0.4976477 1.0000000 0.5128477   0.4684114 0.4448179
## apple       0.3518853 0.4374850 0.5128477 1.0000000   0.3681791 0.3680715
## dowchemical 0.5316235 0.5607511 0.4684114 0.3681791   1.0000000 0.3464743
## yahoo       0.3262037 0.3780730 0.4448179 0.3680715   0.3464743 1.0000000
pairs(as.data.frame(dados), lower.panel = NULL, main = "Título", col = "pink")

library(corrplot)
corrplot(cor(x = dados, method = "pearson"))

library(corrplot)
corrplot(cor(x = dados, method = "pearson"), type = "upper")

corrplot(cor(x = dados, method = "pearson"), method = "number", type = "upper")

corrplot(cor(x = dados, method = "pearson"), method = "color", type = "upper")

4.0.5 Estacionariedade

?Nile

Nile {datasets} R Documentation Flow of the River Nile Description Measurements of the annual flow of the river Nile at Aswan (formerly Assuan), 1871–1970, in 10^8 m^3, “with apparent changepoint near 1898” (Cobb(1978), Table 1, p.249).

Usage Nile Format A time series of length 100.

Source Durbin, J. and Koopman, S. J. (2001). Time Series Analysis by State Space Methods. Oxford University Press. http://www.ssfpack.com/DKbook.html

References Balke, N. S. (1993). Detecting level shifts in time series. Journal of Business and Economic Statistics, 11, 81–92. doi: 10.2307/1391308.

Cobb, G. W. (1978). The problem of the Nile: conditional solution to a change-point problem. Biometrika 65, 243–51. doi: 10.2307/2335202.

head(Nile)
## Time Series:
## Start = 1871 
## End = 1876 
## Frequency = 1 
## [1] 1120 1160  963 1210 1160 1160
RioNilo = Nile
tail(RioNilo)
## Time Series:
## Start = 1965 
## End = 1970 
## Frequency = 1 
## [1] 912 746 919 718 714 740
length(RioNilo)
## [1] 100
plot(RioNilo)

plot(RioNilo, type = "b", col = "green")

4.0.6 Estacionariedade

log(): Linearização diff(): Remoção de tendência linear

4.0.7 Diferenciação

ASTSA: Applied Statistical Time Series analysis

library(astsa)
temperatura_global = globtemp
plot(temperatura_global, col = "red")

Diferenciação para obter uma série estacionária

plot(diff(temperatura_global))

par(mfrow = c(2,1))
plot(temperatura_global, col = "red")
plot(diff(temperatura_global), col = "blue")

### Ruído branco:

  • Média Constante
  • Variância Constante
  • Sem correlacão temporal

Portanto não possui um padrão, sendo completamente aleatório

Simulando ruído branco com componentes autorregressivo, de diferenciação e de média movel (p, d, q) = (0, 0, 0).

whitenoise = arima.sim(model = list(order = c(0, 0, 0)), n = 50)
class(whitenoise)
## [1] "ts"
plot(whitenoise, col = "green", lwd = 2)

arima(whitenoise, order = c(0, 0, 0))
## 
## Call:
## arima(x = whitenoise, order = c(0, 0, 0))
## 
## Coefficients:
##       intercept
##          0.0115
## s.e.     0.1255
## 
## sigma^2 estimated as 0.788:  log likelihood = -64.99,  aic = 133.98

4.0.8 Passeio aleatório

  • Sem variância ou média especificada

  • Dependência ao longo do tempo

  • Mudança ou incremento são ruídos brancos

Cada momento seque um processo aditino em que o instante adial é a adição de algum ruído ao valor do dado anterior.

\[T_{atual} = T_{atual-1} + e_{atual}\\ \Rightarrow T_1 = T_{0} + e_{1}, \,\, t.q.\,\, \overline{x} = 0\] Um segundo modelo de passeio aleatório chamado drift adiciona uma constante ao modelo

\[T_{atual} = c + T_{atual-1} + e_{atual} \\ \Rightarrow c + T_1 = T_{0} + e_{1}, \,\, t.q.\,\, \overline{x} = 0\]

passeioaleat = arima.sim(model = list(order = c(0, 1, 0)), n = 50)
ts.plot(passeioaleat, col = "green", lwd = 2)

arima(passeioaleat, order = c(0, 0, 0))
## 
## Call:
## arima(x = passeioaleat, order = c(0, 0, 0))
## 
## Coefficients:
##       intercept
##         -0.7471
## s.e.     0.2228
## 
## sigma^2 estimated as 2.531:  log likelihood = -96.05,  aic = 196.1
passeioaleat = diff(passeioaleat)
ts.plot(passeioaleat, col = "green", lwd = 2)

arima(passeioaleat, order = c(0, 0, 0))
## 
## Call:
## arima(x = passeioaleat, order = c(0, 0, 0))
## 
## Coefficients:
##       intercept
##          0.0135
## s.e.     0.1335
## 
## sigma^2 estimated as 0.8907:  log likelihood = -68.05,  aic = 140.1

5 Modelos ARMA

6 Modelos ARIMA

7 Biblioteca Time Series Analysis and Computational Finance (tseries)