BigQuant使用文档

102a-第一个AI策略

由qxiao创建,最终由qxiao 被浏览 2 用户

策略介绍

本策略基于 BigQuant 平台的 StockRanker 排序学习算法,通过机器学习方法预测股票在未来一段时间内的相对表现,并对股票进行横截面排序,从而构建可交易的股票组合。

StockRanker 是 BigQuant 自研的一种 Learning to Rank(排序学习)算法,专门用于量化选股场景。\n它通过在多维因子/特征数据上进行训练,学习股票在未来收益维度上的相对优劣关系

模型输出的是一个相对评分(score):

  • score 只用于 同一交易日的股票排序
  • score 的绝对大小本身不具有直接金融意义
  • score 越大,代表该股票在模型看来未来表现相对更优

策略思想

本策略围绕 “特征 → 学习 → 排序 → 仓位 → 交易” 五个核心环节构建。

  1. 特征选择

通过输入多维度因子作为模型特征,包括估值、价格行为等信息,刻画股票的当前状态。

  1. 预测目标

预测股票 未来 5 个交易日的收益表现,并将其转化为排序学习任务。

  1. 数据处理

对训练阶段与预测阶段的数据分别进行抽取、过滤和缺失值处理,确保数据质量和时间一致性。

  1. 模型训练

使用 StockRanker 算法学习“什么样的特征组合,更可能对应较高的未来收益排名”。

  1. 仓位与交易

根据模型预测结果进行选股,并将排序结果映射为实际仓位,最终通过回测或模拟交易执行策略。

0、因子特征选择

  • m2 输入特征 DAI SQL 在实现因子输入,这里用 表达式模式 输入,作为例子,选择了几个估值因子,在实际中你可以选择你需要的因子。
  • 使用的是 cn_stock_prefactors 预计算因子表 中数据作为基础数据,也可以在这里直接使用更多数据,例如 cn_stock_bar1d.turn , cn_stock_valuation.float_market_ca
  • 连接关系:m2 → m3(features) 与 m2 → m16(features)。

1、训练阶段:构建带标签的训练数据并训练模型

  • 训练阶段的目标是:让模型学会在给定特征条件下,哪些股票在未来更可能表现更好
  • 首先,通过 m1 代码列表(训练集) 定义训练所使用的股票范围和时间区间。m1 的作用不是获取行情数据本身,而是生成一套统一的样本坐标(即哪些股票、哪些交易日会成为训练样本)。在这一模块中,通常只需要填写市场类型和训练起止日期,其余如自定义股票池可以留空,使用平台默认设置即可。
  • m1 同时连接:m1 + m2 → m3(instruments) 与 m1 → m4(instruments)。



在确定训练样本坐标后,m3 表达式特征抽取m4 自动标注 会同时基于 m1 提供的同一套股票与日期运行。m3 负责在这些坐标上计算描述股票当期状态的特征数据(如估值、价格、成交等),m4 则在完全相同的坐标上计算对应的未来表现标签(如未来 5 日收益的离散等级)。m1 同时连接 m3 和 m4,是为了保证每一条训练样本中的特征与标签严格对应同一只股票、同一交易日,这是模型能够正确学习的前提。

m3 表达式特征抽取:在确定训练样本坐标后,m3 表达式特征抽取 会基于 m1 提供的股票与日期坐标,并按照 m2 的特征定义,计算训练阶段的特征数据(如估值、价格、成交等)。

连接关系:m1 → m3(instruments),m2 → m3(features),输出 m3.data → m8.data1。

