<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: MangoQuant</title>
    <description>The latest articles on Forem by MangoQuant (@mangoquant).</description>
    <link>https://forem.com/mangoquant</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3567859%2F0c6e1d8e-ebe9-47ac-bb64-8137e4a73044.png</url>
      <title>Forem: MangoQuant</title>
      <link>https://forem.com/mangoquant</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mangoquant"/>
    <language>en</language>
    <item>
      <title>Qlib - 模型训练和预测(Model Training &amp; Prediction)</title>
      <dc:creator>MangoQuant</dc:creator>
      <pubDate>Sat, 18 Oct 2025 07:37:32 +0000</pubDate>
      <link>https://forem.com/mangoquant/qlib-mo-xing-xun-lian-he-yu-ce-model-training-prediction-4p20</link>
      <guid>https://forem.com/mangoquant/qlib-mo-xing-xun-lian-he-yu-ce-model-training-prediction-4p20</guid>
      <description>&lt;p&gt;我们quick start之前已经跑通，能修改yaml配置文件进行训练模型。但如果想更灵活的话，还需要手动写代码，今天来介绍一下。&lt;br&gt;
参考了&lt;a href="https://qlib.readthedocs.io/en/latest/component/model.html" rel="noopener noreferrer"&gt;官网&lt;/a&gt;的一些文档，但直接用的话&lt;b&gt;跑不通&lt;/b&gt;（我是macOS11，qlib 0.9.7, python 3.11），于是进行了改造。再加上一些指标分析的代码，我们一起来看一下吧。&lt;/p&gt;
&lt;h2&gt;
  
  
  一、初始化
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 合并后的完整脚本：训练模型 + 计算 IC 指标
# reference: https://qlib.readthedocs.io/en/latest/component/model.html
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;qlib&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qlib.contrib.model.gbdt&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LGBModel&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qlib.contrib.data.handler&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Alpha158&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qlib.utils&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;init_instance_by_config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flatten_dict&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qlib.workflow&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qlib.workflow.record_temp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SignalRecord&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PortAnaRecord&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qlib.contrib.eva.alpha&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;calc_ic&lt;/span&gt;

&lt;span class="c1"&gt;# 初始化 Qlib 数据路径
&lt;/span&gt;&lt;span class="n"&gt;qlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;provider_uri&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;~/Documents/code/my_develop/qlib_data/cn_data_snapshot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;market&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;csi300&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;benchmark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SH000300&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# 数据处理器配置
&lt;/span&gt;&lt;span class="n"&gt;data_handler_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;start_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2008-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020-08-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fit_start_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2008-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fit_end_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2014-12-31&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;instruments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;market&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;我们首先需要导入一些python包，&lt;code&gt;provider_uri&lt;/code&gt;路径要修改成自己的。&lt;/p&gt;
&lt;h2&gt;
  
  
  二、配置
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="c1"&gt;# 任务配置：模型 + 数据集
&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;class&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LGBModel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;module_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qlib.contrib.model.gbdt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kwargs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;loss&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mse&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;colsample_bytree&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8879&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;learning_rate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.0421&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subsample&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8789&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lambda_l1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;205.6999&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lambda_l2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;580.9768&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_depth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;num_leaves&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;210&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;num_threads&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dataset&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;class&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DatasetH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;module_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qlib.data.dataset&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kwargs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;handler&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;class&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alpha158&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;module_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qlib.contrib.data.handler&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kwargs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data_handler_config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;segments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;train&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2008-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2014-12-31&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;valid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2015-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2016-12-31&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2017-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020-08-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;配置内容可以参考 我前面的文章 &lt;a href="https://blog.csdn.net/2401_82851462/article/details/153329192" rel="noopener noreferrer"&gt;Qlib - 工作流workflow配置详解&lt;/a&gt;。&lt;br&gt;
因为他们本质上是一样的，只不过一种是yaml格式，一种是python代码的字典格式。&lt;br&gt;
这里以lightGBM为例，我前面也介绍过：&lt;a href="https://blog.csdn.net/2401_82851462/article/details/153261374" rel="noopener noreferrer"&gt;《LightGBM: 一种高效的梯度提升决策树算法》论文（A Highly Efficient Gradient Boosting Decision Tree）&lt;/a&gt;&lt;br&gt;
用的是Alpha158因子（我前面也介绍过），也就是构建了158个指标。再加上LightGBM模型进行训练和预测。&lt;/p&gt;
&lt;h2&gt;
  
  
  三、训练模型
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;【Step 1】初始化模型和数据集...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;init_instance_by_config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;init_instance_by_config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dataset&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;【Step 2】启动实验并训练模型...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;experiment_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workflow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nf"&gt;flatten_dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;这里用的是&lt;code&gt;main()&lt;/code&gt;函数，否则在macos上运行&lt;b&gt;会报错&lt;/b&gt;。&lt;br&gt;
我们先构建好模型&lt;code&gt;model&lt;/code&gt;和数据集&lt;code&gt;dataset&lt;/code&gt;，&lt;br&gt;
然后再进行模型的训练拟合&lt;code&gt;model.fit(dataset)&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  四、模型预测
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;【Step 3】生成预测信号...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;recorder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_recorder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;sr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SignalRecord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recorder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;【Step 4】获取当前实验的 recorder_id，用于后续读取结果...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;recorder_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recorder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;当前实验的 recorder_id 为：&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;recorder_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;经过这一步，可以将模型在测试集上进行预测，并且保存到本地。&lt;br&gt;
用于后续的效果分析。&lt;/p&gt;
&lt;h2&gt;
  
  
  五、效果分析IC计算
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="c1"&gt;# 使用 recorder_id 读取预测结果
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;【Step 5】读取预测结果并计算 IC...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;recorder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_recorder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;experiment_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workflow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recorder_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;recorder_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;已保存的 artifacts：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recorder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list_artifacts&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="c1"&gt;# 获取 artifact 路径
&lt;/span&gt;    &lt;span class="n"&gt;artifact_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recorder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;artifact_uri&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file://&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pred&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_pickle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;artifact_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/pred.pkl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_pickle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;artifact_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/label.pkl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;预测结果（前5行）：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;预测结果（后5行）：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;预测结果时间范围：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_level_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;datetime&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;标签结果（前5行）：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;标签结果（后5行）：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="c1"&gt;# 计算 IC
&lt;/span&gt;    &lt;span class="n"&gt;ic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calc_ic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;LABEL0&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;【Step 6】IC 指标统计：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IC 均值：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IC 标准差：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;std&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IC 绝对值均值：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rank IC 均值：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rank IC 标准差：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;std&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rank IC 绝对值均值：&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;通过这段代码，我们可以读取本地预测数据和标签数据，并且进行效果分析。&lt;br&gt;
并且，我这里先分别打印一下头尾部数据，看看数据格式、日期比对等。&lt;br&gt;
然后计算&lt;code&gt;IC和Rank IC&lt;/code&gt;，方便看模型效果。&lt;/p&gt;
&lt;h2&gt;
  
  
  六、运行结果
&lt;/h2&gt;

