kdb - 在DolphinDB数据库中重写kdb脚本

标签 kdb dolphindb

我正在尝试在 DolphinDB 中重写 kdb 脚本。

首先让我解释一下我需要做什么。如果信号高于阈值 T1,我们就建立该证券的多头头寸。我们不想在信号跌破 T1 时立即平仓,因此我们给它一个缓冲:只有当信号跌破 T10(小于 T1)时我们才平仓。

另一方面,如果信号低于阈值 T2,我们建立空头头寸。只有当信号移动到 T20>T2 以上时我们才会平仓。

T1>T10>T20>T2。

基本上我需要以下向量:

 - if signal>T1, return 1. Subsequent elements are 1 until when signal<T10; 
 - if signal<T2, return -1. Subsequent elements are -1 until when signal>T20;
 - 0 otherwise

上述任务的 kdb 脚本是:

0h^fills(-).(0N 1h)[(signal>T1;signal<T2)]^'(0N 0h)[(signal<T10;signal>T20)]

有人如何在 DolphinDB 中重写它吗?

最佳答案

我在 DolphinDB 版本 0.97.4 中进行了直译

eachPost(-, loop(nullFill, [iif(signal<T10, 0h, 00h), iif(signal>T20, 0h, 00h)], [iif(signal>T1, 1h, 00h), iif(signal<T2, 1h, 00h)]))[0].ffill().nullFill(0h)

iif(cond, trueResult, falseResult) 是逐元素条件函数。 00h 表示短类型的空值。 nullFill(X, Y) 将 X 中的 null 值替换为 Y 中的相应值。ffill(X) 将 X 中的 null 值替换为前面的值。 loopeachPost 都是两个高阶函数。

DolphinDB 中的测试用例

T1= 60
T10 = 50
T20 = 30
T2 = 20
signal = 10 20 70 59 42 49 19 25 26  35
eachPost(-, loop(nullFill, [iif(signal<T10, 0h, 00h), iif(signal>T20, 0h, 00h)], [iif(signal>T1, 1h, 00h), iif(signal<T2, 1h, 00h)]))[0].ffill().nullFill(0h)

-1 -1 1 1 0 0 -1 -1 -1 0

KDB+ 中的测试用例

T1:60
T10:50
T20:30
T2:20
signal:10 20 70 59 42 49 19 25 26  35
0h^fills(-).(0N 1h)[(signal>T1;signal<T2)]^'(0N 0h)[(signal<T10;signal>T20)]

-1 -1 1 1 0 0 -1 -1 -1 0

我还进行了快速性能比较。我生成了 1000 万个随机信号,并分别在 DolphinDB 和 KDB+ 中运行上述表达式。 KDB+ 花费了 800 毫秒,而 DolphinDB 仅花费了 480 毫秒。以下是性能测试代码。

//DolphinDB
T1= 60
T10 = 50
T20 = 30
T2 = 20
signal = 1 + rand(99.0, 10000000)
timer eachPost(-, loop(nullFill, [iif(signal<T10, 0h, 00h), iif(signal>T20, 0h, 00h)], [iif(signal>T1, 1h, 00h), iif(signal<T2, 1h, 00h)]))[0].ffill().nullFill(0h)

//KDB+
T1:60
T10:50
T20:30
T2:20
signal: 1.0 + 10000000 ? 99.0
\t  0h^fills(-).(0N 1h)[(signal>T1;signal<T2)]^'(0N 0h)[(signal<T10;signal>T20)]

关于kdb - 在DolphinDB数据库中重写kdb脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57529114/

相关文章:

KDB:选择对应于两个更新列的行

kdb - q kdb中sublist和take operator(#)的比较

matrix - kdb 矩阵函数改进

python - DLL 加载失败,而 `import dolphindb`

mysql - 在 dolphindb 中删除一个表

kdb/q : apply the function, 再次将返回值传递给函数,多轮

architecture - 在 kdb 植物中有一个 tickerplant 有什么用?

KDB select查询和vs函数

python - 在DolphinDB的Python API中,使用s.loadTable和s.table加载内存表有什么区别?