DEV Community

Henry Lin
Henry Lin

Posted on

Chapter 2: Getting Started with Qlib/第2章:Qlib平台入门

第2章:Qlib平台入门 / Chapter 2: Getting Started with Qlib

学习目标 / Learning Objectives

通过本章学习,您将了解:
Through this chapter, you will learn:

  • Qlib平台的设计理念和核心功能 / Design philosophy and core features of Qlib platform
  • Qlib的系统架构和组件 / System architecture and components of Qlib
  • 如何安装和配置Qlib环境 / How to install and configure Qlib environment
  • 如何准备和管理数据 / How to prepare and manage data
  • Qlib的基本使用方法 / Basic usage of Qlib

2.1 Qlib平台介绍 / Introduction to Qlib Platform

2.1.1 什么是Qlib / What is Qlib

Qlib是由微软开源的AI驱动量化投资研究平台,旨在通过AI技术实现量化投资的潜力、赋能研究并创造价值。它从探索想法到实施生产,支持多种机器学习建模范式。

Qlib is an AI-oriented quantitative investment platform open-sourced by Microsoft that aims to realize the potential, empower research, and create value using AI technologies in quantitative investment, from exploring ideas to implementing productions, supporting diverse machine learning modeling paradigms.

2.1.2 Qlib的核心特性 / Core Features of Qlib

1. 全流程覆盖 / Full Pipeline Coverage

# Qlib covers the entire quantitative investment pipeline
# Qlib覆盖整个量化投资流水线

# Data processing / 数据处理
from qlib.data import D
from qlib.data.dataset import DatasetH

# Model training / 模型训练  
from qlib.contrib.model.gbdt import LGBModel

# Strategy development / 策略开发
from qlib.contrib.strategy import TopkDropoutStrategy

# Backtesting / 回测
from qlib.backtest import backtest
Enter fullscreen mode Exit fullscreen mode

2. 模块化设计 / Modular Design

# Components are designed as loose-coupled modules
# 组件设计为松耦合模块

# Each component can be used independently
# 每个组件都可以独立使用

# Example: Data component usage / 示例:数据组件使用
import qlib
from qlib.constant import REG_CN

# Initialize Qlib / 初始化Qlib
qlib.init(provider_uri="~/.qlib/qlib_data/cn_data", region=REG_CN)

# Use data module independently / 独立使用数据模块
instruments = D.instruments('csi300')
features = D.features(instruments, ['$close', '$volume'])
Enter fullscreen mode Exit fullscreen mode

3. 丰富的模型库 / Rich Model Library

Qlib提供了30+种机器学习和深度学习模型:
Qlib provides 30+ machine learning and deep learning models:

  • 传统机器学习 / Traditional ML: LightGBM, XGBoost, LinearModel
  • 深度学习 / Deep Learning: LSTM, GRU, Transformer, GATs
  • 强化学习 / Reinforcement Learning: PPO, OPDS for order execution

2.1.3 Qlib架构概览 / Qlib Architecture Overview

┌─────────────────────────────────────────────────────────────┐
│                    Workflow Layer                           │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐          │
│  │Information  │ │  Forecast   │ │  Portfolio  │          │
│  │ Extractor   │ │   Model     │ │ Management  │          │
│  └─────────────┘ └─────────────┘ └─────────────┘          │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│                Learning Framework Layer                     │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐          │
│  │ Supervised  │ │Reinforcement│ │Meta Learning│          │
│  │  Learning   │ │  Learning   │ │             │          │
│  └─────────────┘ └─────────────┘ └─────────────┘          │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│                Infrastructure Layer                         │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐          │
│  │    Data     │ │   Trainer   │ │   Cache     │          │
│  │   Server    │ │             │ │   System    │          │
│  └─────────────┘ └─────────────┘ └─────────────┘          │
└─────────────────────────────────────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

2.2 环境搭建 / Environment Setup

2.2.1 系统要求 / System Requirements

  • 操作系统 / Operating System: Linux, Windows, macOS
  • Python版本 / Python Version: 3.8-3.12
  • 内存 / Memory: 建议8GB以上 / Recommended 8GB+
  • 存储空间 / Storage: 建议10GB以上 / Recommended 10GB+

2.2.2 安装Qlib / Installing Qlib

方法1:使用pip安装 / Method 1: Install via pip

# Install stable version / 安装稳定版本
pip install pyqlib

# Verify installation / 验证安装
python -c "import qlib; print(qlib.__version__)"
Enter fullscreen mode Exit fullscreen mode

