Кэширование и обновление исторических котировок акций OHLC локально

Хорошо, я не хочу, чтобы это был еще один вопрос «как мне получить исторические данные об акциях».

Я уже нашел множество легкодоступных источников для этого, даже аккуратно экспортированных в прямые загрузки CSV из таких компаний, как Google Finance, Yahoo и Finviz.

Программное обеспечение, которое я пишу, активно использует удобные инструменты, включая YahooFinance и прекрасный Beancounter Дирка Эддельбюттеля.

Мой вопрос, возможно, особенно если кто-то знаком с beancounter, когда я запрашиваю цены на конец дня для одной акции, как я могу убедиться, что все эти исторические данные кэшируются (например, в локальный текст или файлы sqlite), чтобы свести к минимуму попадание в Интернет и ускорить повторные запросы, перекрывающие временные рамки?

Вызов сети для поиска сегодняшней цены в реальном времени, если она еще доступна, неизбежно, что само по себе нормально. Мой скрипт pricehist.sh сочетает это с ценами OHLCV на акции N дней назад, которые также можно легко получить, например. wget или curl по правильному URL + правильные переменные GET.

$ ./pricehist.sh VQT 6
VQT  2011-12-14  125.50  125.50  124.43  124.49  20360 
VQT  2011-12-13  128.00  128.00  125.28  125.39  24400 
VQT  2011-12-12  127.50  127.50  126.36  126.66  9100  
VQT  2011-12-09  128.00  128.31  127.82  128.14  12100  

В приведенном выше примере я бы хотел, чтобы файл pricehist.sh:

  • просмотрите текущие рыночные данные на сегодня, если таковые имеются, поэтому цена закрытия фактически является последней ценой, если сессия еще не закончилась. ВЫПОЛНЕНО
  • Убедитесь, что остальная часть запрошенной истории для этого тикерного символа еще не сохранена локально, в противном случае:
  • Посмотрите историю VQT за 6 дней, сохраните ее и распечатайте заполненную таблицу. ВЫПОЛНЕНО

Несмотря на все мои поиски, я все еще не уверен, как заставить beancounter просто выводить таблицу OHLCV одной акции независимо от портфеля ... НЕ этот вывод:

$ setup_beancounter -l beancounter.stockdata.sqlite
$ beancounter addstock  VQT ACPW
$ beancounter backpopulate --prevdate '1 month ago' --date 'today'  VQT ACPW 
   Adding VQT from 20111114 to 20111214
   Adding ACPW from 20111114 to 20111214

$ beancounter dayendreport --prevdate '1 month ago' --date 'today'  VQT
## ..... hoping for OHLCV table of VQT only but get this instead:
===============================================================================
Profit / loss         from 12 Dec 2011  to 14 Dec 2011  abs, rel change
-------------------------------------------------------------------------------
Citigroup, Inc. N  USD    2690.00    26.90    2605.00    26.05   -85.00  -3.16%
Exxon Mobil Corpo  USD    6039.75    80.53    5958.00    79.44   -81.75  -1.35%
Google Inc.        USD   15640.75   625.63   15451.75   618.07  -189.00  -1.21%
International Bus  USD    9557.50   191.15    9436.00   188.72  -121.50  -1.27%
-------------------------------------------------------------------------------
Grand Total        USD   33928.00            33450.75           -477.25  -1.41%
===============================================================================

Используя вместо этого модуль Perl Finance, я просто не вижу, где активировать кеширование и какие локальные файлы данных будут использоваться для хранения. Каждый вызов yahoofinance.rb показывает мне его веб-трафик в журналах прокси-сервера Squid. Тысячи запросов EOD, часто перекрывающихся на нескольких этапах обработки моего движка, делают эти поисковые запросы в Интернете серьезным узким местом.

Я полагаю, что это колесо должно быть уже изобретено, и я буду использовать полный бэкэнд РСУБД, если потребуется, хотя это будет означать обложение моих скриптов Ruby, Perl и Bash с клиентами MySQL.

Для сравнения, то, что я построил для польского фондового рынка, поддерживающий только текстовые файлы для каждого из примерно 700 символов и обрабатываемый только с помощью grep, sed и awk, невероятно быстр - почти мгновенно, несмотря на тысячи циклов цикла эквивалентных скриптов - так что Ежедневная предмаркетная обработка моего программного обеспечения для обмена GPW выполняется за минуты, а не часы.


person Marcos    schedule 15.12.2011    source источник


Ответы (1)


Я кое-что понимаю.

Файл SQLite, который использует Beancounter, включает таблицу с этими ежедневными записями OHLCV:

Table: stockprices
#   |symbol|date    |previous_close|day_open        |day_low         |day_high        |day_close|day_change|bid   |ask   |volume    
----+------+--------+--------------+----------------+----------------+----------------+---------+----------+------+------+----------
1   |C     |20111214|26.9          |26.45           |25.92           |27.19           |26.05    |-0.85     |      |      |68284528  
2   |IBM   |20111214|191.15        |189.84          |188.0           |190.28          |188.72   |-2.43     |      |      |5031717   
3   |GOOG  |20111214|625.63        |621.49          |612.49          |624.32          |618.07   |-7.56     |617.59|618.95|3892889   
31  |HD    |20111214|39.51         |39.45           |38.84           |39.57           |39.14    |-0.37     |      |      |12021824  
32  |IBM   |20111213|              |193.46          |190.64          |194.3           |191.15   |          |      |      |5008400   
33  |IBM   |20111212|              |193.64          |191.22          |193.9           |192.18   |          |      |      |3796100   
34  |IBM   |20111209|              |192.91          |192.4           |194.87          |194.56   |          |      |      |4847900   

Итак, затем я перепишу свой процесс, чтобы использовать beancounter для добавления и обновления запасов по мере необходимости, и, поскольку его отчет по данным EOD отсутствует или не работает для меня, я изучаю соответствующие команды sqlite, чтобы вытащить его непосредственно из базы данных, массируйте вывод по мере необходимости с помощью sed / awk и отправляйте сюда.

В конце у меня должен быть простой запрос pricehist.sh, который объединяет текущие текущие цены (если они есть) + кэшированные исторические записи на конец дня.

person Marcos    schedule 16.12.2011