學習筆記:Qlib 量化投資平臺框架 — FIRST STEPS

學習筆記:Qlib 量化投資平臺框架 — FIRST STEPS

Qlib 是微軟亞洲研究院開源的一個面向人工智能的量化投資平臺,旨在實現人工智能技術在量化投資中的潛力,賦能研究,并創造價值,從探索想法到實施生產。Qlib 支持多種機器學習建模范式,包括監督學習、市場動態建模和強化學習。借助 Qlib,用戶可以輕松嘗試他們的想法,以創建更優秀的量化投資策略。

文中內容僅限技術學習與代碼實踐參考,市場存在不確定性,技術分析需謹慎驗證,不構成任何投資建議。

Qlib

安裝指南

一、環境要求

  1. 操作系統
    • 支持 Windows、MacOS 和 Linux,推薦使用 Linux
  2. Python 版本
    • 支持 Python3, Python >=3.8

二、安裝方法

1. 通過 pip 安裝

pip install pyqlib

2. 通過源碼安裝

步驟說明

  1. 進入 Qlib 根目錄(包含 setup.py 文件)。

  2. 依次執行以下命令:

    # 安裝環境依賴
    pip install numpy
    pip install --upgrade cython# 克隆倉庫并安裝
    git clone https://github.com/microsoft/qlib.git && cd qlib
    python setup.py install
    

三、注意事項

  1. 環境管理
    • 推薦使用 anacondaminiconda 創建獨立環境。
  2. 依賴包安裝
    • 需額外通過 pip 安裝 lightgbmpytorch

      pip install lightgbm torch torchaudio torchvision
      

四、驗證安裝

執行以下 Python 代碼確認安裝成功:

import qlib
print(qlib.__version__)  # 輸出應為當前安裝版本(如 0.9.6)

關鍵總結

  • 優先選擇 Linux 環境,Python 版本需 >=3.8。
  • 源碼安裝需按順序處理依賴(numpy → cython → 克隆倉庫)。
  • 通過 conda 管理環境可減少依賴沖突風險。
  • 必須單獨安裝 lightgbmpytorch 以支持完整功能。

初始化

一、初始化流程

  1. 數據準備

    • 執行以下命令下載默認數據集(中國股市數據):

      python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn
      
    • 數據來源:Yahoo Finance(可能存在缺陷,建議用戶使用高質量自定義數據)。

    • 自定義數據格式要求:詳見 Data Preparation 部分。

  2. 初始化 Qlib

    • 在調用其他 API 前,需運行以下 Python 代碼初始化:

      import qlib
      from qlib.constant import REG_CNprovider_uri = "~/.qlib/qlib_data/cn_data"  # 數據存儲路徑
      qlib.init(provider_uri=provider_uri, region=REG_CN)
      
    • 注意:禁止在 Qlib 代碼倉庫目錄內導入 qlib 包,否則可能報錯。

二、關鍵參數解析

qlib.init() 支持以下核心參數配置:

  • provider_uri
    類型:str,必填,數據存儲路徑(如 ~/.qlib/qlib_data/cn_data)。

  • region
    類型:str,默認值為REG_CN,市場模式:

    • REG_CN(中國股市)
    • REG_US(美國股市)
      不同模式對應交易規則(如最小交易單位、交易限制)。
  • redis_host
    類型:str,默認值為"127.0.0.1",Redis 主機地址(用于緩存與鎖機制)。

  • redis_port
    類型:int,默認值為6379,Redis 端口。

  • exp_manager
    類型:dict,默認值無,實驗管理器配置(如使用 MLflow):

    exp_manager={"class": "MLflowExpManager","module_path": "qlib.workflow.expm","kwargs": {"uri": "path/mlruns", "default_exp_name": "Experiment"}
    }
    
  • mongo
    類型:dict,默認值無,MongoDB 配置(用于任務管理):

    mongo={"task_url": "mongodb://localhost:27017/","task_db_name": "rolling_db"
    }
    
  • logging_level
    默認值無,系統日志級別(如 DEBUG, INFO)。

  • kernels
    類型:int,默認值無,表達式引擎進程數(調試時可設為 1)。

三、注意事項

  1. 數據與 region 一致性

    • region 必須與 provider_uri 中數據對應。當前 get_data.py 僅支持中國數據,使用美國數據需用戶自行準備。
  2. Redis 依賴

    • 若 Redis 連接失敗(錯誤配置或未啟動),緩存機制將失效。
  3. 實驗管理器配置

    • exp_manager 需嚴格按字典格式定義類、模塊路徑及參數(如 MLflowExpManager)。
  4. MongoDB 前置條件

    • 使用 mongo 參數前需安裝并啟動 MongoDB,通過 URI 訪問(支持帶認證的 URL)。
  5. 調試建議

    • 調試表達式計算時,設置 kernels=1 以簡化問題定位。

