AI 原生量化投研平台AI-native quantitative research platform
正在打开工作台Opening your workspace
页面仍在加载,可以继续等待,或重新加载。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.

数据驱动未来,代码挖掘阿尔法(Data Drives the Future. Code Mines the Alpha)

在现代量化投资领域,阿尔法因子 (Alpha Factor) 是获取超额收益的核心。一个有效的因子,能够从海量、嘈杂的市场数据中精准地预测未来股价的动向。对于像进益资本这样的资产管理机构而言,持续不断地挖掘、迭代高质量的因子,是保持投资策略领先地位的关键。
作为一家专注于量化策略的顶尖资产管理机构,进益资本致力于通过严谨的数据分析和先进的计算方法,在复杂的金融市场中为投资者创造价值。我们相信,最卓越的投资思想往往源于开放的探索与协作。因此,我们选择通过本次挑战赛,开放真实的、高颗粒度的市场数据,邀请全球顶尖高校的人才与我们共同迎接这一挑战。
在本次比赛中,您将有机会接触到稀缺、高质量的A股市场分钟级行情数据。您的任务是利用这些数据,构建一个能够预测未来股票收益的创新因子。您的因子模型将在两个阶段进行评估:首先是在历史数据上进行回测的“公榜”得分,然后是在全新的、动态更新的市场数据上进行模拟的“私榜”得分,以确保您的策略在真实世界中的稳健性。
通过本次竞赛,您将获得处理大规模金融时序数据的宝贵实战经验,深入理解市场微观结构,并直面顶级量化机构在日常研究中遇到的真实挑战。我们期待看到参赛者们应用创新的方法,解决这个充满挑战且激动人心的量化投资难题。
入门指南
为了帮助参赛者更好地准备,我们与合作的线上量化平台共同准备了一系列入门资源:
本次竞赛提供高质量的A股市场历史行情数据,具体如下:
本次竞赛采用”高频因子低频化”的方式,平台提供高频数据,参赛者构建日频因子并提交。主办方将提供如下模版代码供参赛者参考:
时间:2025-11-16 至 2025-11-30
决赛名单公布:组委会根据私榜阶段最终得分和排名,公布15支入围决赛的队伍名单。
决赛辅导:为每支决赛队伍提供一次30分钟的线上辅导,帮助其深化研究报告。
提交材料: 参赛队伍需提供以下材料:
本竞赛公榜(Public Leaderboard)与私榜(Private Leaderboard)阶段的排名将完全基于量化评估。评估分为两个步骤:数据检测和得分计算。
数据检测:您提交的因子必须首先通过以下所有检测,否则将被视为无效提交。
date (交易日), instrument (股票代码), factor (因子值)。数据处理:通过数据检测后,系统会将您的因子数据与 BARRA 风险因子进行回归取残差作为新的因子,剔除风格因子的影响。
最终得分:系统将基于您的因子值计算IC均值、ICIR、夏普比率、换手率等指标,并依据各参赛者在这些指标上的实时排名,按以下公式计算最终得分:
Score=0.4×RankICmean+0.3×RankICIR+0.2×RankSR+0.1×RankTurnover其中,Rank指标 代表该指标在所有参赛者中的实时百分比排名(数值越大,表现越优)。最终得分是四项指标排名的加权和,得分越高代表综合排名越靠前。
入围决赛的队伍将由评审委员会进行综合评估,评分标准如下:
在本次比赛中,您只需要按照模版代码里的例子,将因子构建代码写在main函数中并提交,平台会自动运行生成因子数据,计算得分并实时公布。但需要注意,要保证main函数的返回数据格式应遵循特定格式,比如:
| date | instrument | factor |
|---|---|---|
| 2023-01-03 | 000001.SZ | 0.05 |
| 2023-01-03 | 000002.SZ | -0.12 |
| ... | ... | ... |
本次竞赛为代码竞赛,所有提交必须通过合作的线上量化平台完成。为保证竞赛公平性,您的代码需满足以下条件:
本比赛只可使用指定的数据源来构建因子。评判程序会 import 参赛用户提交代码里的 main 函数,并传入数据源名、开始日期时间、结束日期时间来调用。
参考:cpt_jyc_2025_stock_csi1000_bar1m
| 字段 | 字段类型 | 字段描述 |
|---|---|---|
| date | timestamp[ns] | 包含日期和时间 |
| instrument | string | 股票代码 |
| time | int32 | 交易时间 e.g. 104300 |
| trading_day | int32 | 交易日期 e.g. 20250417 |
| pre_close | float | 前收盘价 |
| high | float | 最高价 |
| open | float | 开盘价 |
| low | float | 最低价 |
| close | float | 收盘价 |
| deal_number | int32 | 成交笔数 |
| volume | int32 | 最新总成交量 |
| amount | float | 最新成交金额 |
| ask_price1 | float | 1档委卖价 |
| ask_price2 | float | 2档委卖价 |
| ask_price3 | float | 3档委卖价 |
| ask_price4 | float | 4档委卖价 |
| ask_price5 | float | 5档委卖价 |
| bid_price1 | float | 1档委买价 |
| bid_price2 | float | 2档委买价 |
| bid_price3 | float | 3档委买价 |
| bid_price4 | float | 4档委买价 |
| bid_price5 | float | 5档委买价 |
| ask_volume1 | int32 | 1档委卖量 |
| ask_volume2 | int32 | 2档委卖量 |
| ask_volume3 | int32 | 3档委卖量 |
| ask_volume4 | int32 | 4档委卖量 |
| ask_volume5 | int32 | 5档委卖量 |
| bid_volume1 | int32 | 1档委买量 |
| bid_volume2 | int32 | 2档委买量 |
| bid_volume3 | int32 | 3档委买量 |
| bid_volume4 | int32 | 4档委买量 |
| bid_volume5 | int32 | 5档委买量 |
| ask_num_orders1 | int32 | 卖1档委托笔数 |
| ask_num_orders2 | int32 | 卖2档委托笔数 |
| ask_num_orders3 | int32 | 卖3档委托笔数 |
| ask_num_orders4 | int32 | 卖4档委托笔数 |
| ask_num_orders5 | int32 | 卖5档委托笔数 |
| bid_num_orders1 | int32 | 买1档委托笔数 |
| bid_num_orders2 | int32 | 买2档委托笔数 |
| bid_num_orders3 | int32 | 买3档委托笔数 |
| bid_num_orders4 | int32 | 买4档委托笔数 |
| bid_num_orders5 | int32 | 买5档委托笔数 |
| adjust_factor | float | 累计后复权因子 |
import daidai.query("SELECT * FROM cpt_jyc_2025_stock_csi1000_bar1m", filters={"date": ["2023-01-01 00:00:00", "2023-02-01 23:59:59"]}).df().head()| date | time | trading_day | instrument | 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 | 2023-01-03 09:31:00 | 93100 | 20230103 | 000006.SZ | 38.939548 | 6.30 | 6.260000 | 6.200000 | 6.090000 | 6.10 | 2242 | 6358700 | 3.934735e+07 | 6.10 | 6.110000 | 6.130000 | 6.140000 | 6.150000 | 6.09 | 6.08 | 6.07 | 6.060000 | 6.050000 | 340300 | 11000 | 198600 | 24800 | 32400 | 18100 | 67500 | 13300 | 71900 | 31600 | 1 | 2 | 39 | 7 | 11 | 10 | 23 | 6 | 22 | 14 |
| 1 | 2023-01-03 09:31:00 | 93100 | 20230103 | 000011.SZ | 4.082454 | 11.59 | 11.500000 | 11.500000 | 11.400000 | 11.42 | 435 | 254000 | 2.906789e+06 | 11.43 | 11.450000 | 11.460000 | 11.470000 | 11.490000 | 11.42 | 11.41 | 11.40 | 11.390000 | 11.380000 | 5900 | 2600 | 2100 | 1600 | 7500 | 9500 | 8700 | 23500 | 100 | 8000 | 4 | 6 | 2 | 7 | 3 | 11 | 6 | 4 | 1 | 5 |
| 2 | 2023-01-03 09:31:00 | 93100 | 20230103 | 000016.SZ | 22.375458 | 4.51 | 4.510000 | 4.510000 | 4.470000 | 4.48 | 260 | 200500 | 8.990930e+05 | 4.49 | 4.500000 | 4.510000 | 4.520000 | 4.530000 | 4.48 | 4.47 | 4.46 | 4.450000 | 4.430000 | 21300 | 7200 | 20044 | 31700 | 35000 | 2000 | 4100 | 26100 | 51100 | 5700 | 32 | 5 | 5 | 6 | 7 | 3 | 2 | 17 | 12 | 4 |
| 3 | 2023-01-03 09:31:00 | 93100 | 20230103 | 000019.SZ | 4.453101 | 7.51 | 7.520000 | 7.510000 | 7.450000 | 7.48 | 250 | 199791 | 1.497431e+06 | 7.49 | 7.500000 | 7.510000 | 7.520000 | 7.530000 | 7.48 | 7.47 | 7.46 | 7.450000 | 7.440000 | 200 | 18900 | 28800 | 15600 | 30200 | 10400 | 1000 | 1100 | 8800 | 17300 | 2 | 2 | 8 | 10 | 7 | 6 | 1 | 3 | 10 | 12 |
| 4 | 2023-01-03 09:31:00 | 93100 | 20230103 | 000025.SZ | 2.742168 | 17.15 | 17.299999 | 17.299999 | 17.209999 | 17.27 | 288 | 138700 | 2.394415e+06 | 17.27 | 17.280001 | 17.290001 | 17.299999 | 17.309999 | 17.26 | 17.25 | 17.23 | 17.219999 | 17.200001 | 4700 | 100 | 400 | 44600 | 3100 | 1000 | 2400 | 100 | 3300 | 1400 | 1 | 1 | 2 | 13 | 2 | 2 | 5 | 1 | 4 | 3 |
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_2025_stock_csi1000_bar1m GROUP BY date::DATE, instrument""", filters={"date": ["2023-01-01 00:00:00", "2023-02-01 23:59:59"]}).df().head()| date | instrument | factor | |
|---|---|---|---|
| 0 | 2023-01-03 | 601258.SH | -1.102671 |
| 1 | 2023-01-03 | 601777.SH | -3.899350 |
| 2 | 2023-01-03 | 601921.SH | -7.454631 |
| 3 | 2023-01-03 | 603032.SH | -87.025263 |
| 4 | 2023-01-03 | 603055.SH | -10.245980 |
import dai
data = dai.query("SELECT date, instrument, close FROM cpt_jyc_2025_stock_csi1000_bar1m", filters={"date": ["2023-01-01 00:00:00", "2023-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 与 pandas 等混合计算,可以在 dai 中高性能的使用 pandas、polars、arrow等数据(通过参数 bind_relations 绑定),并支持JOIN等操作。
import dai
data = dai.query("SELECT date, instrument, close FROM cpt_jyc_2025_stock_csi1000_bar1m", filters={"date": ["2023-01-01 00:00:00", "2023-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()main: 本次比赛中用户需要实现一个 main 函数用于因子计算,注意在提交代码中,尽量保持代码干净,开发测试代码可以放在 if __name__ == '__main__' 块中,避免在 import 的时候被执行M.factorlens: 评估程序会 import 这个 main 函数,并使用 M.factorlens._latest 给出绩效评估,其中 ._latest 表示每次都去引用此模块的最新版本,建议只在开发阶段这样使用,不然新的版本新功能会有不兼容升级导致计算失败。如下是一个完整的因子计算和评估参考代码。请在 比赛代码区 选择合适代码模版克隆和继续开发
def main(datasource, start_date, end_date): """ factor function
Args: datasource (str): Datasource table name start_date (str): Start date in 'YYYY-MM-DD HH:MM:SS' format end_date (str): End date in 'YYYY-MM-DD HH:MM:SS' format
Returns:注意在因子计算中避免引入未来数据,T0 的因子计算不能用到 T1+的数据。可以参考如下代码去验证是否用到未来数据
import dai
start_date = "2023-01-01 00:00:00"end_date = "2023-01-04 23:59:59"
# 用历史数据表计算d1 = main("cpt_jyc_2025_stock_csi1000_bar1m", start_date, end_date)
# 构建一个截断的数据表df_trunc = dai.query(""" SELECT * FROM cpt_jyc_2025_stock_csi1000_bar1m ORDER BY date, instrument""", filters={"date": [start_date, end_date]}).df()# 基于截断的数据表构建因子d2 = main("df_trunc", start_date, end_date)
# 结果应该是接近 0print((d1["factor"] - d2["factor"]).abs().sum())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_2025_stock_csi1000_bar1mc_ 前缀的是时序算子,并且默认基于 GROUP BY instrument 计算,e.g. SELECT date, instrument, close / m_lag(close, 1) AS close_1, c_rank(close_1) FROM cpt_jyc_2025_stock_csi1000_bar1mcompression=True 参数可降低内存占用:dai.query("SELECT * FROM cpt_jyc_2025_stock_csi1000_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研发的高性能分布式数据平台
参与本次“进益资本杯 · 首届量化因子挖掘挑战赛” (以下简称“本赛事”),即表示您已阅读、理解并同意遵守本规则。如果您不同意本规则,则无权参赛或获得任何奖项。本规则构成您与赛事主办方进益资本有限公司(“主办方”)之间具有法律约束力的协议。
个人参赛者
团队参赛者
注意事项
作为获得奖项的先决条件,获奖者必须履行以下义务:
所有奖项所产生的税费均由获奖者自行承担。主办方将按法律要求代扣代缴相关税款。
您知晓并同意,主办方和合作平台可能会收集、存储、共享和使用您在注册和参赛期间提供的个人信息(“个人信息”)。合作平台将根据其隐私政策使用这些信息。
进益资本杯 · 首届量化因子挖掘挑战赛
进益资本有限公司
🎉️ 进益资本热招岗位: · Python实习生(可转正) · 股票量化研究员 · 大数据开发工程师 · Python开发工程师 · 渠道经理(量化销售方向)
了解更多信息可关注进益资本公众号,点击【加入我们】查看岗位详情~

官方模板与社区共享代码,可作为起点参考或克隆使用。