我正在尝试在 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 值替换为前面的值。 loop
和 eachPost
都是两个高阶函数。
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/