&lt;p&gt;我们执行一下代码&lt;code&gt;python qlib_model_demo.py&lt;/code&gt;，可以得到下面的结果（大概2分钟完成）：&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjo62alw6n72l17wsbu7j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjo62alw6n72l17wsbu7j.png" alt="在这里插入图片描述" width="783" height="573"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(freq) test1@budas-MacBook-Pro user % python qlib_model_demo.py
ModuleNotFoundError. CatBoostModel are skipped. (optional: maybe installing CatBoostModel can fix it.)
ModuleNotFoundError. XGBModel is skipped(optional: maybe installing xgboost can fix it).
ModuleNotFoundError.  PyTorch models are skipped (optional: maybe installing pytorch can fix it).
Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.
[56122:MainThread](2025-10-18 11:31:21,785) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[56122:MainThread](2025-10-18 11:31:21,795) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[56122:MainThread](2025-10-18 11:31:21,796) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
【Step 1】初始化模型和数据集...
ModuleNotFoundError. CatBoostModel are skipped. (optional: maybe installing CatBoostModel can fix it.)
ModuleNotFoundError. CatBoostModel are skipped. (optional: maybe installing CatBoostModel can fix it.)
ModuleNotFoundError. CatBoostModel are skipped. (optional: maybe installing CatBoostModel can fix it.)
ModuleNotFoundError. CatBoostModel are skipped. (optional: maybe installing CatBoostModel can fix it.)
ModuleNotFoundError. CatBoostModel are skipped. (optional: maybe installing CatBoostModel can fix it.)
ModuleNotFoundError. CatBoostModel are skipped. (optional: maybe installing CatBoostModel can fix it.)
ModuleNotFoundError. XGBModel is skipped(optional: maybe installing xgboost can fix it).
ModuleNotFoundError. XGBModel is skipped(optional: maybe installing xgboost can fix it).
ModuleNotFoundError. XGBModel is skipped(optional: maybe installing xgboost can fix it).
ModuleNotFoundError. XGBModel is skipped(optional: maybe installing xgboost can fix it).
ModuleNotFoundError. XGBModel is skipped(optional: maybe installing xgboost can fix it).
ModuleNotFoundError. XGBModel is skipped(optional: maybe installing xgboost can fix it).
ModuleNotFoundError.  PyTorch models are skipped (optional: maybe installing pytorch can fix it).
ModuleNotFoundError.  PyTorch models are skipped (optional: maybe installing pytorch can fix it).
ModuleNotFoundError.  PyTorch models are skipped (optional: maybe installing pytorch can fix it).
ModuleNotFoundError.  PyTorch models are skipped (optional: maybe installing pytorch can fix it).
ModuleNotFoundError.  PyTorch models are skipped (optional: maybe installing pytorch can fix it).
ModuleNotFoundError.  PyTorch models are skipped (optional: maybe installing pytorch can fix it).
Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.

Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.
Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.
Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.
Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.
[56133:MainThread](2025-10-18 11:31:28,381) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[56131:MainThread](2025-10-18 11:31:28,382) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[56136:MainThread](2025-10-18 11:31:28,382) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[56135:MainThread](2025-10-18 11:31:28,383) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[56132:MainThread](2025-10-18 11:31:28,384) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[56134:MainThread](2025-10-18 11:31:28,385) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[56133:MainThread](2025-10-18 11:31:28,388) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[56136:MainThread](2025-10-18 11:31:28,388) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[56133:MainThread](2025-10-18 11:31:28,388) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
[56136:MainThread](2025-10-18 11:31:28,388) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
[56135:MainThread](2025-10-18 11:31:28,389) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[56131:MainThread](2025-10-18 11:31:28,389) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[56135:MainThread](2025-10-18 11:31:28,389) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
[56131:MainThread](2025-10-18 11:31:28,389) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
[56134:MainThread](2025-10-18 11:31:28,390) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[56132:MainThread](2025-10-18 11:31:28,390) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[56134:MainThread](2025-10-18 11:31:28,390) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
[56132:MainThread](2025-10-18 11:31:28,390) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
ModuleNotFoundError. CatBoostModel are skipped. (optional: maybe installing CatBoostModel can fix it.)
ModuleNotFoundError. CatBoostModel are skipped. (optional: maybe installing CatBoostModel can fix it.)
ModuleNotFoundError. CatBoostModel are skipped. (optional: maybe installing CatBoostModel can fix it.)
ModuleNotFoundError. CatBoostModel are skipped. (optional: maybe installing CatBoostModel can fix it.)
ModuleNotFoundError. CatBoostModel are skipped. (optional: maybe installing CatBoostModel can fix it.)
ModuleNotFoundError. CatBoostModel are skipped. (optional: maybe installing CatBoostModel can fix it.)
ModuleNotFoundError. XGBModel is skipped(optional: maybe installing xgboost can fix it).
ModuleNotFoundError. XGBModel is skipped(optional: maybe installing xgboost can fix it).
ModuleNotFoundError. XGBModel is skipped(optional: maybe installing xgboost can fix it).
ModuleNotFoundError. XGBModel is skipped(optional: maybe installing xgboost can fix it).
ModuleNotFoundError. XGBModel is skipped(optional: maybe installing xgboost can fix it).
ModuleNotFoundError. XGBModel is skipped(optional: maybe installing xgboost can fix it).
ModuleNotFoundError.  PyTorch models are skipped (optional: maybe installing pytorch can fix it).
ModuleNotFoundError.  PyTorch models are skipped (optional: maybe installing pytorch can fix it).
ModuleNotFoundError.  PyTorch models are skipped (optional: maybe installing pytorch can fix it).
ModuleNotFoundError.  PyTorch models are skipped (optional: maybe installing pytorch can fix it).
ModuleNotFoundError.  PyTorch models are skipped (optional: maybe installing pytorch can fix it).
ModuleNotFoundError.  PyTorch models are skipped (optional: maybe installing pytorch can fix it).
Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.
Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.
Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.
Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.
Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.
Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.
[56222:MainThread](2025-10-18 11:32:31,653) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[56223:MainThread](2025-10-18 11:32:31,653) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[56226:MainThread](2025-10-18 11:32:31,653) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[56225:MainThread](2025-10-18 11:32:31,653) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[56224:MainThread](2025-10-18 11:32:31,654) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[56227:MainThread](2025-10-18 11:32:31,657) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[56223:MainThread](2025-10-18 11:32:31,658) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[56226:MainThread](2025-10-18 11:32:31,658) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[56225:MainThread](2025-10-18 11:32:31,659) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[56222:MainThread](2025-10-18 11:32:31,659) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[56223:MainThread](2025-10-18 11:32:31,659) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
[56225:MainThread](2025-10-18 11:32:31,659) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
[56226:MainThread](2025-10-18 11:32:31,659) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
[56222:MainThread](2025-10-18 11:32:31,659) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
[56224:MainThread](2025-10-18 11:32:31,659) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[56224:MainThread](2025-10-18 11:32:31,660) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
[56227:MainThread](2025-10-18 11:32:31,661) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[56227:MainThread](2025-10-18 11:32:31,662) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
[56122:MainThread](2025-10-18 11:32:34,882) INFO - qlib.timer - [log.py:127] - Time cost: 73.083s | Loading data Done
[56122:MainThread](2025-10-18 11:32:36,646) INFO - qlib.timer - [log.py:127] - Time cost: 0.462s | DropnaLabel Done
[56122:MainThread](2025-10-18 11:32:39,763) INFO - qlib.timer - [log.py:127] - Time cost: 3.116s | CSZScoreNorm Done
[56122:MainThread](2025-10-18 11:32:39,826) INFO - qlib.timer - [log.py:127] - Time cost: 4.943s | fit &amp;amp; process data Done
[56122:MainThread](2025-10-18 11:32:39,827) INFO - qlib.timer - [log.py:127] - Time cost: 78.029s | Init data Done
【Step 2】启动实验并训练模型...
[56122:MainThread](2025-10-18 11:32:39,849) INFO - qlib.workflow - [exp.py:258] - Experiment 376922499957687719 starts running ...
[56122:MainThread](2025-10-18 11:32:40,631) INFO - qlib.workflow - [recorder.py:345] - Recorder 09c2896631e24499baebacb64603256c starts running under Experiment 376922499957687719 ...
warning: Not a git repository. Use --no-index to compare two paths outside a working tree
usage: git diff --no-index [&amp;lt;options&amp;gt;] &amp;lt;path&amp;gt; &amp;lt;path&amp;gt;

Diff output format options
    -p, --patch           generate patch
    -s, --no-patch        suppress diff output
    -u                    generate patch
    -U, --unified[=&amp;lt;n&amp;gt;]   generate diffs with &amp;lt;n&amp;gt; lines context
    -W, --function-context
                          generate diffs with &amp;lt;n&amp;gt; lines context
    --raw                 generate the diff in raw format
    --patch-with-raw      synonym for '-p --raw'
    --patch-with-stat     synonym for '-p --stat'
    --numstat             machine friendly --stat
    --shortstat           output only the last line of --stat
    -X, --dirstat[=&amp;lt;param1,param2&amp;gt;...]
                          output the distribution of relative amount of changes for each sub-directory
    --cumulative          synonym for --dirstat=cumulative
    --dirstat-by-file[=&amp;lt;param1,param2&amp;gt;...]
                          synonym for --dirstat=files,param1,param2...
    --check               warn if changes introduce conflict markers or whitespace errors
    --summary             condensed summary such as creations, renames and mode changes
    --name-only           show only names of changed files
    --name-status         show only names and status of changed files
    --stat[=&amp;lt;width&amp;gt;[,&amp;lt;name-width&amp;gt;[,&amp;lt;count&amp;gt;]]]
                          generate diffstat
    --stat-width &amp;lt;width&amp;gt;  generate diffstat with a given width
    --stat-name-width &amp;lt;width&amp;gt;
                          generate diffstat with a given name width
    --stat-graph-width &amp;lt;width&amp;gt;
                          generate diffstat with a given graph width
    --stat-count &amp;lt;count&amp;gt;  generate diffstat with limited lines
    --compact-summary     generate compact summary in diffstat
    --binary              output a binary diff that can be applied
    --full-index          show full pre- and post-image object names on the "index" lines
    --color[=&amp;lt;when&amp;gt;]      show colored diff
    --ws-error-highlight &amp;lt;kind&amp;gt;
                          highlight whitespace errors in the 'context', 'old' or 'new' lines in the diff
    -z                    do not munge pathnames and use NULs as output field terminators in --raw or --numstat
    --abbrev[=&amp;lt;n&amp;gt;]        use &amp;lt;n&amp;gt; digits to display object names
    --src-prefix &amp;lt;prefix&amp;gt;
                          show the given source prefix instead of "a/"
    --dst-prefix &amp;lt;prefix&amp;gt;
                          show the given destination prefix instead of "b/"
    --line-prefix &amp;lt;prefix&amp;gt;
                          prepend an additional prefix to every line of output
    --no-prefix           do not show any source or destination prefix
    --inter-hunk-context &amp;lt;n&amp;gt;
                          show context between diff hunks up to the specified number of lines
    --output-indicator-new &amp;lt;char&amp;gt;
                          specify the character to indicate a new line instead of '+'
    --output-indicator-old &amp;lt;char&amp;gt;
                          specify the character to indicate an old line instead of '-'
    --output-indicator-context &amp;lt;char&amp;gt;
                          specify the character to indicate a context instead of ' '

Diff rename options
    -B, --break-rewrites[=&amp;lt;n&amp;gt;[/&amp;lt;m&amp;gt;]]
                          break complete rewrite changes into pairs of delete and create
    -M, --find-renames[=&amp;lt;n&amp;gt;]
                          detect renames
    -D, --irreversible-delete
                          omit the preimage for deletes
    -C, --find-copies[=&amp;lt;n&amp;gt;]
                          detect copies
    --find-copies-harder  use unmodified files as source to find copies
    --no-renames          disable rename detection
    --rename-empty        use empty blobs as rename source
    --follow              continue listing the history of a file beyond renames
    -l &amp;lt;n&amp;gt;                prevent rename/copy detection if the number of rename/copy targets exceeds given limit

Diff algorithm options
    --minimal             produce the smallest possible diff
    -w, --ignore-all-space
                          ignore whitespace when comparing lines
    -b, --ignore-space-change
                          ignore changes in amount of whitespace
    --ignore-space-at-eol
                          ignore changes in whitespace at EOL
    --ignore-cr-at-eol    ignore carrier-return at the end of line
    --ignore-blank-lines  ignore changes whose lines are all blank
    -I, --ignore-matching-lines &amp;lt;regex&amp;gt;
                          ignore changes whose all lines match &amp;lt;regex&amp;gt;
    --indent-heuristic    heuristic to shift diff hunk boundaries for easy reading
    --patience            generate diff using the "patience diff" algorithm
    --histogram           generate diff using the "histogram diff" algorithm
    --diff-algorithm &amp;lt;algorithm&amp;gt;
                          choose a diff algorithm
    --anchored &amp;lt;text&amp;gt;     generate diff using the "anchored diff" algorithm
    --word-diff[=&amp;lt;mode&amp;gt;]  show word diff, using &amp;lt;mode&amp;gt; to delimit changed words
    --word-diff-regex &amp;lt;regex&amp;gt;
                          use &amp;lt;regex&amp;gt; to decide what a word is
    --color-words[=&amp;lt;regex&amp;gt;]
                          equivalent to --word-diff=color --word-diff-regex=&amp;lt;regex&amp;gt;
    --color-moved[=&amp;lt;mode&amp;gt;]
                          moved lines of code are colored differently
    --color-moved-ws &amp;lt;mode&amp;gt;
                          how white spaces are ignored in --color-moved

