Mediante un modelo de predicción simple se busca analizar el comportamiento de los precios de las acciones y pronosticarlo según variación del precio del barril de petróleo WTI producido en Colombia.
Se presenta el histórico de los siguientes precios:
require(ggplot2)
require(lmtest)
require(plotly)
library(readxl)
Ecopetrol_y_Bolsa_de_valores_de_Nueva_York <- read_excel("C:/Users/pocho/Desktop/R/Ecopetrol y Bolsa de valores de Nueva York.xlsx",
col_types = c("date", "numeric", "numeric"))
acc_ecopetrol = Ecopetrol_y_Bolsa_de_valores_de_Nueva_York
colnames(acc_ecopetrol)=c("Fecha","Precio_acciones","Precio_barril")
acc_ecopetrol
| Fecha | Precio_acciones | Precio_barril |
|---|---|---|
| 2015-12-14 | 1090 | 35.62 |
| 2015-12-15 | 1170 | 36.31 |
| 2015-12-16 | 1160 | 37.35 |
| 2015-12-18 | 1230 | 34.95 |
| 2015-12-21 | 1155 | 34.53 |
| 2015-12-22 | 1165 | 35.81 |
| 2015-12-23 | 1205 | 36.14 |
| 2015-12-24 | 1170 | 37.50 |
| 2015-12-28 | 1150 | 37.80 |
| 2015-12-29 | 1130 | 36.81 |
| 2015-12-30 | 1110 | 37.87 |
| 2016-01-04 | 1105 | 37.04 |
| 2016-01-05 | 1085 | 36.76 |
| 2016-01-06 | 1060 | 35.97 |
| 2016-01-07 | 1035 | 33.97 |
| 2016-01-08 | 1015 | 33.27 |
| 2016-01-12 | 955 | 31.41 |
| 2016-01-13 | 961 | 30.44 |
Predecir el valor de las acciones de Ecopetrol con base al precio del barril de petróleo en Colombia:
Para realizar el análisis primero se realiza una análisis bivariado visual de las variables, siendo y el Precio acciones puesto que depende de x quien es el Precio barril. Se puede encontrar que exite una relación lineal entre las variables, pese que algunos puntos presentan alejamiento.
## Análisis Bivariado
g1=ggplot(data = acc_ecopetrol, mapping = aes(x=Precio_acciones,y=Precio_barril))+geom_point()+theme_bw()+geom_smooth(method = "lm")
ggplotly(g1)
## `geom_smooth()` using formula 'y ~ x'
Para continuar deseamos conocer que tanta correlación tienen estas dos variables y estan se explican en un 70%.
## Correlación de Pearson
cor(acc_ecopetrol$Precio_barril,acc_ecopetrol$Precio_acciones)
## [1] 0.7074373
Modelo1
Ahora, se realizará el primero modelo de regresión lineal simple para determinar su el r\(^2\)
mod_acc=lm(Precio_acciones~Precio_barril, data = acc_ecopetrol)
mod_acc
##
## Call:
## lm(formula = Precio_acciones ~ Precio_barril, data = acc_ecopetrol)
##
## Coefficients:
## (Intercept) Precio_barril
## 177.77 26.19
La ecuación de regresión es \[y=177.77 + (26.19x)\] ESto quiere decir que el promedio de las acciones sin estimar un precio del barril de peptróleo es de 177.77 mil dolares y por cada 1000 dolares crece las acciones 26.19 mil dolares.
Ahora, para poder determinar que tanto el precio de las acciones es explicado por el precio del barril se encontrara el r\(^2\) y determinar la significancia de los de los supuestos
summary(mod_acc)
##
## Call:
## lm(formula = Precio_acciones ~ Precio_barril, data = acc_ecopetrol)
##
## Residuals:
## Min 1Q Median 3Q Max
## -59.90 -40.74 -15.94 33.40 136.82
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 177.768 232.828 0.764 0.45627
## Precio_barril 26.192 6.542 4.004 0.00102 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 57.13 on 16 degrees of freedom
## Multiple R-squared: 0.5005, Adjusted R-squared: 0.4692
## F-statistic: 16.03 on 1 and 16 DF, p-value: 0.001024
p1=0.001024
El valor de r\(^2\):0.4692, es decir quela variable explica en un 46,92% el modelo con un p-value: 0.001024
Partiendo de eeste resultado es necesario realizar otro modelo utilizando la trasnformación para poder encontrar un el r\(^2\) más alto.
Modelo2
Se realizará el segundo modelo de regresión lineal simple para mejorar el r\(^2\)
mod_acc2=lm(log(Precio_acciones)~Precio_barril, data = acc_ecopetrol)
mod_acc2
##
## Call:
## lm(formula = log(Precio_acciones) ~ Precio_barril, data = acc_ecopetrol)
##
## Coefficients:
## (Intercept) Precio_barril
## 6.12292 0.02492
La ecuación de regresión es \[y=6.12292 + (0.02492x)\] ESto quiere decir que el promedio de las acciones sin estimar un precio del barril de peptróleo es de 6.12292 mil dolares y por cada 1000 dolares crece las acciones 0.02492 mil dolares.
Ahora, para poder determinar que tanto el precio de las acciones es explicado por el precio del barril se encontrara el r\(^2\) y determinar la significancia de los de los supuestos
summary(mod_acc2)
##
## Call:
## lm(formula = log(Precio_acciones) ~ Precio_barril, data = acc_ecopetrol)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.05440 -0.03599 -0.01496 0.02970 0.12101
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.122915 0.208590 29.354 2.42e-15 ***
## Precio_barril 0.024917 0.005861 4.251 0.000609 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.05119 on 16 degrees of freedom
## Multiple R-squared: 0.5304, Adjusted R-squared: 0.5011
## F-statistic: 18.07 on 1 and 16 DF, p-value: 0.0006095
p2=0.0006095
El valor de r\(^2\):0.5011, es decir que la variable explica en un 50,11% el modelo con un p-value: 0.001024, lo cual mejora un poco la significancia con respecto al modelo1 acc_mod
Continuaremos haciendo un tercer modelo utilizando la trasnformación en x para poder encontrar un el r\(^2\) más alto.
Modelo3
Se realizará el tercer modelo de regresión lineal simple para mejorar el r\(^2\)
mod_acc3=lm(log(Precio_acciones)~log(Precio_barril), data = acc_ecopetrol)
mod_acc3
##
## Call:
## lm(formula = log(Precio_acciones) ~ log(Precio_barril), data = acc_ecopetrol)
##
## Coefficients:
## (Intercept) log(Precio_barril)
## 3.9229 0.8646
La ecuación de regresión es \[y=3.9229 + (0.8646x)\] ESto quiere decir que el promedio de las acciones sin estimar un precio del barril de peptróleo es de 3.9229 mil dolares y por cada 1000 dolares crece las acciones 0.8646 mil dolares.
Ahora, para poder determinar que tanto el precio de las acciones es explicado por el precio del barril se encontrara el r\(^2\) y determinar la significancia de los de los supuestos
summary(mod_acc3)
##
## Call:
## lm(formula = log(Precio_acciones) ~ log(Precio_barril), data = acc_ecopetrol)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.05435 -0.03615 -0.01306 0.02928 0.11927
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.9229 0.7072 5.547 4.42e-05 ***
## log(Precio_barril) 0.8646 0.1981 4.364 0.000482 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.05048 on 16 degrees of freedom
## Multiple R-squared: 0.5434, Adjusted R-squared: 0.5149
## F-statistic: 19.04 on 1 and 16 DF, p-value: 0.0004824
p3=0.0004824
El valor de r\(^2\):0.5149, es decir que la variable explica en un 50,11% el modelo, lo cual mejora un poco la significancia con respecto al modelo1 acc_mod y modelo2 acc_mod2
Continuaremos haciendo un cuarto modelo utilizando la trasnformación en x para poder encontrar un el r\(^2\) más alto.
Modelo4
Se realizará el tercer modelo de regresión lineal simple para mejorar el r\(^2\)
mod_acc4=lm(Precio_acciones~log(Precio_barril), data = acc_ecopetrol)
mod_acc4
##
## Call:
## lm(formula = Precio_acciones ~ log(Precio_barril), data = acc_ecopetrol)
##
## Coefficients:
## (Intercept) log(Precio_barril)
## -2135.3 908.9
La ecuación de regresión es \[y=-2135.3 + (908.9x)\] ESto quiere decir que el promedio de las acciones sin estimar un precio del barril de peptróleo es de -2135.3 mil dolares y por cada 1000 dolares crece las acciones 908.9 mil dolares.
Ahora, para poder determinar que tanto el precio de las acciones es explicado por el precio del barril se encontrara el r\(^2\) y determinar la significancia de los de los supuestos
summary(mod_acc4)
##
## Call:
## lm(formula = Precio_acciones ~ log(Precio_barril), data = acc_ecopetrol)
##
## Residuals:
## Min 1Q Median 3Q Max
## -61.16 -40.91 -14.21 32.96 134.99
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2135.3 790.5 -2.701 0.015730 *
## log(Precio_barril) 908.9 221.5 4.104 0.000829 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 56.42 on 16 degrees of freedom
## Multiple R-squared: 0.5128, Adjusted R-squared: 0.4824
## F-statistic: 16.84 on 1 and 16 DF, p-value: 0.0008295
p4=0.0008295
El valor de r\(^2\):0.4824, es decir que la variable explica en un 50,11% el modelo, lo cual disminuye la significancia obtenida con el modelo3 acc_mod3
Analizaremos cada uno de los modelos para validar el mas optimo junto con sus p-value
library(memisc)
## Loading required package: lattice
## Loading required package: MASS
##
## Attaching package: 'MASS'
## The following object is masked from 'package:plotly':
##
## select
##
## Attaching package: 'memisc'
## The following objects are masked from 'package:plotly':
##
## rename, style
## The following object is masked from 'package:ggplot2':
##
## syms
## The following objects are masked from 'package:stats':
##
## contr.sum, contr.treatment, contrasts
## The following object is masked from 'package:base':
##
## as.array
memisc::mtable(mod_acc,mod_acc2,mod_acc3,mod_acc4)
##
## Calls:
## mod_acc: lm(formula = Precio_acciones ~ Precio_barril, data = acc_ecopetrol)
## mod_acc2: lm(formula = log(Precio_acciones) ~ Precio_barril, data = acc_ecopetrol)
## mod_acc3: lm(formula = log(Precio_acciones) ~ log(Precio_barril), data = acc_ecopetrol)
## mod_acc4: lm(formula = Precio_acciones ~ log(Precio_barril), data = acc_ecopetrol)
##
## ====================================================================================================
## mod_acc mod_acc2 mod_acc3 mod_acc4
## --------------- -------------------- -------------------- ---------------
## Precio_acciones log(Precio_acciones) log(Precio_acciones) Precio_acciones
## ----------------------------------------------------------------------------------------------------
## (Intercept) 177.768 6.123*** 3.923*** -2135.311*
## (232.828) (0.209) (0.707) (790.477)
## Precio_barril 26.192** 0.025***
## (6.542) (0.006)
## log(Precio_barril) 0.865*** 908.947***
## (0.198) (221.476)
## ----------------------------------------------------------------------------------------------------
## R-squared 0.500 0.530 0.543 0.513
## N 18 18 18 18
## ====================================================================================================
## Significance: *** = p < 0.001; ** = p < 0.01; * = p < 0.05
pvalores=data.frame(p1,p2,p3,p4)
names(pvalores)=c("pvalor modelo1","pvalor modelo2","pvalor modelo3","pvalor modelo4")
pvalores
| pvalor modelo1 | pvalor modelo2 | pvalor modelo3 | pvalor modelo4 |
|---|---|---|---|
| 0.001024 | 0.0006095 | 0.0004824 | 0.0008295 |
Con lo anterior se utilizará el modelo4 acc_mod4 para las pruebas de hipótesis teniendo en cuenta su r\(^2\) y su p_value, es decir que se tuvo en cuenta el modelo con la transformación lineal-logaritmica (lin-log)
Hipotesis a: Que sucede cuando el valor del barril es de 35.50
*R* El precio de las acciones seran de 1107.58 y se moverá entre un rango entre 1079 y 1136.1
ph1=predict(mod_acc4,list(Precio_barril=35.50),interval = "confidence",level = 0.95)
ph1
## fit lwr upr
## 1 1109.206 1081.011 1137.402
Hipotesis b: Que sucede cuando el valor del barril es de 37.65
*R* El precio de las acciones seran de 1163 y se moverá entre un rango entre 1122.9 y 1204.8
ph2=predict(mod_acc4,list(Precio_barril=37.65),interval = "confidence",level = 0.95)
ph2
## fit lwr upr
## 1 1162.653 1122.898 1202.408
Los estimados hacen alusión a la fórmula \[y=\hat{\beta}_{0} + (\hat{\beta}_{1} x_{1})\]
summary(mod_acc4)
##
## Call:
## lm(formula = Precio_acciones ~ log(Precio_barril), data = acc_ecopetrol)
##
## Residuals:
## Min 1Q Median 3Q Max
## -61.16 -40.91 -14.21 32.96 134.99
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2135.3 790.5 -2.701 0.015730 *
## log(Precio_barril) 908.9 221.5 4.104 0.000829 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 56.42 on 16 degrees of freedom
## Multiple R-squared: 0.5128, Adjusted R-squared: 0.4824
## F-statistic: 16.84 on 1 and 16 DF, p-value: 0.0008295
El estimado \(\hat{\beta}_{0}\) manifiesta que el precio de las acciones sin estimar un precio del barril de petróleo es de -2135.3 mil dolares.
El estimado \(\hat{\beta}_{1}\) expresa que, por cada 1000 dolares crece las acciones 908.9 mil dolares. Ademias de ello su significancia es buena (00.000829 ***)
e=mod_acc4$residuals
barplot(e)
Se puede evidenciar que se cumple el supuesto que la media de los errores es 0
summary(e)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -61.16 -40.91 -14.21 0.00 32.96 134.99
Ahora vamos a comporbar a través de la test Shapiro Wilk sobre la normalidad de los errores y este tiene un p-value = 0.05664, es decir que no rechazamos la hipótesis de normalidad
shapiro.test(resid(mod_acc4))
##
## Shapiro-Wilk normality test
##
## data: resid(mod_acc4)
## W = 0.89964, p-value = 0.05664
Otro supuesto que se puede comprobar es \(\delta^2\) de los errores, que para el modelo tiene un p-value = 0.9801
require(lmtest)
lmtest::gqtest(mod_acc4)
##
## Goldfeld-Quandt test
##
## data: mod_acc4
## GQ = 0.18378, df1 = 7, df2 = 7, p-value = 0.9801
## alternative hypothesis: variance increases from segment 1 to 2
Ahora, vamos a verificar la covarianza de los errores, en el cual p-value = 0.0004479
dwtest(mod_acc4)
##
## Durbin-Watson test
##
## data: mod_acc4
## DW = 0.7418, p-value = 0.0004479
## alternative hypothesis: true autocorrelation is greater than 0
Se realizará una validacion cruzada para poder evaluar el poder predictivo del modelo.
## segmentación de datos
id_modelo = sample(1:18, size = 14)
acc_modelar = acc_ecopetrol[id_modelo,]
acc_validar = acc_ecopetrol[-id_modelo,]
##estimar el modelo set de modelar
mod_acc_modelar = lm(Precio_acciones~log(Precio_barril), data= acc_modelar)
## predecir el set de validacion
acc_pred = predict(mod_acc_modelar,list(Precio_barril=acc_validar$Precio_barril),interval = "confidence",level = 0.95)
## comparar datos de modelo y reales
acciones_real = acc_validar$Precio_acciones
error = acciones_real - acc_pred
res = data.frame(acciones_real,acc_pred,error)
res
| acciones_real | fit | lwr | upr | fit.1 | lwr.1 | upr.1 |
|---|---|---|---|---|---|---|
| 1230 | 1084.897 | 1057.973 | 1111.822 | 145.10290 | 172.02735 | 118.17845 |
| 1165 | 1108.542 | 1080.709 | 1136.376 | 56.45760 | 84.29146 | 28.62374 |
| 1170 | 1153.398 | 1115.327 | 1191.468 | 16.60236 | 54.67273 | -21.46802 |
| 1110 | 1162.948 | 1121.825 | 1204.071 | -52.94800 | -11.82500 | -94.07099 |
## calcular el indicador de evaluación de la predicción
MAE=mean(abs(error))
MAE
## [1] 71.35572