数据层:数据框架与使用

介绍

Data Layer 提供了用户友好的API来管理和检索数据。它提供了高性能的数据基础设施。

它是为量化投资设计的。例如,用户可以轻松地使用Data Layer构建公式化阿尔法。更多详情请参考构建公式化阿尔法

Data Layer 的介绍包括以下部分。

  • 数据准备

  • Data API

  • 数据加载器

  • 数据处理器

  • Dataset

  • Cache

  • 数据和缓存文件结构

以下是Qlib数据工作流程的典型示例

  • 用户下载数据并将其转换为Qlib格式(文件后缀为.bin)。在此步骤中,通常只有一些基本数据存储在磁盘上(例如OHLCV)。

  • 基于Qlib的表达式引擎创建一些基本特征(例如,“Ref($close, 60) / $close”,过去60个交易日的回报)。表达式引擎中支持的运算符可以在这里找到。此步骤通常在Qlib的数据加载器中实现,这是数据处理器的一个组件。

  • 如果用户需要更复杂的数据处理(例如数据标准化),Data Handler支持用户自定义处理器来处理数据(一些预定义的处理器可以在这里找到)。这些处理器与表达式引擎中的操作符不同。它们是为一些复杂的数据处理方法设计的,这些方法在表达式引擎的操作符中难以支持。

  • 最后,Dataset 负责从数据处理器处理的数据中准备特定于模型的数据集

数据准备

Qlib 格式数据

我们特别设计了一种数据结构来管理金融数据,详细信息请参考Qlib论文中的文件存储设计部分。 此类数据将以文件名后缀.bin存储(我们称之为.bin文件、.bin格式或qlib格式)。.bin文件专为金融数据的科学计算而设计。

Qlib 提供了两种不同的现成数据集,可以通过此 链接 访问:

Dataset

美国市场

中国市场

Alpha360

Alpha158

此外,Qlib 提供了一个高频数据集。用户可以通过此 链接 运行高频数据集示例。

Qlib 格式数据集

Qlib 提供了一个现成的数据集,格式为 .bin,用户可以使用脚本 scripts/get_data.py 下载中国股票数据集,如下所示。用户也可以使用 numpy 加载 .bin 文件来验证数据。 价格和成交量数据与实际交易价格不同,因为它们经过了调整调整价格)。然后你可能会发现,不同数据源的调整价格可能不同。这是因为不同数据源在调整价格的方式上可能有所不同。Qlib 在调整价格时,将每只股票的第一个交易日的价格归一化为 1。 用户可以利用 $factor 来获取原始交易价格(例如,$close / $factor 来获取原始收盘价)。

这里有一些关于Qlib价格调整的讨论。

# 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

除了中国股票数据,Qlib 还包括一个美国股票数据集,可以通过以下命令下载:

python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/us_data --region us

运行上述命令后,用户可以在~/.qlib/qlib_data/cn_data目录和~/.qlib/qlib_data/us_data目录中分别找到以Qlib格式存储的中国股票和美国股票数据。

Qlib 还提供了 scripts/data_collector 中的脚本来帮助用户从互联网上抓取最新数据并将其转换为 qlib 格式。

当使用此数据集初始化Qlib时,用户可以构建并评估他们自己的模型。更多详情请参阅初始化

每日频率数据的自动更新

建议用户手动更新一次数据(--trading_date 2021-05-25),然后设置为自动更新。

更多信息请参考:yahoo collector

  • Automatic update of data to the “qlib” directory each trading day(Linux)
    • 使用 crontab: crontab -e

    • 设置定时任务:

      * * * * 1-5 python <script path> update_data_to_bin --qlib_data_1d_dir <user data dir>
      
      • 脚本路径: scripts/data_collector/yahoo/collector.py

  • 手动更新数据

    python scripts/data_collector/yahoo/collector.py update_data_to_bin --qlib_data_1d_dir <user data dir> --trading_date <start date> --end_date <end date>
    
    • trading_date: 交易日开始

    • end_date: 交易日结束时间(不包括在内)