方法2:从源码安装 / Method 2: Install from source

# Clone repository / 克隆仓库
git clone https://github.com/microsoft/qlib.git
cd qlib

# Install dependencies / 安装依赖
pip install numpy
pip install --upgrade cython

# Install Qlib / 安装Qlib
pip install .

# For development / 开发模式安装
pip install -e .[dev]
Enter fullscreen mode Exit fullscreen mode

方法3:使用Docker / Method 3: Using Docker

# Pull Docker image / 拉取Docker镜像
docker pull pyqlib/qlib_image_stable:stable

# Run container / 运行容器
docker run -it --name qlib_container -v /path/to/data:/app pyqlib/qlib_image_stable:stable
Enter fullscreen mode Exit fullscreen mode

2.2.3 验证安装 / Verify Installation

# Test Qlib installation / 测试Qlib安装
import qlib
print(f"Qlib version: {qlib.__version__}")

# Test core modules / 测试核心模块
from qlib.data import D
from qlib.constant import REG_CN
from qlib.model.base import Model

print("Qlib installation successful! / Qlib安装成功!")
Enter fullscreen mode Exit fullscreen mode

2.3 数据准备 / Data Preparation

2.3.1 获取数据 / Getting Data

自动下载数据 / Automatic Data Download

# Download Chinese market data / 下载中国市场数据
python -m qlib.run.get_data qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn

# Download 1-minute data / 下载1分钟数据
python -m qlib.run.get_data qlib_data --target_dir ~/.qlib/qlib_data/cn_data_1min --region cn --interval 1min
Enter fullscreen mode Exit fullscreen mode

使用社区数据源 / Using Community Data Source

# Download community-provided data / 下载社区提供的数据
wget https://github.com/chenditc/investment_data/releases/latest/download/qlib_bin.tar.gz
mkdir -p ~/.qlib/qlib_data/cn_data
tar -zxvf qlib_bin.tar.gz -C ~/.qlib/qlib_data/cn_data --strip-components=1
rm -f qlib_bin.tar.gz
Enter fullscreen mode Exit fullscreen mode

2.3.2 数据结构 / Data Structure

Qlib使用高效的二进制格式存储数据:
Qlib uses efficient binary format for data storage:

~/.qlib/qlib_data/cn_data/
├── calendars/          # 交易日历 / Trading calendars
├── instruments/        # 股票列表 / Stock lists  
├── features/          # 特征数据 / Feature data
│   ├── SH600000/      # Individual stock data / 个股数据
│   │   ├── close.bin  # 收盘价 / Close price
│   │   ├── volume.bin # 成交量 / Volume
│   │   └── ...
│   └── ...
└── meta.pkl          # 元数据 / Metadata
Enter fullscreen mode Exit fullscreen mode

2.3.3 数据健康检查 / Data Health Check

# Check data health / 检查数据健康状况
import qlib
from qlib.data import D
from qlib.constant import REG_CN

# Initialize with data path / 使用数据路径初始化
qlib.init(provider_uri="~/.qlib/qlib_data/cn_data", region=REG_CN)

# Basic data check / 基本数据检查
def check_data_health():
    """
    Check if data is properly loaded
    检查数据是否正确加载
    """
    try:
        # Check calendar / 检查日历
        calendar = D.calendar(start_time='2020-01-01', end_time='2020-12-31')
        print(f"Calendar days: {len(calendar)} / 日历天数: {len(calendar)}")

        # Check instruments / 检查股票列表
        instruments = D.instruments('csi300')
        print(f"Number of instruments: {len(instruments)} / 股票数量: {len(instruments)}")

        # Check features / 检查特征数据
        features = D.features(instruments[:5], ['$close', '$volume'], 
                            start_time='2020-01-01', end_time='2020-01-31')
        print(f"Feature data shape: {features.shape} / 特征数据形状: {features.shape}")

        return True
    except Exception as e:
        print(f"Data check failed: {e} / 数据检查失败: {e}")
        return False

# Run check / 运行检查
data_ok = check_data_health()
Enter fullscreen mode Exit fullscreen mode

2.4 Qlib基本使用 / Basic Usage of Qlib

2.4.1 初始化Qlib / Initialize Qlib

import qlib
from qlib.constant import REG_CN

# Method 1: Basic initialization / 方法1: 基础初始化
qlib.init(provider_uri="~/.qlib/qlib_data/cn_data", region=REG_CN)

