A KDB+/Q DataStore Plugin for RightEdge Edition 2

Discussion in 'kdb+' started by zwz, Feb 28, 2009.

  1. 至此,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,想看一下目前记录总数。结果出现得太快了。以至于我愣了半天。:D

    最后,必须承认:
    1、Arthur Whitney。牛!
    2、zwz。牛!
    3、itfin。牛!
     
  2. zwz

    zwz

    在q里面完成所有计算的速度才叫快。QDataStore是将数据取出来通过TCP/IP传到RE里面计算,速度比mssql快不了多少是正常的,实际上比LocalDataStore慢,不过能带来一些其它方便的好处。
    QDataStore当前版本为0.5,存在一些不足和待改进之处。如,保存tick数据时一条数据写一次磁盘带来性能下降;未实现区分品种、交易所、到期日、货币等(该问题比较严重,近期解决);未实现修改、删除bar/tick数据功能等。。。。。。。。
     
  3. 倚天屠龙 谁与争锋
     
  4. 看过q的文档的命令,用它来做数据的timeframe转换也会是非常方便的.只要有tick数据,在q里面可以很方便的转换成其他周期的数据.

    不过快速确实在q里面才有,所以我把kdb放下了.过段时间有空才来摸摸
     
  5. kdb 这两小时的限制咋解决哪?总不至于买吧。呵呵
     
  6. 1、自动退出后,如果还要用,再进;
    2、q比较冷门,相信大多数人不会尝试用;尝试的人,大多数不会坚持。:D
     
  7. 目前看下来,好像kdb是不多的针对时间序列的In-memory DB。想在这上面做些高频交易的东西。
     
  8. :D资料不好找,语法不习惯. 我会用的,不过目前打算在一些特殊应用下才会用一下,比如tick数据转1min数据等.

    windspeedo 打算怎么用?;)
     
  9. 1、作为数据库用;
    2、作为数组操作语言用;
    3、统计分析等复杂的分析,还是用R。不是因为q不行,而是自己水平不够。:D
     
  10. zwz

    zwz

    资料是少了点,不过只要把下面的东东各看N遍达到熟练掌握,就是q专家了:p
    Q for Mortals 2.0
    FD的那个手册
    code.kx.com
     
  11. 通过Q server for R,可以很方便地在R中调用kdb+的数据。
    前几天,kx又放出了R server for Q。可以在Q中直接调用R的各项功能。包括做图。
    可惜,琢磨了半天,估计要编译它提供的源码才行。这就复杂了。
     
  12. zwz

    zwz

    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方法进行修改。
     
  13. 第一时间同步更新。一切顺利。
    多谢。:D
     
  14. 发一段代码,庆祝QDataStore升级。:D
    有时候,我们需要将若干股票的信息如收盘价,按时间顺序并列,形成一个矩阵。再结合楼上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
    
     
  15. 昨天周末,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系统好。
    估计大多数人不需要修改这个方案。:D
     
  16. 老大,我来了,留个位置和大家一起学习
     
  17. 插件安装成功。
     
  18. 关于手工增加一条记录。
    假设要手工增加一条港币日线。
    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大表给删了。:D
    好在kdb+重建数据库也很快。:cool:
     
  19. zwz

    zwz

    把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)
     
  20. 从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