
FlyingOE(https://github.com/FlyingOE)是一位kdb+高手,他在“kdb+用户群”中热心回答了大量kdb+问题。经他本人同意,本公众号摘录了其一小部分答疑内容,供大家学习参考。
[注:“kdb+用户群”微信群汇集了国内主要kdb+使用者,主要交流kdb+的具体使用,群主为itfin。另一个微信群“kx公司服务支持”,主要交流kdb+购买、kx免费培训等,群主为kx公司工作人员。]
1、问:如何根据市值大小确定股票投资权重,同时限制单只股票的权重?例如,构建一个股票组合,有很多行业,每个行业有对应成份股,成份股的权重按市值来确定。部分行业里,有些个股一家独大,所占权重过大,现在要限制它们,当他们的权重超过30%,设定为30%。剩下70%的权重由这个行业剩余的个股来进行计算,也是按市值。这时可能仍有个股的权重大于30%,这时也要处理,将它调整为30%。
答:定义如下三个函数
norm:{x%sum x};
clamp:{(x*b)+(1-x*sumb)*norm@[y;where b:x<=z;:;0]};
weight:{clamp[x;y]/[normy]};
执行示例:weight[.3;9 1 2 6 8 1],其中0.3为权重上限,(9 1 2 6 8 1) 为市值数组。
2、问:研报标题格式为“股票简称:标题”时,如何取冒号后的标题部分,删除冒号以前的股票简称?
答:定义如下函数
f:{(count[y]+firstx ss y)_x}
执行示例:f[title;":"],其中title为存储研报标题的变量
3、问:如何将表转化为矩阵
q)t:([]a:1 23;b:4 5 6)
q)t
a b
---
1 4
2 5
3 6
答:value flip t,或 t`a`b
4、问:如何一次性利用多个分隔符切割字符串?例如,如何把 "业绩超出预期,10转;增10,受益建材下;乡" 的逗号和分号直接转换成 ("业绩超出预期";"10转增10";"受益建材下"; "乡"),一步到位,不分两次操作?
答:以中文标点逗号“,”及分号“;”为例
raze";"vs/:","vsstr,其中str为字符串变量
5、问:当表T中的某列为等长数组时,如何将这个数组中的所有值赋给相同数量的变量?例如,如何把 r的五项批量赋值给 x1...x5,不使用update x1:{x[0]} each r,x2:{x[1]} each r from 0!aa的方式?
)
答:T,'`x1`x2`x3`x4`x5!/:T`r
6、问:kdb中的0w代表什么含义
答: kdb中,0w代表正无穷而不是0。部分非法运算(如log 0)的结果会返回0w,因为kdb中的数学运算不会返回异常,以求得到速度上的优势。
7、问:用kdb处理朝阳永续一致预期数据,摘要字段字符串特别长,kdb取不出来,SqlServer就可以取出来,请问有没有啥解决方案?
h:hopen …;a:.odbc.eval[h]"select distinct report_id, stock_code, title, content, create_date,report_type from rpt_forecast_stk where report_type in(22,25,110)"; .odbc.close[h];
答:是sql server odbc驱动的问题。content字段的类型是varchar(MAX),不定长字段在odbc驱动里返回时存在问题(用oledb驱动会正常,但是kdb+只能用odbc)。建议在数据库中将字段改为定长类型,如varchar(8000),或是在查询中用cast把这个字段转换为varchar(8000)。
8、问:splayed table无法使用exec函数?例如:
codeList:execdistinct WindCode from min01 wheredate=dateList[i+delay-1];
答:splayed table不支持直接exec,只能先select,再转换。
9、问:通过\l 命令加载含有中文的q文件报错?如:stkrpttyp0:([]mdrpt:`03.31`06.30`09.30`12.31;mdann:`04.30`08.31`10.31`04.30;rpttyp:`$("一季度";"半年报";"三季度";"年报")); 直接在studio执行,中文显示正常。但是放在q文件里,通过 \l basedata.q导入。发现中文显示乱码,这个怎么解决?
答:把q文件保存为不带BOM的UTF-8编码。
10、问:如何批量替换数组元素,如将a: 1 2 3 4 5 6替换为 a: 10 20 30 4 5 6?
答:@[`a;1 2 3;:;10 20 30]
11、问:kdb有没有递归搜索文件的函数?即指定一个pattern,遍历指定文件夹,搜索满足pattern的文件。
答:fileSearch:{[d;p] $[-11h=t:type f:key d;$[last[` vsf]like p;f;()];11h=t;raze .z.s\:[;p] .Q.dd/:[d;f];()] }
12、问:kdb+tick tp日志文件很大时, rdb恢复时间很长(比如5分钟), 如果这时有新的数据到达tp, rdb是不是就丢失这些数据了?
答:不会,数据会堆积在内存里面,等replay结束之后,才会被处理。这也是为什么如果tplog太大的话,要注意replay的过程中有可能会导致'wsfull。主要是因为kdb+是单线程的,replay运行时,主线程已被占用,接收到的数据都只是放在缓存里面。解决方案很多,具体要看应用场景,自己挑个合适的方案去实现就是了,如:
1) rdb里加个.z.ts,定期把内存的东西保存成一个快照。下次恢复时直接读最新的快照,再从快照之后的数据开始replay。
2) 对tplog做log rotation,rotate出来的日志直接发送到rdb可读取的地方。需要replay时,直接从本地读取rotate出来的日志,再从tp找最新的数据。
3) 启动多个rdb。需要replay时,直接从别的rdb里读取数据,再从新数据开始replay。
4) 单独写一个简单的远程replay服务,有需要时才启动,读取tplog,以给rdb提供历史数据。
5)让kdb+对接kafka或solar之类的中间件,用中间件代替tp,可以直接从中间件里replay数据了。
《kdb+中文教程》
全文链接

《kdb+中文教程》
主要内容

kdb+号称是世界上最快的内存数据库,q是kdb+的内置语言。事实上kdb+/q不只是内存数据库,更是一款高性能大数据平台,它使用统一的数据库处理实时数据和历史数据,同时具备CEP(复杂事件处理)引擎、内存数据库、磁盘数据库等功能。与传统关系数据库及现代大数据平台相比,kdb+/q具有更快的速度和更低的总拥有成本,非常适合海量数据的快速采集、存储、分析、处理和检索等。kdb+/q最初主要被用于金融机构海量数据分析和高频交易,目前被广泛用于人工智能、机器学习、物联网、智能电网、航天等领域。
《kdb+中文教程》是一本关于kdb+/q的中文入门书籍,内容分为三大部分:
第一部分(第一章)为kdb+/q简介,主要介绍kdb+/q的优势及不同许可类型,同时介绍了kdb+/q的下载、安装、基本操作及数据表操作等。通过学习本章,读者可以快速了解kdb+/q的特性,同时对kdb+/q的独特、简洁等有一个初步直观感受。
第二章至第八章为第二部分,是本书的核心内容,分别为数据类型、数组、函数、字典、表与qSQL、I/O操作及数据库。首先介绍了kdb+/q的基本数据类型,然后介绍了kdb+/q的数组(列表)、函数、字典、表,最后介绍了文件I/O操作、进程间通讯、数据库构建等。通过这部分内容的学习,读者可以掌握kdb+/q的基础知识,为kdb+/q的运用打下坚实基础,逐步将kdb+应用于实际场景,同时能进一步感受kdb+/q的简洁、灵活与强大等。
第三部分包括第九章和第十章。第九章通过实例介绍kdb+在股票期货数据处理方面的常见应用,包括历史行情数据库构建、策略回测与优化、实时行情处理等,并简单介绍了企业级开源证券期货交易平台Tx。第十章把一些可能有用的知识点以问答形式列出来,方便读者需要时查找。通过这部分内容的学习,读者可以参考常见应用实例,举一反三。