# Method 2: Advanced initialization with custom settings / 方法2: 高级初始化with自定义设置
qlib.init(
    provider_uri="~/.qlib/qlib_data/cn_data",
    region=REG_CN,
    exp_manager={
        "class": "MLflowExpManager",
        "module_path": "qlib.workflow.expm",
        "kwargs": {
            "uri": "file:///tmp/mlruns",
            "default_exp_name": "Experiment"
        }
    }
)
Enter fullscreen mode Exit fullscreen mode

2.4.2 基础数据操作 / Basic Data Operations

from qlib.data import D

# Get trading calendar / 获取交易日历
calendar = D.calendar(start_time='2020-01-01', end_time='2020-12-31', freq='day')
print(f"First 5 trading days / 前5个交易日: \n{calendar[:5]}")

# Get stock list / 获取股票列表
instruments = D.instruments('csi300')
print(f"CSI300 stocks count / 沪深300股票数量: {len(instruments)}")
print(f"Sample stocks / 样本股票: {instruments[:5]}")

# Get feature data / 获取特征数据
features = D.features(
    instruments=['SH600000', 'SZ000001'], 
    fields=['$open', '$high', '$low', '$close', '$volume'],
    start_time='2020-01-01', 
    end_time='2020-01-31'
)
print(f"Feature data / 特征数据:")
print(features.head())
Enter fullscreen mode Exit fullscreen mode

2.4.3 配置文件方式使用 / Using Configuration Files

创建配置文件 / Create configuration file:

# config_basic.yaml
qlib_init:
    provider_uri: "~/.qlib/qlib_data/cn_data"
    region: cn

market: &market csi300
benchmark: &benchmark SH000300

data_handler_config: &data_handler_config
    start_time: 2008-01-01
    end_time: 2020-08-01
    fit_start_time: 2008-01-01
    fit_end_time: 2014-12-31
    instruments: *market

task:
    model:
        class: LGBModel
        module_path: qlib.contrib.model.gbdt
        kwargs:
            loss: mse
            learning_rate: 0.1
            max_depth: 6
            num_leaves: 64

    dataset:
        class: DatasetH
        module_path: qlib.data.dataset
        kwargs:
            handler:
                class: Alpha158
                module_path: qlib.contrib.data.handler
                kwargs: *data_handler_config
            segments:
                train: [2008-01-01, 2014-12-31]
                valid: [2015-01-01, 2016-12-31] 
                test: [2017-01-01, 2020-08-01]
Enter fullscreen mode Exit fullscreen mode

使用配置文件运行 / Run with configuration file:

# Run experiment with config file / 使用配置文件运行实验
qrun config_basic.yaml
Enter fullscreen mode Exit fullscreen mode

2.4.4 代码方式使用 / Using Code Approach

# Complete workflow example / 完整工作流示例
import qlib
from qlib.constant import REG_CN
from qlib.utils import init_instance_by_config
from qlib.workflow import R
from qlib.tests.config import CSI300_GBDT_TASK

# Initialize Qlib / 初始化Qlib
qlib.init(provider_uri="~/.qlib/qlib_data/cn_data", region=REG_CN)

# Initialize model and dataset / 初始化模型和数据集
model = init_instance_by_config(CSI300_GBDT_TASK["model"])
dataset = init_instance_by_config(CSI300_GBDT_TASK["dataset"])

# Start experiment recording / 开始实验记录
with R.start(experiment_name="basic_example"):
    # Train model / 训练模型
    model.fit(dataset)

    # Make predictions / 进行预测
    predictions = model.predict(dataset)

    # Record results / 记录结果
    R.save_objects(model=model, predictions=predictions)

print("Experiment completed successfully! / 实验成功完成!")
Enter fullscreen mode Exit fullscreen mode

2.5 快速示例 / Quick Example

2.5.1 端到端示例 / End-to-End Example

# Quick start example: Build a simple quant strategy
# 快速开始示例:构建简单量化策略

import qlib
import pandas as pd
from qlib.constant import REG_CN
from qlib.utils import init_instance_by_config

# Step 1: Initialize / 步骤1:初始化
qlib.init(provider_uri="~/.qlib/qlib_data/cn_data", region=REG_CN)

# Step 2: Define model configuration / 步骤2:定义模型配置
model_config = {
    "class": "LGBModel",
    "module_path": "qlib.contrib.model.gbdt",
    "kwargs": {
        "loss": "mse",
        "learning_rate": 0.1,
        "max_depth": 6,
        "num_leaves": 64,
        "verbose": -1
    }
}

