1

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

我已经找到了大量现成的资源,甚至可以从 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 交易所的每日上市前处理是在几分钟而不是几小时内完成的。

4

1 回答 1

0

我正在做某事。

Beancounter 使用的 SQLite 文件包含一个包含以下 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 查询,它结合了今天的实时价格(如果可用)+缓存的历史收盘记录。

于 2011-12-16T15:22:19.460 回答