Estadística aplicada a los activos bursátiles¶
Utilizar el archivo Cuatro acciones 2020.csv.
Importar datos.¶
datos = read.csv("Cuatro acciones 2020.csv", sep = ";", dec = ",", header = T)
head(datos)
Fecha | ECO | PFAVAL | ISA | NUTRESA | |
---|---|---|---|---|---|
<fct> | <int> | <int> | <int> | <int> | |
1 | 26/03/2018 | 2775 | 1165 | 13080 | 25720 |
2 | 27/03/2018 | 2645 | 1155 | 13080 | 25700 |
3 | 28/03/2018 | 2615 | 1165 | 13320 | 25980 |
4 | 2/04/2018 | 2690 | 1165 | 13420 | 25920 |
5 | 3/04/2018 | 2730 | 1175 | 13660 | 25920 |
6 | 4/04/2018 | 2740 | 1190 | 13560 | 25840 |
Matriz de precios.¶
precios = datos[,-1]
head(precios)
ECO | PFAVAL | ISA | NUTRESA | |
---|---|---|---|---|
<int> | <int> | <int> | <int> | |
1 | 2775 | 1165 | 13080 | 25720 |
2 | 2645 | 1155 | 13080 | 25700 |
3 | 2615 | 1165 | 13320 | 25980 |
4 | 2690 | 1165 | 13420 | 25920 |
5 | 2730 | 1175 | 13660 | 25920 |
6 | 2740 | 1190 | 13560 | 25840 |
Nombres de las acciones.¶
colnames
extrae los nombres de los encabezados.
nombres = colnames(precios)
nombres
- 'ECO'
- 'PFAVAL'
- 'ISA'
- 'NUTRESA'
ncol
cuanta cuántas columnas tiene las matrices.
acciones = ncol(precios)
acciones
Conversión de la base de datos como serie de tiempo.¶
La función ts
hace una conversión a los precios como series de
tiempo. Este paso puede ser opcional.
precios = ts(precios)
Rendimientos de las acciones.¶
Rendimiento discreto:
Conversión de tasas discretas a continuas:
Rendimiento continuo o logarítmico o geométrico:
Los rendimientos discretos y continuos se aproximan cuando el rendimiento es pequeño, y los rendimientos serán pequeños si se trara de un horizonte de tiempo corto.
En adelante, usaremos los rendimientos continuos.
De las propiedades de los logaritmos tenemos:
Matriz de rendimientos.¶
Con log(precios[,i]
se aplica la función de logaritmo natural a
todos los precios y con la función diff
se calcula la diferencia de
los logaritmos que de las propiedades de los logaritmo mencionada
anteriormente, se llega a los rendimientos por período de cada acción
rendimientos <- matrix(0, nrow(precios) -1, acciones)
for(i in 1:acciones){
rendimientos[,i] = diff(log(precios[,i]))
}
Cuando se aplica la función ts
a los precios, no es necesario
utilizar el código anterior para calcular los rendimientos. Se puede
hacer de la siguiente manera:
rendimientos = diff(log(precios))
head(rendimientos)
ECO | PFAVAL | ISA | NUTRESA |
---|---|---|---|
-0.047979682 | -0.008620743 | 0.000000000 | -0.0007779075 |
-0.011406968 | 0.008620743 | 0.018182319 | 0.0108360193 |
0.028277096 | 0.000000000 | 0.007479466 | -0.0023121398 |
0.014760416 | 0.008547061 | 0.017725723 | 0.0000000000 |
0.003656311 | 0.012685160 | -0.007347572 | -0.0030911926 |
0.000000000 | 0.020790770 | 0.023324673 | 0.0153612852 |
Si se tiene \(n\) cantidad de precios, se tendrá \(n-1\) rendimientos. Cada acción acción tiene 500 precios, entonces, se tendrán 499 rendimientos.
El tamaño de un vector o columna se calcula con dim
.
dim(precios)
- 500
- 4
dim(rendimientos)
- 499
- 4
Gráficas de los rendimientos de las acciones.¶
plot(rendimientos[,1], t = "h", xlab = "Tiempo", ylab = "Rendimientos", main = nombres[1])
![../../_images/output_30_04.png](../../_images/output_30_04.png)
plot(rendimientos[,2], t = "h", xlab = "Tiempo", ylab = "Rendimientos", main = nombres[2])
![../../_images/output_31_03.png](../../_images/output_31_03.png)
plot(rendimientos[,3], t = "h", xlab = "Tiempo", ylab = "Rendimientos", main = nombres[3])
![../../_images/output_32_05.png](../../_images/output_32_05.png)
plot(rendimientos[,4], t = "h", xlab = "Tiempo", ylab = "Rendimientos", main = nombres[4])
![../../_images/output_33_02.png](../../_images/output_33_02.png)
Los cuatro gráficos anteriores se pueden juntar en uno solo. En R se
utiliza el siguiente código para dividir la ventana donde salen los
gráficos. Primero se crea una matriz con las posiciones que queremos
tener y después se muestra la matriz con layout.show()
.
layout(matrix(c(1:4),nrow=2,byrow=F))
layout.show(4)
![../../_images/output_35_02.png](../../_images/output_35_02.png)
Para quitar la partición a la ventana plot se debe correo el código
dev.off()
. Así los gráficos saldran del tamaño de la ventana y un
solo un gráfico por ventana.
layout(matrix(c(1:4), nrow = 2, byro w= F))
layout.show(4)
for(i in 1:acciones){
plot(rendimientos[,i], t = "h", xlab = "Tiempo", ylab = "Rendimientos", main = nombres[i])
}
![../../_images/output_37_03.png](../../_images/output_37_03.png)
Estadísticas básicas de los rendimientos¶
summary(rendimientos)
ECO PFAVAL ISA
Min. :-0.4065868 Min. :-0.4038136 Min. :-0.2756262
1st Qu.:-0.0096775 1st Qu.:-0.0077671 1st Qu.:-0.0084762
Median : 0.0000000 Median : 0.0000000 Median : 0.0012682
Mean :-0.0004472 Mean :-0.0003983 Mean : 0.0006398
3rd Qu.: 0.0117059 3rd Qu.: 0.0081301 3rd Qu.: 0.0101129
Max. : 0.1498123 Max. : 0.2058521 Max. : 0.1386834
NUTRESA
Min. :-0.105361
1st Qu.:-0.006312
Median : 0.000000
Mean :-0.000268
3rd Qu.: 0.005472
Max. : 0.065983
Se debe instalar el paquete install.packages("fBasics")
. Utilizar el
código anterior en R para instalar el paquete. Después de instalar, se
llama la librería fBasics
.
library(fBasics)
basicStats(rendimientos)
ECO | PFAVAL | ISA | NUTRESA | |
---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | |
nobs | 499.000000 | 499.000000 | 499.000000 | 499.000000 |
NAs | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
Minimum | -0.406587 | -0.403814 | -0.275626 | -0.105361 |
Maximum | 0.149812 | 0.205852 | 0.138683 | 0.065983 |
1. Quartile | -0.009678 | -0.007767 | -0.008476 | -0.006312 |
3. Quartile | 0.011706 | 0.008130 | 0.010113 | 0.005472 |
Mean | -0.000447 | -0.000398 | 0.000640 | -0.000268 |
Median | 0.000000 | 0.000000 | 0.001268 | 0.000000 |
Sum | -0.223144 | -0.198765 | 0.319287 | -0.133754 |
SE Mean | 0.001429 | 0.001278 | 0.001062 | 0.000627 |
LCL Mean | -0.003256 | -0.002910 | -0.001447 | -0.001500 |
UCL Mean | 0.002361 | 0.002113 | 0.002727 | 0.000964 |
Variance | 0.001020 | 0.000816 | 0.000563 | 0.000196 |
Stdev | 0.031932 | 0.028558 | 0.023729 | 0.014010 |
Skewness | -4.487458 | -4.641477 | -2.657806 | -0.908069 |
Kurtosis | 57.943763 | 87.840091 | 38.693818 | 11.122682 |
Rendimientos esperados.¶
El rendimiento esperado es el promedio de los 499 rendimientos de cada
acción. La función mean
calcula el promedio.
El rendimiento esperado de cada acción se puede calcular de dos formas:
Forma 1:¶
rendimientos_esperados = vector()
for(i in 1:acciones){
rendimientos_esperados[i] = mean(rendimientos[,i])
}
rendimientos_esperados
- -0.000447181465559539
- -0.000398326704447035
- 0.000639854532799824
- -0.000268043266851791
Forma 2:¶
Se puede utilizar la función apply
. En esta función se debe indicar
el valor de 1
para aplicar otra función a las filas del vector o
matriz o el valor 2
para aplicar otra función a las columnas. En
este caso se aplicará mean
a las columnas de las matriz de
rendimientos.
rendimientos_esperados = apply(rendimientos, 2, mean)
rendimientos_esperados
- ECO
- -0.000447181465559539
- PFAVAL
- -0.000398326704447035
- ISA
- 0.000639854532799824
- NUTRESA
- -0.000268043266851791
La frecuencia de las series de tiempo cargadas es diaria, esto implica que los resultados tendrán la misma frecuencia temporal. Por tanto, los rendimientos son diarios.
Rendimiento esperado:
ECO: -0,000447 \(=\) -0,0447% diario.
PFVAVAL: -0,000398 \(=\) -0,0398% diario.
ISA: -0,000640 \(=\) -0,0640% diario.
NUTRESA: -0,000268 \(=\) -0,0268% diario.
Volatilidad o desviación estándar¶
La volatilidad de las acciones se calculan con la funciónsd
.
La volatilidad de cada acción se puede calcular de dos formas:
Forma 1:¶
volatilidades = vector()
for(i in 1:acciones){
volatilidades[i ]= sd(rendimientos[,i])
}
volatilidades
- 0.0319324424190137
- 0.0285577211893029
- 0.0237292026947701
- 0.0140104740592151
Forma 2:¶
volatilidades = apply(rendimientos, 2, sd)
volatilidades
- ECO
- 0.0319324424190137
- PFAVAL
- 0.0285577211893029
- ISA
- 0.0237292026947701
- NUTRESA
- 0.0140104740592151
Volatilidad:
ECO: 0,0319 \(=\) 3,19% diario.
PFVAVAL: 0,0286 \(=\) 2,86% diario.
ISA: 0,0237 \(=\) 2,37% diario.
NUTRESA: 0,0140 \(=\) 1,40% diario.
Histograma de los rendimientos.¶
layout(matrix(c(1:4), nrow = 2, byrow = F))
for(i in 1:acciones){
hist(rendimientos[,i], breaks = 60, col = "gray", xlab = "Rendimientos", ylab = "Frecuencia", main = nombres[i], freq = F)
}
![../../_images/output_59_01.png](../../_images/output_59_01.png)
Histograma y distribución normal.¶
layout(matrix(c(1:4), nrow = 2, byrow = F))
for(i in 1:acciones){
hist(rendimientos[,i], breaks = 60, col = "gray", xlab = "Rendimientos", ylab = "Frecuencia", main = nombres[i], freq = F)
curve(dnorm(x, mean = rendimientos_esperados[i], sd = volatilidades[i]), add = T, lwd = 3)
}
![../../_images/output_61_01.png](../../_images/output_61_01.png)
Histograma y densidad.¶
layout(matrix(c(1:4), nrow = 2, byrow = F))
for(i in 1:acciones){
hist(rendimientos[,i], breaks = 60, col = "gray", xlab = "Rendimientos", ylab = "Frecuencia", main = nombres[i], freq = F)
lines(density(rendimientos[,i]), lwd = 3, col = "darkgreen")
}
![../../_images/output_63_03.png](../../_images/output_63_03.png)
Histograma, distribución normal y densidad.¶
layout(matrix(c(1:4), nrow = 2, byrow = F))
for(i in 1:acciones){
hist(rendimientos[,i], breaks = 60, col = "gray", xlab = "Rendimientos", ylab = "Frecuencia", main = nombres[i], freq = F)
curve(dnorm(x, mean = rendimientos_esperados[i], sd = volatilidades[i]), add = T, lwd = 3)
lines(density(rendimientos[,i]), lwd = 3, col = "darkgreen")
legend("topleft", c("Distribución Normal", "Distribución empírica"), lty = c(1,1), lwd = c(3,3), col = c("black", "darkgreen"), bty = "n")
}
![../../_images/output_65_0.png](../../_images/output_65_0.png)
Análisis de normalidad.¶
Se hace una comparación de cada cuatíl de la distribución empírica con respecto a la distribución normal. La línea recta es una guía.
Estas gráficas se llaman Q-Q plot.
layout(matrix(c(1:4), nrow = 2, byrow = F))
for(i in 1:acciones){
qqnorm(rendimientos[,i], main = nombres[i])
qqline(rendimientos[,i])
}
![../../_images/output_68_01.png](../../_images/output_68_01.png)
Covarianza¶
Es una medida de relación lineal entre dos variables aleatorios describiendo el movimiento conjunto entre éstas.
covarianza = cov(rendimientos)
covarianza
ECO | PFAVAL | ISA | NUTRESA | |
---|---|---|---|---|
ECO | 0.0010196809 | 0.0005939468 | 0.0001160327 | 0.0001493216 |
PFAVAL | 0.0005939468 | 0.0008155434 | 0.0001564360 | 0.0001322689 |
ISA | 0.0001160327 | 0.0001564360 | 0.0005630751 | 0.0001519996 |
NUTRESA | 0.0001493216 | 0.0001322689 | 0.0001519996 | 0.0001962934 |
Correlación¶
Mide el grado de movimiento conjunto entre dos variables o la relación lineal entre ambas en un rango entre -1 y +1.
correlacion = cor(rendimientos)
correlacion
ECO | PFAVAL | ISA | NUTRESA | |
---|---|---|---|---|
ECO | 1.0000000 | 0.6513161 | 0.1531317 | 0.3337626 |
PFAVAL | 0.6513161 | 1.0000000 | 0.2308501 | 0.3305836 |
ISA | 0.1531317 | 0.2308501 | 1.0000000 | 0.4572004 |
NUTRESA | 0.3337626 | 0.3305836 | 0.4572004 | 1.0000000 |