# Step 3: Define dataset configuration / 步骤3:定义数据集配置
dataset_config = {
    "class": "DatasetH",
    "module_path": "qlib.data.dataset",
    "kwargs": {
        "handler": {
            "class": "Alpha158",
            "module_path": "qlib.contrib.data.handler",
            "kwargs": {
                "start_time": "2008-01-01",
                "end_time": "2020-08-01",
                "fit_start_time": "2008-01-01", 
                "fit_end_time": "2014-12-31",
                "instruments": "csi300"
            }
        },
        "segments": {
            "train": ["2008-01-01", "2014-12-31"],
            "valid": ["2015-01-01", "2016-12-31"],
            "test": ["2017-01-01", "2020-08-01"]
        }
    }
}

# Step 4: Initialize model and dataset / 步骤4:初始化模型和数据集
model = init_instance_by_config(model_config)
dataset = init_instance_by_config(dataset_config)

# Step 5: Train model / 步骤5:训练模型
print("Training model... / 训练模型中...")
model.fit(dataset)

# Step 6: Make predictions / 步骤6:进行预测
print("Making predictions... / 进行预测中...")
predictions = model.predict(dataset)

# Step 7: Evaluate results / 步骤7:评估结果
def evaluate_predictions(pred, dataset):
    """
    Simple evaluation of predictions
    简单的预测评估
    """
    # Get actual returns / 获取实际收益
    label = dataset.prepare("test")["label"]

    # Calculate IC (Information Coefficient) / 计算IC(信息系数)
    ic = pred.corrwith(label, method='pearson').mean()

    # Calculate Rank IC / 计算Rank IC
    rank_ic = pred.corrwith(label, method='spearman').mean()

    print(f"Information Coefficient (IC): {ic:.4f}")
    print(f"Rank IC: {rank_ic:.4f}")

    return ic, rank_ic

# Evaluate / 评估
ic, rank_ic = evaluate_predictions(predictions, dataset)

print("Quick example completed! / 快速示例完成!")
Enter fullscreen mode Exit fullscreen mode

2.5.2 结果分析 / Result Analysis

# Analyze prediction results / 分析预测结果
import matplotlib.pyplot as plt
import numpy as np

def analyze_results(predictions, dataset):
    """
    Analyze and visualize prediction results
    分析和可视化预测结果
    """
    # Get test data / 获取测试数据
    test_data = dataset.prepare("test")
    pred = predictions
    label = test_data["label"]

    # Plot prediction vs actual / 绘制预测vs实际
    plt.figure(figsize=(12, 8))

    # Subplot 1: Scatter plot / 子图1:散点图
    plt.subplot(2, 2, 1)
    plt.scatter(label, pred, alpha=0.5)
    plt.xlabel('Actual Returns / 实际收益')
    plt.ylabel('Predicted Returns / 预测收益')
    plt.title('Prediction vs Actual / 预测vs实际')

    # Subplot 2: IC over time / 子图2:时间序列IC
    plt.subplot(2, 2, 2)
    ic_series = pred.groupby(level=0).corrwith(label.groupby(level=0), method='pearson')
    ic_series.plot()
    plt.title('IC Over Time / IC时间序列')
    plt.xlabel('Date / 日期')
    plt.ylabel('IC')

    # Subplot 3: Returns distribution / 子图3:收益分布
    plt.subplot(2, 2, 3)
    plt.hist(pred.values, bins=50, alpha=0.7, label='Predicted / 预测')
    plt.hist(label.values, bins=50, alpha=0.7, label='Actual / 实际')
    plt.legend()
    plt.title('Returns Distribution / 收益分布')

    # Subplot 4: Cumulative IC / 子图4:累积IC
    plt.subplot(2, 2, 4)
    cumulative_ic = ic_series.cumsum()
    cumulative_ic.plot()
    plt.title('Cumulative IC / 累积IC')
    plt.xlabel('Date / 日期')
    plt.ylabel('Cumulative IC / 累积IC')

    plt.tight_layout()
    plt.show()

    # Print statistics / 打印统计信息
    print(f"Mean IC / 平均IC: {ic_series.mean():.4f}")
    print(f"IC Std / IC标准差: {ic_series.std():.4f}")
    print(f"IC Sharpe / IC夏普: {ic_series.mean() / ic_series.std():.4f}")

# Run analysis / 运行分析
# analyze_results(predictions, dataset)
Enter fullscreen mode Exit fullscreen mode

2.6 常见问题解决 / Troubleshooting

2.6.1 安装问题 / Installation Issues

# Check Python version / 检查Python版本
import sys
print(f"Python version: {sys.version}")

