3. Qlib数据查询与基础统计
任务说明
使用 Qlib 的 D.features 接口,按股票代码与字段名查询日频行情数据,并对返回的 DataFrame 计算基础统计量(均值、标准差、最小值、最大值、样本数)。本案例以 SH600000 的收盘价与成交量为查询对象,覆盖从初始化到统计输出的完整闭环。
环境与依赖
- 已安装
pyqlib(pip install pyqlib)。 - 已通过
python -m qlib.run.get_data或scripts/get_data.py下载并初始化中国 A 股日频数据到~/.qlib/qlib_data/cn_data。 - Python 3.8+,依赖
pandas(随 qlib 一并安装)。
核心代码
import pandas as pd
import qlib
from qlib.data import D
# 1. 初始化 qlib,指向本地数据目录
qlib.init(provider_uri="~/.qlib/qlib_data/cn_data", region="cn")
# 2. 查询参数:股票、字段、时间区间
instruments = ["SH600000"]
fields = ["$close", "$volume"]
start_time = "2020-01-01"
end_time = "2020-12-31"
# 3. 调用 D.features 获取数据
df = D.features(
instruments=instruments,
fields=fields,
start_time=start_time,
end_time=end_time,
freq="day",
)
print("原始数据前 5 行:")
print(df.head())
print("数据形状:", df.shape)
# 4. 计算基础统计量
stats = pd.DataFrame({
"count": df.count(),
"mean": df.mean(),
"std": df.std(),
"min": df.min(),
"max": df.max(),
})
print("\n基础统计量:")
print(stats)
# 5. 简单校验:收盘价应全部为正,且样本数一致
assert (df["$close"] > 0).all(), "存在非正收盘价"
assert df["$close"].count() == df["$volume"].count(), "字段样本数不一致"
print("\n校验通过:收盘价均为正,字段样本数一致。")
运行方式
python qlib_features_stats.py
验证方法与通过条件
- 脚本无异常退出,且打印出
原始数据前 5 行、数据形状与基础统计量三部分内容。 df.shape的行数应等于 2020 年 A 股交易日数量(约 240 余行),列数为 2($close、$volume)。- 统计表中
count两列相等,mean、std、min、max均为有限数值,min列收盘价大于 0。 - 末尾打印
校验通过,说明断言全部成立。
常见问题
- 报
qlib.data._libs.rolling相关错误:通常是数据未初始化,重新执行python -m qlib.run.get_data qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn。 - 返回空 DataFrame:检查股票代码是否带交易所前缀(如
SH600000),以及时间区间是否落在数据覆盖范围内。 - 字段名必须以
$开头,例如$close、$volume;写成close会查询失败。