将CSV格式转换为Qlib格式

Qlib 提供了脚本 scripts/dump_bin.py 来将 任何 CSV 格式的数据转换为 .bin 文件(Qlib 格式),只要它们格式正确。

除了下载准备好的演示数据外,用户还可以直接从Collector下载演示数据,以供参考CSV格式。 以下是一些示例:

for daily data:
python scripts/get_data.py download_data --file_name csv_data_cn.zip --target_dir ~/.qlib/csv_data/cn_data
for 1min data:
python scripts/data_collector/yahoo/collector.py download_data --source_dir ~/.qlib/stock_data/source/cn_1min --region CN --start 2021-05-20 --end 2021-05-23 --delay 0.1 --interval 1min --limit_nums 10

用户也可以提供自己的CSV格式数据。然而,CSV数据必须满足以下标准:

  • CSV文件以特定股票命名CSV文件包含一列股票名称

    • 将CSV文件命名为股票名称:SH600000.csv, AAPL.csv(不区分大小写)。

    • CSV 文件包含一列股票名称。用户在转储数据时必须指定列名。以下是一个示例:

      python scripts/dump_bin.py dump_all ... --symbol_field_name symbol
      

      数据格式如下:

      符号

      关闭

      SH600000

      120

  • CSV文件必须包含一个日期列,并且在导出数据时,用户必须指定日期列的名称。以下是一个示例:

    python scripts/dump_bin.py dump_all ... --date_field_name date
    

    数据格式如下:

    符号

    日期

    关闭

    打开

    体积

    SH600000

    2020年11月1日

    120

    121

    12300000

    SH600000

    2020年11月2日

    123

    120

    12300000

假设用户在目录 ~/.qlib/csv_data/my_data 中准备了他们的CSV格式数据,他们可以运行以下命令来开始转换。

python scripts/dump_bin.py dump_all --csv_path  ~/.qlib/csv_data/my_data --qlib_dir ~/.qlib/qlib_data/my_data --include_fields open,close,high,low,volume,factor

对于将数据转储到.bin文件时支持的其他参数,用户可以通过运行以下命令来参考信息:

python dump_bin.py dump_all --help

转换后,用户可以在目录 ~/.qlib/qlib_data/my_data 中找到他们的 Qlib 格式数据。

注意

–include_fields 的参数应与CSV文件的列名相对应。由Qlib提供的数据集的列名至少应包括开盘价、收盘价、最高价、最低价、成交量和因子。

  • open

    调整后的开盘价

  • close

    调整后的收盘价

  • high

    调整后的最高价格

  • low

    调整后的最低价格

  • volume

    调整后的交易量

  • factor

    恢复因子。通常,factor = adjusted_price / original_price调整后的价格参考:split adjusted

Qlib数据处理的惯例中,如果股票停牌,open, close, high, low, volume, money and factor将被设置为NaN。 如果你想使用无法通过OCHLV计算的自己的alpha因子,如PE、EPS等,你可以将其与OHCLV一起添加到CSV文件中,然后将其转储为Qlib格式的数据。

股票池(市场)

Qlibstock pool 定义为股票列表及其日期范围。预定义的股票池(例如 csi300)可以按如下方式导入。

python collector.py --index_name CSI300 --qlib_dir <user qlib data dir> --method parse_instruments

多种库存模式

Qlib 现在为用户提供了两种不同的股票模式:中国股票模式和美国股票模式。以下是这两种模式的一些不同设置:

区域

交易单位

限制阈值

中国

100

0.099

美国

1

