学习笔记:Qlib 量化投资平台框架 — OTHER COMPONENTS/FEATURES/TOPICS

学习笔记:Qlib 量化投资平台框架 --- OTHER COMPONENTS/FEATURES/TOPICS

Qlib 是微软亚洲研究院开源的一个面向人工智能的量化投资平台,旨在实现人工智能技术在量化投资中的潜力,赋能研究,并创造价值,从探索想法到实施生产。Qlib 支持多种机器学习建模范式,包括监督学习、市场动态建模和强化学习。借助 Qlib,用户可以轻松尝试他们的想法,以创建更优秀的量化投资策略。

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。

公式化Alpha因子构建

一、核心概念

1.1 公式化Alpha因子定义

  • 通过数学公式表达的预测性因子
  • 用于解释和预测资产未来收益
  • 示例:MACD(指数平滑异同移动平均线)

1.2 MACD技术指标解析

M A C D = 2 × ( D I F − D E A ) MACD = 2 \times (DIF - DEA) MACD=2×(DIF−DEA)

分量公式
  • DIF(差离值)
    D I F = E M A ( C L O S E , 12 ) − E M A ( C L O S E , 26 ) C L O S E DIF = \frac{EMA(CLOSE, 12) - EMA(CLOSE, 26)}{CLOSE} DIF=CLOSEEMA(CLOSE,12)−EMA(CLOSE,26)
  • DEA(信号线)
    D E A = E M A ( D I F , 9 ) C L O S E DEA = \frac{EMA(DIF, 9)}{CLOSE} DEA=CLOSEEMA(DIF,9)

二、QLib实现步骤

2.1 数据加载器配置

python 复制代码
from qlib.data.dataset.loader import QlibDataLoader

# MACD公式表达式
MACD_EXP = '(EMA($close, 12) - EMA($close, 26))/$close - EMA((EMA($close, 12) - EMA($close, 26))/$close, 9)/$close'

# 特征与标签配置
fields = [MACD_EXP]  # 特征字段
names = ['MACD']     # 特征名称
labels = ['Ref($close, -2)/Ref($close, -1) - 1']  # 标签计算公式
label_names = ['LABEL']  # 标签名称

data_loader_config = {
    "feature": (fields, names),
    "label": (labels, label_names)
}

2.2 数据加载与执行

python 复制代码
# 初始化数据加载器
data_loader = QlibDataLoader(config=data_loader_config)

# 加载CSI300数据
df = data_loader.load(
    instruments='csi300',
    start_time='2010-01-01',
    end_time='2017-12-31'
)

# 输出数据结构示例
print(df)
"""
                        feature     label
                           MACD     LABEL
datetime   instrument
2010-01-04 SH600000   -0.011547 -0.019672
           SH600004    0.002745 -0.014721
           ...              ...       ...
"""

三、关键技术要素

3.1 特征工程组件

  • EMA计算函数:EMA($close, N)
  • 价格引用函数:Ref($close, -N)
  • 算术运算符支持:+、-、*、/

3.2 数据维度说明

  • feature列:包含计算得到的MACD值
  • label列 :反映未来收益率
    L A B E L = C l o s e t + 2 C l o s e t + 1 − 1 LABEL = \frac{Close_{t+2}}{Close_{t+1}} - 1 LABEL=Closet+1Closet+2−1

四、注意事项

  1. 前置初始化 :必须执行qlib.init()初始化环境
  2. 数据格式规范
    • 时间索引格式:YYYY-MM-DD
    • 证券代码格式:交易所代码+股票代码(如SH600000)
  3. 计算周期说明
    • 短期EMA周期:12日
    • 长期EMA周期:26日
    • 信号线周期:9日

五、扩展学习

在线模式与离线模式

1. 模式概述

支持模式:QLib 提供两种数据访问模式

  • Online Mode(在线模式)
  • Offline Mode(离线模式)*

2. 在线模式核心优势

设计目标:

  1. 集中化数据管理 - 用户无需处理多版本数据管理问题
  2. 减少缓存生成量 - 优化存储空间利用率
  3. 远程数据访问 - 支持分布式环境下的数据调用

3. Qlib-Server架构解析

3.1 系统定位

  • 专用配套服务系统

  • 基础架构:

    text 复制代码
    Qlib基础计算引擎 + 扩展服务系统 + 智能缓存机制

3.2 核心价值

  • 实现数据的集中化管理
  • 支持在线模式运行环境搭建
  • 提供远程服务调用能力

4. 进阶学习指引

序列化机制

一、核心功能概述

  1. 支持序列化对象类型

    • DataHandler
    • DataSet
    • Processor
    • Model
    • 其他继承自Serializable基类的对象
  2. 序列化格式

    • 使用pickle格式进行持久化存储
    • 支持选择pickle后端(默认pickle/dill)