# Check required packages / 检查必需包
required_packages = ['numpy', 'pandas', 'sklearn', 'lightgbm']
for package in required_packages:
    try:
        __import__(package)
        print(f"{package} is installed")
    except ImportError:
        print(f"{package} is not installed / {package}未安装")
        print(f"  Install with: pip install {package}")
Enter fullscreen mode Exit fullscreen mode

2.6.2 数据问题 / Data Issues

# Data troubleshooting / 数据问题排查
def diagnose_data_issues():
    """
    Diagnose common data issues
    诊断常见数据问题
    """
    try:
        import qlib
        from qlib.data import D
        from qlib.constant import REG_CN

        # Test initialization / 测试初始化
        qlib.init(provider_uri="~/.qlib/qlib_data/cn_data", region=REG_CN)
        print("✓ Qlib initialization successful / Qlib初始化成功")

        # Test data access / 测试数据访问
        calendar = D.calendar()
        print(f"✓ Calendar loaded: {len(calendar)} days / 日历加载成功: {len(calendar)}")

        instruments = D.instruments('csi300')
        print(f"✓ Instruments loaded: {len(instruments)} stocks / 股票列表加载成功: {len(instruments)}")

    except Exception as e:
        print(f"✗ Error: {e}")
        print("Possible solutions / 可能的解决方案:")
        print("1. Check data path / 检查数据路径")
        print("2. Re-download data / 重新下载数据")
        print("3. Check file permissions / 检查文件权限")

# Run diagnosis / 运行诊断
diagnose_data_issues()
Enter fullscreen mode Exit fullscreen mode

2.6.3 性能优化 / Performance Optimization

# Performance optimization tips / 性能优化建议
def optimize_performance():
    """
    Tips for optimizing Qlib performance
    优化Qlib性能的建议
    """
    import psutil
    import os

    # Check system resources / 检查系统资源
    print("System Resources / 系统资源:")
    print(f"CPU cores: {psutil.cpu_count()}")
    print(f"Memory: {psutil.virtual_memory().total / (1024**3):.1f} GB")
    print(f"Available memory: {psutil.virtual_memory().available / (1024**3):.1f} GB")

    # Memory optimization settings / 内存优化设置
    print("\nRecommended settings / 推荐设置:")
    print("1. Set environment variables / 设置环境变量:")
    print("   export NUMEXPR_MAX_THREADS=4")
    print("   export MKL_NUM_THREADS=4")

    # Cache optimization / 缓存优化
    print("2. Enable caching / 启用缓存:")
    print("   qlib.init(..., mem_cache_size_limit=10*1024**3)  # 10GB cache")

optimize_performance()
Enter fullscreen mode Exit fullscreen mode

本章小结 / Chapter Summary

本章介绍了Qlib平台的核心概念、安装配置和基本使用方法。我们学习了:

This chapter introduced the core concepts, installation and configuration, and basic usage of the Qlib platform. We learned:

  1. Qlib架构 / Qlib Architecture: 三层架构设计支持模块化开发 / Three-layer architecture design supports modular development

  2. 环境搭建 / Environment Setup: 多种安装方式和配置选项 / Multiple installation methods and configuration options

  3. 数据管理 / Data Management: 数据获取、存储和验证方法 / Data acquisition, storage, and validation methods

  4. 基本使用 / Basic Usage: 配置文件和代码两种使用方式 / Configuration file and code-based usage approaches

  5. 问题解决 / Troubleshooting: 常见问题的诊断和解决方法 / Diagnosis and solutions for common issues

掌握这些基础知识后,我们就可以开始深入学习Qlib的核心概念和高级功能了。

After mastering this foundational knowledge, we can begin to delve deeper into Qlib's core concepts and advanced features.

练习题 / Exercises

  1. 环境验证 / Environment Verification: 按照教程安装Qlib并验证所有功能正常 / Install Qlib following the tutorial and verify all functions work properly

  2. 数据探索 / Data Exploration: 使用Qlib API探索CSI300股票的基本统计信息 / Use Qlib API to explore basic statistics of CSI300 stocks

  3. 配置文件 / Configuration File: 创建自定义配置文件并运行简单实验 / Create a custom configuration file and run a simple experiment

  4. 性能测试 / Performance Testing: 测试不同数据加载方式的性能差异 / Test performance differences between different data loading methods


下一章预告 / Next Chapter Preview:
第3章将深入介绍Qlib的核心概念,包括系统架构、配置系统和数据流处理机制。
Chapter 3 will delve into Qlib's core concepts, including system architecture, configuration system, and data flow processing mechanisms.

Top comments (0)