m4 模块用于数据标注:在 m1 定义的股票池与日期范围上,为每个样本(date, instrument)计算并新增 label 列。\nlabel 的计算过程如下:

  • m_lead(close, 5) / m_lead(open, 1) 计算未来收益倍率,含义为“明天开盘买入,5 个交易日后收盘卖出”。
  • all_quantile_cont(_future_return, 0.01) 与 all_quantile_cont(_future_return, 0.99) 计算未来收益的 1% 与 99% 分位值。
  • clip(_future_return, _future_return_1pct, _future_return_99pct) 按分位值裁剪极端收益,提升标签稳定性。
  • all_cbins(_clipped_return, 20) 将裁剪后的收益按分布划分为 20 个等级(离散化),得到排序学习所需的标签。另一个常用分箱函数为 c_wbins,可参考DAI 函数文档
  • 连接关系:m1 → m4(instruments),输出 m4.data → m8.data2,与 m3 在 m8 中按 date,instrument 对齐。

随后,通过 m8 数据连接 将 m3 输出的特征数据与 m4 输出的标签数据按 date 和 instrument 进行合并,生成每一行同时包含“特征 + 标签”的完整训练样本。若你希望保留未对齐样本用于排查,可临时改为 outer 并输出调试,但训练仍建议 inner。

m6 DAI 数据过滤(训练):m6 用于剔除不可交易或明显异常的训练样本(例如停牌、ST、成交为 0 等),减少噪声。

连接关系:m8.data → m6.input_data,输出 m6.data → m12.input_data。

st_status==0 & close>low : 排除 ST / ST 等特殊处理股票并且要求收盘价大于最低价

m12 缺失值处理 进一步移除包含缺失值的样本。m6, m12两个模块的参数通常可以保持较为保守的默认设置,重点在于保证数据质量,而不是一次性过滤过多样本。

连接关系:m6.data → m12.input_data, 输出m12.data → m9.input_data.

m9 为 Python 函数模块,用于在可视化流程中插入自定义逻辑。\n该模块接收上游模块输出的数据,执行用户定义的 Python 处理代码,并将处理结果输出到下游模块。m9 常用于实现特征的二次加工、样本过滤、预测结果后处理等当前标准模块不便直接完成的逻辑,用于增强策略灵活性。是否使用 m9 以及具体效果,取决于策略中自定义代码的实现内容。

m9在这里用于对上游训练样本进行自定义加工。本策略中该模块读取 m12 输出的数据表,删除 st_statuslowcloseprice_limit_status

等不希望参与模型学习的字段,并将处理后的结果写回为 DataSource 输出给 StockRanker 训练模块使用,从而确保模型只学习有效特征,避免无效字段干扰训练效果。

最后,清洗后的训练数据被送入 m7 StockRanker 训练模块。该模块使用排序学习算法,在训练样本上学习股票的相对优劣顺序,并输出可复用的模型。对于初次使用的策略,建议优先使用默认或稳健的参数配置,模型效果的主要提升往往来自特征质量而非复杂调参。

在m7板块可以调整StockRanker 训练模块的训练细节,包括学习算法、叶节点数量等。



到此,训练集板块已经完成

训练集板块与测试集板块并不直接用数据连线相连,而是通过“训练得到的模型”进行连接:训练集负责生成模型,测试集负责使用该模型进行预测。

训练集链路(此例左侧):m1 → m3(特征)  m1 → m4(标签)  m3 + m4 → m8 → m6 → m12 → m7(StockRanker 训练)输出的核心只有一个东西:m7 输出的 model(训练集最终产物)

2.测试阶段

测试/预测链路(此例右侧):m2 + m15 → m16(特征) → m10 → m17 → m13(StockRanker 预测)

m15m1在本质上是同一个功能的模块,都是在定义股票范围和时间区间,只不过m15 定义预测所使用的股票与日期坐标,用于后续预测特征计算与当日打分。训练期和预测期通常不同(例如训练用 2021–2022,预测用 2023–2024)。避免训练数据和预测数据混在一起(防止穿越),同时方便分别调参和回测区间m1的训练区间较长、覆盖多阶段,而m15:预测/回测区间放在训练区间之后,股票市场 market 通常保持一致(除非故意跨市场训练)

连接关系:m15 → m16(instruments)。

**m16 表达式特征抽取(预测)**m16 在 m15 的坐标上,复用 m2 的特征定义计算预测特征。预测阶段不生成标签。