二、序列化基类实现

python 复制代码
qlib.utils.serial.Serializable

关键特性

  1. 属性保存规则

    • 自动保存不以_开头的实例属性

    • 可通过以下方式修改默认行为:

      python 复制代码
      self.config(dump_all=False)  # 配置方法
      default_dump_all = False     # 类属性覆盖
  2. Pickle后端选择

    python 复制代码
    pickle_backend = "pickle"  # 默认选项(标准序列化)
    pickle_backend = "dill"    # 支持函数序列化等高级特性

三、序列化实践示例

1. 序列化数据集示例

python 复制代码
# ============= 序列化数据集 =============
dataset.to_pickle(path="dataset.pkl")  # dataset是DatasetH实例

# ============= 反序列化数据集 =============
with open("dataset.pkl", "rb") as file_dataset:
    dataset = pickle.load(file_dataset)

2. 关键注意事项

  • 序列化内容限制

    • 仅保存状态信息(如数据标准化的均值/方差)
    • 不保存实际数据(数据不属于状态)
  • 反序列化后操作

    python 复制代码
    # 必须重新初始化以下参数:
    instruments   # 投资标的
    start_time    # 起始时间
    end_time      # 结束时间 
    segments      # 数据分段

完整示例参考:[this link](this link)

四、重要设计原则

  1. 状态与数据分离

    • 状态:需要持久化的配置参数
    • 数据:动态生成不进行存储
  2. 可扩展性设计

    • 通过继承Serializable基类实现自定义序列化
    • 支持不同pickle协议扩展

五、API参考

详细接口说明请参见:Serializable API

任务管理模块

一、核心功能概述

QLib任务管理系统提供完整的工作流自动化解决方案,包含四大核心组件:

  • 任务生成(Task Generating)
  • 任务存储(Task Storing)
  • 任务训练(Task Training)
  • 结果收集(Task Collecting)

支持不同时间段/损失函数/模型的自动任务生成与管理,适用于在线服务场景

二、任务生成(Task Generating)

2.1 核心类

python 复制代码
class qlib.workflow.task.gen.TaskGen  # 任务生成基类
class qlib.workflow.task.gen.RollingGen  # 时间窗口滚动生成器

2.2 核心方法

python 复制代码
@abstract
def generate(task: dict) -> List[dict]:
    """基于任务模板生成衍生任务
    Parameters:
        task - 基础任务模板(字典格式)
    Returns:
        生成的任务列表
    """

2.3 典型应用场景

  • 时间窗口滚动:输入基础模板+滚动步数 → 输出不同时间段的衍生任务
  • 损失函数测试:输入基础模板+损失函数列表 → 输出不同损失函数的任务集

三、任务存储(Task Storing)

3.1 MongoDB配置

python 复制代码
from qlib.config import C
C["mongo"] = {
    "task_url": "mongodb://localhost:27017/",  # MongoDB连接地址
    "task_db_name": "rolling_db"  # 数据库名称
}

3.2 任务管理器(TaskManager)

python 复制代码
class qlib.workflow.task.manage.TaskManager(task_pool: str)
3.2.1 核心方法
python 复制代码
create_task(task_def_l, dry_run=False)  # 批量创建任务
fetch_task(query={}, status='waiting')  # 查询获取任务
commit_task_res(task, res, status='done')  # 提交任务结果
task_stat(query={})  # 统计任务状态分布
reset_waiting(query={})  # 重置运行中任务为等待状态
3.2.2 任务状态机
text 复制代码
STATUS_WAITING → STATUS_RUNNING → STATUS_PART_DONE → STATUS_DONE

3.3 命令行工具

bash 复制代码
python -m qlib.workflow.task.manage -t <pool_name> wait  # 等待任务完成
python -m qlib.workflow.task.manage -t <pool_name> task_stat  # 查看任务统计

四、任务训练(Task Training)

4.1 核心执行函数

python 复制代码
qlib.workflow.task.manage.run_task(
    task_func: Callable,
    task_pool: str,
    query: dict = {},
    force_release: bool = False,
    before_status: str = 'waiting',
    after_status: str = 'done',
    **kwargs
)

4.2 训练器(Trainer)

python 复制代码
class qlib.model.trainer.Trainer  # 即时训练器
class qlib.model.trainer.DelayTrainer  # 延迟训练器

# 主要方法
train(tasks: list) → list  # 开始训练
end_train(models: list) → list  # 结束训练
is_delay() → bool  # 判断训练器类型

4.3 训练器类型对比

特性 TrainerR TrainerRM
任务管理 基础方式 基于TaskManager
适用场景 简单任务列表 需要生命周期管理

五、结果收集(Task Collecting)

5.1 收集流程

text 复制代码
Collector → Group → Ensemble

