好的,我并不是说这是另一个“我如何获得历史股票数据”的问题。
我已经找到了大量现成的资源,甚至可以从 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 :
- 如果有的话,请查看今天的当前市场数据,因此如果交易时段未结束,收盘价实际上是最后价格。完毕
- 检查该股票代码的其余请求历史记录是否尚未本地存储,否则:
- 查找 6 天前的 VQT 历史记录,存储并打印完成的表格。完毕
尽管我进行了所有搜索,但我仍然不确定如何让 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 查询,通常是重叠的,在我的引擎的几个处理阶段导致这些 Web 查找成为主要瓶颈。
我认为这个轮子应该已经被发明出来了,如果必须的话,我会使用完整的 RDBMS 后端,尽管这意味着我的 Ruby、Perl 和 Bash 脚本会使用 MySQL 客户端。
相比之下,我为波兰股票市场构建的仅维护大约 700 个符号中的每一个的文本文件,并且仅由 grep、sed 和 awk 处理的内容非常快——尽管循环了数千个循环等效脚本,但几乎是瞬时的——所以我的软件对 GPW 交易所的每日上市前处理是在几分钟而不是几小时内完成的。