3. Qlib数据查询与基础统计

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 会查询失败。