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)
Gráfica de los precios de las acciones.#
plot(precios, t = "l", xlab = "Tiempo")
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])
plot(rendimientos[,2], t = "h", xlab = "Tiempo", ylab = "Rendimientos", main = nombres[2])
plot(rendimientos[,3], t = "h", xlab = "Tiempo", ylab = "Rendimientos", main = nombres[3])
plot(rendimientos[,4], t = "h", xlab = "Tiempo", ylab = "Rendimientos", main = nombres[4])
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)
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])
}
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)
}
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)
}
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")
}
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")
}
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])
}
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 |