NFLXdata <- pdfetch_YAHOO("NFLX",from = c("2019-01-01"),to = c("2023-01-03"), interval = '1d')
Netflix <- NFLXdata[,4]
length(Netflix)
## [1] 1008
tsNetflix <- ts(Netflix, start = c(2019,1),frequency=365)
En la grafica se puede observar el comportamiento del precio de las acciones de Netflix en el periodo de interes.
plot(tsNetflix)
Al realizar la prueba de raices unitarias ADF, al aplicarla sobre el primer conjunto de residuos ADF este debe ser menor a 0.05 para demostrar la estacionariedad, si es mayor a 0.05 no hay estacionariedad. En este caso no se cumple el criterio de estacionariedad.
tseries::adf.test(tsNetflix)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
##
## Augmented Dickey-Fuller Test
##
## data: tsNetflix
## Dickey-Fuller = -1.2132, Lag order = 10, p-value = 0.9043
## alternative hypothesis: stationary
Al realizar una diferenciacion en los datos con logaritmo se obtiene un valor estadistico p menor a 0.05
l_Netflix<-diff(log(tsNetflix))
plot(l_Netflix)
tseries::adf.test(l_Netflix)
##
## Augmented Dickey-Fuller Test
##
## data: l_Netflix
## Dickey-Fuller = -9.881, Lag order = 10, p-value = 0.01
## alternative hypothesis: stationary
Delta <- 1/365
alpha <- mean(l_Netflix)/Delta
sigma <- sqrt(var(l_Netflix)/Delta)
mu <- alpha +0.5*sigma^2
x0<-tsNetflix[1]
x <- tsNetflix
gBm <- setModel(drift="mu*x", diffusion="sigma*x", xinit=x0)
mod <- setYuima(model=gBm, data=setData(tsNetflix, delta=Delta))
set.seed(123)
fit <- qmle(mod, start=list(mu=0, sigma=1),
lower=list(mu=0.1, sigma=0.1),
upper=list(mu=100, sigma=10))
summary(fit)
## Quasi-Maximum likelihood estimation
##
## Call:
## qmle(yuima = mod, start = list(mu = 0, sigma = 1), lower = list(mu = 0.1,
## sigma = 0.1), upper = list(mu = 100, sigma = 10))
##
## Coefficients:
## Estimate Std. Error
## sigma 0.5789536 0.0129018
## mu 0.2102318 0.3485583
##
## -2 log L: 7801.417
coef(fit)
## sigma mu
## 0.5789536 0.2102318
sigma
## NFLX.close
## NFLX.close 0.600152
mu
## NFLX.close
## NFLX.close 0.2151961
gbm_vec <- function(nsim = 10000, t = 25, mu = 0, sigma = 0.1, S0 = 100, dt = 1./365) {
# matrix of random draws - one for each day for each simulation
epsilon <- matrix(rnorm(t*nsim), ncol = nsim, nrow = t)
# get GBM and convert to price paths
gbm <- exp((mu - sigma * sigma / 2) * dt + sigma * epsilon * sqrt(dt))
gbm <- apply(rbind(rep(S0, nsim), gbm), 2, cumprod)
return(gbm)
}
gBm
##
## Diffusion process
## Number of equations: 1
## Number of Wiener noises: 1
## Parametric model with 2 parameters
valores_simulados <- simulate(gBm, true.parameter = list(mu=mu, sigma=sigma))
plot(valores_simulados)
nsim <- 1000
t <- 366
mu <- 1.517177
sigma <- 0.531907
S0 <- 32.72
dt = 1/365
gbm <- gbm_vec(nsim, t, mu, sigma, S0, dt)
gbm_df <- as.data.frame(gbm) %>%
mutate(ix = 1:nrow(gbm)) %>%
pivot_longer(-ix, names_to = 'sim', values_to = 'price')
gbm_df %>%
ggplot(aes(x=ix, y=price, color=sim)) +
geom_line() +
theme(legend.position = 'none')
data.frame(price = gbm[253, ]) %>%
ggplot(aes(x = price)) +
geom_histogram(aes(y = ..density..), binwidth = 0.1) +
geom_density() +
ggtitle('terminal price distribution')
D <- gbm[253, ] %>%
density();D
##
## Call:
## density.default(x = .)
##
## Data: . (1000 obs.); Bandwidth 'bw' = 8.149
##
## x y
## Min. : -5.465 Min. :1.500e-08
## 1st Qu.: 88.938 1st Qu.:3.595e-05
## Median :183.340 Median :6.888e-04
## Mean :183.340 Mean :2.646e-03
## 3rd Qu.:277.742 3rd Qu.:4.177e-03
## Max. :372.144 Max. :1.158e-02
D$x[which.max(D$y)]
## [1] 71.38717
Se obtiene el siguiente modelo de prediccion de los datos seleccionados para la empresa en los dias deseados.
NFLXdata2 <- pdfetch_YAHOO("NFLX",from = c("2019-01-01"),to = c("2023-03-03"), interval = '1d')
Netflix2 <- NFLXdata2[,4]
View(Netflix2)