好的,我并不是说这是另一个“如何获得历史股票数据”的问题。
我已经找到了大量现成的资源,甚至可以从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能够:
尽管我所有的搜索,我仍然不确定如何让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交换,只需几分钟而不是几小时。
答案 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查询,它结合了今天的实时价格(如果可用)+ 缓存历史日终记录。