1. Caso Ecopetrol

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

a. Modelo de regresión líneal simple:

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

Modelos:

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)

b. Prueba de significancia del modelo:

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

c. coeficientes del modelo:

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 ***)

d. Análisis de los residuos y que supuesto no se cumple

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

e. Validez del modelo:

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