交易单位定义了可用于交易的股票单位数量,而限制阈值定义了股票涨跌幅的百分比界限。

  • If users use Qlib in china-stock mode, china-stock data is required. Users can use Qlib in china-stock mode according to the following steps:
    • 下载qlib格式的中国股票数据,请参考章节Qlib格式数据集

    • Initialize Qlib in china-stock mode

      假设用户在目录 ~/.qlib/qlib_data/cn_data 中下载了他们的 Qlib 格式数据。用户只需如下初始化 Qlib

      from qlib.constant import REG_CN
      qlib.init(provider_uri='~/.qlib/qlib_data/cn_data', region=REG_CN)
      
  • If users use Qlib in US-stock mode, US-stock data is required. Qlib also provides a script to download US-stock data. Users can use Qlib in US-stock mode according to the following steps:
    • 下载qlib格式的美国股票数据,请参考章节Qlib Format Dataset

    • Initialize Qlib in US-stock mode

      假设用户在目录 ~/.qlib/qlib_data/us_data 中准备了他们的 Qlib 格式数据。用户只需如下初始化 Qlib

      from qlib.config import REG_US
      qlib.init(provider_uri='~/.qlib/qlib_data/us_data', region=REG_US)
      

注意

非常欢迎提交新数据源的PR!用户可以提交代码来爬取数据,就像这里的示例一样。然后我们将使用该代码在我们的服务器上创建数据缓存,其他用户可以直接使用。

数据API

数据检索

用户可以使用qlib.data中的API来检索数据,请参考数据检索

功能

Qlib 提供了 FeatureExpressionOps 来根据用户需求获取特征。

  • Feature

    从数据提供者加载数据。用户可以获取诸如$high$low$open$close等特征,这些特征应与–include_fields的参数相对应,请参阅章节将CSV格式转换为Qlib格式

  • ExpressionOps

    ExpressionOps 将使用操作符进行特征构建。 要了解更多关于 Operator 的信息,请参考 Operator API。 此外,Qlib 支持用户定义自己的自定义 Operator,在 tests/test_register_ops.py 中提供了一个示例。

要了解更多关于 Feature 的信息,请参考 Feature API

过滤器

Qlib 提供了 NameDFilterExpressionDFilter 来根据用户的需求筛选工具。

  • NameDFilter

    名称动态仪器过滤器。根据规定的名称格式过滤仪器。需要一个名称规则正则表达式。

  • ExpressionDFilter

    表达式动态仪器过滤器。根据特定表达式过滤仪器。需要一个指示特定特征字段的表达式规则。

    • 基本特征过滤器: rule_expression = ‘$close/$open>5’

    • 横截面特征过滤器 : rule_expression = ‘$rank($close)<10’

    • 时间序列特征过滤器: rule_expression = ‘$Ref($close, 3)>100’

这里是一个简单的例子,展示了如何在基本的Qlib工作流配置文件中使用过滤器:

filter: &filter
    filter_type: ExpressionDFilter
    rule_expression: "Ref($close, -2) / Ref($close, -1) > 1"
    filter_start_time: 2010-01-01
    filter_end_time: 2010-01-07
    keep: False

data_handler_config: &data_handler_config
    start_time: 2010-01-01
    end_time: 2021-01-22
    fit_start_time: 2010-01-01
    fit_end_time: 2015-12-31
    instruments: *market
    filter_pipe: [*filter]

要了解更多关于Filter的信息,请参考Filter API

参考

要了解更多关于Data API的信息,请参考Data API

数据加载器

Data LoaderQlib 中设计用于从原始数据源加载原始数据。它将被加载并在 Data Handler 模块中使用。

Qlib数据加载器

Qlib中的QlibDataLoader类是一个接口,允许用户从Qlib数据源加载原始数据。

StaticDataLoader

StaticDataLoader 类是 Qlib 中的一个接口,允许用户从文件或提供的来源加载原始数据。

接口

以下是QlibDataLoader类的一些接口:

class qlib.data.dataset.loader.DataLoader

DataLoader 设计用于从原始数据源加载原始数据。

abstract load(instruments, start_time=None, end_time=None) DataFrame

将数据加载为 pd.DataFrame。

数据示例(列的多重索引是可选的):

                        feature                                                             label
                        $close     $volume     Ref($close, 1)  Mean($close, 3)  $high-$low  LABEL0