Other diff options
    --relative[=&amp;lt;prefix&amp;gt;]
                          when run from subdir, exclude changes outside and show relative paths
    -a, --text            treat all files as text
    -R                    swap two inputs, reverse the diff
    --exit-code           exit with 1 if there were differences, 0 otherwise
    --quiet               disable all output of the program
    --ext-diff            allow an external diff helper to be executed
    --textconv            run external text conversion filters when comparing binary files
    --ignore-submodules[=&amp;lt;when&amp;gt;]
                          ignore changes to submodules in the diff generation
    --submodule[=&amp;lt;format&amp;gt;]
                          specify how differences in submodules are shown
    --ita-invisible-in-index
                          hide 'git add -N' entries from the index
    --ita-visible-in-index
                          treat 'git add -N' entries as real in the index
    -S &amp;lt;string&amp;gt;           look for differences that change the number of occurrences of the specified string
    -G &amp;lt;regex&amp;gt;            look for differences that change the number of occurrences of the specified regex
    --pickaxe-all         show all changes in the changeset with -S or -G
    --pickaxe-regex       treat &amp;lt;string&amp;gt; in -S as extended POSIX regular expression
    -O &amp;lt;file&amp;gt;             control the order in which files appear in the output
    --rotate-to &amp;lt;path&amp;gt;    show the change in the specified path first
    --skip-to &amp;lt;path&amp;gt;      skip the output to the specified path
    --find-object &amp;lt;object-id&amp;gt;
                          look for differences that change the number of occurrences of the specified object
    --diff-filter [(A|C|D|M|R|T|U|X|B)...[*]]
                          select files by diff type
    --output &amp;lt;file&amp;gt;       Output to a specific file

