AI 原生量化投研平台AI-native quantitative research platform
正在加载…Loading…
页面仍在加载,可以继续等待,或重新加载。The page is still loading. You can keep waiting or reload.
部分页面资源未能加载,请重新加载。Some page resources could not load. Please reload.
设备当前处于离线状态,恢复连接后可以继续等待或重新加载。Your device is offline. Once connected, you can keep waiting or reload.

以数据发现价值·以研究探索 Alpha
2026年第二届“进益资本”杯量化因子挑战赛 面向高校与社会量化人才,围绕 A 股分钟级行情数据,考察参赛者构建分钟级预测因子的能力,服务于量化研究交流、品牌传播与人才选拔。
进益资本是一家专注于量化投资与量化研究的资产管理机构,致力于通过严谨的数据分析、系统化的研究流程和先进的计算方法,在复杂多变的金融市场中寻找可持续的投资机会。对于量化投资而言,因子是连接市场数据与投资决策的重要桥梁;从海量、嘈杂的行情数据中提炼出具有经济含义、逻辑清晰、稳定可靠的预测信号,是量化研究的核心工作之一。持续挖掘、验证和迭代高质量因子,也是进益资本建设长期研究能力的重要组成部分。
本次挑战赛由进益资本主办,面向学校以清华大学为主,同时也欢迎其他院校同学与清华同学共同组队参赛。主办方将提供真实的 A 股分钟级行情、盘口等特色数据,为参赛者创造贴近实际量化研究工作的研究环境。参赛者需要围绕未来 30 分钟收益构建预测因子,并通过公榜和私榜两个阶段接受评估:公榜用于研究迭代和过程反馈,私榜使用未公开样本外数据检验因子的稳健性与可落地性。
参赛者将在比赛中接触大规模金融时序数据,理解市场微观结构、短期供需和交易行为,并完整经历数据处理、因子构造、统计检验、稳定性分析和代码复现等研究环节。我们期待参赛者以清晰的投资逻辑为基础,提出具有创新性、可解释性和实际研究价值的因子,与进益资本共同探索分钟级量化研究的更多可能。
本次比赛设置两个独立赛道,参赛者可选择一个赛道,也可同时参加两个赛道:
| 赛道 | 适合人群 | 核心任务 |
|---|---|---|
| 因子挖掘 | 金融工程、量化、数学、统计等方向 | 基于分钟级行情与盘口数据人工构造预测因子 |
| 端到端 | AI、计算机、数据科学、金融科技等方向 | 基于原始分钟级量价序列直接训练模型并输出预测分数 |
为什么是分钟级预测:分钟级行情和盘口数据能够反映市场微观结构、短期供需和交易行为。本次比赛统一预测未来 30 分钟 VWAP 收益,以每 30 分钟一个非重叠截面进行评估,两个赛道的区别仅在于预测信号的产生方式。
本赛道采用"因子挖掘"方式:平台提供高频等特色数据,参赛者构建30分钟频因子并提交。主办方提供以下模版供参考:
| 模版 | 说明 |
|---|---|
demo_sql.ipynb | DAI数据引擎直接计算因子,速度更快,内存占比更低 |
demo_udf.ipynb | UDF支持用户自定义封装python函数并在dai数据引擎中执行,效率更高 |
demo_py.ipynb | 传统python计算,请注意内存使用情况 |
参赛者提交因子构建代码,平台自动运行代码并生成因子数据。提交内容是代码,不是离线因子文件。入口函数返回的数据必须且仅包含以下三列:
| date | instrument | factor |
|---|---|---|
| 2023-01-03 10:30:00 | 000001.SZ | 0.05 |
| 2023-01-03 10:30:00 | 000002.SZ | -0.12 |
| ... | ... | ... |
date 必须精确到分钟,并落在平台约定的 30 分钟采样时点。提交须通过以下校验,否则视为无效:
date、instrument、factor 三列。校验通过后,平台对原始因子统一处理:
为保证公平,所有因子生成代码须在指定线上平台 Notebook 环境运行并提交:
评分以单个有效因子提交为单位。每个因子分别计算五项原始指标,再在全体有效提交中进行 rank 百分比排名,将不同量纲的指标统一转换为 [0, 1] 区间的排名分数。这样,各细分项可以直接进行横向比较并加权求和。
| 指标 | 评价重点 |
|---|---|
| IC 均值 | 因子排序与未来 30 分钟 VWAP 收益的平均相关性 |
| IC_IR | 预测能力在不同时间截面的稳定性 |
| 多空组合夏普比率 | 按因子排序构建多空组合后的收益风险表现 |
| 压力场景稳定性 | 高低波动、放缩量和不同时段等场景下的稳健性 |
| 换手率 | 信号变化和组合调仓成本,换手越低越好 |
五项指标各占 20%,指标表现越好,百分位排名越高;其中换手率按照“换手越低、排名越高”的方向处理。提交 i 的最终分数为:
其中,R 表示对应原始指标在全体有效提交中的 rank 百分比排名,取值范围为 [0, 1]。例如,某项指标的 R=0.80,表示该因子在该项指标上的表现优于约 80% 的有效提交。团队最终成绩取本队全部有效提交中的最高分,不因提交数量直接加分。公榜排名会随着新提交加入而变化,私榜使用样本外数据决定最终排名。
团队 team 的最终得分为队内所有有效个人提交分数中的最高值:
其中,i 表示团队成员提交的有效因子。也就是说,团队成员可以分别提交和探索因子,最终由团队中表现最好的有效因子决定团队排名。
比赛使用公榜训练集、公榜验证集和私榜数据集三个数据集,经历公榜和私榜两个阶段,最终排名以私榜数据集上的成绩为准。
| 数据集 | 用途 | 评估方式 | 结果 |
|---|---|---|---|
| 公榜训练集 | 用于参赛者开发、调试和迭代因子 | 参赛者基于该数据集自行完成因子构建与研究分析 | 不产生公榜成绩 |
| 公榜验证集 | 用于评估已提交的因子 | 参赛者提交后,平台使用该数据集重跑因子并计算评估指标 | 展示提交成绩,用于研究反馈,不直接决定最终排名 |
| 私榜数据集 | 用于对精选提交进行最终样本外评估 | 入选私榜的提交使用该数据集重跑因子并计算评估指标 | 作为最终排名依据 |
三个数据集的数据区间相互不重叠:公榜训练集用于开发调试,公榜验证集用于提交后的统一重跑和评估,私榜数据集用于精选提交的最终样本外评估。公榜提交截止时间为 2026 年 10 月 30 日 23:59:59,分数仅用于研究反馈,不决定最终名次;私榜候选选择截止时间为 2026 年 10 月 31 日 23:59:59,待提交评分完成后由各队选择候选并确认冻结。冻结后不得修改代码、参数、依赖或随机种子,最终以团队私榜最高有效提交分数排名。
入围队伍需提交研究报告、代码复现说明和数据/依赖声明。报告应重点说明因子构造逻辑、经济含义、可解释性、数据处理、统计检验、稳定性分析和局限性;如使用 AI 工具,还需说明 AI 参与环节、关键提示词和人工复核方式。
决赛综合评审参考以下维度:
| 评审维度 | 权重 | 评估重点 |
|---|---|---|
| 投资逻辑与问题定义 | 25% | 是否清楚说明分钟级信号来源、经济含义、微观结构逻辑,或端到端模型捕捉的行为模式 |
| 分钟级信号质量 | 30% | RankIC、RankIC_IR、分组多空、换手率、压力场景、公榜与私榜差异及样本外稳定性 |
| 实现与复现规范 | 20% | 代码结构、依赖版本、随机种子、运行入口、日志样例、训练/推理分离及平台复现结果 |
| AI/端到端创新 | 10% | AI 工具或深度模型是否真正提升研究效率或预测质量,使用过程是否透明、可复现 |
| 陈述表达与问答互动 | 15% | 汇报是否清晰有条理,能否准确回答数据口径、过拟合、交易可行性和复现等问题 |
答辩材料应与冻结提交保持一致,不得在决赛阶段修改因子或模型代码、参数、权重、随机种子及依赖。涉及 AI 工具的队伍还应如实披露 AI 参与环节、关键提示词、生成内容的人工复核方式及最终采用情况。
决赛答辩结束后,组委会将结合综合评审结果完成最终排名及颁奖安排,预计于 2026 年 11 月 第三周 举行颁奖活动,具体日期以官方通知为准。颁奖可与决赛答辩合并进行,并公布综合奖、赛道奖、专项奖及优秀组织相关结果(如设置)。
决赛入围选手将进入进益资本量化研究人才库,赛后由投研与 HR 统一进行评估。表现优秀的选手可根据赛道和能力方向,获得量化研究、量化开发或 AI 建模方向的实习、面试直通或进一步人才评估机会。
本次赛事奖励安排如下:
| 奖项 | 数量 | 奖励 | 赛道分配 |
|---|---|---|---|
| 一等奖 | 2 名 | ¥10,000 | 两赛道各 1 名 |
| 二等奖 | 4 名 | ¥6,000 | 两赛道各 2 名 |
| 三等奖 | 6 名 | ¥4,000 | 两赛道各 3 名 |
| 签约奖(入职/实习) | 6 名 | ¥8,000 | 两赛道合计 6 名 |
| 合计 | ¥116,000 |
最终获奖资格、评选流程及人才转化安排以进益资本大赛组委会公告和最终审核结果为准,所有进入决赛的同学均有机会获得。进入决赛的选手还有机会获得进入进益资本实习的机会,经过评估获得offer并愿意加入进益的同学还可以获得签约奖,签约奖单独发放与一二三等奖不冲突。
本比赛只可使用指定的数据源来构建因子。评判程序会 import 参赛用户提交代码里的 main 函数,并传入数据源名、开始日期时间、结束日期时间来调用。
数据都放在 进益资本 空间下(https://jinyicapital.bigquant.com/)数据平台 /进益资本杯2026 目录下,报名审核后自动加入该空间获取数据权限。
股票池:以中证 1000 指数历史成分股为基础。
时间范围:2020年至2024年。
数据频率:1 分钟、5 分钟、15 分钟和 30 分钟 K 线及盘口快照。
开发数据表:
| cpt_jyc_2026_stock_bar1m | 1 分钟 K 线及盘口快照 |
| cpt_jyc_2026_stock_bar5m | 5 分钟 K 线及盘口快照 |
| cpt_jyc_2026_stock_bar15m | 15 分钟 K 线及盘口快照 |
| cpt_jyc_2026_stock_bar30m | 30 分钟 K 线及盘口快照 |
其他数据
以分钟行情为例,参考:[cpt_jyc_2026_stock_bar1m]
以下是根据您提供的内容转换成的 Markdown 格式表格:
| 字段名 | 数据类型 | 描述 |
|---|---|---|
| date | np.datetime64 | 日期(Bar 结束时刻) |
| instrument | pd.StringDtype | 股票代码 |
| instrument_id | np.int16 | 股票代码 ID |
| adjust_factor | np.float32 | 复权因子 |
| pre_close | np.float32 | 前收盘价 |
| high | np.float32 | 最高价 |
| open | np.float32 | 开盘价 |
| low | np.float32 | 最低价 |
| close | np.float32 | 收盘价 |
| deal_number | np.int32 | 成交笔数 |
| volume | np.int32 | 成交量 |
| amount | np.float32 | 成交额 |
| ask_price1 | np.float32 | 1档委卖价 |
| ask_price2 | np.float32 | 2档委卖价 |
| ask_price3 | np.float32 | 3档委卖价 |
| ask_price4 | np.float32 | 4档委卖价 |
| ask_price5 | np.float32 | 5档委卖价 |
| bid_price1 | np.float32 | 1档委买价 |
| bid_price2 | np.float32 | 2档委买价 |
| bid_price3 | np.float32 | 3档委买价 |
| bid_price4 | np.float32 | 4档委买价 |
| bid_price5 | np.float32 | 5档委买价 |
| ask_volume1 | np.int32 | 1档委卖量 |
| ask_volume2 | np.int32 | 2档委卖量 |
| ask_volume3 | np.int32 | 3档委卖量 |
| ask_volume4 | np.int32 | 4档委卖量 |
| ask_volume5 | np.int32 | 5档委卖量 |
| bid_volume1 | np.int32 | 1档委买量 |
| bid_volume2 | np.int32 | 2档委买量 |
| bid_volume3 | np.int32 | 3档委买量 |
| bid_volume4 | np.int32 | 4档委买量 |
| bid_volume5 | np.int32 | 5档委买量 |
| ask_num_orders1 | np.int32 | 卖1档委托笔数 |
| ask_num_orders2 | np.int32 | 卖2档委托笔数 |
| ask_num_orders3 | np.int32 | 卖3档委托笔数 |
| ask_num_orders4 | np.int32 | 卖4档委托笔数 |
| ask_num_orders5 | np.int32 | 卖5档委托笔数 |
| bid_num_orders1 | np.int32 | 买1档委托笔数 |
| bid_num_orders2 | np.int32 | 买2档委托笔数 |
| bid_num_orders3 | np.int32 | 买3档委托笔数 |
| bid_num_orders4 | np.int32 | 买4档委托笔数 |
| bid_num_orders5 | np.int32 | 买5档委托笔数 |
import dai
dai.query("SELECT * FROM cpt_jyc_2026_stock_bar1m", filters={"date": ["2020-01-01 00:00:00", "2020-01-05 23:59:59"]}).df().head()| date | instrument | instrument_id | adjust_factor | pre_close | high | open | low | close | deal_number | volume | amount | ask_price1 | ask_price2 | ask_price3 | ask_price4 | ask_price5 | bid_price1 | bid_price2 | bid_price3 | bid_price4 | bid_price5 | ask_volume1 | ask_volume2 | ask_volume3 | ask_volume4 | ask_volume5 | bid_volume1 | bid_volume2 | bid_volume3 | bid_volume4 | bid_volume5 | ask_num_orders1 | ask_num_orders2 | ask_num_orders3 | ask_num_orders4 | ask_num_orders5 | bid_num_orders1 | bid_num_orders2 | bid_num_orders3 | bid_num_orders4 | bid_num_orders5 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2020-01-02 09:31:00 | 000010.SZ | 10 | 10.7745 | 3.4 | 3.4 | 3.4 | 3.4 | 3.4 | 11 | 16600 | 56440 | 3.4 | 3.41 | 3.42 | 3.43 | 3.44 | 3.38 | 3.37 | 3.36 | 3.35 | 3.34 | 11200 | 500 | 7000 | 148400 | 9200 | 11500 | 42700 | 40900 | 39700 | 19100 | 3 | 3 | 2 | 1 | 3 | 4 | 7 | 8 | 6 | 2 |
| 1 | 2020-01-02 09:31:00 | 000011.SZ | 11 | 3.60337 | 9.41 | 9.5 | 9.49 | 9.47 | 9.49 | 74 | 140600 | 1.33519e+06 | 9.49 | 9.5 | 9.53 | 9.54 | 9.55 | 9.47 | 9.46 | 9.45 | 9.44 | 9.42 | 38700 | 21700 | 1200 | 33600 | 10300 | 300 | 11700 | 5600 | 1600 | 5100 | 6 | 5 | 1 | 5 | 9 | 1 | 4 | 4 | 1 | 3 |
| 2 | 2020-01-02 09:31:00 | 000014.SZ | 14 | 5.42094 | 9.31 | 9.4 | 9.38 | 9.38 | 9.4 | 42 | 31600 | 296616 | 9.41 | 9.42 | 9.43 | 9.44 | 9.45 | 9.38 | 9.32 | 9.31 | 9.3 | 9.24 | 2200 | 3000 | 4700 | 4200 | 4000 | 4200 | 9800 | 11200 | 5300 | 1000 | 2 | 1 | 2 | 3 | 2 | 3 | 3 | 4 | 3 | 1 |
| 3 | 2020-01-02 09:31:00 | 000017.SZ | 17 | 2.68274 | 4.52 | 4.56 | 4.53 | 4.53 | 4.53 | 68 | 96492 | 437659 | 4.54 | 4.55 | 4.56 | 4.57 | 4.58 | 4.53 | 4.52 | 4.51 | 4.5 | 4.49 | 11700 | 11000 | 30400 | 6100 | 21300 | 25208 | 16500 | 6100 | 32100 | 16800 | 5 | 4 | 11 | 3 | 6 | 8 | 7 | 3 | 4 | 5 |
| 4 | 2020-01-02 09:31:00 | 000019.SZ | 19 | 4.10962 | 6.08 | 6.14 | 6.11 | 6.11 | 6.12 | 87 | 212660 | 1.30156e+06 | 6.13 | 6.14 | 6.15 | 6.16 | 6.17 | 6.12 | 6.11 | 6.1 | 6.09 | 6.08 | 69510 | 29500 | 22300 | 200 | 28000 | 92200 | 43640 | 152300 | 34500 | 8200 | 21 | 11 | 12 | 1 | 8 | 3 | 15 | 9 | 3 | 8 |
可以注意到 cpt_jyc_2026_stock_bar1m 的股票代码有两个: instrument 和 instrument_id。如果需要节省数据内存占比,可以使用 instrument_id。
DAI 内置多种算子/函数,参考 DAI函数文档。DAI是专为AI/量化场景优化的超高性能计算引擎,能充分利用现代CPU/GPU能力。
import dai
dai.query(""" SELECT date::DATE::DATETIME AS date, instrument, AVG(close) / LAST(close) AS factor FROM cpt_jyc_2026_stock_bar1m GROUP BY date::DATE, instrument ORDER BY date, instrument""", filters={"date": ["2020-01-01 00:00:00", "2020-02-01 23:59:59"]}, compression=True).df().head()| date | instrument | factor | |
|---|---|---|---|
| 0 | 2020-01-02 00:00:00 | 000010.SZ | 1.00156 |
| 1 | 2020-01-02 00:00:00 | 000011.SZ | 1.00021 |
| 2 | 2020-01-02 00:00:00 | 000014.SZ | 1.00244 |
| 3 | 2020-01-02 00:00:00 | 000017.SZ | 0.994755 |
| 4 | 2020-01-02 00:00:00 | 000019.SZ | 1.00098 |
DAI 数据引擎支持UDF(User-Defined Function,用户定义函数),指允许用户通过编写自定义函数来扩展算子。
import dai
# 定义计算因子的UDF - 带类型声明(推荐)def calculate_factor(instrument: str, prices: list) -> float: """计算因子:平均价格/最后价格""" if not prices: return None avg_price = sum(prices) / len(prices) last_price = prices[-1]| date | instrument | factor | |
|---|---|---|---|
| 0 | 2020-01-02 00:00:00 | 000010.SZ | 0.998619 |
| 1 | 2020-01-02 00:00:00 | 000011.SZ | 0.999154 |
| 2 | 2020-01-02 00:00:00 | 000014.SZ | 0.998182 |
| 3 | 2020-01-02 00:00:00 | 000017.SZ | 0.999099 |
| 4 | 2020-01-02 00:00:00 | 000019.SZ | 0.996117 |
DAI 数据引擎也支持将数据转换为 pd.DataFrame、pl.DataFrame、arrow 等格式的数据类型。
import dai
data = dai.query("SELECT date, instrument, close FROM cpt_jyc_2026_stock_bar1m", filters={"date": ["2020-01-01 00:00:00", "2020-02-01 23:59:59"]}, compression=True)
# 转为 pandas dataframe,然后在 pandas 继续计算df = data.df()
# 转为 polars dataframe,然后在 polars 继续计算,polars没有内置在 aistudio 中,可以自行安装 pip3 install polarsdf = data.pl()
# 转为 apache arrow,然后在 arrow 继续计算df = data.arrow()更多参考 DAI 文档:DAI文档
dai 与 pandas 等混合计算,可以在 dai 中高性能的使用 pandas、polars、arrow等数据(通过参数 bind_relations 绑定),并支持JOIN等操作。
import dai
data = dai.query("SELECT date, instrument, close FROM cpt_jyc_2026_stock_bar1m", filters={"date": ["2020-01-01 00:00:00", "2020-02-01 23:59:59"]})df = data.df()
dai.query(""" SELECT date::DATE::DATETIME AS date, instrument AS instrument, AVG(close) AS avg_close FROM df GROUP BY date::DATE::DATETIME, instrument""", bind_relations={"df": df}).df()date::DATE 只取得 date 的日期部分,e.g. 2025-01-03 14:24:31::DATE 为 2025-01-03。注意:date 的类型是 TIMESTAMP,date::DATE 类型是 DATE,可能在部分比较时出现数据类型不一致问题date::DATE::DATETIME 可以这样再将数据类型转为 DATETIMEdate_trunc, time_bucketm_ 前缀的是时序算子,并且默认基于 GROUP BY instrument 计算,e.g. SELECT date, instrument, close / m_lag(close, 1) AS close_1 FROM cpt_jyc_2026_stock_bar1mc_ 前缀的是时序算子,并且默认基于 GROUP BY instrument 计算,e.g. SELECT date, instrument, close / m_lag(close, 1) AS close_1, c_rank(close_1) FROM cpt_jyc_2026_stock_bar1mcompression=True 参数可降低内存占用:dai.query("SELECT * FROM cpt_jyc_2026_stock_bar1m", filters={"date": ["2023-01-01 00:00:00", "2023-02-01 23:59:59"]}, compression=True).df()。数据量很大,可以开启该参数(设为 True)后,系统会自动将 instrument 列的字符串类型转换为 category 类型,显著降低内存占用。在 dai sql 中查询和计算 pandas category 类型,可能会遇到不兼容问题,可以尝试用 instrument::string 转会为字符串。DAI(DATA FOR AI)是BigQuant研发的高性能分布式数据平台
t 的计算,不得使用 t 之后才可获得的信息,包括未来交易数据、盘后数据、后续财务数据、未来成分股信息或其他形式的未来函数。使用者应独立、诚实地开展研究。以下行为均属于禁止行为:
鼓励合理参考公开论文、公开文档和开源工具,但应遵循相应许可要求,并在研究材料中准确说明引用来源、使用方式及实质性改动。
使用平台、数据或相关运行环境,即视为使用者已阅读、理解并同意遵守本规则。使用者如无法接受本规则,应停止使用相关服务,并通过正式渠道提出疑问或申请退出。
官方模板与社区共享代码,可作为起点参考或克隆使用。
bql2nstd 上传于 2026-10-29
bql2nstd 上传于 2026-10-29
yfsTHU 上传于 2026-10-09
因子赛道首轮公榜试提交(Attempt A)。09:30 使用同一交易日09:25已完成bar的close/pre_close构造开盘信号;这是参赛者基于观测时间先后关系作出的解释,非主办方明确确认。2021-01-04至2021-01-08开发预检通过;其余七个时点使用原五档盘口因子。未使用未来bar、标签或研究留出数据。