datetime    instrument
2010-01-04  SH600000    81.807068  17145150.0       83.737389        83.016739    2.741058  0.0032
            SH600004    13.313329  11800983.0       13.313329        13.317701    0.183632  0.0042
            SH600005    37.796539  12231662.0       38.258602        37.919757    0.970325  0.0289
Parameters:
  • instruments (strdict) – 它可以是市场名称或由InstrumentProvider生成的仪器配置文件。 如果instruments的值为None,则表示没有进行过滤。

  • start_time (str) – 时间范围的开始。

  • end_time (str) – 时间范围的结束时间。

Returns:

数据从底层源加载

Return type:

pd.DataFrame

Raises:

KeyError: – 如果不支持仪器过滤器,则引发 KeyError

API

要了解更多关于Data Loader的信息,请参考Data Loader API

数据处理器

Qlib中的Data Handler模块旨在处理那些大多数模型将使用的常见数据处理方法。

用户可以通过qrun在自动工作流中使用Data Handler,更多详情请参考Workflow: Workflow Management

DataHandlerLP

除了在自动工作流中使用Data Handlerqrun一起使用外,Data Handler还可以作为一个独立的模块使用,用户可以轻松地预处理数据(标准化、去除NaN等)并构建数据集。

为了实现这一点,Qlib 提供了一个基类 qlib.data.dataset.DataHandlerLP。这个类的核心思想是:我们将有一些可学习的 Processors,它们可以学习数据处理的参数(例如,zscore 归一化的参数)。当新数据到来时,这些训练过的 Processors 可以处理新数据,从而使得高效处理实时数据成为可能。关于 Processors 的更多信息将在下一小节中列出。

接口

以下是DataHandlerLP提供的一些重要接口:

class qlib.data.dataset.handler.DataHandlerLP(instruments=None, start_time=None, end_time=None, data_loader: dict | str | DataLoader | None = None, infer_processors: List = [], learn_processors: List = [], shared_processors: List = [], process_type='append', drop_raw=False, **kwargs)

带有(L)earnable (P)rocessor的DataHandler

此处理程序将生成三块数据,格式为pd.DataFrame。

  • DK_R / self._data: 从加载器加载的原始数据

  • DK_I / self._infer: 用于推理处理的数据

  • DK_L / self._learn: 用于学习模型处理的数据。

使用不同处理器工作流进行学习和推理的动机 以下是一些示例。

  • 用于学习和推理的工具集可能不同。

  • 某些样本的处理可能依赖于标签(例如,一些达到限制的样本可能需要额外处理或被丢弃)。

    • 这些处理器仅适用于学习阶段。

数据处理器的提示

  • 为了减少内存成本

    • drop_raw=True: 这将会在原始数据上就地修改数据;

  • 请注意,像self._inferself._learn这样的处理数据与Qlib的Dataset中的“train”和“test”等segments概念不同。

    • 处理过的数据如 self._inferself._learn 是通过不同处理器处理的基础数据

    • segments 在 Qlib 的 Dataset 中,如“train”和“test”,只是查询数据时的时间分段(在时间序列中,“train”通常早于“test”)。

    • 例如,您可以在“训练”时间段查询由infer_processors处理的data._infer

__init__(instruments=None, start_time=None, end_time=None, data_loader: dict | str | DataLoader | None = None, infer_processors: List = [], learn_processors: List = [], shared_processors: List = [], process_type='append', drop_raw=False, **kwargs)
Parameters:
  • infer_processors (list) –

    • 用于生成推理数据的处理器列表

    • 示例:

    1) classname & kwargs:
        {
            "class": "MinMaxNorm",
            "kwargs": {
                "fit_start_time": "20080101",
                "fit_end_time": "20121231"
            }
        }
    2) Only classname:
        "DropnaFeature"
    3) object instance of Processor
    

  • learn_processors (list) – 类似于 infer_processors,但用于生成学习模型的数据

  • process_type (str) –

    PTYPE_I = ‘independent’

    • self._infer 将由 infer_processors 处理

    • self._learn 将由 learn_processors 处理

    PTYPE_A = ‘append’

    • self._infer 将由 infer_processors 处理

    • self._learn 将由 infer_processors + learn_processors 处理

      • (例如,self._infer 由 learn_processors 处理)

  • drop_raw (bool) – 是否删除原始数据