连接关系:m15 → m16(instruments),m2 → m16(features),输出 m16.data → m10.input_data。

**m10 数据过滤(预测) + m17 缺失值处理(预测)**用来保证可交易的预测输入,预测阶段必须保证输入数据可执行:m10 剔除不可交易样本,m17 剔除缺失样本,确保预测与交易稳定。(效果与m6 + m12相同)

连接关系:m16 → m10 → m17 → m13(data)。

m13 StockRanker 预测用来模型打分m13 使用 m7 训练得到的模型,对预测样本进行打分输出 score,用于后续仓位生成。

连接关系m7.model → m13.model,m17.data → m13.data,输出 m13.predictions → m18.input_1。

m18 仓位分配用将从 score 转换到 position

m18 将预测分数(score)转换为目标持仓结构(position),决定买哪些、买多少。

连接关系:m13.predictions → m18.input_1,输出 m18.data → m19.data。

score DESC 是指按照预测分数降序排序

持仓股票数:10 是指我们取分数最高的10支股票

1 AS position:完全等权持仓,不看排名强弱 ,如果选择1 / score_rank AS position:排名越靠前权重越大(第1名最大)



m19 BigTrader(回测/交易执行)用来执行调仓与回测m19 根据目标仓位执行买卖,输出回测绩效与交易细节。

连接关系:m18.data → m19.data;如需在回调中读取信号数据,通过 context.data 访问。

只需要设置:回测区间、调仓周期、买卖价格点(open/close)、初始资金等。

3.查看数据

我们封装一个函数,用来查看每一个模块输出的是什么数据

import pandas as pd

def to_df(x, name="obj", max_rows=2000):
    """
    尽量把任意对象转成 DataFrame:
    - DataSource -> read()
    - DataFrame -> 原样
    - dict -> key/value表 或 sql单列
    - list/tuple -> 单列或多列
    - 其他 -> 摘要表
    """
    # 先 read()
    if hasattr(x, "read"):
        x = x.read()

    # 1) DataFrame
    if isinstance(x, pd.DataFrame):
        return x

    # 2) dict
    if isinstance(x, dict):
        # 常见:sql
        if "sql" in x and isinstance(x["sql"], str):
            return pd.DataFrame({"sql": [x["sql"]]})
        # 否则做 key/value 表
        rows = []
        for k, v in x.items():
            # 太长的字符串截断,避免 notebook 卡
            sv = v
            if isinstance(v, str) and len(v) > 2000:
                sv = v[:2000] + " ... (truncated)"
            rows.append({"key": k, "value": sv})
        return pd.DataFrame(rows)

    # 3) list/tuple
    if isinstance(x, (list, tuple)):
        # list of dict -> DataFrame
        if len(x) > 0 and isinstance(x[0], dict):
            return pd.DataFrame(x)
        # list of list/tuple -> DataFrame
        if len(x) > 0 and isinstance(x[0], (list, tuple)):
            return pd.DataFrame(list(x))
        # list of scalar -> 单列
        return pd.DataFrame({name: list(x)})

    # 4) 其他对象:做摘要
    return pd.DataFrame({
        "name": [name],
        "type": [str(type(x))],
        "repr": [repr(x)[:2000]]
    })

def show_df(x, title="df", head=20):
    df = to_df(x, title)
    print(f"\n[{title}] shape={getattr(df, 'shape', None)}")
    display(df.head(head))
    return df

m1(代码列表)

m2(特征列表)

m3(抽取结果)

m4(Label数据)

m7(模型)

m13(预测分数)

m18(仓位)

策略实现&代码

在BigQuant平台可以非常容易的将量化+AI结合起来。如下是策略代码,可以克隆策略进入 AIStudio 运行和调优。

https://deepwin.bigquant.com/codesharev3/8c71efad-dd5e-42ac-b097-f944994e1732

\

标签

因子模型量化选股机器学习
{link}