表达式函数
由small_q创建,最终由small_q 被浏览 100 用户
BigQuant的DAI数据平台提供了许多字段运算的表达式函数,完整的函数在这个文档(DAI SQL 函数列表),我们这篇文档总结了一些常见的表达式
1. DAI数据平台表达式函数的使用
1.1 输入特征模块中使用表达式函数
DAI数据平台封装的表达式函数,需要在可视化模式下的“输入特征(DAI SQL)”模块中的“表达式特征”一栏中填写,之后再连接数据抽取模块就可以把该表达式的计算抽取出来
例如,我们以5日平均收盘价m_avg(close, 5)
为例
1.2 将表达式函数计算出来的字段命名
我们可以给表达式函数计算出来的字段命名,在表达式函数写好后,我们在后面加上一个空格,再加上AS 新名字
,就完成了对计算字段的命名
例如,我们想计算5日平均收盘价,并起名为“close_avg_5”,就可以写为m_avg(close, 5) AS close_avg_5
1.3 将字段命名为临时变量
临时变量(哑变量)的作用是只在表达式运算的过程中,起到中间变量的作用,并不会出现在最终数据抽取的结果中,将变量命名为临时变量,只需在给它起的名前加一个下划线即可
例如,我们想计算5日平均收盘价为临时变量,并起名为“_close_avg_5”,就可以写为m_avg(close, 5) AS _close_avg_5
,之后我们按照这个临时变量把全市场股票排序,计算出c_rank(_close_avg_5)
从最终的提取结果我们可以看到,_close_avg_5
作为一个中间变量并没有被提取出来
\
2. 时序计算函数与截面计算函数
2.1 时序计算函数与截面计算函数的区别
金融数据都是从两个维度进行展开的:时间维度&标的维度
时序计算指的是,对于同一标的,不同时间的数据进行操作,例如:
- 对于贵州茅台一只股票,求过去5天收盘价的平均
- 对于贵州茅台一只股票,求过去20天的收益率
- 对于贵州茅台一只股票,求MACD指标(TA-Lib指标)
截面计算指的是,对于同一时间,不同标的的数据进行操作,例如:
- 2024-04-30这一天,全市场股票的收盘价的平均
- 2024-04-30这一天,全市场股票的收盘价的降序排名名次
- 2024-04-30这一天,全市场股票的
以下一张图展示了时序计算函数与截面计算函数的区别
2.2 DAI数据平台的时序运算函数
DAI平台封装的时序运算函数都是以m_开头的,并且函数的参数中基本都要填入窗口大小这个参数,常见的有(只展示部分典型,全部请参考DAI SQL 函数列表):
函数 | 功能 |
---|---|
m_lag(字段, 窗口大小) |
时间序列上,字段向历史的偏移值 |
m_lead(字段, 窗口大小) |
时间序列上,字段向未来的偏移值 |
m_sum(字段, 窗口大小) |
时间序列上,字段在时间窗口中的求和 |
m_product(字段, 窗口大小) |
时间序列上,字段在时间窗口中的求积 |
m_avg(字段, 窗口大小) |
时间序列上,字段在时间窗口中的平均 |
m_stddev(字段, 窗口大小) |
时间序列上,字段在时间窗口中的标准差 |
m_variance(字段, 窗口大小) |
时间序列上,字段在时间窗口中的方差 |
m_skewness(字段, 窗口大小) |
时间序列上,字段在时间窗口中的偏度 |
m_kurtosis(字段, 窗口大小) |
时间序列上,字段在时间窗口中的峰度 |
m_covar_samp(字段1, 字段2,窗口大小) |
时间序列上,字段1和字段2在时间窗口中的协方差 |
m_corr(字段1, 字段2,窗口大小) |
时间序列上,字段1和字段2在时间窗口中的相关系数 |
m_max(字段, 窗口大小) |
时间序列上,字段在时间窗口中的最大值 |
m_min(字段, 窗口大小) |
时间序列上,字段在时间窗口中的最小值 |
m_rank(字段, 窗口大小) |
时间序列上,字段在时间窗口中的升序排名 |
m_pct_rank(字段, 窗口大小) |
时间序列上,字段在时间窗口中的升序百分比排名 |
2.3 DAI数据平台的截面运算函数
DAI平台封装的时序运算函数都是以c_开头的,而且基本不需要指定窗口大小,常见的有(只展示部分典型,全部请参考DAI SQL 函数列表):
函数 | 功能 |
---|---|
c_sum(字段) |
在截面上,所有标的字段的求和 |
c_avg(字段) |
在截面上,所有标的字段的平均 |
c_std(字段) |
在截面上,所有标的字段的标准差 |
c_var(字段) |
在截面上,所有标的字段的方差 |
c_rank(字段) |
在截面上,所有标的字段的升序排名 |
c_pct_rank(字段) |
在截面上,所有标的字段的升序百分比排名 |
c_cbins(字段, 组数) |
在截面上,所有标的按照字段排名后分成等大小的组 |
\
3. DAI平台的其他常用表达式函数
3.1 运算符
表达式计算中是支持加减乘除这样的简单运算符的,常见的有
运算符 | 功能 | 用例 |
---|---|---|
+ |
加法 | close + open |
- |
减法 | close - open |
* |
乘法 | close * 2 |
/ |
除法 | volume / amount |
** 或 ^ |
指数 | close ^ 2 |
() |
括号 | (high + low) / 2 |
3.2 简单标量计算
简单标量计算函数可以在所有数字类型的字段上使用,而且不分截面或者时序
函数 | 功能 |
---|---|
abs(X) |
X的绝对值 |
exp(X) |
e的X次方 |
log(底数, X) |
X的以自定义底数为底的对数 |
ln(X) |
X的以e为底的对数 |
log10(X) |
X的以10为底的对数 |
log2(X) |
X的以2为底的对数 |
pow(X, Y) 或 power(X, Y) |
X的Y次方 |
least(X, Y) |
返回X与Y当中的小者 |
greatest(X, Y) |
返回X与Y当中的大者 |
3.3 三元表达式
在DAI数据平台中,三元表达式是使用IF(条件, X, Y)
的格式来定义的,含义是如果条件满足,则为X,如果条件不满足,则为Y
我们来看两个例子:
IF(close < m_lag(close, 1), 1, 0)
:如果今日收盘价小于昨日收盘价,就标记一个1,否则就标记一个0IF(float_market_cap > 2500000000, 2500000000, float_market_cap)
:如果流通市值大于25亿,我就将流通市值标为25亿的上界,否则就为流通市值的原始值
在DAI数据平台中,我们有以下逻辑运算符
运算符 | 功能 | 用例 |
---|---|---|
= 或 == |
判断是否等于 | close = open |
!= |
判断是否不等于 | close != open |
< |
判断是否小于 | close < open |
<= |
判断是否小于等于 | close <= open |
> |
判断是否大于 | close > open |
>= |
判断是否大于等于 | close >= open |
& |
且 | close > open & float_market_cap > 2500000000 |
|| |
或 | close > open || float_market_cap > 2500000000 |
IN |
判断是否在一系列的值当中 | instrument IN (‘600519.SH‘, ‘000001.SZ‘, ‘000002.SZ‘) |
() |
括号 | (close > open || close > m_lag(close, 1)) & high != low |
LIKE ‘%A‘ |
判断字符串是否以A结尾(前面无所谓) | instrument LIKE ‘%SH‘ |
LIKE ‘A%‘ |
判断字符串是否以A开头(后面无所谓) | instrument LIKE ‘3%‘ |
LIKE ‘%A%‘ |
判断字符串是否包括A(前后都无所谓) | name LIKE ‘%酒%’ |
\