fit()

在不处理数据的情况下拟合数据

fit_process_data()

拟合和处理数据

fit 的输入将是前一个处理器的输出

process_data(with_fit: bool = False)

处理数据。如果需要,请使用processor.fit

符号:(数据) [处理器]

# 当 self.process_type == DataHandlerLP.PTYPE_I 时的数据处理流程

(self._data)-[shared_processors]-(_shared_df)-[learn_processors]-(_learn_df)
                                       \
                                        -[infer_processors]-(_infer_df)

# 当 self.process_type == DataHandlerLP.PTYPE_A 时的数据处理流程

(self._data)-[shared_processors]-(_shared_df)-[infer_processors]-(_infer_df)-[learn_processors]-(_learn_df)
Parameters:

with_fit (bool) – fit 的输入将是前一个处理器的输出

config(processor_kwargs: dict | None = None, **kwargs)

数据的配置。 # 从数据源加载哪些数据

此方法将在从数据集中加载腌制处理程序时使用。 数据将使用不同的时间范围进行初始化。

setup_data(init_type: str = 'fit_seq', **kwargs)

设置数据以防多次运行初始化

Parameters:
  • init_type (str) – 上面列出的类型 IT_*

  • enable_cache (bool) –

    默认值为 false:

    • 如果 enable_cache == True:

      处理后的数据将保存在磁盘上,当我们下次调用 init 时,处理程序将直接从磁盘加载缓存的数据

fetch(selector: Timestamp | slice | str = slice(None, None, None), level: str | int = 'datetime', col_set='__all', data_key: Literal['raw', 'infer', 'learn'] = 'infer', squeeze: bool = False, proc_func: Callable | None = None) DataFrame

从底层数据源获取数据

Parameters:
  • selector (Union[pd.Timestamp, slice, str]) – 描述如何通过索引选择数据。

  • level (Union[str, int]) – 选择数据的索引级别。

  • col_set (str) – 选择一组有意义的列。(例如:特征、列)。

  • data_key (str) – 要获取的数据: DK_*.

  • proc_func (Callable) – 请参考DataHandler.fetch的文档

Return type:

pd.DataFrame

get_cols(col_set='__all', data_key: Literal['raw', 'infer', 'learn'] = 'infer') list

获取列名

Parameters:
  • col_set (str) – 选择一组有意义的列。(例如:特征、列)。

  • data_key (DATA_KEY_TYPE) – 要获取的数据: DK_*.

Returns:

列名列表

Return type:

列表

classmethod cast(handler: DataHandlerLP) DataHandlerLP

Motivation

  • 用户在他的自定义包中创建了一个数据处理器。然后他希望将处理后的处理器分享给其他用户,而不引入包依赖和复杂的数据处理逻辑。

  • 这个类通过将类转换为DataHandlerLP并仅保留处理后的数据来实现这一点

Parameters:

handler (DataHandlerLP) – DataHandlerLP 的一个子类

Returns:

转换后的处理数据

Return type:

DataHandlerLP

classmethod from_df(df: DataFrame) DataHandlerLP

动机: - 当用户想要快速获取数据处理程序时。

创建的数据处理程序将只有一个共享的Dataframe,没有处理器。 创建处理程序后,用户可能经常希望转储处理程序以便重用 这是一个典型的使用案例

from qlib.data.dataset import DataHandlerLP
dh = DataHandlerLP.from_df(df)
dh.to_pickle(fname, dump_all=True)

待办事项: - StaticDataLoader 相当慢。它不必再次复制数据…

