2. Qlib数据下载与本地存储管理

任务说明

使用 Qlib 自带的 scripts/get_data.py 下载 A 股日频行情(默认 qlib_data/cn_data 数据集),并把数据落到自定义本地目录,最后通过 qlib.init 指向该目录完成校验。

环境与依赖

  • Python 3.8+,已安装 pyqlib(pip install pyqlib)。
  • 下载脚本依赖 numpy、pandas、requests、tqdm,随 pyqlib 一并安装。
  • 磁盘预留约 1GB 空间;下载源为 Qlib 官方数据仓库,需可访问外网。

关键代码

下面脚本完成三件事:调用内置下载脚本把数据写入指定目录、检查目录结构、用 qlib.init 加载并读取一只股票的日线数据做验证。

# download_qlib_data.py
import os
import subprocess
import sys

# 1. 自定义本地存储路径(绝对路径,避免相对路径歧义)
DATA_DIR = os.path.abspath("./qlib_data/cn_data")
os.makedirs(os.path.dirname(DATA_DIR), exist_ok=True)

# 2. 调用 Qlib 内置下载脚本
#    --target_dir 指定落地目录;--region cn 表示 A 股;--interval 1d 表示日频
cmd = [
    sys.executable, "-m", "qlib.scripts.get_data",
    "--target_dir", DATA_DIR,
    "--region", "cn",
    "--interval", "1d",
]
print("running:", " ".join(cmd))
subprocess.run(cmd, check=True)

# 3. 校验目录结构:Qlib 数据目录必须包含 calendars / instruments / features
required = ["calendars", "instruments", "features"]
missing = [d for d in required if not os.path.isdir(os.path.join(DATA_DIR, d))]
if missing:
    raise SystemExit(f"数据目录不完整,缺少: {missing}")
print("data dir ok:", DATA_DIR)

# 4. 用 qlib.init 指向本地目录并读取一只股票验证
import qlib
from qlib.data import D

qlib.init(provider_uri=DATA_DIR, region="cn")

# 取沪深300成分股中的第一只,读取最近 5 个交易日的收盘价
instruments = D.instruments(market="csi300")
fields = ["$close"]
df = D.features(instruments, fields, start_time="2023-01-01", end_time="2023-01-10")
print(df.head())
print("rows:", len(df))

运行方式

python download_qlib_data.py

首次运行会从官方源拉取数据,耗时取决于网络;重复运行会跳过已存在文件。

验证方法与通过条件

  • 脚本无异常退出,且打印 data dir ok: .../qlib_data/cn_data。
  • DATA_DIR 下存在 calendars/、instruments/、features/ 三个子目录。
  • D.features 返回的 DataFrame 非空(rows > 0),且索引包含 instrument 与 datetime,列包含 $close。
  • 若需换目录,只改 DATA_DIR 即可,其余逻辑不变。

常见问题

  • 下载中断:删除 DATA_DIR 后重跑,避免残留半成品文件。
  • 网络受限:可先手动下载官方数据包解压到 DATA_DIR,再执行第 3、4 步校验。
  • 路径含中文或空格:DATA_DIR 已用 abspath 规范化,仍建议放在纯英文路径下。