目录
一、核心概念
1.1 什么是Alpha?
在WorldQuant BRAIN平台中,Alpha是一个可预测资产未来价格走势的数学模型或数学表达式。它的本质是:
-
输入:某只股票当前及历史的市场数据(价格、成交量、财务指标等)
-
输出:一个预测信号值,通常介于-1到1之间,代表对股票未来表现的预期
-
正数:预测股票将跑赢大盘(买入或做多)
-
负数:预测股票将跑输大盘(卖出或做空)
1.2 FastExpression语言特点
FastExpression是WorldQuant BRAIN平台的专属语言,具有以下特点:
-
声明式风格:你只需要描述“要什么数据”和“怎么计算”,不需要关心底层循环实现
-
表格化数据处理:所有操作都在一个虚拟的“股票×时间”的大表格上进行
-
丰富的内置算子:提供了7大类、60+个核心操作符
-
无需编程背景:平台设计使得即使没有编码经验的小白也能快速上手
1.3 Alpha的生命周期
在WorldQuant BRAIN系统中,Alpha遵循以下生命周期:
-
生成:使用数据字段和运算符构建表达式
-
模拟:在历史数据上进行回测,评估表现
-
改进:通过相关性分析、剪枝等技术优化
-
提交:将高质量的Alpha提交到平台
二、数据字段 (Data Fields)
2.1 什么是数据字段?
数据字段是Alpha的“原材料”,指的是一个命名的数据集合。平台提供数百种数据字段,涵盖价格、成交量、财务指标等多个维度。
2.2 常用数据字段分类
| 类别 | 字段示例 | 说明 |
|---|---|---|
| 价格类 | close | 收盘价 |
| open | 开盘价 | |
| high | 最高价 | |
| low | 最低价 | |
| vwap | 成交量加权平均价 | |
| 收益类 | returns | 日收益率 |
| returns_5 | 5天累计收益率 | |
| returns_20 | 20天累计收益率 | |
| 成交量类 | volume | 成交量 |
| adv20 | 过去20天平均成交量 | |
| turnover | 换手率 | |
| 基本面类 | fnd9_asset | 总资产 |
| fnd9_liability | 总负债 | |
| fnd28_value_05480 | 账面价值(示例) | |
| 市值类 | cap | 市值 |
2.3 数据字段的处理
在实际使用前,数据字段通常会经过预处理:
# 处理缺失值:用120天前的数据回填
ts_backfill(field, 120)
# 处理异常值:4倍标准差缩尾处理
winsorize(field, std=4)
三、运算符大全
WorldQuant BRAIN平台提供7大类、60+个核心操作符。下面按类别详细介绍。
3.1 运算符分类总览
| 类别 | 描述 | 典型算子 |
|---|---|---|
| 算术类 | 基础数学运算 | add、divide、log、power |
| 逻辑类 | 条件判断与逻辑运算 | and、or、if_else、greater |
| 时间序列类 | 历史数据处理 | ts_corr、ts_rank、ts_sum、ts_delay |
| 横截面类 | 跨股票比较分析 | rank、quantile、zscore |
| 向量类 | 向量场运算 | vec_avg、vec_sum |
| 变换类 | 数据预处理 | bucket、trade_when |
| 分组类 | 分组统计分析 | group_rank、group_mean |
3.2 算术运算符 (Arithmetic)
| 算子 | 语法 | 说明 |
|---|---|---|
| 加法 | x + y或add(x, y) | 两数相加 |
| 减法 | x - y或sub(x, y) | 两数相减 |
| 乘法 | x * y或multiply(x, y) | 两数相乘 |
| 除法 | x / y或divide(x, y) | 两数相除 |
| 绝对值 | abs(x) | 返回x的绝对值 |
| 对数 | log(x) | 自然对数 |
| 幂运算 | power(x, y) | x的y次方 |
3.3 逻辑运算符 (Logical)
| 算子 | 语法 | 说明 |
|---|---|---|
| 大于 | greater(x, y) | 如果x > y,返回True,否则False |
| 小于 | less(x, y) | 如果x < y,返回True,否则False |
| 等于 | eq(x, y) | 如果x == y,返回True,否则False |
| 与 | and(x, y) | 逻辑与 |
| 或 | or(x, y) | 逻辑或 |
| 条件判断 | if_else(cond, true_val, false_val) | 如果cond为真,返回true_val,否则返回false_val |
3.4 时间序列算子 (Time Series)
时间序列算子是Alpha构建的核心,它们处理一只股票自身的历史数据。
| 算子 | 语法 | 说明 |
|---|---|---|
| 延迟 | ts_delay(field, d) | 返回d天前的field值 |
| 差值 | ts_delta(field, d) | 计算当前值与d天前值的差值:field - ts_delay(field, d) |
| 求和 | ts_sum(field, d) | 计算过去d天的总和 |
| 均值 | ts_mean(field, d)或ts_avg(field, d) | 计算过去d天的平均值 |
| 标准差 | ts_std_dev(field, d) | 计算过去d天的标准差 |
| 排名 | ts_rank(field, d) | 计算field在过去d天中的时间序列排名(值在0-1之间) |
| 相关系数 | ts_corr(field1, field2, d) | 计算过去d天内field1和field2的相关系数 |
| 协方差 | ts_covariance(field1, field2, d) | 计算过去d天内field1和field2的协方差 |
| 偏度 | ts_skewness(field, d) | 计算过去d天的偏度 |
| 峰度 | ts_kurtosis(field, d) | 计算过去d天的峰度 |
| 最大值 | ts_max(field, d) | 过去d天的最大值 |
| 最小值 | ts_min(field, d) | 过去d天的最小值 |
| 指数衰减加权 | ts_decay_exp_window(field, d) | 指数衰减加权和,越近的数据权重越大 |
| 回归残差 | ts_regression(field1, field2, d) | 对过去d天做线性回归,返回残差 |
常用时间窗口
| 窗口 | 对应天数 | 说明 |
|---|---|---|
| 5 | 5天 | 1周(交易日) |
| 22 | 22天 | 1个月(约) |
| 66 | 66天 | 3个月 |
| 120 | 120天 | 6个月 |
| 240 | 240天 | 1年 |
| 250 | 250天 | 1年(BRAIN常用) |
3.5 横截面算子 (Cross Sectional)
横截面算子处理的是同一时间点,所有股票之间的比较。
| 算子 | 语法 | 说明 |
|---|---|---|
| 排名 | rank(field) | 对全体股票的field值进行排名,结果均匀分布在0-1之间 |
| 分位数 | quantile(field, n) | 将股票分成n个分位数,返回所属的分位数编号 |
| Z-Score | zscore(field) | 标准化:(field - mean)/std,使均值为0,标准差为1 |
| 归一化 | normalize(field) | 将值缩放到[-1, 1]区间 |
| 截断 | truncate(field, min, max) | 将超出[min, max]的值截断到边界 |
3.6 分组算子 (Group)
分组算子允许你在特定分组内进行统计分析,是实现行业中性化的核心工具。
| 算子 | 语法 | 说明 |
|---|---|---|
| 分组均值 | group_mean(field, group) | 计算每个分组内的均值 |
| 分组标准差 | group_std(field, group) | 计算每个分组内的标准差 |
| 分组排名 | group_rank(field, group) | 在每个分组内分别进行排名 |
| 分组中性化 | group_neutralize(field, group) | 减去分组均值:field - group_mean(field, group) |
| 分组Z-Score | group_zscore(field, group) | 在每个分组内分别做Z-Score标准化 |
常用的分组维度
| 分组参数 | 说明 |
|---|---|
| industry | 行业 |
| subindustry | 子行业 |
| sector | 部门 |
| bucket(rank(cap), 10) | 按市值分10组 |
3.7 高级算子
| 算子 | 语法 | 说明 |
|---|---|---|
| 回归中性化 | regression_neut(field1, field2) | 剔除field2对field1的线性影响 |
| 向量中性化 | vector_neut(field1, field2) | 向量正交化处理 |
| 交易条件 | trade_when(condition, field, default) | 仅在condition为真时使用field,否则用default值 |
四、Alpha构建规则与语法
4.1 基本语法规则
| 规则 | 说明 |
|---|---|
| 表达式结尾 | 整个Alpha表达式的最后一句话不需要使用分号;中间语句可以用分号分隔 |
| 注释 | 和C语言一样,/* 注释内容 */用于多行注释 |
| 大小写 | 运算符和字段名通常区分大小写 |
| 空格 | 运算符和操作数之间可以用空格提高可读性 |
4.2 Alpha表达式结构
一个完整的Alpha表达式通常由以下部分组成:
中间计算结果1;
中间计算结果2;
最终Alpha表达式 /* 最后一行的计算结果就是Alpha信号 */
4.3 数据流向
Alpha表达式的计算过程可以理解为:
-
原始数据 → 2. 算子变换 → 3. Alpha向量 → 4. 中性化 → 5. 标准化 → 6. 投资组合
4.4 关键概念
4.4.1 Alpha向量
指因子初始值的向量。例如对负收益率执行排名操作后,会为每只股票生成一个对应的值向量。
4.4.2 中性化
从向量中的每个值减去该组向量值的平均值,使得所有向量值的总和=0。这可以消除特定分组(如行业、市场)的影响。
4.4.3 标准化
将生成的值缩放,使得alpha向量值的绝对值总和为1。
4.4.4 多空市场中性化
使用标准化后的权重,分配资金构建投资组合。正值代表做多,负值代表做空,使得多空头寸平衡。
五、常见算子组合模式
5.1 基础模式
| 模式 | 表达式示例 | 说明 |
|---|---|---|
| 原始字段 | field | 直接使用原始数据 |
| 排名 | rank(field) | 横截面排序 |
| 反转 | -rank(field) | 取排名的相反数,常用于反转策略 |
| 时间序列排名 | ts_rank(field, 22) | 过去22天的时间序列排名 |
5.2 动量类模式
动量效应:近期上涨的资产倾向于继续上涨,近期下跌的资产倾向于继续下跌。
# 计算250天价格涨幅
ts_delta(close, 250) / ts_delay(close, 250)
# 计算250天内上涨的天数
ts_sum(if_else(greater(returns, 0), 1, 0), 250)
5.3 反转类模式
反转效应:短期涨幅过大的股票可能回调,跌幅过大的股票可能反弹。
# 短期反转:做空过去5天涨幅最大的股票
-rank(ts_delta(close, 5))
# 长期反转:做空过去120天涨幅最大的股票
-rank(returns_120)
5.4 波动率类模式
# 波动率偏度:实际波动与预期波动的差异
power(ts_std_dev(abs(returns), 30), 2) - power(ts_std_dev(returns, 30), 2)
5.5 成交量验证模式
# 成交量异常:当日成交量与过去20天平均成交量的比值
volume / adv20
# 成交量异常的持续性:该比值在过去5天的时间序列排名
ts_rank(volume / adv20, 5)
六、实战Alpha示例
6.1 示例1:基础反转Alpha
/* 基础反转Alpha */
- rank(returns_120)
说明:做多过去120天表现最差的股票(跌幅最大),做空过去120天表现最好的股票(涨幅最大)。这是经典的长期反转策略。
6.2 示例2:上涨天数计数Alpha
/* 过去250天上涨天数计数 */
ts_sum(if_else(greater(returns, 0), 1, 0), 250)
分步解析:
-
greater(returns, 0):判断当天收益率是否为正
-
if_else(..., 1, 0):将布尔值转为数值(1表示上涨,0表示下跌)
-
ts_sum(..., 250):对过去250天的结果求和
6.3 示例3:三重验证Alpha
这是一个经典的101因子之一,结合了反转、价格加速度和成交量验证。
/* 三重验证Alpha */
(
(-1 * rank(ts_rank(close, 10))) *
rank(ts_delta(ts_delta(close, 1), 1)) *
rank(ts_rank((volume / adv20), 5))
)
分步解析:
| 部分 | 表达式 | 含义 |
|---|---|---|
| 第一部分 | -1 * rank(ts_rank(close, 10)) | 捕捉近期弱势股的反转信号 |
| 第二部分 | rank(ts_delta(ts_delta(close, 1), 1)) | 捕捉价格变化的加速度 |
| 第三部分 | rank(ts_rank((volume / adv20), 5)) | 验证成交量的异常信号 |
核心逻辑:仅当三个条件同时满足时,因子值才显著:
-
近期弱势股(有反转预期)
-
价格波动加剧(有加速度信号)
-
成交量持续放大(资金验证)
6.4 示例4:行业中性化Alpha
/* 行业内资产负债比排名 */
group_rank((fnd9_asset / fnd9_liability), subindustry)
说明:在每个子行业内,对公司的资产负债比进行排名。做多行业内财务稳健的公司,做空财务风险高的公司。
6.5 示例5:条件触发Alpha
/* 低波动率时才交易 */
trade_when(
ts_rank(ts_std_dev(returns, 10), 252) < 0.9, /* 条件:过去10天波动率排名在90%以下 */
-rank(ts_delta(close, 5)), /* 策略:5日反转 */
-1 /* 默认值:不满足条件时做空 */
)
七、Alpha模拟与评估
7.1 模拟参数设置
在提交模拟时,可以配置以下参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
| instrumentType | EQUITY | 金融工具类型 |
| region | USA | 地理区域 |
| universe | TOP3000 | 股票池(市值最大的3000只) |
| delay | 1 | 信号延迟天数 |
| neutralization | SUBINDUSTRY | 中性化方式 |
| truncation | 0.08 | 极端值截断水平 |
| pasteurization | ON | 是否启用“消毒”处理 |
| testPeriod | P2Y | 回测周期(2年) |
7.2 关键评估指标
| 指标 | 说明 |
|---|---|
| Sharpe Ratio | 夏普比率,衡量风险调整后收益 |
| Fitness | 平台综合评分,结合Sharpe、Turnover等指标 |
| Turnover | 换手率,衡量交易频率 |
| Returns | 总回报率 |
| Volatility | 波动率 |
| Coverage | 覆盖率,信号覆盖的股票比例 |
八、常用算子速查表
8.1 按功能分类速查
| 功能 | 算子 |
|---|---|
| 排名类 | rank、group_rank、ts_rank |
| 统计类 | mean、std、corr、covariance、skewness、kurtosis |
| 时间序列 | delay、delta、sum、mean、std_dev、rank、decay_exp_window |
| 条件类 | if_else、greater、less、eq、trade_when |
| 中性化 | group_neutralize、regression_neut、vector_neut |
| 分组 | subindustry、industry、sector、bucket |
8.2 常见组合模式
# 横截面排名
rank(field)
# 行业中性化排名
group_rank(field, subindustry)
# 过去22天时间序列排名
ts_rank(field, 22)
# 标准化
zscore(field)
# 条件计数
ts_sum(if_else(greater(field, threshold), 1, 0), window)
九、补充说明
9.1 分级权限系统
WorldQuant BRAIN平台采用分级解锁机制:
-
基础操作符:对所有用户开放
-
高级操作符:需要达到Expert、Master和Grandmaster Genius级别才能使用
9.2 NaN值处理
平台提供完善的缺失值处理机制,确保数据质量和计算稳定性。
9.3 性能优化
支持dense/sparse模式选择,以平衡计算效率与内存使用。
1万+

被折叠的 条评论
为什么被折叠?



