palabras - marcas con r
Cómo descargar datos intradía del mercado de valores con R (4)
¿Por qué no cargar los datos de Quandl ? P.ej
library(Quandl)
Quandl(''YAHOO/AAPL'')
Actualización : lo siento, me acabo de dar cuenta de que solo se obtienen datos diarios con Quandl, pero dejo mi respuesta aquí, ya que es muy fácil consultar a Quandl en casos similares
Todos,
Busco descargar datos de inventario de Yahoo o Google en intervalos de 15 a 60 minutos para la mayor cantidad de historial que pueda obtener. He encontrado una solución cruda de la siguiente manera:
library(RCurl)
tmp <- getURL(''https://www.google.com/finance/getprices?i=900&p=1000d&f=d,o,h,l,c,v&df=cpct&q=AAPL'')
tmp <- strsplit(tmp,''/n'')
tmp <- tmp[[1]]
tmp <- tmp[-c(1:8)]
tmp <- strsplit(tmp,'','')
tmp <- do.call(''rbind'',tmp)
tmp <- apply(tmp,2,as.numeric)
tmp <- tmp[-apply(tmp,1,function(x) any(is.na(x))),]
Dada la cantidad de datos que busco importar, me preocupa que esto pueda ser computacionalmente costoso. Tampoco entiendo por mi vida, entiendo cómo los sellos de tiempo están codificados en Yahoo y Google.
Entonces, mi pregunta es doble: ¿cuál es una manera simple y elegante de ingerir rápidamente datos para una serie de acciones en R, y cómo interpreto el sellado de tiempo en los archivos de Google / Yahoo que estaría usando?
Para el desplazamiento de zona horaria, intente:
as.POSIXct (1357828200, origin = ''1970-01-01'', tz = Sys.timezone (ubicación = TRUE))
(El tz se ajustará automáticamente de acuerdo a su ubicación)
Por lo tanto, la descarga y la estandarización de los datos terminaron siendo más un oso de lo que pensé que sería: alrededor de 150 líneas de código. El problema es que, si bien Google proporciona los últimos 50 días de entrenamiento de datos para todas las acciones que se negocian en bolsa, las marcas de tiempo dentro de los días no están estandarizadas: un índice de ''1'', por ejemplo, podría referirse al primero del segundo incremento de tiempo En el primer día de negociación en el conjunto de datos. Lo que es peor, las acciones que solo se negocian en volúmenes bajos solo tienen entradas donde se registra una transacción. Para un stock de alto volumen como APPL, eso no es un problema, pero para minúsculas de bajo volumen significa que a su serie le faltará mucho, si no la mayoría de los datos. Esto fue problemático porque necesito que todas las series de valores se encuentren perfectamente juntas para el análisis que estoy haciendo.
Afortunadamente, todavía hay una estructura general para los datos. Utilizando este enlace:
https://www.google.com/finance/getprices?i=1800&p=1000d&f=d,o,h,l,c,v&df=cpct&q=AAPL
y al cambiar el ticker de acciones al final, obtendrá los últimos 50 días de días de negociación en un incremento de 1/2-hora. Las marcas de tiempo POSIX, muy útiles decodificadas por @geektrader, aparecen en la columna de marca de tiempo a intervalos de 3 semanas. Aunque los índices de marca de tiempo no siempre se corresponden de manera conveniente 1: 1 (casi sospecho que esto fue intencional por parte de Google) hay un patrón. Por ejemplo, para las series de media hora que miré en el primer día de negociación de cada incremento de tres semanas de manera uniforme, los índices de marca de tiempo se ejecutan en el vecindario 1:15. Esto podría ser 1:13, 1:14, 2: 15 - todo depende de la acción. No estoy seguro de cuáles son las entradas 14 y 15: sospecho que son resúmenes diarios o información sobre operaciones fuera de horario. El punto es que no hay un patrón consistente en el que pueda confiar. Lamentablemente, el primer sello en un día de entrenamiento no siempre contiene los datos de apertura. Lo mismo para la última entrada y los datos de cierre. Descubrí que la única forma de saber qué representan los datos comerciales es comparar los números con la serie en los mapas de Google. Después de varios días de tratar de averiguar cómo extraer un patrón de mapeo 1: 1 de los datos, me decidí por una estrategia de "estadio". Rastreé los datos de APPL (una acción comercializada de muy alto volumen) y establecí sus índices de marca de tiempo dentro de cada día comercial como los valores de referencia para todo el mercado. Todos los días tuvieron un mínimo de 13 incrementos, correspondientes al día de negociación de 6,5 horas, pero algunos tuvieron 14 o 15. En este caso, acabo de truncar al tomar los primeros 13 índices. A partir de ahí, utilicé un bucle while para avanzar esencialmente a través de los datos descargados de cada indicador de cotizaciones y comparar sus índices de marca de tiempo dentro de un día de entrenamiento determinado con las marcas de tiempo de APPL. Mantuve la superposición, llené los datos faltantes y eliminé las partes que no se superponían.
Suena como una solución simple, pero para las acciones de bajo volumen con pocos datos de transacciones, hubo literalmente docenas de casos especiales que tuve que hornear y muchos datos para interpolar. Obtuve algunos resultados bastante extraños para algunos de estos que sé que son incorrectos. Sin embargo, para las acciones de alto volumen, de mediana y gran capitalización, la solución funcionó de manera brillante: en su mayor parte, la serie se sincronizó muy bien con los datos de APPL y se ajustó perfectamente a sus perfiles de Google Finance.
No hay forma de evitar el hecho de que este método introduce algún error, y todavía tengo que ajustar el método para reducir las mayúsculas. Dicho esto, cambiar una serie por media hora o llenar un solo incremento de tiempo introduce una cantidad muy pequeña de error en relación con el movimiento general del mercado y las acciones. Estoy seguro de que este conjunto de datos que tengo es "lo suficientemente bueno" para permitirme obtener respuestas relevantes a algunas de las preguntas que tengo. Conseguir esto comercialmente cuesta literalmente miles de dólares.
¿Pensamientos o sugerencias?
Voy a tratar de responder a la pregunta de marca de tiempo primero. Tenga en cuenta que esta es mi interpretación y podría estar equivocado.
Usando el enlace en su ejemplo https://www.google.com/finance/getprices?i=900&p=1000d&f=d,o,h,l,c,v&df=cpct&q=AAPL
Obtengo la siguiente información:
EXCHANGE%3DNASDAQ
MARKET_OPEN_MINUTE=570
MARKET_CLOSE_MINUTE=960
INTERVAL=900
COLUMNS=DATE,CLOSE,HIGH,LOW,OPEN,VOLUME
DATA=
TIMEZONE_OFFSET=-300
a1357828200,528.5999,528.62,528.14,528.55,129259
1,522.63,528.72,522,528.6499,2054578
2,523.11,523.69,520.75,522.77,1422586
3,520.48,523.11,519.6501,523.09,1130409
4,518.28,520.579,517.86,520.34,1215466
5,518.8501,519.48,517.33,517.94,832100
6,518.685,520.22,518.63,518.85,565411
7,516.55,519.2,516.55,518.64,617281
...
...
Note el primer valor de la primera columna a1357828200
, mi intuición fue que esto tiene algo que ver con POSIXct
. Por lo tanto, una comprobación rápida:
> as.POSIXct(1357828200, origin = ''1970-01-01'', tz=''EST'')
[1] "2013-01-10 14:30:00 EST"
Así que mi intuición parece ser correcta. Pero el tiempo parece haberse ido. Ahora tenemos una información más en los datos. TIMEZONE_OFFSET=-300
. Entonces, si compensamos nuestras marcas de tiempo con esta cantidad, deberíamos obtener:
as.POSIXct(1357828200-300*60, origin = ''1970-01-01'', tz=''EST'')
[1] "2013-01-10 09:30:00 EST"
Tenga en cuenta que no sabía qué datos del día había solicitado. Pero la revisión rápida de Google Finance revela que, efectivamente, eran niveles de precios el 10 de enero de 2013.
Los valores restantes de la primera columna parecen ser algún tipo de desplazamiento desde el valor de la primera fila.