这篇是因子库全景导览,带你走一遍 betalens-factor/ 下现有的因子家族——WorldQuant ALPHA101、中信高频行为因子、流动性需求/预期分歧、通达信指标。看完这篇,你会理解每个因子家族的适用场景,以及如何在 Dashboard 里把它们跑起来。
导言
betalens-factor/ 是 Betalens 的因子仓库,每个子目录对应一个因子家族。目前包含四大类:
| 目录 | 家族名称 | 因子数量 | 典型应用 |
|---|---|---|---|
alpha101/ |
WorldQuant ALPHA101 | 101 | 经典量化选股 |
citic_hf_behavior/ILLIQ_v2 |
中信高频行为 | 1 | 市场微观结构 |
LiqDemand/DISP |
流动性需求/预期分歧 | 2 | 机构行为 |
tdx/ |
通达信指标 | RSI系列、XICHOU等 | 技术分析择时 |
因子目录下,每个因子有 一对文件:factor_<NAME>.py(计算逻辑)和 factor_<NAME>.yaml(配置参数)。Dashboard 会自动扫描这些 YAML 并在界面上展示。
一、WorldQuant ALPHA101
目录:betalens-factor/alpha101/
这是 Betalens 里规模最大的因子家族,包含 WorldQuant 在 2014 年发布的 101 个经典 Alpha 因子(ALPHA1 ~ ALPHA101)。每个因子都是基于日行情数据(开盘价、最高价、收盘价、最低价、成交量)的数学表达式,设计初衷是作为量化因子研究的基准。
典型因子
ALPHA1(均值回归 + 成交量加权):
$$\text{ALPHA1} = \text{rank}(\text{TSARS}((\text{open} \times 0.85 + \text{close} \times 0.15), 12)) - \text{rank}(\text{TSARS}(\text{delta}(\text{volume}, 3), 6))$$
ALPHA2(开盘跳空 + 成交量加权):
$$\text{ALPHA2} = -\text{corr}(\text{rank}(\text{open}), \text{rank}(\text{volume}), 10)$$
ALPHA6(收盘价相对位置):
$$\text{ALPHA6} = -\text{corr}(\text{rank}(\text{open}), \text{rank}(\text{high}), 10) + \text{rank}(\text{open} - \text{thsreg_linear_val}((\text{open} - \text{close}) / (\text{high} - \text{low} + 1e-12), 16))$$
在 Dashboard 里跑 ALPHA101
- 打开 Dashboard:
http://127.0.0.1:5173 - 进入”截面因子”页面
- 在因子列表里找到
alpha101/ALPHA1(或任意编号) - 修改运行参数(
start_date、end_date、n_quantiles) - 点击”运行”,等待回测完成
- 查看报告:净值曲线、IC 分析、分组收益
ALPHA101 的局限性
- 全是日行情因子:不使用基本面数据,所以对财报披露类事件没有暴露。
- 参数固定:原始 ALPHA101 没有参数搜索,每个因子都是”一个固定公式”。Betalens 的
mining模块可以在 ALPHA101 基础上做参数化扩展。 - 计算密集:101 个因子全部跑一遍需要不少时间,
alpha101/mining/目录下有预配置的参数扫描入口。
二、中信高频行为因子(ILLIQ_v2)
目录:betalens-factor/citic_hf_behavior/ILLIQ_v2/
ILLIQ(Illiquidity)是由 Amihud 提出、Pastor & Stambaugh 改进的流动性度量指标——非流动性比率,衡量”单位交易额对价格的冲击”。中信建投在 2020 年前后推出了高频版本 ILLIQ_v2,通过分钟级数据精确度量日频非流动性。
公式核心思想:
$$ILLIQ = \frac{1}{D} \sum_{d=1}^{D} \frac{|r_d|}{VOL_d}$$
其中 $|r_d|$ 是日收益率绝对值,$VOL_d$ 是日成交量(金额),$D$ 是月度交易日数。
ILLIQ 的金融含义
- ILLIQ 越高:小额交易就能引起大价格波动 → 流动性差 → 机构卖出困难。
- ILLIQ 低:需要大额交易才能移动价格 → 流动性好 → 机构买卖容易。
- 择股逻辑:低 ILLIQ(高流动性)股票更适合大资金进出,预期未来有正超额收益。
使用方式
在因子 YAML 中配置:
1 | meta: |
三、流动性需求与预期分歧(DISP)
目录:betalens-factor/LiqDemand/DISP/
DISP(Dividend Yield + Institutional Demand + Spread)是一个复合因子,整合了三个维度:
- 股息率(D):高股息 → 价值型、机构偏好。
- 机构需求代理(I):用换手率、成交量异常度量机构参与度。
- 买卖价差(SP):高频价差代理流动性成本。
DISP = $\alpha \cdot D + \beta \cdot I - \gamma \cdot SP$
三个子维度可以独立调参,在 factor_DISP.yaml 的 compute_kwargs 中修改权重。
四、通达信指标(tdx)
目录:betalens-factor/tdx/
通达信是国内使用最广泛的股票行情软件之一,其指标体系在散户群体中有大量追随者。Betalens 的 tdx 目录把一些经典通达信指标实现为因子,并支持在 Dashboard 里直接参数化运行。
RSI 系列(RSI_FAST / RSI_SLOW)
相对强弱指数(RSI)是最经典的技术指标之一:
$$RSI = 100 - \frac{100}{1 + RS}, \quad RS = \frac{\text{avg gain}}{\text{avg loss}}$$
1 | factor_spec: |
XICHOU(侯神吸筹能量)
XICHOU 是一个趋势跟踪类指标,只在最低价创 N 日新低时累积能量:
1 | factor_spec: |
XICHOU 择时版(XICHOU_timing)
tdx/XICHOU 目录下还有一个 factor_XICHOU_timing.py/yaml,是单标的择时策略而非截面因子:
1 | meta: |
择时策略不走截面分组,而是直接生成目标仓位(0~1 的比例),与 BacktestBase 的 actual_weight 机制配合使用。
在 Dashboard 里探索因子库
无论哪个家族的因子,Dashboard 的使用流程都是一样的:
1 | 因子发现 → 选择因子 → 修改参数(compute_kwargs / run) → 运行 → 查看报告 |
因子 YAML 是唯一权威配置——Dashboard 页面参数最终会写入 outputs/runs/<run_id>/run_config.yaml,然后用这份文件构造 FactorPipeline 并运行。理解了这个流程,你就可以:
- 不改代码,只改 YAML:在 Dashboard 里调参,不需要碰 Python。
- 改代码,再改 YAML:在因子脚本里实现新逻辑,更新
compute_kwargs的默认值。 - 新增因子:在
betalens-factor/<class>/<NAME>/下创建factor_<NAME>.py和 YAML,Dashboard 自动发现。
开发者侧:因子目录结构规范
每个因子家族的目录结构:
1 | betalens-factor/ |
关键约束:import 因子脚本时不跑回测、不写文件。回测只在 FactorPipeline.run() 时执行。这保证了因子脚本可以在不产生副作用的情况下被 Dashboard 动态导入。
延伸阅读
- Betalens 新手系列 · 02:五分钟跑通股息率多空——跑第一个回测。
- Betalens 新手系列 · 17:择时策略——XICHOU_timing 详解。
- Betalens 新手系列 · 20:自建因子端到端——如何新增一个因子。
docs/guide/factor-pipeline.rst——因子 YAML 规范文档。docs/guide/dashboard.rst——Dashboard 使用文档。