四、補充說明

  • 區域模式擴展性region 是預定義配置的快捷方式,用戶可通過手動設置交易單位(trade_unit)、限制閾值(limit_threshold)等覆蓋默認行為。
  • 緩存機制文檔:詳見 Cache 部分。

數據檢索功能

一、環境初始化

import qlib
qlib.init(provider_uri='~/.qlib/qlib_data/cn_data')  # 必須初始化后才能獲取數據
  • 需預先完成數據下載并設置正確的provider_uri路徑

二、交易日歷操作

from qlib.data import D
calendar = D.calendar(start_time='2010-01-01', end_time='2017-12-31', freq='day')
print(calendar[:2])  # 輸出前兩個交易日
  • 支持時間范圍過濾
  • 可指定頻率參數(freq)

三、股票池管理

1. 基礎配置

D.instruments(market='all')  # 全市場配置
D.instruments(market='csi300')  # 滬深300成分股

2. 動態篩選器

(1) 正則篩選器
from qlib.data.filter import NameDFilter
name_filter = NameDFilter(name_rule_re='SH[0-9]{4}55')  # 匹配SHxxxx55格式
(2) 表達式篩選器
from qlib.data.filter import ExpressionDFilter
expr_filter = ExpressionDFilter(rule_expression='$close>2000')  # 收盤價大于2000
(3) 組合使用
instruments = D.instruments(market='csi300', filter_pipe=[name_filter, expr_filter])

四、特征數據加載

1. 基礎特征獲取

fields = ['$close', '$volume', 'Ref($close, 1)', 'Mean($close, 3)', '$high-$low']
data = D.features(['SH600000'], fields, start_time='2010-01-01', freq='day')

完整Features參考詳見官方文檔:Feature API Reference

2. 帶緩存的加載

D.features(..., disk_cache=1)  # 啟用緩存
D.features(..., disk_cache=0)  # 禁用緩存(客戶端默認)
D.features(..., disk_cache=2)  # 服務端更新緩存

3. 高級表達式構建

方法一:字符串表達式
"(($high / $close) + ($open / $close)) * ..."
方法二:代碼對象構建
from qlib.data.ops import *
f1 = Feature("high") / Feature("close")
f2 = Feature("open") / Feature("close")
f3 = (f1 + f2) * (f1 + f2) / (f1 + f2)

五、注意事項

  1. 首次請求數據時因緩存初始化可能較慢
  2. 相同股票池和字段的后續請求會利用緩存加速
  3. 復雜表達式建議分步構建以提高可讀性
  4. 時間范圍參數需遵循格式規范

完整API參考詳見官方文檔:Data API Reference

自定義模型集成

一、核心流程

  1. 定義模型類:繼承 qlib.model.base.Model
  2. 編寫配置文件:描述模型路徑和參數
  3. 模型測試:通過命令行或代碼驗證

二、自定義模型類實現規范

2.1 必須重寫方法

(1) __init__ 方法
  • 接收來自配置文件的初始化參數
  • 必須與配置文件參數命名嚴格一致
  • 示例邏輯:
