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

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

问题描述:

好的,我不是说这是另一个“我如何获取历史股票数据”的问题。本地缓存和更新OHLC历史股票报价

我已经找到了很多现成的来源,甚至可以整齐地导出到Google Finance,Yahoo和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到实例:

  • 查找最新市场数据,今天如果有,那么收盘价实际上是最后价格,如果会议没有结束。完成
  • 检查该股票代码的所请求历史记录的其余部分是否尚未存储在本地,否则:
  • 查看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财务模块代替,我只是看不到在哪里激活缓存,也不知道本地数据文件将用于存储。每次调用yahoofinance.rb都会显示其在squid代理日志中的网络流量。成千上万的EOD查询经常在我的引擎的几个处理阶段重叠,导致这些Web查询成为主要瓶颈。

我认为这个轮子已经被发明出来了,如果必须的话,我会使用一个完整的RDBMS后端,尽管这意味着我的Ruby客户端,Perl客户端和Bash脚本会被征税。

通过比较,我为波兰股票市场建立的只维护大约700个符号的每个文本文件,并且仅由grep,sed和awk进行处理的速度非常快 - 几乎是瞬间的,尽管数千个循环的等价循环脚本 - 所以我的软件每天上市前的GPW交换是在几分钟内完成的,而不是几个小时。

我正在做点什么。

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