如果用户希望通过配置加载特征和标签,用户可以定义一个新的处理程序并调用qlib.contrib.data.handler.Alpha158的静态方法parse_config_to_fields

此外,用户可以将qlib.contrib.data.processor.ConfigSectionProcessor传递给新的处理程序,该处理器提供了一些预处理方法,用于处理由配置定义的特征。

处理器

Qlib中的Processor模块被设计为可学习的,它负责处理数据处理,如归一化删除无/空特征/标签

Qlib 提供以下 Processors

  • DropnaProcessor: processor 删除N/A特征的处理器。

  • DropnaLabel: processor 删除 N/A 标签。

  • TanhProcess: 使用 tanh 处理噪声数据的 processor

  • ProcessInf: processor 处理无穷大值的处理器,它将被列的均值替换。

  • Fillna: 处理器 用于处理N/A值,它将用0或其他给定的数字填充N/A值。

  • MinMaxNorm: processor 应用最小-最大归一化的处理器。

  • ZscoreNorm: processor 应用z-score标准化的处理器。

  • RobustZScoreNorm: processor 应用鲁棒z-score归一化的处理器。

  • CSZScoreNorm: processor 应用横向z-score标准化的处理器。

  • CSRankNorm: processor 应用横截面排名归一化。

  • CSZFillna: processor 通过列的平均值以横向方式填充N/A值。

用户还可以通过继承Processor的基类来创建自己的处理器。请参考所有处理器的实现以获取更多信息(Processor Link)。

要了解更多关于Processor的信息,请参阅Processor API

示例

Data Handler 可以通过修改配置文件使用 qrun 运行,也可以作为单独的模块使用。

了解更多关于如何使用qrun运行Data Handler的信息,请参考工作流:工作流管理

Qlib 提供了实现的数据处理器 Alpha158。以下示例展示了如何将 Alpha158 作为单个模块运行。

注意

用户需要首先使用qlib.init初始化Qlib,请参考initialization

import qlib
from qlib.contrib.data.handler import Alpha158

data_handler_config = {
    "start_time": "2008-01-01",
    "end_time": "2020-08-01",
    "fit_start_time": "2008-01-01",
    "fit_end_time": "2014-12-31",
    "instruments": "csi300",
}

if __name__ == "__main__":
    qlib.init()
    h = Alpha158(**data_handler_config)

    # get all the columns of the data
    print(h.get_cols())

    # fetch all the labels
    print(h.fetch(col_set="label"))

    # fetch all the features
    print(h.fetch(col_set="feature"))

注意

Alpha158中,Qlib使用标签Ref($close, -2)/Ref($close, -1) - 1表示从T+1到T+2的变化,而不是Ref($close, -1)/$close - 1,原因是当获取中国股票的T日收盘价时,股票可以在T+1日买入并在T+2日卖出。

API

要了解更多关于Data Handler的信息,请参考Data Handler API

数据集

Qlib 中的 Dataset 模块旨在为模型训练和推理准备数据。

该模块的动机是我们希望最大化不同模型处理适合自身数据的灵活性。该模块赋予模型以独特方式处理其数据的灵活性。例如,像GBDT这样的模型可能在包含nanNone值的数据上表现良好,而像MLP这样的神经网络在此类数据上会崩溃。

如果用户的模型需要以不同的方式处理其数据,用户可以自己实现Dataset类。如果模型的数据处理并不特殊,可以直接使用DatasetH

DatasetH 类是带有 数据处理器数据集。以下是该类最重要的接口:

class qlib.data.dataset.__init__.DatasetH(handler: Dict | DataHandler, segments: Dict[str, Tuple], fetch_kwargs: Dict = {}, **kwargs)

带有数据(H)处理器的数据集

用户应尝试将数据预处理函数放入处理程序中。 只有以下数据处理函数应放置在数据集中:

  • 处理与特定模型相关。

  • 处理与数据分割有关。

