至此,QDataStore在我的电脑上完美运行。 1、完美支持yahoo数据plugin; 2、完美支持定制历史数据plugin; 3、完美支持q 2.4与q 2.5。 简单汇报一下kdb+相对于ms sql的情况: 1、内存占用远远小于ms sql。 以前在ms sql下,完全生成A股日线数据,内存占用很快从1.4G左右上升到2.5G(物理内存3G),然后就一直顶着内存上限,直接影响其它程序运行。如果没有在sql中限制它使用内存不超过1G,影响还会更严重。 kdb+下,内存占用从1.41G上升缓慢,最终也不过1.54G。 2、数据库文件远远小于ms sql。 ms sql下,全部A股日线数据生成的数据库好像超过1G,具体记不清了。 kdb+下,200M。(估计比二进制flat file只大一点点) 3、CPU占用 如同我用过的其它软件,q也不能在双核之间均衡负载。但一颗内核似乎也够了。毕竟更新数据的时候,读取硬盘弄不好更是个速度瓶颈。 运行数据更新的同时,完全不影响其它程序。 4、速度 大批量更新数据的速度明显快于ms sql。感觉至少快一倍。 在re中双击symbol绘图的速度似乎与ms sql相差不大。在双击和绘图之间,都有一个可察觉的停顿。 在数据更新过程中,在q里面输入count select from daily,想看一下目前记录总数。结果出现得太快了。以至于我愣了半天。 最后,必须承认: 1、Arthur Whitney。牛! 2、zwz。牛! 3、itfin。牛!
在q里面完成所有计算的速度才叫快。QDataStore是将数据取出来通过TCP/IP传到RE里面计算,速度比mssql快不了多少是正常的,实际上比LocalDataStore慢,不过能带来一些其它方便的好处。 QDataStore当前版本为0.5,存在一些不足和待改进之处。如,保存tick数据时一条数据写一次磁盘带来性能下降;未实现区分品种、交易所、到期日、货币等(该问题比较严重,近期解决);未实现修改、删除bar/tick数据功能等。。。。。。。。
看过q的文档的命令,用它来做数据的timeframe转换也会是非常方便的.只要有tick数据,在q里面可以很方便的转换成其他周期的数据. 不过快速确实在q里面才有,所以我把kdb放下了.过段时间有空才来摸摸
通过Q server for R,可以很方便地在R中调用kdb+的数据。 前几天,kx又放出了R server for Q。可以在Q中直接调用R的各项功能。包括做图。 可惜,琢磨了半天,估计要编译它提供的源码才行。这就复杂了。
v0.6更新:区分品种、交易所、到期日等,sym字段的格式如下: 股票、债券、指数、外汇,sym的格式为:symbolName.Exchange,如000001.SZ; 期货,sym的格式为:symbolName_yyyyMM.Exchange,如HSI_200903.HKFE; 期权、期货期权,sym的格式为:symbolName_yyyyMM_strikeprice_C.exhange,如xxxx_200905_30.30_C.EX。 如果SymbolInformation中的Sector不为空,则sym=Sector。。。 可以根据自己的需要对reSymbol2qSym方法进行修改。
发一段代码,庆祝QDataStore升级。 有时候,我们需要将若干股票的信息如收盘价,按时间顺序并列,形成一个矩阵。再结合楼上zwz大侠给出的获取股票名称的代码,使输出结果更加直观(我的数据库中,股票代码的形式为SH600001,SZ000002等)。在Q里的相关代码如下: Code: \读数据 \l d:/qdata/fdb ra:0!select date,close by sym from daily where (sym like "SH60*") or (sym like "SZ00*"),date > 2008.1.1d rc:{`date xkey (`sym`date,`$(string ra[x;`sym]),".close") xcol flip ra[x]} each til count ra \并列股票数据 rs:rc[0];rx:1 do[(count rc)-1;rs:rs,'rc[rx];rx:rx+1] rs:delete sym from rs `date xasc `rs /读windin的证券代码 from zwz syms:flip `sym`name`stype! ("SSS";",")0: `:c:/Windin/WWT2008/etc/SECBASICHIS.DAT; delt:flip `op`sym`name`stype! ("ISSS";",")0: `:c:/Windin/WWT2008/etc/SECBASICDELT.DAT; delete from `syms where sym in exec sym from delt where op>0; syms:syms,select sym,name,stype from delt where op=0; /将股票代码替换成股票名称 oldcol:cols rs oldname:(2_'8#'string oldcol[1_ til count oldcol]),'".",'(2#'string oldcol[1_ til count oldcol]) rs:(`date,txf[`sym xkey syms;`$oldname;`name]) xcol rs
昨天周末,IB系统不开。 今天测试了IB接口。一切顺利。 QDataStore 0.6自动生成的symbol如下: HSI_200903.HKFE HSI_200904.HKFE K200_200906.KSE MHI_200903.HKFE MHI_200904.HKFE STW_200903.SGX STW_200904.SGX EUR_200903.GLOBEX EUR/GBP.IDEALPRO GBP_200903.GLOBEX 非常简洁明晰。比RightEdge原来的SymbolID系统好。 估计大多数人不需要修改这个方案。
关于手工增加一条记录。 假设要手工增加一条港币日线。 Code: //设定空表格式。根据3楼。 hkd:([] sym:`symbol$();date:`date$();open:`float$();high:`float$();low:`float$();close:`float$();volume:`long$();openint:`long$()) //向空表中注入一条记录。根据QDataStore源码。 `hkd insert (`$"HKD/USD.IDEAL";2009.03.03d;0.1290;0.1295;0.1285;0.1290;2j;2j) //将这个表合并到daily大表中。根据QDataStore源码。 //2009年4月3日修订 .[`:d:/qdata/fdb/daily/;();,;.Q.en[`:d:/qdata/fdb]hkd] 上面这个代码似乎没有考虑splayed因素。daily表本身可能是个splayed表。上面将它当作普通表操作,会不会有后遗症呢? 请zwz兄帮助举例示范一下 1、如何从大表中删除一条、若干条记录。 2、如何从大表中修改一条、若干条记录。 您的代码肯定是最高效的。 我刚才为了增加一条记录,一不小心,将整个daily大表给删了。 好在kdb+重建数据库也很快。
把splayed表当普通表操作是行不通的,.[`:d:/qdata/fdb/daily;();,;hkd] 无法成功执行吧。d:/qdata/fdb/daily后加/就OK了。 从splayed大表中删除/修改一条、若干条记录不能象一般数据库软件那样操作(KDB+的设计思路不一样),可以把整个表加载到内存,修改内存表后重新保存为磁盘表,另外可参考下面的帖子: If you want to *update *just one column or one column based on others, you can map the columns you'd like to modify in with get, change it/them and then flush back to disk set. When *deleting *data you have to read/modify/write every column to keep the vectors the same size so you may as well let q load it in for you. If for some reason memory is an issue i.e. not partitioned), you can follow the same approach as the update, but in a loop for all columns. A huge splayed table that is not part'ed in some way is probably not recommended though. (by Tim Rieder)
从daily表中删除一些记录 Code: \l d:/qdata/fdb select from daily where sym like "EUR/USD*", date>2009.3.10d delete from `daily where sym like "EUR/USD*", date>2009.3.15d `:d:/qdata/fdb/daily/ set daily