表达式规则和语法
一 使用场景
表达式是 BeeQuant 的核心语言,用于描述因子计算、交易条件和标签定义。主要在以下位置使用:
| 使用位置 | 功能 | 示例 | 支持范围 |
|---|---|---|---|
| 数据处理节点 | 因子表达式 | rsi = ta_rsi(close, 14) | 算子函数 + 运算符 |
| Label 表达式 | label = shift(close, -5) / shift(open, -1) - 1 | 算子函数 + 运算符 | |
| 过滤表达式 | volume > 1000000 | 比较 + 逻辑运算 | |
| 策略类型节点 | 择时-开平仓表达式 | (rsi > 70) & (close > ma20) | 仅比较 + 逻辑运算 |
| 择币-过滤表达式 | volume > 1000000 | 仅比较 + 逻辑运算 |
⚠️ 注意:策略类型节点的条件表达式(择时的开平仓、择币的过滤)不支持调用时序算子函数(如 ta_ma、shift、ta_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 为中间变量不输出,diff、rsi 输出)| timestamp | symbol | close | diff | rsi |
|---|---|---|---|---|
| 2024-12-11 00:00:00 | BTCUSDT | 97800.0 | -679.5 | 58.32 |
| 2024-12-11 01:00:00 | BTCUSDT | 97750.0 | -593.2 | 55.18 |
| 2024-12-11 02:00:00 | BTCUSDT | 97820.0 | -616.8 | 59.45 |
| 2024-12-11 03:00:00 | BTCUSDT | 98050.0 | -781.5 | 63.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 ** 2 | x 的 y 次方 |
| % | 取模 | index % 5 | 除法取余 |
3.2 比较运算符
比较运算符返回布尔值,主要用于策略节点的条件表达式。
| 符号 | 名称 | 示例 | 说明 |
|---|---|---|---|
| > | 大于 | rsi > 70 | RSI 超买 |
| >= | 大于等于 | close >= ma20 | 价格在均线上方 |
| < | 小于 | rsi < 30 | RSI 超卖 |
| <= | 小于等于 | 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_meanta_rsi, ta_macd, ta_kdj, ta_ccita_atr, ta_bbands, t_stdshift, pct, log, diffif, max, min, absc_rank, c_pctrank, c_zscoreta_ma(close, 20)// 20期均线
t_mean(ta_rsi(close, 14), 20)// RSI的20期均值
if(close > open, 1, -1)// 阳线返回1,阴线返回-1
⚠️ 注意:时序算子函数(如 ta_ma、shift、ta_cross_over 等)仅可在数据处理节点的因子表达式和标签表达式中使用。策略条件表达式不支持时序算子函数调用,只能引用已预计算的列名进行比较和逻辑运算。
五 因子表达式示例
以下是在 数据处理节点 因子配置中常用的表达式示例:
| 因子名 | 表达式 | 说明 |
|---|---|---|
| 均线 | ma20 = ta_ma(close, 20) | 20期简单移动平均 |
| RSI | rsi = 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) - 1 | 20期价格变化率 |
| 布林位置 | bb_pos = (close - ta_bbands_lower(close, 20, 2)) / (ta_bbands_upper(close, 20, 2) - ta_bbands_lower(close, 20, 2)) | 价格在布林带中的位置(0-1) |
六 条件表达式示例
以下是在 策略类型节点 开平仓条件中常用的表达式示例。 条件表达式中可以直接使用上游数据处理节点定义的因子变量。
ta_ma、shift、ta_cross_over)。 所有因子计算必须在数据处理节点中预先完成,策略条件仅支持对列名进行比较和逻辑运算。| 条件类型 | 策略条件表达式 | 数据处理节点(前置) |
|---|---|---|
| RSI 超买 | rsi > 70 | rsi = ta_rsi(close, 14) |
| RSI 超卖 | rsi < 30 | rsi = ta_rsi(close, 14) |
| 金叉信号 | golden == True | golden = ta_cross_over(ma5, ma20) |
| 死叉信号 | death == True | death = ta_cross_under(ma5, ma20) |
| 突破上轨 | close > bb_upper | bb_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.6 | pred 由 AI 训练节点输出 |
golden、death)既可以直接引用(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(col, n) 将数据向前(n>0)或向后(n<0)偏移。 例如 shift(close, -5) 表示"5个周期后的收盘价"。