Qlib
中文 | English
Qlib 是面向本地股票量化研究的 Python 工具库,覆盖行情与财务数据管理、表达式因子计算、历史股票池筛选、因子评估和日频回测。通过统一的数据接口,将本地数据转化为可分析、可回测的研究结果。
PyPI · 在线文档 · 功能介绍 · 快速上手 · API 参考 · 数据集
功能
| 模块 | 主要能力 |
|---|---|
| 数据管理 | 日线、交易日历、基础信息、历史指数成分、行业与 ST 区间;Tushare 下载与永久 CSV 缓存,直接构建本地数据 |
| 价格复权 | 默认后复权,支持前复权与不复权;价格先复权,再进行表达式计算 |
| 因子表达式 | 算术、条件、滚动、累计、排名、相关与回归算子;自动加载预热历史,可禁止未来引用 |
| 历史过滤 | ST、上市天数、行业、指数成分、可交易性与表达式过滤;支持组合条件 |
| PIT 财务 | Tushare fina_indicator 全部 163 个数值指标;保留公告与修订历史,每股一组 pit.data / pit.index |
| 因子预处理 | 均值标准差、中位数 MAD 两种去极值方法,Z-score 标准化;可组合去极值、中性化、标准化 |
| 因子评估 | IC、RankIC、ICIR、多空收益、自相关、分组收益与换手率;多因子、多持有期分析及报告导出 |
| 策略与回测 | TopkStrategy、TopkDropoutStrategy、WeightStrategy;日频撮合、费用、滑点、涨跌停、成交量约束及持仓报告 |
| 数值加速 | 纯 C 实现 rolling、expanding 和 PIT 查询核心,使用 MinGW-w64 构建,通过 NumPy / ctypes 调用 |
用法
1. 安装
需要 Python 3.10+。从 PyPI 安装:
python -m pip install qlib-joshuaxql
发行包名称为 qlib-joshuaxql,Python 导入名仍是 qlib:
import qlib
print(qlib.__version__)
升级时使用 python -m pip install --upgrade qlib-joshuaxql。建议使用独立虚拟环境。
PyPI 安装即可读取数据、计算因子和运行回测;行情与财务数据需单独准备。
运行下文的 scripts/ 数据维护、原生编译或本地文档构建命令时,请先获取源码并安装:
git clone https://github.com/joshuaxql/qlib.git
cd qlib
python -m venv .venv
.venv\Scripts\python.exe -m pip install -e ".[download,docs]"
仅使用数据读取、因子分析和回测时,可安装 -e .。Linux/macOS 对应的 Python 路径为 .venv/bin/python。
Windows 下可选编译 C 核心,需要与 Python 位数匹配的 MinGW-w64 GCC:
# GCC 已在 PATH 中时
.venv\Scripts\python.exe scripts/build_rolling.py
# 也可指定编译器路径
.venv\Scripts\python.exe scripts/build_rolling.py --cc D:/software/mingw64/bin/gcc.exe
PyPI wheel 不包含预编译 DLL。未构建 DLL 时,表达式计算和 PIT 查询使用 pandas/NumPy 回退。环境与编译说明见安装指南。
2. 准备数据
从 Hugging Face 数据集 下载 cn_data.zip,解压到 ~/.qlib/qlib_data/。解压后应存在:
~/.qlib/qlib_data/cn_data/
├─ calendars/
├─ features/
├─ instruments/
├─ industry/
├─ financial/
└─ stock_basic.csv
也可配置 scripts/config.py 中的数据目录和起始日期,再从 Tushare 构建:
$env:TUSHARE_TOKEN = "你的 Token"
.venv\Scripts\python.exe scripts/build_data.py
下载以完整 CSV 为缓存单位;构建直接读取 CSV 写出 Qlib 数据。财务和涨跌停字段也可独立维护:
# 从已有季度 CSV 构建财务数据;添加 --download 可先下载/刷新
.venv\Scripts\python.exe scripts/build_pit.py
# 为已有日线数据下载并补充每日涨跌停价
.venv\Scripts\python.exe scripts/build_limits.py --download
读取和回测可离线运行,无需 Tushare Token。详细说明见数据维护。
3. 读取行情与计算因子
import qlib
from qlib.data import D
from qlib.data.filter import ListingDaysFilter, STFilter
provider = qlib.init("~/.qlib/qlib_data/cn_data", adjust="hfq")
prices = D.daily(
["000001.SZ", "600000.SH"], ["open", "close", "volume"],
"2025-01-01", "2025-12-31",
)
pool = D.instruments("csi300", [STFilter(), ListingDaysFilter(min_days=180)])
features = D.features(
pool,
["$close", "Mean($close, 20)", "$close / Ref($close, 20) - 1", "P($$eps)"],
"2025-01-01", "2025-12-31",
allow_future=False,
)
print(features.head())
adjust="hfq"为默认后复权;"qfq"为前复权;"none"为原始价格。daily()和features()返回以(instrument, datetime)为索引的 DataFrame。P($$eps)读取当时已公告的最新报告期 EPS;PRef($$eps, -1)读取前一自然季度。- 更新本地数据后调用
D.clear_cache()或重新初始化。
4. 评估因子
沿用上面的 provider 和 pool:
from qlib.contrib.report.analysis_model import factor_analysis
analysis = factor_analysis(
pool,
{"momentum20": "$close / Ref($close, 20) - 1"},
"2025-01-01", "2025-12-31",
provider=provider, horizons=(1, 5, 20), quantiles=5,
price="open", entry_lag=1,
)
print(analysis.summary)
analysis.save("outputs/factor_analysis")
默认标签为下一交易日开盘进入、持有指定交易日数后的开盘价收益。指标口径与底层评估接口见因子分析。
factor_analysis() 默认执行均值±3倍标准差去极值、行业+对数总市值中性化、Z-score 标准化。
market_cap="total_mv" 为默认市值口径,可通过 neutralize_min_samples 调整回归最小样本数(默认 3)。
也可单独中性化已有因子:
from qlib.contrib.report.analysis_model import neutralize_factors
neutral = neutralize_factors(
features[["$close / Ref($close, 20) - 1"]],
provider=provider, market_cap="total_mv", min_samples=20,
)
行业和市值使用因子当日数据,缺失或无效样本保留 NaN;market_cap="circ_mv" 可改用流通市值。
还支持按日横截面去极值与标准化:winsorize_factors(..., method="std") 使用均值±n倍标准差,
method="mad" 使用中位数±n×1.4826×MAD;standardize_factors() 计算 Z-score。
组合处理固定按“去极值 → 中性化 → 标准化”的顺序执行:
from qlib.contrib.report.analysis_model import preprocess_factors
processed = preprocess_factors(
features[["$close / Ref($close, 20) - 1"]], provider=provider,
winsorize="std", winsorize_n=3,
neutralize=True, neutralize_min_samples=20,
standardize=True,
)
factor_analysis() 也支持这些参数。各步骤默认开启,去极值默认 winsorize="std", winsorize_n=3;
标准差采用 ddof=0,缺失值保留 NaN。默认需要本地历史行业和总市值数据。
设置 winsorize=None, neutralize=False, standardize=False 可关闭全部预处理,winsorize="mad" 可改用中位数法。
完整口径及零 MAD、恒定样本的处理见因子分析文档。
5. 运行回测
from qlib.backtest import ExchangeConfig, backtest
from qlib.contrib.strategy import TopkDropoutStrategy
strategy = TopkDropoutStrategy(
topk=50, n_drop=5,
score="$close / Ref($close, 20) - 1",
instruments=pool, risk_degree=0.95,
)
result = backtest(
strategy, "2025-01-01", "2025-12-31",
provider=provider, initial_cash=1_000_000,
exchange=ExchangeConfig(
deal_price="open", lot_size=100,
buy_cost=0.0001, sell_cost=0.0001, sell_tax=0.0005, min_cost=5,
),
)
print(result.metrics)
result.save("outputs/backtest")
信号在下一交易日执行,撮合使用原始价格,并自动读取 up_limit / down_limit 边界。TopkDropoutStrategy 根据实际持仓换出股票,先卖后买,保留股票不重新调权。结果包含净值、持仓、成交、订单和绩效指标。执行假设与配置见策略与回测。
默认买卖佣金均为 万分之一(0.0001),每笔最低佣金仍为 5 元;
印花税为 万分之五(0.0005),仅卖出收取,在卖出佣金之外另计。
这些是固定回测参数,不自动按历史政策切换;可通过 ExchangeConfig 显式覆盖。
6. 关键日志
日志统一使用 Loguru(安装时自动包含),仅记录阶段开始、完成摘要、报告路径和重要警告。 不输出逐股/逐日进度条、逐次重试详情或 joblib 任务进度;批量构建中的重复数据警告按类别汇总数量。 数据读取与表达式求值保持安静,异常仍正常抛出,不会被日志吞掉。
Qlib 不修改调用方的日志处理器。可在应用入口配置简洁输出:
import sys
from loguru import logger
logger.remove() # 由应用主动替换默认处理器;已有日志配置时无需重复设置
logger.add(sys.stderr, level="INFO", format="{time:HH:mm:ss} | {level} | {message}",
backtrace=False, diagnose=False)
只看警告可将 level 改为 "WARNING"。日志默认不写文件;文件输出及脚本环境变量设置见
日志配置。
7. 浏览文档
在线阅读:Qlib 文档。
文档使用 Sphinx 和 sphinx_rtd_theme,涵盖使用指南、Python API、表达式与 C 接口:
.venv\Scripts\python.exe -m sphinx -b html -W --keep-going docs docs/_build/html
构建后打开 docs/_build/html/index.html。更多入口:包结构、API 参考、文档维护。
开源协议
本项目采用 MIT License。引用代码的版权与许可声明保留在相应模块中: 数值核心、因子评估、策略。
鸣谢
- Microsoft Qlib:感谢其开源实现与量化研究工作;项目关系和参考范围见功能介绍。
- Tushare:提供行情、财务指标和每日涨跌停价格等数据接口。
- NumPy、pandas、SciPy 和 joblib:提供数值计算、数据处理与并行计算支持。
- MinGW-w64、Sphinx 和 Read the Docs:提供原生编译与文档工具;Hugging Face 提供数据集托管。
Metadata
Release files for qlib-joshuaxql 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| qlib_joshuaxql-0.2.0.tar.gz | 165.3 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| qlib_joshuaxql-0.2.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| qlib_joshuaxql-0.2.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| qlib_joshuaxql-0.2.0-py3-none-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl | Python 3 | none | Linux glibc 2.5+ x86-64, Linux glibc 2.17+ x86-64 | Details |
| qlib_joshuaxql-0.2.0-py3-none-macosx_11_0_x86_64.whl | Python 3 | none | macOS 11.0+ x86-64 | Details |
| qlib_joshuaxql-0.2.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| qlib_joshuaxql-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.7 MB
Release files / qlib_joshuaxql-0.2.0.tar.gz
| Download URL | qlib_joshuaxql-0.2.0.tar.gz |
|---|---|
| Size | 165.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8ab538f6e70813af39525cca6b5183b2cb5b968827684f58ab2380e61296151e
|
|
BLAKE2b-256 checksum How to use checksums |
dc0867631a67b68d9ac47d7d770c5d84d300b373ca885f08b4403748371c9956
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / qlib_joshuaxql-0.2.0-py3-none-win_amd64.whl
| Download URL | qlib_joshuaxql-0.2.0-py3-none-win_amd64.whl |
|---|---|
| Size | 508.2 kB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
abec5717eafa2b4e2e3e47655ec06cb56df75db5745a747c3b3b6106c469b16b
|
|
BLAKE2b-256 checksum How to use checksums |
85027c5baee5c46d5e58dade3e29bc553f6adcd137f556a05e7fa0f6656aca12
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / qlib_joshuaxql-0.2.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
| Download URL | qlib_joshuaxql-0.2.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl |
|---|---|
| Size | 494.6 kB |
| Tags | Linux glibc 2.17+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
b037abb44ba0bfe428a7f2b11bbd87c899f47bfc7cd075740ef11ba9209deb59
|
|
BLAKE2b-256 checksum How to use checksums |
75ddc2349d3101e5095ea79e4d21c43d2d5352a077bfcbdcefa2a638c28dee50
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / qlib_joshuaxql-0.2.0-py3-none-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl
| Download URL | qlib_joshuaxql-0.2.0-py3-none-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl |
|---|---|
| Size | 494.7 kB |
| Tags | Linux glibc 2.17+ x86-64 Linux glibc 2.5+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
327173e4a0cc6946ccfb346ae06e381f1e475898b3b569a730ba7ebf5da08537
|
|
BLAKE2b-256 checksum How to use checksums |
c6a7c53a47eed659ca4c8eded3c971763eb2ddc24e762b1ac3ae166c674aa08d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / qlib_joshuaxql-0.2.0-py3-none-macosx_11_0_x86_64.whl
| Download URL | qlib_joshuaxql-0.2.0-py3-none-macosx_11_0_x86_64.whl |
|---|---|
| Size | 486.9 kB |
| Tags | Python 3 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
11c3f0ff494600c79250a349084ff44c23fe10cd7f62716c99a708909ffdf77c
|
|
BLAKE2b-256 checksum How to use checksums |
684156da9da5711b26e35f6ec49fc2094cb5fff1df6a5c9ac96da894cfe31cd2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / qlib_joshuaxql-0.2.0-py3-none-macosx_11_0_arm64.whl
| Download URL | qlib_joshuaxql-0.2.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 486.9 kB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
18f1f0cb6c5ef4f17212a9e3a2c0d5ab4646d94a826a9f8f9bd974353fb3a4de
|
|
BLAKE2b-256 checksum How to use checksums |
7176b8625cc55888168ea722053f4740af926e0f59acb1b820519c2e2f566769
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / qlib_joshuaxql-0.2.0-py3-none-any.whl
| Download URL | qlib_joshuaxql-0.2.0-py3-none-any.whl |
|---|---|
| Size | 67.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
541ac73e12de2209cca17eac728c5002cf77b79df46445668a67a0ddc446c628
|
|
BLAKE2b-256 checksum How to use checksums |
8d3dd3b3dfe683d2b66d3a247893b9e345b4f502c5abd16e53500bb35cc3a211
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|