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规范化,仍建议放在纯英文路径下。