尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Qlib Data Collector 实战指南:数据采集器家族、数据集规范与自定义 Collector 开发

Qlib Data Collector 实战指南:数据采集器家族、数据集规范与自定义 Collector 开发 Qlib Data Collector 实战指南数据采集器家族、数据集规范与自定义 Collector 开发【免费下载链接】qlibQlib is an AI-oriented Quant investment platform that aims to use AI tech to empower Quant Research, from exploring ideas to implementing productions. Qlib supports diverse ML modeling paradigms, including supervised learning, market dynamics modeling, and RL, and is now equipped with https://github.com/microsoft/RD-Agent to automate RD process.项目地址: https://gitcode.com/GitHub_Trending/qli/qlib导读Qlib 作为 AI 量化平台其研究与回测都依赖规整、可复现的历史行情数据。本指南以 scripts/data_collector/README.md 为核心系统讲解 Qlib 数据采集模块Data Collector内置的多市场数据源、统一的数据落盘规范、下游组件对数据字段的依赖关系以及如何按照BaseCollector / BaseNormalize / BaseRun三个基类在 4 个文件内为任意新数据源扩展一个全新的 Collector。读完本文你可以掌握 Qlib 行情数据 采集 → 规范化 → 入库 的完整闭环并具备从零编写自定义采集器的工程能力。一、Data Collector 是什么Qlib 数据链路的入口在 Qlib 中数据是一切机器学习建模特征工程、训练、回测的地基。scripts/data_collector/目录下存放着所有数据采集脚本其职责是从公开网络数据源抓取原始行情经过标准化Normalize后再交给dump_bin.py转成 Qlib 二进制格式bin供数据层直接读取。换句话说Collector 解决的是数据从哪里来、以什么形态进入 Qlib这一最上游问题。内置采集器一览按照 scripts/data_collector/README.md 的 Introduction当前仓库主要提供以下数据源脚本目录数据源覆盖标的scripts/data_collector/yahooYahoo FinanceUS/CN股票行情US/CN另扩展支持印度IN、巴西BRscripts/data_collector/fundhttp://fund.eastmoney.com公募基金数据scripts/data_collector/cn_indexhttp://www.csindex.com.cnCN 指数成分如CSI300/CSI100scripts/data_collector/us_indexhttps://en.wikipedia.org/wikiUS 指数成分如SP500/NASDAQ100/DJIA/SP400scripts/data_collector/contrib—辅助功能脚本除上述在文档 Introduction 中列出的目录外仓库中还包含 baostock 5 分钟数据scripts/data_collector/baostock_5min、中证指数补充scripts/data_collector/br_index、加密货币scripts/data_collector/crypto、PIT 点数据scripts/data_collector/pit以及期货交易日历scripts/data_collector/future_calendar_collector.py等均遵循同一套基类设计。从实现结构看这些目录由两个角色组成行情/标的采集器collector与指数成分股/日历生成器index前者继承BaseCollector后者继承IndexBase见 scripts/data_collector/index.py。二、数据集规范Feature / Calendar / Instruments 三件套无论数据来自哪个市场Collector 输出的原始数据最终都要被组织成 Qlib 认可的形态。文档用一张表定义了各数据集共用的 Basic Data 结构类别内容FeaturesPrice/Volume行情字段close/open/low/high/volume/change/factorCalendar按频率命名的交易日历文件freq.txt如day.txt日线、1min.txt分钟线Instruments按市场命名的标的池文件market.txtall.txt为必需csi300.txt/csi500.txt/sp500.txt等按需提供补充约定Features必须是**数字digital**类型若行情未做复权adjusted处理则factor 1输出目录通常以features / calendars / instruments三个子目录组织可在dump_bin.py、qlib_data目录结构中印证。Data-dependent component谁依赖哪些数据为了让 Qlib 各组件正常运行文档进一步给出了数据依赖清单组件必需数据数据检索Data retrieval即qlib.data.D查询引擎Features、Calendar、Instrument回测Backtest含撮合、仓位、账户管理Features[Price/Volume]、Calendar、Instruments这解释了为什么回测对行情完整性要求严苛撮合需要open/high/low/close/volume才能计算成交与冲击成本而日历决定哪些时刻可交易标的池决定可下单位置。因此采集阶段的任何缺口停牌缺行、字段缺失、区间不连续都会沿数据链路传导到回测结果。三、自定义数据采集四个文件接入一个新数据源scripts/data_collector/README.md 的 Custom Data Collection 一节给出了把任意新数据源接入 Qlib 的标准骨架具体实现参考 yahoo 目录。完整步骤为在scripts/data_collector/下创建一个数据集代码目录如my_source添加collector.py其中定义三类类见下添加README.md说明数据源、用法、参数添加requirements.txt声明该数据源所需的第三方依赖。3.1collector.py的最小骨架CUR_DIR Path(__file__).resolve().parent sys.path.append(str(CUR_DIR.parent.parent)) from data_collector.base import BaseCollector, BaseNormalize, BaseRun class UserCollector(BaseCollector): ... # 实现数据抓取 class UserNormalzie(BaseNormalize): ... # 实现数据规范化原文档中如此拼写实际命名约定见 3.4 class Run(BaseRun): ... # 注册 CLI 命令入口其中路径拼接sys.path.append(str(CUR_DIR.parent.parent))是为了让子目录能 import 位于 scripts/data_collector/base.py 中的三个抽象基类。3.2 Collector 侧继承BaseCollectorBaseCollector定义于 scripts/data_collector/base.py负责从数据源逐标的抓取原始行情。子类必须实现三个抽象方法抽象方法职责get_instrument_list()返回待抓取的标的列表如全市场股票代码基类会对其sorted(set(...))去重排序normalize_symbol(symbol)把数据源代码规范化为 Qlib 惯例格式例如 Yahoo 的600519.ss→sh600519见 scripts/data_collector/yahoo/collector.pyget_data(symbol, interval, start_datetime, end_datetime)真正请求数据源并返回pd.DataFrame要求包含symbol、date列此外可复写_timezone属性以适配不同市场的时区转换如 CN 用Asia/Shanghai、US 用America/New_York。__init__暴露了以下关键参数默认值可直接参考 scripts/data_collector/base.py参数含义默认值save_dir原始数据落盘目录按symbol.csv一个标的一文件保存必填interval频率取值1d/1min1dstart/end起止日期分别默认2000-01-01与明天max_workers并发抓取的标的数采集时建议设为 1基类文档明确提示保持 1 以保证数据完整性1max_collector_count失败/数据不足标的的重试轮数上限2delay每次请求前time.sleep(delay)用于限速0check_data_length若大于 0则每个标的数据行数 ≥ 该值才算完整否则按max_collector_count次数重新抓取Nonelimit_nums只抓前 N 个标的用于调试None底层抓取链路collector_data()scripts/data_collector/base.py按max_collector_count轮次调用_collector()后者通过joblib.Parallel并行执行_simple_collector()每轮之间自动sleep_simple_collector若发现数据行数不足check_data_length会把该标的缓存进mini_symbol_map等待下一轮补齐补不齐的最终写入 CSV 并打印警告。save_instrument()scripts/data_collector/base.py还做了增量合并若symbol.csv已存在则先读旧文件再pd.concat且文件名经由qlib.utils.code_to_fname归一化便于后续按符号寻址。3.3 Normalize 侧继承BaseNormalizeBaseNormalizescripts/data_collector/base.py是数据规范化的抽象它要求子类实现normalize(df) - df将原始字段处理成目标字段与_get_calendar_list()提供基准交易日历通常复用交易所有效交易日。其构造函数接收date_field_name默认date与symbol_field_name默认symbol两个字段名参数作为后续所有处理的列名契约。真正执行多文件并行规范化的是Normalize调度器scripts/data_collector/base.py其关键行为包括读取source_dir/*.csv通过ProcessPoolExecutor(max_workers16)并行处理解析 CSV 时对symbol字段手工固定 dtype 与na_values避免TRUE、NA这类合法股票代码被 pandas 误判成 bool / NaN过滤尾部的脏行format_data在1d频率下剔除无法解析为%Y-%m-%d的最后一行支持end_date截断含当日结果逐文件写入target_dir。3.4 Run 侧用BaseRun一键注册 CLIBaseRunscripts/data_collector/base.py是整个 collector 目录的命令层。以 yahoo 为例执行python collector.py download_data ...时firedownload_data()内部再按命名约定YahooCollector{REGION}{INTERVAL}通过importlib动态加载对应类并调用其collector_data()。BaseRun的默认目录约定source_dir缺省为collector 目录/sourcenormalize_dir缺省为collector 目录/normalize。子类只需实现三个只读属性collector_class_name如YahooCollectorCN1d与数据源内定义的类名保持一致normalize_class_name如YahooNormalizeCN1ddefault_base_dir默认路径基准通常为CUR_DIR。由此形成统一开发范式每个数据源 1 个 collector 类 1 个 normalize 类 1 个 Run 命令类 3 个配套文件。你可以对照仓库中同类实现fund、crypto、pit、baostock_5min来确认这一约定各目录的collector.py底部都定义了class Run(BaseRun)。四、端到端实战参考以 Yahoo 为例的三步数据流水线尽管 scripts/data_collector/README.md 明确具体实现参考 yahoo 目录但它所述的source → normalize → dump_bin三段式在全部数据源中通用。以 scripts/data_collector/yahoo/README.md 为模板可将流程归纳为第 1 步抓取原始数据download_data# CN 日线指定区间 python collector.py download_data --source_dir ~/.qlib/stock_data/source/cn_data \ --start 2020-01-01 --end 2020-12-31 --delay 1 --interval 1d --region CN每个标的生成一个 CSV保存 open/high/low/close/adjclose/volume 等原始字段。注意start为闭区间含end为开区间不含interval1min时受 Yahoo Finance API 限制通常只可获取最近一个月数据。第 2 步规范化normalize_datapython collector.py normalize_data --source_dir ~/.qlib/stock_data/source/cn_data \ --normalize_dir ~/.qlib/stock_data/source/cn_1d_nor --region CN --interval 1d规范化主要做两件事一是用 adjclose 对 high/low/close/open 做复权归一二是把价格归一化到首个有效交易日 close1 的基准YahooNormalize1d 中的处理可查看 scripts/data_collector/yahoo/collector.py。当interval 1min时必须额外提供--qlib_data_1d_dir1min 复权依赖 1d 数据的 factor/paused 信息。第 3 步转成 Qlib bindump_binpython scripts/dump_bin.py dump_all --data_path ~/.qlib/stock_data/source/cn_1d_nor \ --qlib_dir ~/.qlib/qlib_data/cn_data --freq day --exclude_fields date,symbol --file_suffix .csvdump_bin.py 会把规范化 CSV 转为 numpy 数组按一列一文件、一标的一目录落盘同时生成calendars/与instruments/频率参数映射为1d → day、1min → 1min。自动化更新则可通过update_data_to_bin命令或 crontab 定时交易日* * * * 1-5调用实现增量更新。若不想从零抓取也可直接使用python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn见 scripts/get_data.py下载已打包好的现成 qlib-data。其中version可选v1/v2仓库 benchmarks 默认基于v1复现注意官方打包数据为压缩体积做了字段裁剪无法在其上做增量更新需要最新数据时仍应使用 Yahoo collector 从零抓取后再增量维护。五、配套基础设施日历、复权因子与指数成分IndexBase除基类外scripts/data_collector/utils.py 提供了大量共享函数理解它们能帮你更精确地实现自定义 normalize 类get_calendar_list(bench_code)获取某基准CSI300/CSI500/ALL/US_ALL等的历史交易日列表模块级缓存避免重复请求generate_minutes_calendar_from_daily(...)由日线日历按上下午时段默认 A 股09:30–11:29、13:00–14:59扩展出分钟级日历calc_adjusted_price(...)1min 复权核心函数——补paused字段、对齐 1d 时间轴、按volume / factor与open/high/low/close × factor重加权、并计算连续停牌天数paused_numcalc_paused_num(...)逐日统计连续停牌字段该字段是calc_adjusted_price内部调用的一个方法用于剔除全天为 NaN 的尾部交易日deco_retry(retry5, retry_sleep3)网络请求重试装饰器默认为巴西等弱数据源覆盖场景可在子类中覆盖重试次数。对指数成分股scripts/data_collector/index.py 定义了IndexBase通过get_new_companies()当前成分 起始日期与get_changes()历史 add/remove 事件两个抽象方法parse_instruments()即可生成含symbol/start_date/end_date的csi300.txt类文件保存于qlib_dir/instruments/save_new_companies()则输出*_only_new.txt。各指数目录cn_index/collector.py、us_index/collector.py、br_index/collector.py中的XXXIndex子类分别对接中证官网、Wikipedia 成分页与巴西 B3 数据共同产出二、三节所描述的instruments/market.txt。六、数据接入后的使用方式Data Collector 产出的 qlib-data含features、calendars、instruments的目录可直接作为qlib.init的provider_uri使用。以采集结果为例import qlib from qlib.data import D qlib.init(provider_uri~/.qlib/qlib_data/cn_data, regioncn) df D.features(D.instruments(all), [$close], freqday) # freq 默认 day若你手握的是 CSV 格式而非本模块产出的 bin也可参考 docs/component/data.rst 中Converting csv format into qlib format一节。回测与数据检索两大下游组件对本数据集核心字段的依赖关系已在第二节的依赖表中说明这也是 Data Collector 在 qlib/backtest 与 qlib/data 之间扮演的枢纽角色。七、实践要点与注意事项并发要克制抓取阶段建议max_workers1且用delay限速既避免触发数据源反爬也防止单标的请求错位导致数据不完整用check_data_length做自校验例如日线一年约 252 个交易日可设252 // 41min 一周约6.5 * 60 * 5US或4 * 60 * 5CN数据不足会自动重抓最终仍不足的标的会打印警告清单便于人工复核字段契约要守get_data返回的 DataFrame 必须含symbol与date列规范化阶段的date_field_name/symbol_field_name要与 CSV 实际列名一致停牌与复权是隐性陷阱原始源如 Yahoo复权序列偶尔异常规范化阶段依赖 adjclose 与前复权 factor 重算factor字段在未复权场景下恒为1数据结构以all.txt为锚instruments中all.txt必需csi300.txt等仅当需要特定股票池回测时生成自定义数据源从复制 yahoo 目录起步这是文档推荐的参考实现它完整覆盖了 collector、normalize、index 数据补充、增量更新与 dump 全链路。综上Data Collector 以三个抽象基类 一套数据规范将多市场、多频率、多数据源统一进同一条流水线原始抓取BaseCollector→ 规范化BaseNormalize/Normalize→ 指数日历与成分IndexBase→ bin 落盘dump_bin.py→ 供qlib.data检索与回测使用。理解并扩展这套模块是你在 Qlib 上构建自定义高质量数据集、复现基准实验或服务生产策略的第一步。【免费下载链接】qlibQlib is an AI-oriented Quant investment platform that aims to use AI tech to empower Quant Research, from exploring ideas to implementing productions. Qlib supports diverse ML modeling paradigms, including supervised learning, market dynamics modeling, and RL, and is now equipped with https://github.com/microsoft/RD-Agent to automate RD process.项目地址: https://gitcode.com/GitHub_Trending/qli/qlib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表