martes, 8 de marzo de 2016

Analisis de Series de tiempo con Python: Analizando el precio de Ecopetrol S.A.

ecopetrolAnalysis

Que es una serie de tiempo

Una serie temporal es una sucesión de datos medidos en determinados momentos y ordenados cronológicamente.

En los negocios se encuentran muchos ejemplos de series temporales. Ejemplos de series temporales es el registro del precio de cierre de las acciones de cada día de la bolsa de valores de Colombia (BVC). Otra serie temporal suele ser las ventas diarias, semanales o mensuales en almacenes o grandes superficies como Exito, SAO, etc.

En sectores de la banca existe un gran uso de técnicas y herramientas para analizar series temporales. La herramienta mas popular para análisis de series temporales es sin duda Microsoft Excel. Por medio de filtros avanzados, tablas y gráficos dinámicos se pueden construir magníficos Cuadros de Mando (Dashboards) para impresionar a los tomadores de decisiones en la empresa. SAS (Statistical Analysis Software) es otra de las herramientas de pago para realizar un análisis de este tipo de datos.

Estas y muchas herramientas son de pago, A continuación mostraré una forma de realizar análisis de series temporales con Python, un lenguaje de código abierto especialmente usado para análisis de datos, ciencia de datos, machine learning entre otros.

Se analizará el valor del precio de cierre de la compañía Ecopetrol S.A. El conjunto de datos para este proyecto será extraído de la pagina de Yahoo Finance

Se empezará importando las librerías necesarias para procesar los datos:

In [25]:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

A continuación, se crea un objeto llamado dataset en el cuál vamos a almacenar los datos

In [3]:
precios =pd.read_csv("https://query1.finance.yahoo.com/v7/finance/download/EC?period1=1425772800&period2=1457395200&interval=1d&events=history")

Echemos un vistazo rápido a los 7 primeros datos de contiene nuestro objeto precios:

In [26]:
precios.head(7)
Out[26]:
Date Open High Low Close Adj Close Volume
0 2015-03-09 14.55 14.76 13.86 13.89 10.781767 1020800
1 2015-03-10 13.76 13.94 13.29 13.90 10.789528 1944800
2 2015-03-11 13.75 14.12 13.75 14.05 10.905963 617200
3 2015-03-12 14.24 14.36 14.05 14.32 11.115544 1056600
4 2015-03-13 14.28 14.28 13.71 14.11 10.952536 917400
5 2015-03-16 13.98 14.21 13.40 14.11 10.952536 1432500
6 2015-03-17 13.97 14.56 13.48 14.42 11.193166 1441700

Como podemos observar la columna Date contiene la fecha en que se generó el registro. La columna Open contine el precio de apertura de la acción, es decir, el precio al cuál empezó a cotizarse la acción.

Miremos ahora un poco más a fondo nuestro conjunto de datos:

In [15]:
precios.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 254 entries, 0 to 253
Data columns (total 7 columns):
Date         254 non-null object
Open         254 non-null float64
High         254 non-null float64
Low          254 non-null float64
Close        254 non-null float64
Adj Close    254 non-null float64
Volume       254 non-null int64
dtypes: float64(5), int64(1), object(1)
memory usage: 14.0+ KB

Para tener en cuenta estadísticos descriptivos como la media y desviacion estandar podemos hacer uso de la siguiente línea.

In [24]:
precios.describe()
Out[24]:
Open High Low Close Adj Close Volume
count 252.000000 252.00000 252.000000 252.000000 252.000000 2.520000e+02
mean 10.797262 11.00004 10.588690 10.785516 8.778119 1.023037e+06
std 3.484264 3.50656 3.440111 3.472390 2.550262 5.147702e+05
min 5.360000 5.50000 5.160000 5.400000 4.529967 3.150000e+05
25% 8.270000 8.45000 8.130000 8.280000 6.945949 6.646750e+05
50% 9.990000 10.11000 9.650000 9.920000 8.321717 8.902000e+05
75% 14.007500 14.29000 13.757500 14.077500 11.057659 1.294125e+06
max 17.540001 17.92000 17.440001 17.480000 13.568414 3.295100e+06

podemos notar que la media del precio de cierre ajustado en el ultimo año es de 10.79 dólares. El valor mínimo ha sido 5.36 dolares y el valor máximo fué de 17.54 dólares

Para tener un conjunto de datos limpio debemos cerciorarnos que no haya valores nulos o NaN (NaN: Not a Number) en nuestros datos. el sigiente código nos permite observar que no hay valores nulos en nuestro conjunto de datos.

In [10]:
precios.isnull().sum()
Out[10]:
Date         0
Open         0
High         0
Low          0
Close        0
Adj Close    0
Volume       0
dtype: int64

Analicemos la gráfica de el precio de cierre ajustado:

In [23]:
plot = precios['Adj Close'].plot(figsize=(12, 8))

Un analista técnico podría notar que el precio acaba de romper una linea de tendencia fuerte a la baja y que ha tenido impulso fuerte hacia arriba en la última semana.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.