Analisis de datos desde Yahoo Finance para NETFLIX

Obtenemos los datos desde el sitio de Yahoo

NFLXdata <- pdfetch_YAHOO("NFLX",from = c("2019-01-01"),to = c("2023-01-03"), interval = '1d')

Obtenemos la columna que es de nuestro interes

Netflix <- NFLXdata[,4]
length(Netflix)
## [1] 1008

Convertimos en una serie temporal

tsNetflix <- ts(Netflix, start = c(2019,1),frequency=365)

Realizamos la Grafica

En la grafica se puede observar el comportamiento del precio de las acciones de Netflix en el periodo de interes.

plot(tsNetflix)

Prueba de Raices unitarias para determinar si es estacionaria

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

Se calculan las diferencias de la serie de datos con logaritmo

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

Calculo parametros iniciales manera 1

Delta <- 1/365
alpha <- mean(l_Netflix)/Delta
sigma <- sqrt(var(l_Netflix)/Delta)
mu <- alpha +0.5*sigma^2
x0<-tsNetflix[1]

Calculo parametros iniciales manera 2

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

Realizar la comparacion entre las dos maneras

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)

PROBAR CON FORMA 1 Y FORMA 2

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

Resultado de prediccion del modelo

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)