在本地缓存和更新OHLC历史股票报价

时间:2011-12-15 02:16:09

标签: quotes finance stock google-finance yahoo-finance

好的,我并不是说这是另一个“如何获得历史股票数据”的问题。

我已经找到了大量现成的资源,甚至可以从Google财经,雅虎和Finviz等网站直接下载到CSV。

我积极撰写的软件使用了方便的工具,包括YahooFinance和Dirk Eddelbuettel的精美Beancounter。

我的问题是,或许特别是如果有人熟悉beancounter,当我查询单个股票的日终价格时,我如何确保所有历史数据都被缓存(例如,本地文本或sqlite文件)这样可以最大限度地减少对网络的影响并加快重复查询重叠的时间框架?

导致网络查找当前的实时价格(如果可用)是不可避免的,这本身就很好。 我的pricehist.sh脚本结合了N天前库存的OHLCV价格,也可以很容易地抓住,例如。 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能够:

  • 查看今天的当前市场数据(如果有的话),因此如果会话未结束,收盘价实际上是最后价格。 DONE
  • 检查该股票代码的剩余请求历史记录是否尚未存储在本地,否则:
  • 查看VQT历史可以追溯到6天,存储并打印完成的表格。 DONE

尽管我所有的搜索,我仍然不确定如何让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代理日志中的Web流量。在我的引擎的几个处理阶段,数以千计的EOD查询经常重叠,导致这些Web查找成为主要瓶颈。

我认为这个轮子已经被发明了,如果必须的话,我将使用完整的RDBMS后端,尽管这会对MySQL客户端的Ruby,Perl和Bash脚本造成负担。

相比之下,我为波兰股票市场建立的只维护大约700个符号中的每个符号的文本文件并仅由grep,sed和awk处理的速度非常快 - 几乎是即时的,尽管有数千个循环的循环等效脚本 - 所以我的软件每天上市前进行GPW交换,只需几分钟而不是几小时。

1 个答案:

答案 0 :(得分:0)

我正在做点什么。

Beanite文件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查询,它结合了今天的实时价格(如果可用)+ 缓存历史日终记录。