[56122:MainThread](2025-10-18 11:32:40,664) INFO - qlib.workflow - [recorder.py:378] - Fail to log the uncommitted code of $CWD(/Users/test1/Documents/code/my_develop/qlib_data/user) when run git diff.
fatal: not a git repository (or any of the parent directories): .git
[56122:MainThread](2025-10-18 11:32:40,693) INFO - qlib.workflow - [recorder.py:378] - Fail to log the uncommitted code of $CWD(/Users/test1/Documents/code/my_develop/qlib_data/user) when run git status.
error: unknown option `cached'
usage: git diff --no-index [&amp;lt;options&amp;gt;] &amp;lt;path&amp;gt; &amp;lt;path&amp;gt;

Diff output format options
    -p, --patch           generate patch
    -s, --no-patch        suppress diff output
    -u                    generate patch
    -U, --unified[=&amp;lt;n&amp;gt;]   generate diffs with &amp;lt;n&amp;gt; lines context
    -W, --function-context
                          generate diffs with &amp;lt;n&amp;gt; lines context
    --raw                 generate the diff in raw format
    --patch-with-raw      synonym for '-p --raw'
    --patch-with-stat     synonym for '-p --stat'
    --numstat             machine friendly --stat
    --shortstat           output only the last line of --stat
    -X, --dirstat[=&amp;lt;param1,param2&amp;gt;...]
                          output the distribution of relative amount of changes for each sub-directory
    --cumulative          synonym for --dirstat=cumulative
    --dirstat-by-file[=&amp;lt;param1,param2&amp;gt;...]
                          synonym for --dirstat=files,param1,param2...
    --check               warn if changes introduce conflict markers or whitespace errors
    --summary             condensed summary such as creations, renames and mode changes
    --name-only           show only names of changed files
    --name-status         show only names and status of changed files
    --stat[=&amp;lt;width&amp;gt;[,&amp;lt;name-width&amp;gt;[,&amp;lt;count&amp;gt;]]]
                          generate diffstat
    --stat-width &amp;lt;width&amp;gt;  generate diffstat with a given width
    --stat-name-width &amp;lt;width&amp;gt;
                          generate diffstat with a given name width
    --stat-graph-width &amp;lt;width&amp;gt;
                          generate diffstat with a given graph width
    --stat-count &amp;lt;count&amp;gt;  generate diffstat with limited lines
    --compact-summary     generate compact summary in diffstat
    --binary              output a binary diff that can be applied
    --full-index          show full pre- and post-image object names on the "index" lines
    --color[=&amp;lt;when&amp;gt;]      show colored diff
    --ws-error-highlight &amp;lt;kind&amp;gt;
                          highlight whitespace errors in the 'context', 'old' or 'new' lines in the diff
    -z                    do not munge pathnames and use NULs as output field terminators in --raw or --numstat
    --abbrev[=&amp;lt;n&amp;gt;]        use &amp;lt;n&amp;gt; digits to display object names
    --src-prefix &amp;lt;prefix&amp;gt;
                          show the given source prefix instead of "a/"
    --dst-prefix &amp;lt;prefix&amp;gt;
                          show the given destination prefix instead of "b/"
    --line-prefix &amp;lt;prefix&amp;gt;
                          prepend an additional prefix to every line of output
    --no-prefix           do not show any source or destination prefix
    --inter-hunk-context &amp;lt;n&amp;gt;
                          show context between diff hunks up to the specified number of lines
    --output-indicator-new &amp;lt;char&amp;gt;
                          specify the character to indicate a new line instead of '+'
    --output-indicator-old &amp;lt;char&amp;gt;
                          specify the character to indicate an old line instead of '-'
    --output-indicator-context &amp;lt;char&amp;gt;
                          specify the character to indicate a context instead of ' '

Diff rename options
    -B, --break-rewrites[=&amp;lt;n&amp;gt;[/&amp;lt;m&amp;gt;]]
                          break complete rewrite changes into pairs of delete and create
    -M, --find-renames[=&amp;lt;n&amp;gt;]
                          detect renames
    -D, --irreversible-delete
                          omit the preimage for deletes
    -C, --find-copies[=&amp;lt;n&amp;gt;]
                          detect copies
    --find-copies-harder  use unmodified files as source to find copies
    --no-renames          disable rename detection
    --rename-empty        use empty blobs as rename source
    --follow              continue listing the history of a file beyond renames
    -l &amp;lt;n&amp;gt;                prevent rename/copy detection if the number of rename/copy targets exceeds given limit

Diff algorithm options
    --minimal             produce the smallest possible diff
    -w, --ignore-all-space
                          ignore whitespace when comparing lines
    -b, --ignore-space-change
                          ignore changes in amount of whitespace
    --ignore-space-at-eol
                          ignore changes in whitespace at EOL
    --ignore-cr-at-eol    ignore carrier-return at the end of line
    --ignore-blank-lines  ignore changes whose lines are all blank
    -I, --ignore-matching-lines &amp;lt;regex&amp;gt;
                          ignore changes whose all lines match &amp;lt;regex&amp;gt;
    --indent-heuristic    heuristic to shift diff hunk boundaries for easy reading
    --patience            generate diff using the "patience diff" algorithm
    --histogram           generate diff using the "histogram diff" algorithm
    --diff-algorithm &amp;lt;algorithm&amp;gt;
                          choose a diff algorithm
    --anchored &amp;lt;text&amp;gt;     generate diff using the "anchored diff" algorithm
    --word-diff[=&amp;lt;mode&amp;gt;]  show word diff, using &amp;lt;mode&amp;gt; to delimit changed words
    --word-diff-regex &amp;lt;regex&amp;gt;
                          use &amp;lt;regex&amp;gt; to decide what a word is
    --color-words[=&amp;lt;regex&amp;gt;]
                          equivalent to --word-diff=color --word-diff-regex=&amp;lt;regex&amp;gt;
    --color-moved[=&amp;lt;mode&amp;gt;]
                          moved lines of code are colored differently
    --color-moved-ws &amp;lt;mode&amp;gt;
                          how white spaces are ignored in --color-moved

Other diff options
    --relative[=&amp;lt;prefix&amp;gt;]
                          when run from subdir, exclude changes outside and show relative paths
    -a, --text            treat all files as text
    -R                    swap two inputs, reverse the diff
    --exit-code           exit with 1 if there were differences, 0 otherwise
    --quiet               disable all output of the program
    --ext-diff            allow an external diff helper to be executed
    --textconv            run external text conversion filters when comparing binary files
    --ignore-submodules[=&amp;lt;when&amp;gt;]
                          ignore changes to submodules in the diff generation
    --submodule[=&amp;lt;format&amp;gt;]
                          specify how differences in submodules are shown
    --ita-invisible-in-index
                          hide 'git add -N' entries from the index
    --ita-visible-in-index
                          treat 'git add -N' entries as real in the index
    -S &amp;lt;string&amp;gt;           look for differences that change the number of occurrences of the specified string
    -G &amp;lt;regex&amp;gt;            look for differences that change the number of occurrences of the specified regex
    --pickaxe-all         show all changes in the changeset with -S or -G
    --pickaxe-regex       treat &amp;lt;string&amp;gt; in -S as extended POSIX regular expression
    -O &amp;lt;file&amp;gt;             control the order in which files appear in the output
    --rotate-to &amp;lt;path&amp;gt;    show the change in the specified path first
    --skip-to &amp;lt;path&amp;gt;      skip the output to the specified path
    --find-object &amp;lt;object-id&amp;gt;
                          look for differences that change the number of occurrences of the specified object
    --diff-filter [(A|C|D|M|R|T|U|X|B)...[*]]
                          select files by diff type
    --output &amp;lt;file&amp;gt;       Output to a specific file

[56122:MainThread](2025-10-18 11:32:40,721) INFO - qlib.workflow - [recorder.py:378] - Fail to log the uncommitted code of $CWD(/Users/test1/Documents/code/my_develop/qlib_data/user) when run git diff --cached.
Training until validation scores don't improve for 50 rounds
[20]    train's l2: 0.990585    valid's l2: 0.99431
[40]    train's l2: 0.986931    valid's l2: 0.993693
[60]    train's l2: 0.984352    valid's l2: 0.99349
[80]    train's l2: 0.982319    valid's l2: 0.993382
[100]   train's l2: 0.980442    valid's l2: 0.99331
[120]   train's l2: 0.97871 valid's l2: 0.993247
[140]   train's l2: 0.976987    valid's l2: 0.993334
[160]   train's l2: 0.97536 valid's l2: 0.993338
Early stopping, best iteration is:
[122]   train's l2: 0.978519    valid's l2: 0.993238
【Step 3】生成预测信号...
[56122:MainThread](2025-10-18 11:33:25,686) INFO - qlib.workflow - [record_temp.py:198] - Signal record 'pred.pkl' has been saved as the artifact of the Experiment 376922499957687719
'The following are prediction results of the LGBModel model.'
                          score
datetime   instrument
2017-01-03 SH600000   -0.042865
           SH600008    0.005925
           SH600009    0.030596
           SH600010   -0.013973
           SH600015   -0.141758
【Step 4】获取当前实验的 recorder_id，用于后续读取结果...
当前实验的 recorder_id 为：09c2896631e24499baebacb64603256c
[56122:MainThread](2025-10-18 11:33:25,736) INFO - qlib.timer - [log.py:127] - Time cost: 0.000s | waiting `async_log` Done
【Step 5】读取预测结果并计算 IC...
已保存的 artifacts： ['label.pkl', 'pred.pkl']
预测结果（前5行）：
                          score
datetime   instrument
2017-01-03 SH600000   -0.042865
           SH600008    0.005925
           SH600009    0.030596
           SH600010   -0.013973
           SH600015   -0.141758
预测结果（后5行）：
                          score
datetime   instrument
2020-07-31 SZ300413   -0.078162
           SZ300433   -0.101778
           SZ300498   -0.054418
           SZ300601   -0.147531
           SZ300628    0.030925
预测结果时间范围： DatetimeIndex(['2017-01-03', '2017-01-04', '2017-01-05', '2017-01-06',
               '2017-01-09', '2017-01-10', '2017-01-11', '2017-01-12',
               '2017-01-13', '2017-01-16',
               ...
               '2020-07-20', '2020-07-21', '2020-07-22', '2020-07-23',
               '2020-07-24', '2020-07-27', '2020-07-28', '2020-07-29',
               '2020-07-30', '2020-07-31'],
              dtype='datetime64[ns]', name='datetime', length=871, freq=None)
标签结果（前5行）：
                         LABEL0
datetime   instrument
2017-01-03 SH600000   -0.001831
           SH600008   -0.002398
           SH600009    0.001493
           SH600010    0.003520
           SH600015   -0.007142
标签结果（后5行）：
                         LABEL0
datetime   instrument
2020-07-31 SZ300413   -0.037566
           SZ300433   -0.031677
           SZ300498   -0.006531
           SZ300601    0.090264
           SZ300628    0.004142
【Step 6】IC 指标统计：
IC 均值： 0.04993267859655785
IC 标准差： 0.12446777545374337
IC 绝对值均值： 0.10684702003092757
Rank IC 均值： 0.051507508261451146
Rank IC 标准差： 0.12273969195405407
Rank IC 绝对值均值： 0.10527763281820797
(freq) test1@budas-MacBook-Pro user %
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  七、结果分析
&lt;/h2&gt;

&lt;p&gt;我们可以忽略一些不重要的警告信息。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[56227:MainThread](2025-10-18 11:32:31,662) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data_snapshot')}
[56122:MainThread](2025-10-18 11:32:34,882) INFO - qlib.timer - [log.py:127] - Time cost: 73.083s | Loading data Done
[56122:MainThread](2025-10-18 11:32:36,646) INFO - qlib.timer - [log.py:127] - Time cost: 0.462s | DropnaLabel Done
[56122:MainThread](2025-10-18 11:32:39,763) INFO - qlib.timer - [log.py:127] - Time cost: 3.116s | CSZScoreNorm Done
[56122:MainThread](2025-10-18 11:32:39,826) INFO - qlib.timer - [log.py:127] - Time cost: 4.943s | fit &amp;amp; process data Done
[56122:MainThread](2025-10-18 11:32:39,827) INFO - qlib.timer - [log.py:127] - Time cost: 78.029s | Init data Done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;上面这部分日志，展示了一些加载数据、预处理数据的过程，以及消耗的时长。&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;【Step 2】启动实验并训练模型...
[56122:MainThread](2025-10-18 11:32:39,849) INFO - qlib.workflow - [exp.py:258] - Experiment 376922499957687719 starts running ...
[56122:MainThread](2025-10-18 11:32:40,631) INFO - qlib.workflow - [recorder.py:345] - Recorder 09c2896631e24499baebacb64603256c starts running under Experiment 376922499957687719 ...

...
[56122:MainThread](2025-10-18 11:32:40,721) INFO - qlib.workflow - [recorder.py:378] - Fail to log the uncommitted code of $CWD(/Users/test1/Documents/code/my_develop/qlib_data/user) when run git diff --cached.
Training until validation scores don't improve for 50 rounds
[20]    train's l2: 0.990585    valid's l2: 0.99431
[40]    train's l2: 0.986931    valid's l2: 0.993693
[60]    train's l2: 0.984352    valid's l2: 0.99349
[80]    train's l2: 0.982319    valid's l2: 0.993382
[100]   train's l2: 0.980442    valid's l2: 0.99331
[120]   train's l2: 0.97871 valid's l2: 0.993247
[140]   train's l2: 0.976987    valid's l2: 0.993334
[160]   train's l2: 0.97536 valid's l2: 0.993338
Early stopping, best iteration is:
[122]   train's l2: 0.978519    valid's l2: 0.993238
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;这部分是训练过程，early-stop 在 122 棵&lt;br&gt;
训练集 L2=0.9785，验证集 L2=0.9932 训练误差 &amp;lt; 验证误差，轻微过拟合，但不算严重，模型的早停策略起作用了。&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;【Step 3】生成预测信号...
[56122:MainThread](2025-10-18 11:33:25,686) INFO - qlib.workflow - [record_temp.py:198] - Signal record 'pred.pkl' has been saved as the artifact of the Experiment 376922499957687719
'The following are prediction results of the LGBModel model.'
                          score
datetime   instrument
2017-01-03 SH600000   -0.042865
           SH600008    0.005925
           SH600009    0.030596
           SH600010   -0.013973
           SH600015   -0.141758
【Step 4】获取当前实验的 recorder_id，用于后续读取结果...
当前实验的 recorder_id 为：09c2896631e24499baebacb64603256c
[56122:MainThread](2025-10-18 11:33:25,736) INFO - qlib.timer - [log.py:127] - Time cost: 0.000s | waiting `async_log` Done
【Step 5】读取预测结果并计算 IC...
已保存的 artifacts： ['label.pkl', 'pred.pkl']
预测结果（前5行）：
                          score
datetime   instrument
2017-01-03 SH600000   -0.042865
           SH600008    0.005925
           SH600009    0.030596
           SH600010   -0.013973
           SH600015   -0.141758
预测结果（后5行）：
                          score
datetime   instrument
2020-07-31 SZ300413   -0.078162
           SZ300433   -0.101778
           SZ300498   -0.054418
           SZ300601   -0.147531
           SZ300628    0.030925
预测结果时间范围： DatetimeIndex(['2017-01-03', '2017-01-04', '2017-01-05', '2017-01-06',
               '2017-01-09', '2017-01-10', '2017-01-11', '2017-01-12',
               '2017-01-13', '2017-01-16',
               ...
               '2020-07-20', '2020-07-21', '2020-07-22', '2020-07-23',
               '2020-07-24', '2020-07-27', '2020-07-28', '2020-07-29',
               '2020-07-30', '2020-07-31'],
              dtype='datetime64[ns]', name='datetime', length=871, freq=None)
标签结果（前5行）：
                         LABEL0
datetime   instrument
2017-01-03 SH600000   -0.001831
           SH600008   -0.002398
           SH600009    0.001493
           SH600010    0.003520
           SH600015   -0.007142
标签结果（后5行）：
                         LABEL0
datetime   instrument
2020-07-31 SZ300413   -0.037566
           SZ300433   -0.031677
           SZ300498   -0.006531
           SZ300601    0.090264
           SZ300628    0.004142
【Step 6】IC 指标统计：
IC 均值： 0.04993267859655785
IC 标准差： 0.12446777545374337
IC 绝对值均值： 0.10684702003092757
Rank IC 均值： 0.051507508261451146
Rank IC 标准差： 0.12273969195405407
Rank IC 绝对值均值： 0.10527763281820797
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这里主要就是预测的结果，以及计算效果。&lt;/p&gt;

&lt;p&gt;我们用表格来分析一下：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;数值&lt;/th&gt;
&lt;th&gt;业内参考&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IC 均值&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.050&lt;/td&gt;
&lt;td&gt;0.03 以下≈无效；0.05≈“可用”；0.1+≈“优秀”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IC 绝对值均值&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.107&lt;/td&gt;
&lt;td&gt;同上，绝对值越高越好&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IC 标准差&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.124&lt;/td&gt;
&lt;td&gt;波动大，方向不稳定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rank IC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;与 IC 几乎持平&lt;/td&gt;
&lt;td&gt;说明非线性单调性也没带来额外信息&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;所以这套代码属于刚刚可用水平，但至少我们跑通了。&lt;br&gt;
剩下只需要优化模型，提升IC即可。&lt;/p&gt;

&lt;p&gt;继续努力💪&lt;/p&gt;

&lt;h2&gt;
  
  
  八、所有代码
&lt;/h2&gt;

&lt;p&gt;我把这套整体demo放在：&lt;a href="https://github.com/JizhiXiang/Quant-Strategy" rel="noopener noreferrer"&gt;https://github.com/JizhiXiang/Quant-Strategy&lt;/a&gt;上。&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Qlib - 下载数据实操 Download data</title>
      <dc:creator>MangoQuant</dc:creator>
      <pubDate>Fri, 17 Oct 2025 07:00:37 +0000</pubDate>
      <link>https://forem.com/mangoquant/qlib-xia-zai-shu-ju-shi-cao-download-data-52gh</link>
      <guid>https://forem.com/mangoquant/qlib-xia-zai-shu-ju-shi-cao-download-data-52gh</guid>
      <description>&lt;p&gt;很多人听说了Qlib这个量化工具后，想去尝试，但卡在了第一步，不知道怎么下载数据，今天主要讲讲如何下载数据。&lt;/p&gt;

&lt;h2&gt;
  
  
  一、下载（静态数据包）
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.脚本代码下载
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# download 1d
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn

# download 1min
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/qlib_cn_1min --region cn --interval 1min

# 美股下载（源代码/Users/test1/Documents/code/my_develop/qlib/scripts/data_collector/yahoo/collector.py里找到的）
python scripts/get_data.py qlib_data --target_dir &amp;lt;qlib_data_1d_dir&amp;gt; --interval 1d
# 美股更新
python scripts/data_collector/yahoo/collector.py update_data_to_bin --qlib_data_1d_dir &amp;lt;qlib_data_1d_dir&amp;gt; --trading_date 2021-06-01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;【最终还是需要以我实际运行的代码为准，我的qlib版本是&lt;code&gt;0.9.7&lt;/code&gt;】&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这个A股数据经我实操，发现只能到2020年的数据，应该是官方静态数据包，用来做实验的。&lt;/p&gt;
&lt;h3&gt;
  
  
  2.实操-下载A股1d数据
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;p&gt;我这里下载到自定义的路径了：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;python scripts/get_data.py qlib_data --target_dir ../qlib_data/cn_data --region cn&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcy66mqybytfhbbycwwqd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcy66mqybytfhbbycwwqd.png" alt="下载过程1" width="800" height="158"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fikyq4mgyahlly5mon3sd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fikyq4mgyahlly5mon3sd.png" alt="在这里插入图片描述" width="800" height="163"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi-blog.csdnimg.cn%2Fdirect%2F712ca3793df74f19a6f490ae7ea3fdae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi-blog.csdnimg.cn%2Fdirect%2F712ca3793df74f19a6f490ae7ea3fdae.png" width="600" height="786"&gt;&lt;/a&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v78c334m7i8etazl2po.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v78c334m7i8etazl2po.png" alt="在这里插入图片描述" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3.实操-下载美股1d数据
&lt;/h3&gt;

&lt;p&gt;如果你有多个不同来源的数据集，最好如下进行分开。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;qlib_data/
 ├── cn_data_tushare/      # A股数据源（含更新）
 ├── cn_data_snapshot/     # 官方静态包(2020-09-25)
 ├── us_data_yahoo/        # 美股
 └── hk_data_yahoo/        # 港股
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;我的代码：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 美股下载
python scripts/get_data.py qlib_data --target_dir ../qlib_data/us_data_yahoo --interval 1d --region us
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fudx55g2jv25gbb8fi2wz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fudx55g2jv25gbb8fi2wz.png" alt="在这里插入图片描述" width="800" height="266"&gt;&lt;/a&gt;&lt;br&gt;
下载完成，速度还挺快的。&lt;/p&gt;
&lt;h2&gt;
  
  
  二、检查数据的健康状况
&lt;/h2&gt;

&lt;p&gt;Qlib 提供了一个脚本来检查数据的运行状况。&lt;br&gt;
检查要点如下：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;检查 DataFrame 中是否缺少任何数据。&lt;/li&gt;
&lt;li&gt;检查 OHLCV 列中是否有任何高于阈值的较大阶跃变化。&lt;/li&gt;
&lt;li&gt;检查 DataFrame 中是否缺少任何必需的列 （OLHCV）。&lt;/li&gt;
&lt;li&gt;检查 DataFrame 中是否缺少 'factor' 列。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我们可以执行以下命令来检查数据是否健康。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# for daily data
python scripts/check_data_health.py check_data --qlib_dir ~/.qlib/qlib_data/cn_data

# for 1min data
python scripts/check_data_health.py check_data --qlib_dir ~/.qlib/qlib_data/cn_data_1min --freq 1min
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;还可以修改这些参数：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; freq：数据频率。&lt;/li&gt;
&lt;li&gt;large_step_threshold_price：允许的最大价格变化&lt;/li&gt;
&lt;li&gt;large_step_threshold_volume：允许的最大音量变化。&lt;/li&gt;
&lt;li&gt;missing_data_num：允许数据为空的最大值。
### 1.实操 - 数据健康
根据我的实际目录，
&amp;gt; python scripts/check_data_health.py check_data --qlib_dir  ../qlib_data/cn_data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwy0r6jlsg52tjiy50e6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwy0r6jlsg52tjiy50e6.png" alt="在这里插入图片描述" width="800" height="384"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(freq) test1@budas-MacBook-Pro qlib % ls
CHANGELOG.md        LICENSE         SECURITY.md     pyproject.toml      tests
CHANGES.rst     MANIFEST.in     build_docker_image.sh   qlib
CODE_OF_CONDUCT.md  Makefile        docs            scripts
Dockerfile      README.md       examples        setup.py
(freq) test1@budas-MacBook-Pro qlib % python scripts/check_data_health.py check_data --qlib_dir  ../qlib_data/cn_data
[25774:MainThread](2025-10-16 18:01:32,906) INFO - qlib.Initialization - [config.py:452] - default_conf: client.
[25774:MainThread](2025-10-16 18:01:34,294) INFO - qlib.Initialization - [__init__.py:75] - qlib successfully initialized based on client settings.
[25774:MainThread](2025-10-16 18:01:34,294) INFO - qlib.Initialization - [__init__.py:77] - data_path={'__DEFAULT_FREQ': PosixPath('/Users/test1/Documents/code/my_develop/qlib_data/cn_data')}
                              open        close          low         high        volume  factor
instrument datetime
SH000905   2007-01-15  1881.467041  1986.538940  1881.467041  1986.538940  3.881263e+09     NaN
           2007-01-16  1991.689941  2055.020020  1991.040039  2055.020020  4.807442e+09     NaN
           2007-01-17  2064.290039  2035.650024  1992.540039  2093.889893  5.883289e+09     NaN
           2007-01-18  2025.849976  2085.399902  2002.660034  2085.399902  5.094946e+09     NaN
           2007-01-19  2097.500000  2159.639893  2097.500000  2159.649902  5.792517e+09     NaN
...                            ...          ...          ...          ...           ...     ...
           2020-09-21  6492.225098  6445.964844  6434.323730  6515.336914  1.260237e+10     NaN
           2020-09-22  6392.024902  6358.651855  6341.483887  6462.975098  1.213059e+10     NaN
           2020-09-23  6382.281250  6392.032715  6356.163574  6411.204590  9.504884e+09     NaN
           2020-09-24  6353.693848  6244.638672  6243.282227  6354.682617  1.128015e+10     NaN
           2020-09-25  6271.700684  6236.890625  6206.182129  6285.471680  8.779878e+09     NaN

[3285 rows x 6 columns]
2025-10-16 18:03:15.435 | INFO     | __main__:check_required_columns:144 - ✅ The columns (OLHCV) are complete and not missing.
2025-10-16 18:03:15.820 | INFO     | __main__:check_missing_factor:172 - ✅ The `factor` column already exists and is not empty.

Summary of data health check (3875 files checked):
-------------------------------------------------
2025-10-16 18:03:15.820 | WARNING  | __main__:check_data:189 - There is missing data.
             open  high  low  close  volume
instruments
SH000903        4     4    4      4       4
SH600000        3     3    3      3       3
SH600004       53    53   53     53      53
SH600006       96    96   96     96      96
SH600007       32    32   32     32      32
...           ...   ...  ...    ...     ...
SZ300771        2     2    2      2       2
SZ300772        2     2    2      2       2
SZ300773        2     2    2      2       2
SZ300802        1     1    1      1       1
SH000905        0     0    0      0       0

[3613 rows x 5 columns]
2025-10-16 18:03:15.825 | WARNING  | __main__:check_data:192 - The OHLCV column has large step changes.
            col_name        date   pct_change
instruments
SH000300      volume  2016-01-08     3.216515
SH000903      volume  2016-01-08     3.425825
SH600000      volume  1999-12-15  1396.263672
SH600004      volume  2003-05-23   634.929382
SH600006      volume  1999-11-16    40.254677
...              ...         ...          ...
SZ300869        open  2020-08-26     0.502253
SZ300869        high  2020-08-25     0.513636
SZ300869         low  2020-08-25     0.557708
SZ300877        high  2020-08-25     0.698236
SZ300877       close  2020-08-25     0.768708

[4744 rows x 3 columns]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.分析
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;先打印基本信息段，
把 &lt;b&gt;中证 500（SH000905）&lt;/b&gt;拉出来做样例展示，
2007-01-15 ～ 2020-09-25 共 3285 条日线
6 个字段：open / close / low / high / volume / factor
虽然factor 全为NaN，但没关系后面会计算。&lt;/li&gt;
&lt;li&gt;OLHCV 五列 没有整列缺失
factor 列存在。&lt;/li&gt;
&lt;li&gt;警告一
缺失数据（Missing rows）
缺了多少根 bar。可能是因为停牌等原因，只要不是缺失过多，影响不大。&lt;/li&gt;
&lt;li&gt;警告二
大幅跳变（Large step change）
每只股票，每列数据，每日波动超过 50 % 则表示异常跳变。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  三、查看下载数据
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.查看A股数据
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;qlib&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qlib.data&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt;

&lt;span class="n"&gt;qlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;provider_uri&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/Users/test1/Documents/code/my_develop/qlib_data/cn_data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;symbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SH000905&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;features&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;instruments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$open&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$low&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$volume&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;start_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2010-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;end_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;没有找到 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 的数据，请检查代码或时间范围。&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 数据共 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 条记录。&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_data.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8-sig&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;保存成功！&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;provider_uri&lt;/code&gt;路径要写对。&lt;br&gt;
注意&lt;code&gt;symbol&lt;/code&gt;的格式，&lt;br&gt;
另外 &lt;code&gt;instruments=[symbol]&lt;/code&gt;是一个list，可以传入多只股票等。&lt;br&gt;
还可以结合我上一篇文章，获取股票列表等。&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falb2gztad44fioecjtcu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falb2gztad44fioecjtcu.png" alt="在这里插入图片描述" width="800" height="319"&gt;&lt;/a&gt;&lt;br&gt;
从我的执行记录可以看出，尾部的数据并没有真的到2025年（这是因为数据不全导致的），所以我们有时候需要进行打印、排查等。&lt;/p&gt;
&lt;h3&gt;
  
  
  2.查看美股数据
&lt;/h3&gt;

&lt;p&gt;我们以苹果AAPL公司为例，上市时间为1980年，但我们的官方静态数据包只有2000年到2020年的数据。&lt;br&gt;
下面我们运行代码，注意修改一些配置参数。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;qlib&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qlib.data&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt;

&lt;span class="n"&gt;qlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;provider_uri&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/Users/test1/Documents/code/my_develop/qlib_data/us_data_yahoo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;symbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;features&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;instruments&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$open&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$low&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$volume&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;start_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1980-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;end_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;没有找到 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 的数据，请检查代码或时间范围。&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 数据共 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 条记录。&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_data.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8-sig&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;保存成功！&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54ca0q46i80c0j9aqkl8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54ca0q46i80c0j9aqkl8.png" alt="在这里插入图片描述" width="800" height="377"&gt;&lt;/a&gt;&lt;br&gt;
我们可以通过这种方式，检查数据是否充足。发现2020年之后的数据没有，这样引出下一节内容：&lt;b&gt;更新数据&lt;/b&gt;。&lt;/p&gt;
&lt;h2&gt;
  
  
  四、更新数据
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 美股更新
python scripts/data_collector/yahoo/collector.py update_data_to_bin --qlib_data_1d_dir ../qlib_data/us_data_yahoo --trading_date 2019-01-01 --end_date 2022-01-01 --region us

# 指定美股
python scripts/data_collector/yahoo/collector.py update_data_to_bin --qlib_data_1d_dir ../qlib_data/us_data_yahoo --trading_date 2019-01-01 --end_date 2022-01-01 --region us --instruments AAPL,MSFT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;但是很不幸，接口请求不通，可能需要其他方式。&lt;br&gt;
结果：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(freq) test1@budas-MacBook-Pro qlib % python scripts/data_collector/yahoo/collector.py update_data_to_bin --qlib_data_1d_dir ../qlib_data/us_data_yahoo --trading_date 2019-01-01 --end_date 2022-01-01 --region us --instruments AAPL,MSFT
2025-10-17 14:40:09.386 | INFO     | collector:get_instrument_list:266 - get US stock symbols......
2025-10-17 14:40:10.913 | WARNING  | data_collector.utils:wrapper:558 - _get_eastmoney: 1 :request error
2025-10-17 14:40:14.190 | WARNING  | data_collector.utils:wrapper:558 - _get_eastmoney: 2 :request error
2025-10-17 14:40:17.669 | WARNING  | data_collector.utils:wrapper:558 - _get_eastmoney: 3 :request error
2025-10-17 14:40:20.949 | WARNING  | data_collector.utils:wrapper:558 - _get_eastmoney: 4 :request error
2025-10-17 14:40:24.227 | WARNING  | data_collector.utils:wrapper:558 - _get_eastmoney: 5 :request error
Traceback (most recent call last):
  File "/Users/test1/Documents/code/my_develop/qlib/scripts/data_collector/yahoo/collector.py", line 1021, in &amp;lt;module&amp;gt;
    fire.Fire(Run)
  File "/Users/test1/py_env/freq/lib/python3.11/site-packages/fire/core.py", line 135, in Fire
    component_trace = _Fire(component, args, parsed_flag_args, context, name)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/test1/py_env/freq/lib/python3.11/site-packages/fire/core.py", line 468, in _Fire
    component, remaining_args = _CallAndUpdateTrace(
                                ^^^^^^^^^^^^^^^^^^^^
  File "/Users/test1/py_env/freq/lib/python3.11/site-packages/fire/core.py", line 684, in _CallAndUpdateTrace
    component = fn(*varargs, **kwargs)
                ^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/test1/Documents/code/my_develop/qlib/scripts/data_collector/yahoo/collector.py", line 988, in update_data_to_bin
    self.download_data(delay=delay, start=trading_date, end=end_date, check_data_length=check_data_length)
  File "/Users/test1/Documents/code/my_develop/qlib/scripts/data_collector/yahoo/collector.py", line 802, in download_data
    super(Run, self).download_data(max_collector_count, delay, start, end, check_data_length, limit_nums)
  File "/Users/test1/Documents/code/my_develop/qlib/scripts/data_collector/base.py", line 402, in download_data
    _class(
  File "/Users/test1/Documents/code/my_develop/qlib/scripts/data_collector/yahoo/collector.py", line 86, in __init__
    super(YahooCollector, self).__init__(
  File "/Users/test1/Documents/code/my_develop/qlib/scripts/data_collector/base.py", line 80, in __init__
    self.instrument_list = sorted(set(self.get_instrument_list()))
                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/test1/Documents/code/my_develop/qlib/scripts/data_collector/yahoo/collector.py", line 267, in get_instrument_list
    symbols = get_us_stock_symbols() + [
              ^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/test1/Documents/code/my_develop/qlib/scripts/data_collector/utils.py", line 359, in get_us_stock_symbols
    _all_symbols = _get_eastmoney() + _get_nasdaq() + _get_nyse()
                   ^^^^^^^^^^^^^^^^
  File "/Users/test1/Documents/code/my_develop/qlib/scripts/data_collector/utils.py", line 554, in wrapper
    _result = func(*args, **kwargs)
              ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/test1/Documents/code/my_develop/qlib/scripts/data_collector/utils.py", line 316, in _get_eastmoney
    raise ValueError("request error")
ValueError: request error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtnf2y8yxn8egx3yxxem.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtnf2y8yxn8egx3yxxem.png" alt="在这里插入图片描述" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;另外，还有一种方法，就是先从别的地方下载数据，如何再转换成qlib格式。&lt;/p&gt;

&lt;p&gt;参考：&lt;a href="https://qlib.readthedocs.io/en/latest/component/data.html" rel="noopener noreferrer"&gt;官网文档&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>《LightGBM: 一种高效的梯度提升决策树算法》论文（A Highly Efficient Gradient Boosting Decision Tree）</title>
      <dc:creator>MangoQuant</dc:creator>
      <pubDate>Thu, 16 Oct 2025 02:24:24 +0000</pubDate>
      <link>https://forem.com/mangoquant/-lun-wen-a-highly-efficient-gradient-boosting-decision-tree-3g8b</link>
      <guid>https://forem.com/mangoquant/-lun-wen-a-highly-efficient-gradient-boosting-decision-tree-3g8b</guid>
      <description>&lt;h2&gt;
  
  
  起因
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphvcdppcr3f4rscav3w9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphvcdppcr3f4rscav3w9.png" alt="起始图" width="800" height="508"&gt;&lt;/a&gt;&lt;br&gt;
前面我们介绍了一些&lt;strong&gt;Qlib的基本入门用法&lt;/strong&gt;，然后进一步深入，发现里面有很多的&lt;strong&gt;模型、算法&lt;/strong&gt;等。那么今天就先以QuickStart的LightGBM入手，来详细了解一下吧。&lt;/p&gt;

&lt;p&gt;代码：&lt;a href="https://github.com/microsoft/LightGBM" rel="noopener noreferrer"&gt;https://github.com/microsoft/LightGBM&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  LightGBM: 一种高效的梯度提升决策树算法
&lt;/h2&gt;

&lt;p&gt;《LightGBM: A Highly Efficient Gradient Boosting Decision Tree》 &lt;a href="https://proceedings.neurips.cc/paper/2017/hash/6449f44a102fde848669bdd9eb6b76fa-Abstract.html" rel="noopener noreferrer"&gt;链接&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;作者&lt;/strong&gt;：Guolin Ke¹, Qi Meng², Thomas Finley³, Taifeng Wang¹, Wei Chen¹, Weidong Ma¹, Qiwei Ye¹, Tie-Yan Liu¹&lt;br&gt;&lt;br&gt;
¹微软研究院，²北京大学，³微软雷德蒙研究院&lt;br&gt;&lt;br&gt;
会议：第31届神经信息处理系统大会（NIPS 2017），美国加州&lt;/p&gt;


&lt;h2&gt;
  
  
  摘要
&lt;/h2&gt;

&lt;p&gt;梯度提升决策树Gradient Boosting Decision Tree（GBDT）是一种流行的机器学习算法，拥有如 XGBoost 和 pGBRT 等高效实现。尽管这些实现采用了许多工程优化，但==在特征维度高、数据量大==的情况下，其效率和可扩展性仍不尽如人意。一个主要原因是：对于&lt;strong&gt;每个特征&lt;/strong&gt;，它们需要&lt;strong&gt;扫描所有数据样本&lt;/strong&gt;来估计所有可能分裂点的信息增益，这一过程非常耗时。&lt;/p&gt;

&lt;p&gt;为解决这一问题，我们提出了两种新技术：&lt;strong&gt;基于梯度的单边采样Gradient-based One-Side Sampling（GOSS）&lt;/strong&gt; 和 &lt;strong&gt;互斥特征捆绑Exclusive Feature Bundling（EFB）&lt;/strong&gt;。GOSS 通过==排除大量梯度较小的==样本，仅使用剩余样本估计信息增益。我们证明，由于&lt;em&gt;大梯度样本在信息增益计算中起更关键作用&lt;/em&gt;，GOSS 能在数据量大幅减少的情况下&lt;em&gt;仍保持较高的估计精度&lt;/em&gt;。EFB 则==将互斥特征（即几乎不会同时取非零值的特征）捆绑在一起，减少特征数量==。我们证明，寻找最优的互斥特征捆绑问题是 NP-hard 的，但一个贪心算法可以在常数&lt;strong&gt;近似&lt;/strong&gt;比下获得良好效果。&lt;/p&gt;

&lt;p&gt;我们将集成 GOSS 和 EFB 的新 GBDT 实现称为 &lt;strong&gt;LightGBM&lt;/strong&gt;。在多个公开数据集上的实验表明，LightGBM 可将传统 GBDT 的训练速度提升 &lt;strong&gt;20 倍以上&lt;/strong&gt;，同时保持几乎相同的精度。&lt;/p&gt;


&lt;h2&gt;
  
  
  1 引言
&lt;/h2&gt;

&lt;p&gt;梯度提升决策树（GBDT）因其高效性、准确性和可解释性而被广泛使用，在多分类、点击预测、排序等任务中表现出色。然而，随着大数据时代的到来（特征数和样本数都急剧增加），GBDT 面临新的挑战，尤其是在准确性与效率之间的权衡。&lt;/p&gt;

&lt;p&gt;传统 GBDT 实现需要对每个特征扫描所有样本，以估计所有可能分裂点的信息增益，因此其计算复杂度与特征数和样本数成正比，导致在大数据场景下训练非常缓慢。&lt;/p&gt;

&lt;p&gt;为应对这一挑战，我们提出以下两种新技术：&lt;/p&gt;
&lt;h3&gt;
  
  
  1.1 梯度单边采样（GOSS）
&lt;/h3&gt;

&lt;p&gt;尽管 GBDT 中没有样本权重的概念，但我们注意到不同梯度的样本在信息增益计算中的作用不同。梯度较大的样本（即训练不足的样本）对信息增益贡献更大。因此，在降采样时，==我们应保留大梯度样本，仅随机丢弃小梯度样本，并通过权重调整保持数据分布的一致性==。&lt;/p&gt;
&lt;h3&gt;
  
  
  1.2 互斥特征捆绑（EFB）
&lt;/h3&gt;

&lt;p&gt;==高维数据通常具有稀疏性，许多特征几乎不会同时取非零值（如 one-hot 编码特征）。我们可以将这些“互斥”特征捆绑为一个特征==，从而减少特征数量。我们证明该问题是 NP-难的，但贪心算法可在常数近似比下获得良好效果。&lt;/p&gt;

&lt;p&gt;我们将集成这两种技术的 GBDT 实现称为 &lt;strong&gt;LightGBM&lt;/strong&gt;，实验表明其训练速度提升显著，且精度几乎无损。&lt;/p&gt;


&lt;h2&gt;
  
  
  2 预备知识
&lt;/h2&gt;
&lt;h3&gt;
  
  
  2.1 GBDT 及其复杂度分析
&lt;/h3&gt;

&lt;p&gt;GBDT 是一种集成模型，每轮训练一棵==拟合负梯度==（&lt;strong&gt;残差&lt;/strong&gt;）的决策树。训练的主要开销在于寻找最优分裂点。常用的方法是预排序算法（精确但慢）和直方图算法（高效，内存友好）。我们基于后者进行优化。&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjg74b7cqkpu687a5ax6u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjg74b7cqkpu687a5ax6u.png" alt="算法1、2" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;直方图算法的复杂度为：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;构建直方图：O(#data × #feature)&lt;/li&gt;
&lt;li&gt;寻找分裂点：O(#bin × #feature)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;由于 #bin ≪ #data，构建直方图是瓶颈。==若能减少 #data 或 #feature==，即可显著加速训练。&lt;/p&gt;
&lt;h3&gt;
  
  
  2.2 相关工作
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;XGBoost&lt;/strong&gt;：支持预排序和直方图算法，是目前最快的 GBDT 实现之一。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SGB（随机梯度提升）&lt;/strong&gt;：每轮随机采样样本，但会损失精度。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;特征降维&lt;/strong&gt;：如 PCA、特征选择，但可能损失信息。&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  3 梯度单边采样（GOSS）
&lt;/h2&gt;
&lt;h3&gt;
  
  
  3.1 算法描述
&lt;/h3&gt;

&lt;p&gt;==GOSS 保留大梯度样本，对小梯度样本进行随机采样，并通过权重因子调整其贡献==，保持信息增益估计的准确性。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;算法流程&lt;/strong&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;按梯度绝对值降序排序样本；&lt;/li&gt;
&lt;li&gt;保留前 a×100% 的大梯度样本；&lt;/li&gt;
&lt;li&gt;从剩余样本中随机采样 b×100%；&lt;/li&gt;
&lt;li&gt;给小梯度样本赋予权重 (1−a)/b；&lt;/li&gt;
&lt;li&gt;使用加权样本构建直方图并估计信息增益。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;（==为了便于理解，博主注：==&lt;br&gt;
把 GOSS 想象成“&lt;strong&gt;在线考试老师只改关键题&lt;/strong&gt;”：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;先给所有样本的“错题程度”打分（=梯度绝对值 |g_i|）。
&lt;/li&gt;
&lt;li&gt;梯度越大 → 错题越严重 → 越要保留。
把全班按 |g_i| 从高到低排队，前 a×100% 的“重灾区”学生&lt;strong&gt;全部留堂&lt;/strong&gt;。
&lt;/li&gt;
&lt;li&gt;剩下的“几乎做对”的学生里，再&lt;strong&gt;随机抽&lt;/strong&gt; b×100% 出来，以免完全忽略他们。
&lt;/li&gt;
&lt;li&gt;为了让“抽样班”的成绩分布跟原来一样，给这些被抽到的“好学生”一个&lt;strong&gt;放大系数&lt;/strong&gt;
weight = (1−a)/b。
直观理解：本来有 (1−a) 比例的好学生，现在只抽了 b 比例，所以每人要“代表” (1−a)/b 个自己。
&lt;/li&gt;
&lt;li&gt;用这套&lt;strong&gt;加权后的子样本&lt;/strong&gt;去计算直方图、信息增益、分裂点——速度变快，但分布仍接近原班。&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;a、b 是什么？  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;用户可调的超参数&lt;/strong&gt;，不是固定常数。
&lt;/li&gt;
&lt;li&gt;论文实验里给出的&lt;strong&gt;典型区间&lt;/strong&gt;：
– a ∈ [0.05, 0.2]（保留 5 %–20 % 的大梯度样本）
– b ∈ [0.05, 0.2]（再从剩余里抽 5 %–20 %）
– 合计采样率 ≈ a + b，常见 10 %–30 %。
&lt;/li&gt;
&lt;li&gt;LightGBM 的默认设置：
– &lt;code&gt;top_rate&lt;/code&gt; (a) = 0.2
– &lt;code&gt;other_rate&lt;/code&gt; (b) = 0.1
如果精度下降，优先&lt;strong&gt;增大 a&lt;/strong&gt;（大梯度样本更关键）。
）
### 3.2 理论分析&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我们定义信息增益为分裂后方差减少量。GOSS 使用采样后的样本来估计信息增益，其误差上界为：&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flatex.codecogs.com%2Fpng.latex%3FE%28d%29%2520%5Cleq%2520C_%7Ba%2Cb%7D%5E2%2520%5Cln%2520%5Cfrac%7B1%7D%7B%5Cdelta%7D%2520%5Ccdot%2520%5Cmax%5Cleft%28%5Cfrac%7B1%7D%7Bn_l%7D%2C%2520%5Cfrac%7B1%7D%7Bn_r%7D%5Cright%29%2520%2B%25202DC_%7Ba%2Cb%7D%2520%5Csqrt%7B%5Cfrac%7B%5Cln%25201%2F%5Cdelta%7D%7Bn%7D%7D" class="article-body-image-wrapper"&gt;&lt;img alt="公式1" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flatex.codecogs.com%2Fpng.latex%3FE%28d%29%2520%5Cleq%2520C_%7Ba%2Cb%7D%5E2%2520%5Cln%2520%5Cfrac%7B1%7D%7B%5Cdelta%7D%2520%5Ccdot%2520%5Cmax%5Cleft%28%5Cfrac%7B1%7D%7Bn_l%7D%2C%2520%5Cfrac%7B1%7D%7Bn_r%7D%5Cright%29%2520%2B%25202DC_%7Ba%2Cb%7D%2520%5Csqrt%7B%5Cfrac%7B%5Cln%25201%2F%5Cdelta%7D%7Bn%7D%7D" width="393" height="48"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;其中：&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flatex.codecogs.com%2Fpng.latex%3FC_%7Ba%2Cb%7D%2520%3D%2520%5Cfrac%7B1%7D%7B%5Csqrt%7Bb%7D%7D%2520%5Cmax_%7Bx_i%2520%5Cin%2520A%5Ec%7D%2520%7Cg_i%7C%2520" class="article-body-image-wrapper"&gt;&lt;img alt="公式2" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flatex.codecogs.com%2Fpng.latex%3FC_%7Ba%2Cb%7D%2520%3D%2520%5Cfrac%7B1%7D%7B%5Csqrt%7Bb%7D%7D%2520%5Cmax_%7Bx_i%2520%5Cin%2520A%5Ec%7D%2520%7Cg_i%7C%2520" width="144" height="42"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flatex.codecogs.com%2Fpng.latex%3FD%2520%3D%2520%5Cmax%28%5Cbar%7Bg%7D_l%2C%2520%5Cbar%7Bg%7D_r%29" class="article-body-image-wrapper"&gt;&lt;img alt="公式3" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flatex.codecogs.com%2Fpng.latex%3FD%2520%3D%2520%5Cmax%28%5Cbar%7Bg%7D_l%2C%2520%5Cbar%7Bg%7D_r%29" width="123" height="19"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftn69or79k9o316mzswd6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftn69or79k9o316mzswd6.png" alt="论文图片" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(对理论证明感兴趣的，可以去看看论文&lt;strong&gt;原文&lt;/strong&gt;。)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;当样本数 n 很大时，误差趋于 0；&lt;/li&gt;
&lt;li&gt;GOSS 优于随机采样（SGB），尤其在信息增益范围大时；&lt;/li&gt;
&lt;li&gt;采样增加了基学习器的多样性，有助于泛化。&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4 互斥特征捆绑（EFB）
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 算法描述
&lt;/h3&gt;

&lt;p&gt;高维稀疏特征中，许多特征几乎不会同时非零（如 &lt;strong&gt;one-hot 特征&lt;/strong&gt;）。我们将这些特征捆绑为一个“互斥特征 bundle”，从而减少特征数。&lt;/p&gt;

&lt;p&gt;（==博主注：==&lt;br&gt;
One-hot 特征（又称独热编码、一位有效编码）是&lt;strong&gt;把离散取值（类别）映射成二进制向量&lt;/strong&gt;的最常用手段：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;假设某特征有 N 个不同类别。
&lt;/li&gt;
&lt;li&gt;建立一个长度 = N 的全 0 向量。
&lt;/li&gt;
&lt;li&gt;样本属于第 i 类时，把向量的第 i 位置为 1，其余保持 0。
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;结果：每个类别对应&lt;strong&gt;唯一一个“1”位&lt;/strong&gt;，所以叫 “one-hot”。&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;例子&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
特征“颜色”取值 {红, 绿, 蓝} → 3 维 one-hot 向量  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;红 → [1, 0, 0]
&lt;/li&gt;
&lt;li&gt;绿 → [0, 1, 0]
&lt;/li&gt;
&lt;li&gt;蓝 → [0, 0, 1]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;）&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;两个关键问题&lt;/strong&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;哪些特征可以捆绑？&lt;/strong&gt; → 转化为图着色问题，特征是顶点，互斥关系是边；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;如何合并特征？&lt;/strong&gt; → 为每个特征分配偏移量，使其值域不重叠，合并为一个新特征。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;定理 4.1&lt;/strong&gt;：寻找最优的互斥特征捆绑问题是 NP-难的。&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabosd0btopi3s5130ry3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabosd0btopi3s5130ry3.png" alt="算法3、4" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;贪心算法&lt;/strong&gt;（算法 3）：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;构建冲突图；&lt;/li&gt;
&lt;li&gt;按度数降序排序特征；&lt;/li&gt;
&lt;li&gt;遍历特征，尝试将其加入现有 bundle（冲突数 ≤ γ），否则新建 bundle。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;合并算法&lt;/strong&gt;（算法 4）：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;为每个特征分配偏移量；&lt;/li&gt;
&lt;li&gt;合并为一个新特征，保留原始特征值的可区分性。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;复杂度&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;捆绑阶段：O(#feature²)，仅执行一次；&lt;/li&gt;
&lt;li&gt;合并后：直方图构建复杂度从 O(#data × #feature) 降为 O(#data × #bundle)，#bundle ≪ #feature。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;（同样，对证明感兴趣的可以看&lt;strong&gt;原文&lt;/strong&gt;。）&lt;/p&gt;




&lt;h2&gt;
  
  
  5 实验
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 数据集
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;数据集&lt;/th&gt;
&lt;th&gt;样本数&lt;/th&gt;
&lt;th&gt;特征数&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;任务&lt;/th&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Allstate&lt;/td&gt;
&lt;td&gt;12M&lt;/td&gt;
&lt;td&gt;4,228&lt;/td&gt;
&lt;td&gt;稀疏&lt;/td&gt;
&lt;td&gt;二分类&lt;/td&gt;
&lt;td&gt;AUC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flight Delay&lt;/td&gt;
&lt;td&gt;10M&lt;/td&gt;
&lt;td&gt;700&lt;/td&gt;
&lt;td&gt;稀疏&lt;/td&gt;
&lt;td&gt;二分类&lt;/td&gt;
&lt;td&gt;AUC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LETOR&lt;/td&gt;
&lt;td&gt;2M&lt;/td&gt;
&lt;td&gt;136&lt;/td&gt;
&lt;td&gt;稠密&lt;/td&gt;
&lt;td&gt;排序&lt;/td&gt;
&lt;td&gt;NDCG@10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KDD10&lt;/td&gt;
&lt;td&gt;19M&lt;/td&gt;
&lt;td&gt;29M&lt;/td&gt;
&lt;td&gt;稀疏&lt;/td&gt;
&lt;td&gt;二分类&lt;/td&gt;
&lt;td&gt;AUC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KDD12&lt;/td&gt;
&lt;td&gt;119M&lt;/td&gt;
&lt;td&gt;54M&lt;/td&gt;
&lt;td&gt;稀疏&lt;/td&gt;
&lt;td&gt;二分类&lt;/td&gt;
&lt;td&gt;AUC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  5.2 实验设置
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;对比方法：XGBoost（预排序 &amp;amp; 直方图）、lgb_baseline（无 GOSS/EFB）、SGB（随机采样）&lt;/li&gt;
&lt;li&gt;参数：GOSS 采样率 a=0.05~ 0.1，b=0.05~0.1；EFB 冲突率 γ=0&lt;/li&gt;
&lt;li&gt;线程数：16，迭代次数：固定，早停&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.3 结果
&lt;/h3&gt;

&lt;h4&gt;
  
  
  训练时间（每轮平均秒数）
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;数据集&lt;/th&gt;
&lt;th&gt;xgb_exa&lt;/th&gt;
&lt;th&gt;xgb_his&lt;/th&gt;
&lt;th&gt;lgb_baseline&lt;/th&gt;
&lt;th&gt;EFB_only&lt;/th&gt;
&lt;th&gt;LightGBM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Allstate&lt;/td&gt;
&lt;td&gt;10.85&lt;/td&gt;
&lt;td&gt;2.63&lt;/td&gt;
&lt;td&gt;6.07&lt;/td&gt;
&lt;td&gt;0.71&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.28&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flight Delay&lt;/td&gt;
&lt;td&gt;5.94&lt;/td&gt;
&lt;td&gt;1.05&lt;/td&gt;
&lt;td&gt;1.39&lt;/td&gt;
&lt;td&gt;0.27&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.22&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LETOR&lt;/td&gt;
&lt;td&gt;5.55&lt;/td&gt;
&lt;td&gt;0.63&lt;/td&gt;
&lt;td&gt;0.49&lt;/td&gt;
&lt;td&gt;0.46&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.31&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KDD10&lt;/td&gt;
&lt;td&gt;108.27&lt;/td&gt;
&lt;td&gt;OOM&lt;/td&gt;
&lt;td&gt;39.85&lt;/td&gt;
&lt;td&gt;6.33&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.85&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KDD12&lt;/td&gt;
&lt;td&gt;191.99&lt;/td&gt;
&lt;td&gt;OOM&lt;/td&gt;
&lt;td&gt;168.26&lt;/td&gt;
&lt;td&gt;20.23&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12.67&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgozwdr0r0f5v8pub6nd3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgozwdr0r0f5v8pub6nd3.png" alt="时间图表" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;==LightGBM 在所有数据集上均最快==，&lt;strong&gt;最高提速 21 倍&lt;/strong&gt;（Allstate）&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  测试精度（AUC / NDCG@10）
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;数据集&lt;/th&gt;
&lt;th&gt;xgb_exa&lt;/th&gt;
&lt;th&gt;xgb_his&lt;/th&gt;
&lt;th&gt;lgb_baseline&lt;/th&gt;
&lt;th&gt;SGB&lt;/th&gt;
&lt;th&gt;LightGBM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Allstate&lt;/td&gt;
&lt;td&gt;0.6070&lt;/td&gt;
&lt;td&gt;0.6089&lt;/td&gt;
&lt;td&gt;0.6093&lt;/td&gt;
&lt;td&gt;0.6064±7e-4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.6093±9e-5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flight Delay&lt;/td&gt;
&lt;td&gt;0.7601&lt;/td&gt;
&lt;td&gt;0.7840&lt;/td&gt;
&lt;td&gt;0.7847&lt;/td&gt;
&lt;td&gt;0.7780±8e-4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.7846±4e-5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LETOR&lt;/td&gt;
&lt;td&gt;0.4977&lt;/td&gt;
&lt;td&gt;0.4982&lt;/td&gt;
&lt;td&gt;0.5277&lt;/td&gt;
&lt;td&gt;0.5239±6e-4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.5275±5e-4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KDD10&lt;/td&gt;
&lt;td&gt;0.7796&lt;/td&gt;
&lt;td&gt;OOM&lt;/td&gt;
&lt;td&gt;0.78735&lt;/td&gt;
&lt;td&gt;0.7759±3e-4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.78732±1e-4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KDD12&lt;/td&gt;
&lt;td&gt;0.7029&lt;/td&gt;
&lt;td&gt;OOM&lt;/td&gt;
&lt;td&gt;0.7049&lt;/td&gt;
&lt;td&gt;0.6989±8e-4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.7051±5e-5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;LightGBM 精度==与最佳基线几乎一致==，&lt;strong&gt;无显著损失&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.4 GOSS 分析
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;提速&lt;/strong&gt;：GOSS 单独带来约 2 倍提速；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;精度&lt;/strong&gt;：在相同采样率下，GOSS 精度 &lt;strong&gt;始终优于 SGB&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.5 EFB 分析
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;提速&lt;/strong&gt;：EFB 在稀疏数据集上带来 &lt;strong&gt;显著提速&lt;/strong&gt;（如 KDD10 上 6.3 倍）；&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;原因&lt;/strong&gt;：减少特征数、避免零值计算、提升缓存命中率&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6 结论
&lt;/h2&gt;

&lt;p&gt;我们提出了 LightGBM，一种集成 GOSS 和 EFB 的高效 GBDT 实现。理论分析与实验结果表明：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GOSS 能在减少样本的同时保持信息增益估计的准确性；&lt;/li&gt;
&lt;li&gt;EFB 能有效减少特征数，尤其适用于高维稀疏数据；&lt;/li&gt;
&lt;li&gt;LightGBM 在多个大规模数据集上实现了 &lt;strong&gt;最高 20 倍以上提速&lt;/strong&gt;，且精度无损。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;未来工作&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;研究 GOSS 中 a、b 的最优选择策略；&lt;/li&gt;
&lt;li&gt;进一步优化 EFB，使其适用于稠密特征场景。&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>tutorial</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
