表达式规则和语法

一 使用场景

表达式是 BeeQuant 的核心语言,用于描述因子计算、交易条件和标签定义。主要在以下位置使用:

使用位置功能示例支持范围
数据处理节点因子表达式rsi = ta_rsi(close, 14)算子函数 + 运算符
Label 表达式label = shift(close, -5) / shift(open, -1) - 1算子函数 + 运算符
过滤表达式volume > 1000000比较 + 逻辑运算
策略类型节点择时-开平仓表达式(rsi > 70) & (close > ma20)仅比较 + 逻辑运算
择币-过滤表达式volume > 1000000仅比较 + 逻辑运算

⚠️ 注意:策略类型节点的条件表达式(择时的开平仓、择币的过滤)不支持调用时序算子函数(如 ta_mashiftta_cross_over 等)。 所有因子计算应在数据处理节点中预先完成,策略条件中仅引用已计算好的列名进行比较和逻辑运算。

二 基本语法

表达式由列名常量运算符函数调用组成。

2.1 内置列名

以下列名可直接使用,由数据源节点提供:

列名说明示例用法
open开盘价(close - open) / open
high最高价high - low
low最低价close - low
close收盘价(最常用)ta_ma(close, 20)
volume成交量volume / t_mean(volume, 20)

2.2 常量

类型说明示例
整数用于窗口期、周期参数等14, 20, 60
浮点数用于阈值、比例等0.05, 2.0, -0.5
布尔值真/假True / 1, False / 0

2.3 变量定义

在因子配置中,使用 变量名 = 表达式 格式定义变量。多个变量换行书写。

语法格式
# 格式: 变量名 = 表达式
_ma20 = ta_ma(close, 20)// 中间变量,不输出
diff = _ma20 - close// 输出变量(均线和收盘价的差)
rsi = ta_rsi(close, 14)// 输出变量
示例:上述配置输出的数据(_ma20 为中间变量不输出,diffrsi 输出)
timestampsymbolclosediffrsi
2024-12-11 00:00:00BTCUSDT97800.0-679.558.32
2024-12-11 01:00:00BTCUSDT97750.0-593.255.18
2024-12-11 02:00:00BTCUSDT97820.0-616.859.45
2024-12-11 03:00:00BTCUSDT98050.0-781.563.21

金色列为新增的输出列,_ma20_ 开头所以不输出

💡 中间变量应用场景:复杂因子计算时,使用中间变量可提高可读性
# 示例:计算布林带位置
_ma20 = ta_ma(close, 20)// 中间变量,不输出
_std = t_std(close, 20)// 中间变量,不输出
_upper = _ma20 + 2 * _std// 中间变量,不输出
_lower = _ma20 - 2 * _std// 中间变量,不输出
bb_pos = (close - _lower) / (_upper - _lower)// 最终因子,输出

三 运算符

3.1 算术运算符

符号名称示例说明
+加法close + open两值相加
-减法high - low两值相减
*乘法close * volume两值相乘
/除法(close - open) / open两值相除
**幂运算returns ** 2x 的 y 次方
%取模index % 5除法取余

3.2 比较运算符

比较运算符返回布尔值,主要用于策略节点的条件表达式

符号名称示例说明
>大于rsi > 70RSI 超买
>=大于等于close >= ma20价格在均线上方
<小于rsi < 30RSI 超卖
<=小于等于close <= ma20价格在均线下方
==等于signal == 1信号等于1
!=不等于trend != 0趋势不为0

3.3 逻辑运算符

逻辑运算符用于组合多个条件。

符号名称示例说明
&(rsi < 30) & (close > ma20)两个条件都满足
|(rsi > 70) | (rsi < 30)任一条件满足
~~(close > open)条件取反

⚠️ 注意:使用 &| 时,建议用括号包裹每个条件,避免运算符优先级问题。

运算符优先级(从高到低)

1. ** 幂运算

2. ~ 逻辑非

3. * / % 乘除取模