def __init__(self, loss='mse', **kwargs):# 參數校驗if loss not in {'mse', 'binary'}:raise NotImplementedError# 參數存儲self._params.update(objective=loss, **kwargs)
(2) fit 方法
  • 輸入必須包含 dataset: DatasetH
  • 支持可選參數默認值(如 num_boost_round=1000
  • 典型處理流程:
def fit(self, dataset, num_boost_round=1000):# 數據準備df_train, df_valid = dataset.prepare(...)# 特征/標簽分離x_train, y_train = df_train["feature"], df_train["label"]# 模型訓練self.model = lgb.train(...)
(3) predict 方法
  • 必須返回 pd.Series 格式預測結果
  • 示例實現:
def predict(self, dataset):x_test = dataset.prepare(...)return pd.Series(self.model.predict(x_test.values), index=x_test.index)

2.2 可選方法

finetune 方法
  • 需繼承 ModelFT 基類
  • 實現微調邏輯:
def finetune(self, dataset, num_boost_round=10):dtrain = self._prepare_data(dataset)self.model = lgb.train(..., init_model=self.model)

三、配置文件規范

model:class: LGBModel                  # 類名module_path: qlib.contrib.model  # 模塊路徑args:loss: mse                    # __init__參數learning_rate: 0.0421        # 模型超參數max_depth: 8# ...其他參數

注意要點

  1. args 內參數通過 **kwargs 傳遞給 __init__
  2. 基準配置參考路徑:examples/benchmarks/<MODEL_NAME>/

四、模型測試方法

4.1 命令行測試

cd examples
qrun benchmarks/LightGBM/workflow_config_lightgbm.yaml

4.2 代碼測試

參考示例:examples/workflow_by_code.ipynb

五、關鍵注意事項

  1. 參數一致性:配置參數必須與__init__定義完全匹配
  2. 數據維度:
    • LightGBM 要求標簽為 1D 數組
    • 需處理 y_train.values.ndim == 2 的情況
  3. 錯誤處理:
    • 必須校驗 self.model is not None 后才執行預測
  4. 微調要求:
    • 需顯式繼承 ModelFT 基類

六、擴展參考

  1. 預測模型文檔:Forecast Model: Model Training & Prediction
  2. API 文檔:Model API
  3. 基準模型實現:examples/benchmarks/ 目錄下的各模型實現

風險提示與免責聲明
本文內容基于公開信息研究整理,不構成任何形式的投資建議。歷史表現不應作為未來收益保證,市場存在不可預見的波動風險。投資者需結合自身財務狀況及風險承受能力獨立決策,并自行承擔交易結果。作者及發布方不對任何依據本文操作導致的損失承擔法律責任。市場有風險,投資須謹慎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903118.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

操作系統:計算機世界的基石與演進

一、操作系統的本質與核心功能 操作系統如同計算機系統的"總管家"&#xff0c;在硬件與應用之間架起關鍵橋梁。從不同視角觀察&#xff0c;其核心功能呈現多維價值&#xff1a; 硬件視角的雙重使命&#xff1a; 硬件管理者&#xff1a;通過內存管理、進程調度和設…

基于單片機的溫濕度采集系統(論文+源碼)

2.1系統的功能 本系統的研制主要包括以下幾項功能&#xff1a; (1)溫度檢測功能&#xff1a;對所處環境的溫度進行檢測&#xff1b; (2)濕度檢測功能&#xff1a;對所處環境的濕度進行檢測&#xff1b; (3)加熱和制冷功能&#xff1a;可以完成加熱和制冷功能。 (4)加濕和除…

webrtc使用

demo https://www.webrtc-experiment.com/ github開源demo https://github.com/muaz-khan/WebRTC-Experiment.git ws傳遞webrtc信令,本機不需要stun服務器,遠端電腦需要ice服務器建立peer連接 const WebSocket = require(ws); const express =

【數據可視化-25】時尚零售銷售數據集的機器學習可視化分析

?? 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN人工智能領域的優質創作者,提供AI相關的技術咨詢、項目開發和個…

Python Cookbook-6.11 緩存環的實現

任務 你想定義一個固定尺寸的緩存&#xff0c;當它被填滿時&#xff0c;新加入的元素會覆蓋第一個(最老的)元素。這種數據結構在存儲日志和歷史信息時非常有用。 解決方案 當緩存填滿時&#xff0c;本節解決方案及時地修改了緩存對象&#xff0c;使其從未填滿的緩存類變成了…

OpenCv高階(九)——背景建模

目錄 一、背景建模的核心目標與核心挑戰 1. 核心目標 2. 核心挑戰 ?二、背景建模模型 1、幀差法原理 2. 概率模型&#xff08;Parametric Models&#xff09; &#xff08;1&#xff09;高斯混合模型&#xff08;Gaussian Mixture Model, GMM&#xff09; &#xff08;…

小重構,大收益!技術重構實踐:如何優雅升級老舊接口

重構格言&#xff1a;"優秀系統不是設計出來的&#xff0c;而是通過持續重構演進而來的。" —— Martin Fowler《重構&#xff1a;改善既有代碼的設計》 希望本文能為您的重構之旅提供指引&#xff0c;讓老舊系統煥發新生&#xff01; 一、背景&#xff1a;一個“穩定…

OSPF中DR/BDR的選舉

OSPF 開放式最短路徑優先協議-CSDN博客 選舉原因&#xff1a;廣播網絡中使路由信息交換更加高速有序&#xff0c;可以降低需要維護的鄰接關系數量 基本概念&#xff1a; DR (Designated Router, 指定路由器)&#xff1a;負責在廣播網絡&#xff08;以太網&#xff09;或NBMA網…

[特殊字符]?[特殊字符]Linux驅動開發入門 | 并發與互斥機制詳解

文章目錄 &#x1f468;?&#x1f4bb;Linux驅動開發入門 | 并發與互斥機制詳解&#x1f4cc;為什么驅動中需要并發和互斥控制&#xff1f;&#x1f4a1;常見的并發控制機制&#x1f510;自旋鎖和信號量通俗理解&#x1f300;自旋鎖&#xff08;Spinlock&#xff09;——“廁所…

Kafka 架構設計和組件介紹

什么是Apache Kafka&#xff1f; Apache Kafka 是一個強大的開源分布式事件流平臺。它最初由 LinkedIn 開發&#xff0c;最初是一個消息隊列&#xff0c;后來發展成為處理各種場景數據流的工具。 Kafka 的分布式系統架構支持水平擴展&#xff0c;使消費者能夠按照自己的節奏檢…

elk中kibana一直處于可用和降級之間且es群集狀態并沒有問題的解決方法

前言 在公司部elk的時候發現kibana的web界面一直很卡&#xff0c;數據量為0也會很卡&#xff0c;es群集狀態正常&#xff0c;資源足夠。 報錯信息 [2025-03-17T09:54:50.19400:00][INFO ][status] Kibana is now available (was degraded) [2025-03-17T09:55:03.28000:00][I…

什么是視頻上墻

視頻聯動上墻是指當監控系統中出現報警或其他特定事件時&#xff0c;相關的視頻畫面能夠自動切換并顯示在指定的監控大屏或顯示設備上&#xff0c;以便監控人員能夠快速、直觀地查看事件現場的情況&#xff0c;及時做出響應和處理。 具體介紹? 系統組成 &#xff1a;一般由前端…

26考研——存儲系統(3)

408答疑 文章目錄 一、存儲器概述二、主存儲器三、主存儲器與 CPU 的連接四、外部存儲器五、高速緩沖存儲器六、虛擬存儲器七、參考資料鮑魚科技課件26王道考研書 八、總結復習提示思考題常見問題和易混淆知識點 一、存儲器概述 文章鏈接: 點擊跳轉 二、主存儲器 文章鏈接: …

.NET 6 + Dapper + User-Defined Table Type

大家都知道&#xff0c;對于SQL Server IN是有限制條件的&#xff0c;如果IN里面的內容過多&#xff0c;在執行的時候會被自動截斷&#xff0c;因而導致查詢到的結果不是實際需要的結果。 select * from Payments where Id in (1,2,3,4,...) 為了解決上面的限制&#xff0c;可以…

MySQL 8(Ubuntu 18.04.6 LTS)安裝筆記

一、前言 其實之前已經寫過一篇筆記【MySQL 8.0.34&#xff08;x64&#xff09;安裝筆記】。機緣巧合&#xff0c;這次遇到的環境是Ubuntu 18.04 LTS&#xff0c;相比Windows平臺的安裝&#xff0c;對mysql的版本以及依賴的選擇&#xff0c;稍微要窄一些。特作筆記。 二、準備…

學習 Apache Kafka

學習 Apache Kafka 是一個很好的選擇&#xff0c;尤其是在實時數據流處理和大數據領域。以下是一個系統化的學習建議&#xff0c;幫助你從入門到進階掌握 Kafka&#xff1a; 1. 先決條件 在開始 Kafka 之前&#xff0c;確保你具備以下基礎&#xff1a; Java 基礎&#xff1a;K…

使用 binlog2sql 閃回 MySQL8 數據

【說明】 MySQL服務器版本 8.0.26 mysql> SELECT version(); ----------- | version() | ----------- | 8.0.26 | -----------Python 版本 Python 3.8.10 [infuq ~]# python -V Python 3.8.10【安裝】 binlog2sql 官方地址 1.安裝 binlog2sql [infuq ~]# git clone …

JavaScript 異步編程與請求取消全指南

JavaScript 異步編程與請求取消全指南 涵蓋&#xff1a;同步/異步、Promise、async/await、AbortController、前后端協作 一、同步與異步 1. 同步&#xff08;Synchronous&#xff09; 定義&#xff1a;代碼按順序執行&#xff0c;前一步完成才能執行下一步。特點&#xff1…

永久緩存 Git 憑證

永久緩存 Git 憑證 打開終端或命令行工具。 執行以下命令&#xff0c;設置 Git 使用 store 憑證幫助程序&#xff1a; bash git config --global credential.helper store第一次執行 git pull 時輸入賬號密碼。之后&#xff0c;所有需要憑證的操作都將自動使用存儲的憑證&…

力扣-48.旋轉圖像

題目描述 給定一個 n n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。 你必須在 原地 旋轉圖像&#xff0c;這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉圖像。 class Solution { public:void rotate(vector<vector<int>…