__init__(handler: Dict | DataHandler, segments: Dict[str, Tuple], fetch_kwargs: Dict = {}, **kwargs)

设置基础数据。

Parameters:
  • handler (Union[dict, DataHandler]) –

    handler 可以是:

    • DataHandler 的实例

    • DataHandler 的配置。请参考 DataHandler

  • segments (dict) –

    描述数据分段的选项。 以下是一些示例:

    1) 'segments': {
            'train': ("2008-01-01", "2014-12-31"),
            'valid': ("2017-01-01", "2020-08-01",),
            'test': ("2015-01-01", "2016-12-31",),
        }
    2) 'segments': {
            'insample': ("2008-01-01", "2014-12-31"),
            'outsample': ("2017-01-01", "2020-08-01",),
        }
    

config(handler_kwargs: dict | None = None, **kwargs)

初始化数据集H

Parameters:
  • handler_kwargs (dict) –

    DataHandler的配置,可能包含以下参数:

    • DataHandler.conf_data的参数,例如'instruments'、'start_time'和'end_time'。

  • kwargs (dict) –

    DatasetH的配置,例如

    • segmentsdict

      segments的配置,与self.__init__中的‘segments’相同

setup_data(handler_kwargs: dict | None = None, **kwargs)

设置数据

Parameters:

handler_kwargs (dict) –

DataHandler的初始化参数,可能包括以下参数:

  • init_type : 处理程序的初始化类型

  • enable_cache : 是否启用缓存

prepare(segments: List[str] | Tuple[str] | str | slice | Index, col_set='__all', data_key='infer', **kwargs) List[DataFrame] | DataFrame

准备用于学习和推理的数据。

Parameters:
  • segments (Union[List[Text], Tuple[Text], Text, slice]) –

    描述要准备的数据范围 以下是一些示例:

    • ’train’

    • [‘train’, ‘valid’]

  • col_set (str) –

    col_set 将在获取数据时传递给 self.handler。 TODO: 使其自动化:

    • 选择 DK_I 用于测试数据

    • 选择 DK_L 用于训练数据。

  • data_key (str) – 要获取的数据: DK_* 默认是 DK_I,表示获取用于推理的数据。

  • kwargs

    kwargs 可能包含的参数:
    flt_colstr

    它仅存在于 TSDatasetH 中,可用于添加一列数据(True 或 False)以过滤数据。 此参数仅在 TSDatasetH 实例中支持。

Return type:

联合[列表[pd.DataFrame], pd.DataFrame]

Raises:

NotImplementedError:

API

要了解更多关于 Dataset 的信息,请参考 Dataset API

缓存

Cache 是一个可选模块,通过将一些常用数据保存为缓存文件来帮助加速数据提供。Qlib 提供了一个 Memcache 类来缓存内存中最常用的数据,一个可继承的 ExpressionCache 类,以及一个可继承的 DatasetCache 类。

全局内存缓存

Memcache 是一个全局内存缓存机制,由三个 MemCacheUnit 实例组成,用于缓存 CalendarInstrumentsFeaturesMemCachecache.py 中全局定义为 H。用户可以使用 H[‘c’], H[‘i’], H[‘f’] 来获取/设置 memcache

class qlib.data.cache.MemCacheUnit(*args, **kwargs)

内存缓存单元。

__init__(*args, **kwargs)
property limited

内存缓存是否有限

class qlib.data.cache.MemCache(mem_cache_size_limit=None, limit_type='length')

内存缓存。

__init__(mem_cache_size_limit=None, limit_type='length')
Parameters:
  • mem_cache_size_limit – 缓存最大大小。

  • limit_type – 长度或大小;长度(调用函数:len),大小(调用函数:sys.getsizeof)。

表达式缓存

ExpressionCache 是一种缓存机制,用于保存诸如 Mean($close, 5) 之类的表达式。用户可以继承这个基类,按照以下步骤定义自己的缓存机制来保存表达式。

  • 重写 self._uri 方法以定义缓存文件路径的生成方式

  • 重写 self._expression 方法以定义将缓存哪些数据以及如何缓存它。