4. + - 加减

5. > >= < <= 比较

6. == != 相等判断

7. & 逻辑与

8. | 逻辑或

💡 建议使用括号明确运算顺序,提高可读性

四 函数调用

函数调用语法:函数名(参数1, 参数2, ...),支持嵌套调用。 完整函数列表请参考 表达式算子

常用函数分类
移动平均
ta_ma, ta_ema, ta_wma, t_mean
动量指标
ta_rsi, ta_macd, ta_kdj, ta_cci
波动率
ta_atr, ta_bbands, t_std
时间位移
shift, pct, log, diff
条件函数
if, max, min, abs
截面函数
c_rank, c_pctrank, c_zscore
函数调用示例
# 简单调用
ta_ma(close, 20)// 20期均线
# 嵌套调用
t_mean(ta_rsi(close, 14), 20)// RSI的20期均值
# 条件函数
if(close > open, 1, -1)// 阳线返回1,阴线返回-1

⚠️ 注意:时序算子函数(如 ta_mashiftta_cross_over 等)仅可在数据处理节点的因子表达式和标签表达式中使用。策略条件表达式不支持时序算子函数调用,只能引用已预计算的列名进行比较和逻辑运算。

五 因子表达式示例

以下是在 数据处理节点 因子配置中常用的表达式示例:

因子名表达式说明
均线ma20 = ta_ma(close, 20)20期简单移动平均
RSIrsi = ta_rsi(close, 14)14期相对强弱指数
收益率ret = pct(close, 1)单期收益率
波动率vol = t_std(pct(close, 1), 20)20期收益率标准差
量比vol_ratio = volume / t_mean(volume, 20)成交量/20期均量
动量mom = close / shift(close, 20) - 120期价格变化率
布林位置bb_pos = (close - ta_bbands_lower(close, 20, 2)) / (ta_bbands_upper(close, 20, 2) - ta_bbands_lower(close, 20, 2))价格在布林带中的位置(0-1)

六 条件表达式示例

以下是在 策略类型节点 开平仓条件中常用的表达式示例。 条件表达式中可以直接使用上游数据处理节点定义的因子变量

🚫 重要:策略条件中不能调用算子函数(如 ta_mashiftta_cross_over)。 所有因子计算必须在数据处理节点中预先完成,策略条件仅支持对列名进行比较和逻辑运算。
条件类型策略条件表达式数据处理节点(前置)
RSI 超买rsi > 70rsi = ta_rsi(close, 14)
RSI 超卖rsi < 30rsi = ta_rsi(close, 14)
金叉信号golden == Truegolden = ta_cross_over(ma5, ma20)
死叉信号death == Truedeath = ta_cross_under(ma5, ma20)
突破上轨close > bb_upperbb_upper = ta_bbands_upper(close, 20, 2)
放量上涨(close > open) & (vol_ratio > 1.5)vol_ratio = volume / t_mean(volume, 20)
多条件组合(rsi < 30) & (close > ma20) & (vol_ratio > 1)rsi / ma20 / vol_ratio 均已预计算
AI 预测信号pred > 0.6pred 由 AI 训练节点输出
💡 提示:布尔类型的因子列(如 goldendeath)既可以直接引用(golden), 也可以显式比较(golden == True),两种写法效果相同。

七 标签表达式示例

以下是在 数据处理节点 Label 标注中常用的表达式示例。 Label 用于定义 AI 模型的预测目标,通常使用 shift() 函数获取未来数据。

标签类型表达式任务类型
未来收益率label = shift(close, -5) / shift(open, -1) - 1回归 / 二分类
未来最大涨幅label = shift(t_max(high, 5), -5) / shift(open, -1) - 1回归
截面排名label = c_pctrank(shift(close, -5) / shift(open, -1) - 1)排序
💡 shift() 函数说明:shift(col, n) 将数据向前(n>0)或向后(n<0)偏移。 例如 shift(close, -5) 表示"5个周期后的收盘价"。