高阶函数

介绍

DolphinDB内置的高阶函数,可以扩展或增强函数或者运算符的功能。高阶函数以一个函数与数据对象作为输入内容,类似于一个函数和数据之间的管道。通常,输入数据首先以一种预设的方式被分解成多个数据块(可能重叠),然后将函数应用于每个数据块,最后将所有的结果组合为一个对象返回。高阶函数的输入数据可以是向量、矩阵或者表,也可以是标量或字典。通过使用高阶函数,某些复杂的分析任务可以用几行代码就可以高效地完成。

语法

高阶函数总是与运算符、用户自定义函数或者系统函数共同使用。所有的高阶函数符号以冒号开头,之后紧跟一个大写字母。

higherOrderFunctionName (<functionName>, functionParameter1, …functionParameterN)

<functionName> :<higher order symbol> functionParameter

functionParameter1 <functionName> :<higher order symbol> functionParameter2

DolphinDB中,所有高阶函数的第一个参数必须是一个函数名,不可以是函数名数组。如果需要在同一个高阶函数中调用多个函数,可以指定该高阶函数的第一个参数为 call 高阶函数,然后在 call 的参数中指定多个函数,详情请见 call

注意:从 1.30.17 版本开始,高阶函数的第一个参数会被强制解析为函数。

高阶函数总结

下面的表中,总结了高阶函数的名字和应用场景。

符号

函数名

应用范围

典型应用

:E

each

二元运算符,一元运算符,函数调用

多因子Alpha策略回测

peach

并行版本的each

:R

eachRight

二元运算符

:L

eachLeft

二元运算符

:P

eachPre

二元运算符

国内股票行情数据导入实例

:O

eachPost

二元运算符,函数调用

pivot

函数调用

原始数据或分组聚合结果进行行列转置

:A

accumulate

二元运算符,函数调用

:T

reduce

二元运算符,函数调用

:G

groupby

函数调用,二元运算符

最简最快的WorldQuant 101 Alpha因子实现

:C

cross

二元运算符,函数调用

多因子Alpha策略最佳因子权重

pcross

并行版本的cross

高频数据处理技巧:数据透视的应用

moving

函数调用(聚合函数),二元运算符

寻找相似的历史k线

window

函数调用

应用同 moving。moving 的窗口右边界固定,但 window 函数的左右边界均可自由设定

nullCompare

函数调用,二元运算符

保留运算中的空值,使运算结果和 Python 的保持一致。

loop

二元运算符,一元运算符,函数调用,混合返回类型

DolphinDB文本数据加载教程

ploop

并行版本的loop

all

二元运算符,函数调用

any

二元运算符,函数调用

call

二元运算符

通常与each函数配合使用,实现同时调用一批函数。其入参个数不确定

pcall

并行版本的call

unifiedCall

函数调用

应用同 call,其只接收1个入参

:X

contextby

函数调用,二元运算符

分组内进行指定的计算

segmentby

函数调用,二元运算符

技术信号回测

rolling

函数调用,二元运算符

计算APPL相对于市场(SPY)的beta值

withNullFill

二元运算符

使用特定值替换Null值参与计算

byRow

函数调用

矩阵按行计算

talib

函数调用

使 DolphinDB 函数与 Python TA-lib 库中的函数行为保持一致

tmoving

函数调用

将一个函数应用到一个时间类型的窗口上,窗口右边界固定

twindow

函数调用

应用同 tmoving,但 twindow 函数的左右边界均可自由设定

上表中的符号可以迭代使用,按从左到右顺序执行符号对应的分解操作,将分解后的数据块应用于函数或操作符,最后将各子任务的结果组合为一个对象并返回。 比如 X <operator> :E:L Y,先对 X 和 Y 执行 :E 对应的分解(拆解为 X(i), Y(i)),再执行 :L 对应的分解操作后作用于操作符, 即对每一个 X(i) 执行了 X(i) <operator>:L Y(i),最后组合各个子任务的结果并输出。具体例子如下:

$ a=1 2 3
$ b=4 5 6
$ c=(a,b)
$ re=c +:E:L c
$ re
(1 2 3
- - -
2 3 4
3 4 5
4 5 6
,4  5  6
-- -- --
8  9  10
9  10 11
10 11 12
)

分解和组装规则

通常来说,一个向量被分解成多个标量,一个 tuple 被拆分出各个元素(各元素的形式不同),一个矩阵被分解成多列(向量),一个表或字典被分解成多行(字典)。

在组装阶段,标量类型合并组成一个向量,向量合并成一个矩阵,字典合并成一张表,其它情况(数据形式不一致时)合并成一个元组。

高阶函数按元素遍历向量/tuple,按列遍历矩阵,按行遍历表或字典。