Подтвердить что ты не робот

Как загрузить внутридневные данные фондового рынка с помощью R

Все,

Я собираюсь загрузить данные о запасах из Yahoo или Google с интервалом в 15-60 минут за столько же, сколько я могу получить. Я придумал грубое решение следующим образом:

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))),]

Учитывая объем данных, которые я ищу для импорта, я беспокоюсь, что это может быть дорогостоящим. Я также не для жизни, понимаю, как штампы времени закодированы в Yahoo и Google.

Итак, мой вопрос двоякий: какой простой и элегантный способ быстро забирать данные для серии акций в R и как интерпретировать временные отметки в файлах Google/Yahoo, которые я буду использовать?

4b9b3361

Ответ 1

Сначала я постараюсь ответить на вопрос timestamp. Пожалуйста, обратите внимание, что это моя интерпретация, и я могу ошибаться.

Используя ссылку в вашем примере https://www.google.com/finance/getprices?i=900&p=1000d&f=d,o,h,l,c,v&df=cpct&q=AAPL, я получаю следующие данные:

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
...
...

Обратите внимание на первое значение первого столбца a1357828200, моя интуиция заключалась в том, что это имеет какое-то отношение к POSIXct. Отсюда быстрая проверка:

> as.POSIXct(1357828200, origin = '1970-01-01', tz='EST')
[1] "2013-01-10 14:30:00 EST"

Итак, моя интуиция кажется правильной. Но время, похоже, выключено. Теперь у нас есть еще одна информация в данных. TIMEZONE_OFFSET=-300. Поэтому, если мы компенсируем наши отметки времени на эту сумму, мы должны получить:

as.POSIXct(1357828200-300*60, origin = '1970-01-01', tz='EST')
[1] "2013-01-10 09:30:00 EST"

Обратите внимание, что я не знал, какие данные за день вы запросили. Но быстро проверка на google finance показывает, что это были действительно уровни цен 10 января 2013 года.

enter image description here

Остальные значения из первого столбца кажутся своего рода смещением от значения первой строки.

Ответ 2

Таким образом, загрузка и стандартизация данных в конечном итоге была большей частью медведя, чем я полагал, это будет - около 150 строк кода. Проблема заключается в том, что, хотя Google предоставляет последние 50 дней обучения для всех биржевых акций, отметки времени в течение дней не стандартизированы: индекс "1", например, может ссылаться на первый приращение второго времени в первый торговый день в наборе данных. Хуже того, акции, которые торгуются только в небольших объемах, имеют только записи, в которых записана транзакция. Для большого объема запасов, таких как APPL, это не проблема, но для небольших колпачков небольшого объема это означает, что вашей серии не хватит, если не большинство данных. Это было проблематично, потому что мне нужно, чтобы все серии акций были аккуратно лежали друг на друге для анализа, который я делаю.

К счастью, все еще есть общая структура данных. Используя эту ссылку:

https://www.google.com/finance/getprices?i=1800&p=1000d&f=d,o,h,l,c,v&df=cpct&q=AAPL 

и изменение биржевого тикета в конце даст вам последние 50 дней торговых дней с 1/2-часовым приростом. Временные метки POSIX, очень эффективно декодированные @geektrader, отображаются в столбце timestamp с интервалом в 3 недели. Хотя индексы временной метки не всегда соответствуют удобному 1:1 (я почти подозреваю, что это было намеренно в части Google), есть шаблон. Например, для получасовых рядов, которые я смотрел на первый торговый день из трехнедельного приращения, равномерно показываются индексы времени, расположенные в районе 1:15. Это может быть 1:13, 1:14, 2: 15 - все зависит от запаса. Я не уверен, что такое 14-я и 15-я записи: я подозреваю, что это либо ежедневные сводки, либо информация о времени после закрытия торгов. Дело в том, что нет единого шаблона, на который вы можете положиться. Первый штамп в учебный день, к сожалению, не всегда содержит данные открытия. То же самое для последней записи и закрытия данных. Я обнаружил, что единственный способ узнать, что на самом деле представляет торговые данные, - сравнить номера с серией на картах Google. После нескольких дней бесполезности, пытаясь выяснить, как вытащить картографическое изображение 1:1 из данных, я остановился на стратегии "шара". Я очистил данные APPL (очень объемный торгуемый запас) и установил свои индексы времени в течение каждого торгового дня в качестве эталонных значений для всего рынка. У всех дней было минимум 13 приращений, что соответствует 6,5-часовому торговому дню, но у некоторых было 14 или 15. Если это было так, я просто уселся, взяв первые 13 индексов. Оттуда я использовал цикл while, чтобы существенно продвигаться через загруженные данные каждого биржевого тикера и сравнивать его индексы времени в течение данного учебного дня с отметками времени APPL. Я сохранил перекрытие, заполнил пробел отсутствующими данными и вырезал неперекрывающиеся части.

Похоже на простое исправление, но для малообъемных акций с разреженными данными транзакций было буквально десятки особых случаев, которые я должен был испечь, и много данных для интерполяции. Я получил некоторые довольно причудливые результаты для некоторых из них, которые, как я знаю, неверны. Тем не менее, для акций большого объема, средней и большой капитализации решение работало блестяще: по большей части серия была очень аккуратно синхронизирована с данными APPL и идеально соответствовала их профилям Google Finance.

Нет никакого способа избежать того, что этот метод вводит некоторую ошибку, и мне все еще нужно точно настроить метод для запасных маленьких шапок. Тем не менее, сдвиг серии на полчаса или заполнение пробела за один раз приращение вводит очень незначительную погрешность относительно общего движения рынка и запаса. Я уверен, что этот набор данных, который у меня есть, "достаточно хорош", чтобы позволить мне получить ответы на некоторые вопросы, которые у меня есть. Получение этого материала коммерчески стоит буквально тысячи долларов.

Мысли или предложения?

Ответ 3

Почему бы не загрузить данные из Quandl? Например.

library(Quandl)
Quandl('YAHOO/AAPL')

Обновление: извините, я только что понял, что с Quandl извлекаются только ежедневные данные, но я оставляю здесь свой ответ, поскольку Quandl действительно легко запросить в подобных случаях

Ответ 4

Для смещения временной зоны попробуйте:

as.POSIXct(1357828200, origin = '1970-01-01', tz = Sys.timezone(location = TRUE))

(tz будет автоматически настраиваться в соответствии с вашим местоположением)