以下显示了关于接口的详细信息:

class qlib.data.cache.ExpressionCache(provider)

表达式缓存机制的基类。

此类用于包装表达式提供者,并带有自定义的表达式缓存机制。

注意

重写_uri_expression方法以创建您自己的表达式缓存机制。

expression(instrument, field, start_time, end_time, freq)

获取表达式数据。

注意

与表达式提供者中的expression方法相同的接口

update(cache_uri: str | Path, freq: str = 'day')

将表达式缓存更新到最新的日历。

重写此方法以定义如何根据用户自己的缓存机制更新表达式缓存。

Parameters:
  • cache_uri (strPath) – 表达式缓存文件的完整URI(包括目录路径)。

  • freq (str) –

Returns:

0(成功更新)/ 1(无需更新)/ 2(更新失败)。

Return type:

整数

Qlib 目前提供了已实现的磁盘缓存 DiskExpressionCache,它继承自 ExpressionCache。表达式数据将存储在磁盘上。

数据集缓存

DatasetCache 是一种保存数据集的缓存机制。某个数据集由股票池配置(或一系列工具,尽管不推荐)、表达式列表或静态特征字段、收集特征的开始时间和结束时间以及频率来规范。用户可以继承这个基类,按照以下步骤定义自己的缓存机制来保存数据集。

  • 重写 self._uri 方法以定义其缓存文件路径的生成方式

  • 重写 self._expression 方法以定义将缓存哪些数据以及如何缓存它。

以下显示了关于接口的详细信息:

class qlib.data.cache.DatasetCache(provider)

数据集缓存机制的基类。

此类用于使用自定义数据集缓存机制包装数据集提供者。

注意

重写 _uri_dataset 方法以创建您自己的数据集缓存机制。

dataset(instruments, fields, start_time=None, end_time=None, freq='day', disk_cache=1, inst_processors=[])

获取特征数据集。

注意

与数据集提供者中的dataset方法相同的接口

注意

服务器使用redis_lock来确保不会触发读写冲突,但没有考虑客户端读取者。

update(cache_uri: str | Path, freq: str = 'day')

更新数据集缓存到最新的日历。

重写此方法以定义如何根据用户自己的缓存机制更新数据集缓存。

Parameters:
  • cache_uri (strPath) – 数据集缓存文件的完整URI(包括目录路径)。

  • freq (str) –

Returns:

0(成功更新)/ 1(无需更新)/ 2(更新失败)

Return type:

整数

static cache_to_origin_data(data, fields)

将缓存数据转换为原始数据

Parameters:
  • data – pd.DataFrame, 缓存数据。

  • fields – 特征字段。

Returns:

pd.DataFrame.

static normalize_uri_args(instruments, fields, freq)

规范化URI参数

Qlib 目前提供了已实现的磁盘缓存 DiskDatasetCache,它继承自 DatasetCache。数据集的数据将存储在磁盘上。

数据和缓存文件结构

我们特别设计了一个文件结构来管理数据和缓存,详细信息请参考Qlib论文中的文件存储设计部分。数据和缓存的文件结构如下所示。

- data/
    [raw data] updated by data providers
    - calendars/
        - day.txt
    - instruments/
        - all.txt
        - csi500.txt
        - ...
    - features/
        - sh600000/
            - open.day.bin
            - close.day.bin
            - ...
        - ...
    [cached data] updated when raw data is updated
    - calculated features/
        - sh600000/
            - [hash(instrtument, field_expression, freq)]
                - all-time expression -cache data file
                - .meta : an assorted meta file recording the instrument name, field name, freq, and visit times
        - ...
    - cache/
        - [hash(stockpool_config, field_expression_list, freq)]
            - all-time Dataset-cache data file
            - .meta : an assorted meta file recording the stockpool config, field names and visit times
            - .index : an assorted index file recording the line index of all calendars
        - ...