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