本项目是一个基于 Python 的高频因子计算引擎,旨在复现海通金工系列研报中的 22 个高频选股因子。项目利用 Polars 库进行高效的大规模数据处理,支持上交所和深交所的逐笔成交、逐笔委托及快照数据。
核心特性:
- 完整复现: 涵盖海通研报中的收益分布、大单资金流、交易意愿、委托成交相关性等多个维度的 22 个因子。
- 高性能: 核心计算逻辑全链路使用 Polars 实现,针对大规模逐笔数据进行了优化。
- 严格时序: 精确处理连续竞价时段,所有计算统一剔除集合竞价(开盘、收盘)及非交易时段数据。
- 灵活运行: 支持单日计算、历史区间批量计算、断点续传及特定因子指定计算。
项目实现的因子主要参考海通金工高频系列研报(如海通19/25/46/47/49/52/57/58/59/60/66/69/70/72/85等)。
主要因子分类实现于 haitong_hf_factors/factors/ 目录下:
- 收益分布特征: 包含日内收益率的已实现方差、偏度、峰度等 (
price_based.py,return_distribution.py)。 - 成交量分布: 包含尾盘成交占比等 (
volume_distribution.py)。 - 单笔成交特征: 单笔成交金额、大小单划分 (
trade_size.py)。 - 大单资金流: 基于大单的主动买入/卖出行为 (
big_order.py)。 - 盘口委托: 委托挂单分析、买卖单不平衡 (
order_book.py)。 - 开盘行为: 开盘时段的买入意愿 (
opening_session.py)。
- Python 3.8+
- Polars (核心数据处理库)
- NumPy
- PyArrow (Parquet 文件读写支持)
haitong_hf_factors/
├── __init__.py
├── main.py # 主程序入口,提供命令行接口
├── config.py # 全局配置(路径、参数、时间段定义)
├── data_loader.py # 数据加载模块,统一处理不同数据源
├── preprocessor.py # 数据预处理(时间过滤、异常值清洗)
├── aggregator.py # 因子聚合模块,汇总各子模块结果
├── batch_processor.py # 批处理流程控制与断点续传逻辑
├── run_real_data.py # 生产环境运行辅助脚本
├── factors/ # 因子计算核心逻辑包
│ ├── base.py # 因子基类
│ ├── big_order.py # 大单因子
│ ├── opening_session.py # 开盘因子
│ ├── order_book.py # 盘口因子
│ ├── price_based.py # 价格基础因子
│ ├── return_distribution.py # 收益分布因子
│ ├── trade_size.py # 成交规模因子
│ └── volume_distribution.py # 成交量分布因子
└── tests/ # 单元测试
项目提供了一个统一的命令行入口 haitong_hf_factors。
在项目根目录下,使用 python -m 方式运行:
计算单日所有因子:
python -m haitong_hf_factors --date 20260101批量计算指定日期范围:
python -m haitong_hf_factors --start-date 20260101 --end-date 20260131仅计算特定因子(使用逗号分隔因子名):
python -m haitong_hf_factors --date 20260101 --factors RSKEW,VOLUME_RATIO指定输出目录并强制重新计算(覆盖已有文件):
python -m haitong_hf_factors --date 20260130 --output-dir /path/to/output --force开启断点续传(跳过已存在的输出文件):
python -m haitong_hf_factors --start-date 20260101 --end-date 20260131 --resume关键配置项位于 haitong_hf_factors/config.py 中,支持但不限于以下配置:
- 数据路径: 输入数据源的根目录。
- 时间参数: 连续竞价时间段定义的起始与结束点(如
MARKET_CLOSE定义为 14:57:00)。 - 并行参数: 多进程计算时的并发数。
-
时间口径:
- 因子计算仅使用 连续竞价时段(09:30-11:30, 13:00-14:57)。
- 严格剔除开盘集合竞价(09:15-09:25)和收盘集合竞价(14:57-15:00)。
- 下午收盘时间点统一截断至 14:57:00.000。
-
数据要求:
- 输入数据格式建议为 Parquet。
- 需包含标准的交易所逐笔/快照字段(如
Time,Price,Volume等)。