5.2 核心组件

  • Collector:收集处理结果(合并/分组等)
  • Group:按规则分组结果
  • Ensemble:集成处理分组结果

5.3 常用集成方法

python 复制代码
AverageEnsemble  # 跨模型结果平均
RollingEnsemble  # 时间窗口滚动集成

六、配置注意事项

  1. MongoDB连接必须在初始化时配置
  2. 需要预先设置mlruns路径用于结果收集
  3. 任务状态转换需遵循严格的状态机规则
  4. 使用safe_fetch_task保证线程安全

七、典型工作流

WAITING RUNNING 任务生成 存储到MongoDB 状态检查 任务训练 结果提交 结果收集 等待/重试

Point-in-Time (PIT) 数据库

概述

核心概念

  • 点时间数据(Point-in-Time Data):解决历史回测中数据时效性问题,确保在任意历史时间戳获取正确的数据版本,避免因使用最新数据导致的数据泄漏(data leakage)。
  • 应用场景:金融历史分析(如财务报告回溯)、交易策略回测(假设每日收盘交易)。

核心价值

  • 保证一致性:确保在线交易与历史回测试验的性能一致。

数据准备

工具与流程

  1. 数据采集
    QLib提供爬虫工具(crawler)下载金融数据。
  2. 格式转换
    使用转换工具(converter)将数据转为QLib格式。
  3. 操作指引
    参考脚本路径:scripts/data_collector/pit/README.md,内含下载、转换及额外使用示例。

文件结构设计

数据文件(XXX_a.dataXXX_q.data

文件结构
  • 列定义 (每行对应一条记录,占20字节):
    • date:数据发布日期(格式:YYYYMMDD)。
    • period:数据所属报告期编码规则:
      • 年度数据 :整数年份(如2007)。
      • 季度数据<年份><季度序号>(如200704表示2007年第4季度)。
    • value:特征值。
    • _next:下一个相同报告期数据的字节索引。4294967295表示无后续记录。
示例数据
python 复制代码
# 数据格式示例(来自XXXX.data文件)
array([(20070428, 200701, 0.090219  , 4294967295),
       (20070817, 200702, 0.13933   , 4294967295),
       ...  # 省略部分数据
       (20190718, 201902, 0.175322  , 4294967295),
       (20191016, 201903, 0.25581899, 4294967295)],
      dtype=[('date', '<u4'), ('period', '<u4'), ('value', '<f8'), ('_next', '<u4')])

索引文件(XXX_a.index

文件结构
  1. 起始索引
    首行为起始年份(如2007)。
  2. 字节索引数组
    记录每个报告期首次更新的字节位置(按升序排列)。
示例索引
python 复制代码
# 索引文件结构示例(来自XXXX.index文件)
array([         0,         20,         40, ..., 4294967295], dtype=uint32)

关键特性与约束

数据排列规则

  • 按日期升序 :数据文件中的记录按date字段升序排列。

文件名约定

  • 年度数据XXX_a.data(如财务年度报告)。
  • 季度数据XXX_q.data(如季度财务数据)。

已知限制

  1. 适用范围
    当前设计主要支持年度/季度周期性数据(如财务报表),适用于多数市场基础因子。
  2. 性能瓶颈
    PIT计算逻辑尚未优化,存在显著性能提升空间。
  3. 编码约束
    依赖文件名标识数据类型(_a_q后缀),需严格遵循命名规范。

设计原理补充

数据查询优化

  • 索引文件作用:通过预记录首次更新的字节位置,加速按报告期查询数据的效率。
  • _next字段逻辑
    若同一报告期存在多次更新(如修正数据),_next指向下一条记录的字节位置,形成链式结构。

特殊值说明

  • _next = 4294967295:表示当前记录是该报告期的最终版本,无后续更新。
相关推荐
于齐龙25 分钟前
pip 常用命令及配置
linux·python·pip
高效匠人39 分钟前
Python10天冲刺-设计模型之策略模式
开发语言·人工智能·python·策略模式
风暴之零1 小时前
文本中地理位置提取方法—正则和NLP模型
开发语言·python
Dxy12393102161 小时前
python合并word中的run
开发语言·python·word
hello_ejb32 小时前
聊聊Spring AI Alibaba的MermaidGenerator
人工智能·python·spring
楠奕2 小时前
neo4j vs python
开发语言·python·neo4j
LIUDAN'S WORLD2 小时前
第 2.3 节: 基于 Python 的关节空间与任务空间控制
人工智能·python·算法
Tech Synapse3 小时前
树莓派智能摄像头实战指南:基于TensorFlow Lite的端到端AI部署
人工智能·python·tensorflow·mobilenetv2·tensorflow lite
派葛穆4 小时前
机器视觉开发-打开摄像头
python·opencv·计算机视觉
Dxy12393102165 小时前
python设置word字体的方法
python·word