Polars 原生、Rust 加速的因子研究引擎。 qweave 在一条 DataFrame pipeline 中 完成可组合因子计算、无前视 forward-return 标签、IC/分位/换手评估和交互式报告。
- ⚡ 480 万行 × 158 因子 ≈ 2.2 秒: Qlib Alpha158 全部因子在 6,000 股 × 800 天面板上一次执行完成(Ryzen 9 9950X 实测)。
- 🆚 比 Qlib Alpha158DL 快 23.85×: 同一面板、同一因子集、同为 32 线程的 实测对比;端到端比 KunQuant 的 JIT C++ 路径快 2.56×,且不需要 C++ 工具链。 命令与完整数据见性能与基准测试。
- 🧩 450 个内置经典因子: WorldQuant Alpha101 + Qlib Alpha158 + 国泰君安 Alpha191,时序与 截面算子同一套表达式 API,可筛选、改字段、混合后批量执行。
- 📊 一行打开交互报告:
result.view()启动内嵌 Vue + ECharts 界面, 逐因子查看分位收益、月度 IC 和多空诊断。
带上你自己的 Polars 行情面板。保留现有数据管线。把昂贵的因子研究循环交给 Rust。
qweave 适合已经用 Parquet/Polars 管理数据,希望减少 Python 逐因子循环、重复 rolling 计算和多张矩阵对齐工作的量化研究者。它聚焦"因子是否携带稳定未来收益信息"的研究 层,不是数据供应商、撮合模拟器或完整投资平台。
从 PyPI 安装(Python 3.10+):
pip install qweave如需指定平台的 wheel,见 GitHub Releases。 从源码构建见开发者手册。
v0.6.2 新增 !=、&、|、~、ts_mad 和 ts_count,继续使用 Float64 掩码。
表达式的隐式 Python 真假判断现在会报错;请使用带括号的比较及 &、|、~。
用法与迁移说明见 v0.6.2 发布说明。
仓库内置一个 80 个资产 × 320 个交易日的确定性合成面板。以下代码混合两个经典因子 与一个自定义表达式,并完成标签、评估和交互式报告:
import polars as pl
import qweave as qw
df = pl.read_parquet("examples/data/sample_daily.parquet")
alphas = qw.worldquant_alpha101({}, alphas=["alpha13", "alpha101"])
alphas.append(
(-(qw.col("close") / qw.col("close").delay(20) - qw.lit(1.0)))
.alias("mean_reversion_20")
)
df = qw.with_alphas(df, "asset", "date", alphas)
df = qw.with_labels(
df,
symbol_col="asset",
time_col="date",
horizons=[1, 5, 20],
entry_lag=1,
tradable_col="tradable",
)
result = qw.evaluate(
df,
symbol_col="asset",
time_col="date",
factor_cols=["alpha13", "alpha101", "mean_reversion_20"],
quantiles=5,
min_cs_count=30,
tradable_col="tradable_entry",
)
print(result.summary)
result.view() # 在浏览器打开交互式评估报告也可以直接运行完整示例:
python examples\quickstart.py- DataFrame 进,DataFrame 出: 直接接收并返回 Polars DataFrame,不需要 先把面板转成 NumPy 数组、算完再拼回来,也不需要迁移到专用数据 provider。
- 截面因子和时序因子写在同一个表达式里:
rank、group_neutralize等 截面算子与 rolling 时序算子在同一个 DAG 中,一次compute_alphas跑完, 不用像 provider/handler 工作流那样分阶段先取特征、再另行组织截面计算。 - 常用时序统计:
ts_skew、ts_kurt、均值初始化的ema和标准线性wma,使用统一的窗口参数;Qlib 算子迁移对照说明口径差异。 - 一次执行整批因子: 多个表达式进入同一 Rust DAG,统一完成公共子表达式复用、 中间 slot 复用、elementwise chain 融合和节点级并行。
- 450 个可组合经典因子: WorldQuant Alpha101、Qlib Alpha158 和国泰君安 Alpha191 使用和自定义表达式相同的 API,可筛选、改字段、混合并批量执行。
- 报告直接可用:
result.view()打开 Vue + ECharts 交互界面,逐因子下钻; 千级因子还可流式写入 Parquet。
实测于 Windows 11 / Ryzen 9 9950X(16 核 32 线程)/ 61.7 GiB 内存,同一份 6,000 股 × 800 天(480 万行)合成 OHLCV 面板,所有引擎 32 线程,1 次 warmup 后测量 3 次取最佳。KunQuant 为 f64 端到端口径(含输入/输出 DataFrame 转换与 JIT 编译):
| 工作负载 | qweave | 对比引擎 | 结论 |
|---|---|---|---|
| Qlib Alpha158 全部 158 因子 | 2.24 s | Qlib Alpha158DL:53.37 s | 快 23.85×,峰值内存少约 46% |
| WorldQuant Alpha101(82 因子) | 3.11 s | KunQuant f64:7.95 s | 端到端快 2.56×,峰值内存少约 31%,无需 C++ 工具链 |
快的来源:排序、rolling、截面算子和评估统计都在 Rust 热路径;整批表达式进入 同一 DAG,公共子表达式复用、slot 复用和节点级并行由引擎统一管理。完整环境、 命令与口径见性能与基准测试。
信号日 T ── entry_lag ──> 入场日 T+1 ── horizon h ──> 退出日 T+1+h
- 默认 T+1 入场,无 look-ahead;停牌缺行不会悄悄缩短持有期,入场日可交易性 自动对齐回信号日。
- 一次
evaluate产出 IC/RankIC、分位收益、换手、rank 自相关和多空诊断, 重叠持有期的显著性用 Newey–West t-stat 校正。 - 结果
result.view()直接打开交互报告,千级因子可流式写 Parquet。
完整口径与参数见因子评估。
- 行情数据已经在 Parquet/Polars 管线里,不想为了算因子迁移到专用数据格式, 或拆成 provider/handler 的分阶段工作流。
- 一次要计算和评估几十到上千个因子,Python 逐因子循环已经成为研究迭代的瓶颈。
- 在搭建自动化因子挖掘或投研 Agent 系统:易写的表达式 API、高吞吐批量执行和 统一评估口径,天然适合作为 Agent「生成 → 计算 → 评估」实验闭环的底层内核。
需要数据下载、模型训练和回测实验管理的完整平台时,Qlib 更合适——qweave 也可以 作为这类平台或 Agent 系统里的因子计算与评估内核嵌入使用。详细比较见 项目对比。
- 面向投研 Agent 的实验内核: 易写的表达式 API + 高吞吐批量执行 + 统一 评估口径,支撑「生成因子 → 批量计算 → 严格评估」的自动化因子挖掘闭环。
- 扩充内置因子库与时序/截面算子覆盖。
- 交互式报告持续增强,作为评估结果的默认查看方式。
从文档首页按顺序阅读:
qweave 的因子计算、标签、评估和报告链路已经可用,API 处于 pre-1.0 阶段。 欢迎阅读 CONTRIBUTING 参与开发。项目与国泰君安证券、WorldQuant、 Microsoft、Qlib 或 KunQuant 没有关联。
MIT. See LICENSE.
