miércoles, 27 de febrero de 2013

Trabajar con Datos de Forex con R y SQLite (2/5)


En la primera entrada de esta serie vimos como crear una tabla para almacenar los datos históricos del cambio euro-dólar. En esta ocasión vamos a empezar a trabajar con estos datos.

Trabajar con los datos

Lo primero que vamos a hacer es darle algo de formato a la salida que nos proporciona el intérprete de sqlite para que sea algo más legible, para ello escribimos:

.echo on
.mode column
.headers on
.nullvalue NULL

Básicamente, lo que le hemos dicho a SQLite es que queremos ver los datos formateados por columnas, y con una cabecera de tabla.

Para mostrar todos los elementos contenidos en la base de datos (que recomiendo no hacer porque llevaría un rato visualizarlos, ya que son muchos) se haría:

SELECT * FROM eurusd;

Para contar el número de barras almacenadas en la base de datos escribimos:

SELECT count(*) FROM eurusd;

que por cierto, debe coincidir con el número de líneas del fichero CSV desde el que hemos importado los datos, y que se pueden contar con la orden Unix:

wc -l EURUSD.csv

Para insertar una nueva barra se haría con:

INSERT INTO eurusd (date, unix, open, high, low, close) VALUES (
'2011-11-01 00:01:00', 0, '1.1212', '1.2323', '1.3434', '1.4545'
);

Que a su vez se puede borrar con:

DELETE FROM eurusd WHERE date = '2011-11-01 00:01:00';

Finalmente, podemos consultar cualquier barra con una orden como:

SELECT * FROM eurusd WHERE date = "2001-01-05 02:26";

Consultas avanzadas

La verdad es que las consultas que hemos hecho hasta ahora no son especialmente útiles. Pero en esta sección vamos a empezar a ver la potencia de almacenar los datos Forex en una base de datos relacional.

Por ejemplo si queremos ver el máximo y el mínimo alcanzado en cada mes escribimos:

SELECT MAX(high) AS High, MIN(low) as Low, 
  STRFTIME("%Y-%m", date) as Month 
  FROM eurusd
  WHERE date > '2010-01-01' AND date < '2011-01-01'
  GROUP BY STRFTIME("%Y-%m", date);

Si queremos ver el máximo y mínimo alcanzado cada día:

SELECT MAX(high) AS High, MIN(low) as Low,
  STRFTIME("%Y-%m-%d", date) as Date
  FROM eurusd
  WHERE date > '2010-01-01' AND date < '2011-01-01'
  GROUP BY STRFTIME("%Y-%m-%d", date);

Si queremos ver el máximo y mínimo alcanzado durante un periodo cualquiera de tiempo, por ejemplo 40 minutos, hacemos:

SELECT high, low FROM eurusd WHERE date >= "2001-01-05 02:00" AND date <= "2001-01-05 02:40";

Y finalmente, si queremos ver el precio de apertura en barras diarias, haríamos:

SELECT open, date FROM eurusd WHERE date IN
  (SELECT MIN(date)
    FROM eurusd
    WHERE date > '2010-01-01' AND date < '2011-01-01'
    GROUP BY STRFTIME("%Y-%m-%d", date));

Y esto es todo para esta entrega. En la siguiente entrada de este blog veremos cómo realizar algunas consultas más avanzadas.

No hay comentarios:

Publicar un comentario