蝶威杯2026年高频因子大赛

比赛时间: -

量化洞察先机,AI智胜未来(Quant Alpha, AI Future)

主办方:蝶威量化

比赛介绍

## **赛事介绍** 在现代量化投资领域,阿尔法因子(Alpha Factor)是获取超额收益的核心。一个有效的因子,能够从海量、嘈杂的市场数据中精准地预测未来股价的动向。对于上海蝶威私募基金管理有限公司这样的私募基金管理机构而言,持续不断地挖掘、迭代高质量的因子,是保持投资策略领先地位的关键。 上海蝶威私募基金管理有限公司(下称“蝶威量化”)成立于2018年4月,2019年8月22日成为中国证券投资基金业协会私募证券投资基金管理人 ,并获得观察会员资格。蝶威量化致力于探索数学科学、人工智能与投资逻辑、投资实践的有机结合。凭借核心成员的长期证券投资经验和量化投资经验,依托先进的大数据分析和数学建模技术,在各类金融产品上进行高中低频策略和套利策略的研发,力求在不同周期、不同市场环境下都带来可观且相对较好的投资回报。 “蝶威”之名,源自蝴蝶效应——金融市场作为典型的复杂动态系统,初始条件的微小变化可能引发长期且巨大的链式反应,我们始终坚持深入研究、科学应对这种市场威力;英文名DeepWin既是“蝶威”的谐音,更衍生于DeepMind,隐喻我们将人工智能技术深度应用于金融市场与量化投资领域的核心追求。 我们相信,最卓越的投资思想往往源于开放的探索与协作。因此,我们选择通过本次挑战赛,开放真实的、高颗粒度的市场数据,邀请全球顶尖高校的人才与我们共同迎接这一挑战。 在本次比赛中,您将有机会接触到稀缺、高质量的A股市场分钟级行情数据。您的任务是利用这些数据,构建一个能够预测未来股票收益的创新因子。您的因子模型将在两个阶段进行评估:首先是在历史数据上进行回测的“公榜”得分,然后是在全新的、动态更新的市场数据上进行模拟的“私榜”得分,以确保您的策略在真实世界中的稳健性。 通过本次竞赛,您将获得处理大规模金融时序数据的宝贵实战经验,深入理解市场微观结构,并直面顶尖量化私募在日常研究中遇到的真实挑战,尤其是如何以AI技术驱动因子挖掘、适配高中低频多策略场景的核心命题。我们期待看到参赛者们应用创新的方法,解决这个充满挑战且激动人心的量化投资难题。 **入门指南** 为了帮助参赛者更好地准备,我们与合作的线上量化平台共同准备了一系列入门资源: 1. **技术工作坊**:由平台方工程师主讲,详细介绍平台功能、API使用、数据结构及适配AI量化的因子分析框架,贴合蝶威高中低频策略与套利策略的研发逻辑。 2. **模版代码**:我们将提供一个包含数据读取、因子构建范例(和评估流程的核心代码Notebook,帮助您快速上手,适配AI模型训练与因子有效性验证需求。 ## **数据说明** 本次竞赛提供高质量的A股市场历史行情数据,具体如下: * **股票池**: 沪深300指数在历史相应时间点上的成分股。 * **时间范围**: 2023-01-01至2024-12-31。 * **数据频率**: snapshot 快照数据。 * **数据内容**: 包含当前snaspshot的价格、成交量、成交额,以及盘口10档的委托量、委托量、委托笔数等字段。 ## **模版代码** 本次竞赛采用”**高频因子低频化**”的方式,平台提供高频数据,参赛者构建15分钟频率因子并提交。主办方将提供如下多个模版代码供参赛者参考: * 用 SQL 计算因子,参考 demo_sql.ipynb。【注:DAI数据引擎直接计算因子,速度更快,内存占比更低】 * 用 UDF 计算因子,参考 demo_udf.ipynb。【注:UDF支持用户自定义封装python函数并在dai数据引擎中执行,效率更高】 * 用 Python 计算因子,参考 demo_py.ipynb。【注:传统python计算,请注意内存使用情况】 ## **赛程安排** ### **阶段一:报名** * **时间周期**:2026-01-12 至 2026-01-31 * **宣讲会**:2026-01-23 在量化峰会上进行宣传。 * **报名和组队**:通过活动主页进行报名,或联系兴趣团老师。可单人或多人组队(单一队伍最多不超过3人)。报名完成后可加入官方社群(微信/QQ群)寻找队友。报名截止时间为“**2026-01-31**”。 ### **阶段二:初赛** * **时间周期**:2026-01-26 至 2026-02-20 * **运行机制**: * 以**2026-02-16 00:00:00**作为**截止日期**。 * 在截止日期前,参赛队伍可利用平台提供的数据开发因子并按照规范提交代码,平台会使用验证集数据构建对应的因子数据并打分实时更新排名,以队伍最好的一次得分进行展示在”公榜(Public Leaderboard)”上;同时,参赛队伍可以选择和替换总计不超过10个因子作为截止日后的候选因子。 * 在截止日期后,参赛者将不允许修改候选因子的构建代码;平台在2026年2月16日至2026年2月20日期间的每个交易日盘后,会根据参赛者提供的代码增量构建因子数据,每日计算得分排名,并以队伍最好的一次得分进行展示在”私榜(Private Leaderboard)”上。 * **线上技术工作坊**:由合作平台方工程师主讲,详细介绍平台功能、API使用、数据结构及因子分析框架。 * **账号与数据发放**:向所有成功报名的队伍发放比赛专用账号,开放数据访问权限。 ### **阶段三:决赛** * **时间**:2026-02-21 至 2026-03-01 * **决赛名单公布**:组委会根据私榜阶段最终得分和排名,公布15支入围决赛的队伍名单。 * **决赛辅导**:为每支决赛队伍提供一次30分钟的线上辅导,帮助其深化研究报告。 * **提交材料**: 参赛队伍需提供以下材料: * 因子研究报告 (.pdf, 10-15页):一份结构完整、论证严谨的深度报告,建议包含以下章节: * 摘要 (Abstract) * 引言 (Introduction):因子研究背景与文献综述。 * 因子构建 (Factor Construction):详细阐述数据预处理、因子计算公式与逻辑。 * 实证分析 (Empirical Analysis):全面的因子分析回测结果展示、绩效归因分析、稳健性检验(如不同市场周期、不同行业下的表现)。 * 创新性与局限性讨论 (Innovation and Limitations)。 * 结论 (Conclusion)。 ### **阶段四:颁奖** - **时间**:2026年3月初 - **决赛答辩会**: 采用“10分钟展示 + 5分钟评委问答”的形式。线下举行,并同步线上直播。 - **颁奖典礼**: 答辩结束后,现场公布最终名次,并举行隆重的颁奖典礼,邀请所有嘉宾、评委与选手共同参与。 ## **评估系统** 本次竞赛在公榜(Public Leaderboard)与私榜(Private Leaderboard)阶段的排名,将完全依据以下量化评估流程和指标确定。 ### **数据检测** 提交的因子数据必须通过以下所有检测,否则视为无效提交。 * **数据列检查**: * 提交的文件必须且仅包含三列:`date`(交易日)、`instrument`(股票代码)、`factor`(因子值)。 * **请注意:平台不限制因子方向,默认因子值越大越好。参赛者需自行确保因子方向的逻辑正确性**。 * **交易日完整性检查**:因子数据不得缺失评估时间范围内的任何一个交易日。 * **因子覆盖度检查**:在每个交易日,因子值的缺失率不得高于 **40%**。 ### **数据处理** 通过数据检测后,系统将将您的原始因子与 BARRA 风险因子、本地因子库进行回归,并取残差作为新的因子,以评估该因子的增量影响。 ### **计算得分** 系统将基于处理后的因子值,分别进行单因子分析和单因子回测,并综合计算最终得分。 **Final Score = 0.3 × Rank_fa + 0.7 × Rank_bt** 其中: * **Rank_fa** 为单因子分析得分的排名。 * **Rank_bt** 为单因子回测得分的排名。 **单因子分析**得分由以下指标的排名计算得出: **Score_fa = Rank_夏普比率** 其中: * **Rank** 为指标在截面上的排名。 * **夏普比率** 为分组回测中多空组合(剔除涨跌停股票)的夏普比率。 **单因子回测**系统将基于处理后的因子值进行每日调仓的回测,以检验因子的实际选股能力。回测设置如下: * **回测周期**:2023年1月1日 至 2024年12月31日 * **调仓周期**:每日 * **初始资金**:10,000,000 元 * **买卖价格**:截断时间后的**15分钟VWAP**成交,**持有一天** * **手续费**:双边 0.05%(5 bps),不考虑其他税费 * **选股逻辑**:每日选择因子值**最大**的**60只**股票,进行**等权重**配置并换仓。 * **资金再平衡**:在换仓日对持仓股的权重进行再平衡。 回测得分由以下公式决定: **Score_bt = 0.3 × Rank_超额收益(取16个截面的均值) + 0.7 × Rank_超额夏普(取16个截面的均值)** 其中: * **超额夏普** 为投资组合相较于**沪深300指数**的超额夏普。 * **截断时间** 共使用以下 **16个** 截断时间点进行测试:`0945`, `1000`, `1015`, `1030`, `1045`, `1100`, `1115`, `1130`, `1315`, `1330`, `1345`, `1400`, `1415`, `1430`, `1445`, `1500` * **最终得分**取这16个截面的**均值**。 ### **决赛评估** 入围决赛的队伍将由评审委员会进行综合评估,评分标准如下: * **因子质量与创新性 (40%)**: * 逻辑性与原创性 (20%): 因子背后的经济学逻辑或市场微观结构解释是否清晰、合理、有创新。 * 有效性与稳健性 (20%): 因子在不同市场周期、不同行业下的表现是否稳定。 * **研究深度与规范性 (30%)**: * 研究报告质量 (20%): 报告结构是否严谨、分析是否深入、论证是否充分。 * 代码质量 (10%): 代码是否规范、可读性强、易于复现。 * **现场表现 (30%)**: * 陈述表达 (15%): 对研究工作的理解是否深刻,表达是否清晰、有条理。 * 问答互动 (15%): 回答评委提问是否精准、有逻辑。 ## **提交文件** 在本次比赛中,您只需要按照**模版代码**里的例子,将因子构建代码写在**main**函数中并提交,平台会自动运行生成因子数据,计算得分并实时公布。但需要注意,要保证**main**函数的返回数据格式应遵循特定格式,比如: | date | instrument | factor | |------------|------------|-------| | 2023-01-03 | 000001.SZ | 0.05 | | 2023-01-03 | 000002.SZ | -0.12 | | ... | ... | ... | ## **赛事奖励** 总计奖金池:120,000 元 | 奖项 | 数量 | 活动奖金(元) | 签约奖金(元) | 合计(元) | |------|------|----------------|----------------|------------| | 特等奖 | 1 | 10,000 | 10,000 | 20,000 | | 一等奖 | 2 | 10,000 | 16,000 | 26,000 | | 二等奖 | 3 | 9,000 | 18,000 | 27,000 | | 三等奖 | 6 | 12,000 | 30,000 | 42,000 | | 定期奖励包/“万能”助教 | 10 | 5,000 | 0 | 5,000 | | **总计** | **22** | **46,000** | **74,000** | **120,000** | 注意事项 1. 上述特等奖至三等奖所含的实习计划“直通车”签约奖金,均需获奖者正式签订实习协议后发放。 2. 实习计划“直通车”签约资格,需经赞成量化综合评估后确定。 --- ## **代码要求** 本次竞赛为代码竞赛,所有提交必须通过合作的线上量化平台完成。为保证竞赛公平性,您的代码需满足以下条件: * **平台提交**: 所有因子生成代码必须在指定的线上平台Notebook环境中运行并提交。 * **运行时长限制**: CPU Notebook \<= 9 小时。 * **禁止访问外部网络**: 为防止信息泄露和使用未来数据,Notebook的互联网访问权限将被禁用。 * **外部数据**: 禁止使用未经官方许可的任何外部数据。 * **最终提交**: 您提交的必须是可以自动运行并生成因子文件的代码,而非因子数据文件本身。 ## **竞赛规则** * **团队规模**: 每支队伍人数为1-3人,每位选手只能加入一支队伍。 * **知识产权**: 参赛作品(代码、报告等)的知识产权归参赛队伍所有。主办方对所有作品拥有非商业性的评审、展示和宣传权利。对于获奖的优秀因子,主办方在同等条件下拥有优先的商业合作洽谈权。 * **诚信竞赛**: 严禁任何形式的抄袭、作弊或共享代码行为。一经发现,将立即取消该队伍的参赛资格。 * **最终解释权**: 本赛事所有规则的最终解释权归蝶威量化大赛组委会所有。 ## **竞赛支持** * **官方交流社群**:建立赛事官方微信/QQ群,用于日常通知发布、技术问题解答和选手间交流。 * **FAQ文档**:在官网建立持续更新的“常见问题解答”页面。 * **学术资源**:提供经典的因子研究论文列表,供选手参考。

奖金&奖项

¥120000

比赛数据

## Overview 本比赛只可使用指定的数据源来构建因子。评判程序会 `import` 参赛用户提交代码里的 `main` 函数,并传入数据源名、开始日期时间、结束日期时间来调用。 ## 数据源 - 股票池:中证1000指数在历史相应时间点上的成分股 - 数据频率:1分钟级别K线及盘口快照数据 - 开发数据源:[cpt_dwc_2026_stock_hs300_snapshot](https://deepwin.bigquant.com/data/datasources/cpt_dwc_2026_stock_hs300_snapshot) 包含2023年1月1日至2024年12月31日的数据 - 公榜数据源:参赛用户不可见。 - 私榜数据源:参赛用户不可见。 ## 数据格式 参考:[cpt_dwc_2026_stock_hs300_snapshot](https://deepwin.bigquant.com/data/datasources/cpt_dwc_2026_stock_hs300_snapshot) 以下是根据您提供的内容转换成的 Markdown 格式表格: | 字段名 | 数据类型 | 描述 | | --- | --- | --- | | date | np.datetime64 | 时间 | | instrument | pd.StringDtype | 标的 | | time | np.int32 | 时间(HHMMSSmmm) | | trading_day | np.int32 | 交易日期 | | pre_close | np.float32 | 前收盘 | | open | np.float32 | 开盘价 | | high | np.float32 | 最高价 | | low | np.float32 | 最低价 | | price | 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档委卖价 | | ask_price6 | np.float32 | 6档委卖价 | | ask_price7 | np.float32 | 7档委卖价 | | ask_price8 | np.float32 | 8档委卖价 | | ask_price9 | np.float32 | 9档委卖价 | | ask_price10 | np.float32 | 10档委卖价 | | ask_volume1 | np.int64 | 1档委卖量 | | ask_volume2 | np.int32 | 2档委卖量 | | ask_volume3 | np.int32 | 3档委卖量 | | ask_volume4 | np.int32 | 4档委卖量 | | ask_volume5 | np.int32 | 5档委卖量 | | ask_volume6 | np.int32 | 6档委卖量 | | ask_volume7 | np.int32 | 7档委卖量 | | ask_volume8 | np.int32 | 8档委卖量 | | ask_volume9 | np.int32 | 9档委卖量 | | ask_volume10 | np.int32 | 10档委卖量 | | 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档委买价 | | bid_price6 | np.float32 | 6档委买价 | | bid_price7 | np.float32 | 7档委买价 | | bid_price8 | np.float32 | 8档委买价 | | bid_price9 | np.float32 | 9档委买价 | | bid_price10 | np.float32 | 10档委买价 | | bid_volume1 | np.int64 | 1档委买量 | | bid_volume2 | np.int32 | 2档委买量 | | bid_volume3 | np.int32 | 3档委买量 | | bid_volume4 | np.int32 | 4档委买量 | | bid_volume5 | np.int32 | 5档委买量 | | bid_volume6 | np.int32 | 6档委买量 | | bid_volume7 | np.int32 | 7档委买量 | | bid_volume8 | np.int32 | 8档委买量 | | bid_volume9 | np.int32 | 9档委买量 | | bid_volume10 | np.int32 | 10档委买量 | | 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档委托笔数 | | bid_num_orders6 | np.int32 | 卖6档委托笔数 | | bid_num_orders7 | np.int32 | 卖7档委托笔数 | | bid_num_orders8 | np.int32 | 卖8档委托笔数 | | bid_num_orders9 | np.int32 | 卖9档委托笔数 | | bid_num_orders10 | np.int32 | 卖10档委托笔数 | | 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档委托笔数 | | ask_num_orders6 | np.int32 | 买6档委托笔数 | | ask_num_orders7 | np.int32 | 买7档委托笔数 | | ask_num_orders8 | np.int32 | 买8档委托笔数 | | ask_num_orders9 | np.int32 | 买9档委托笔数 | | ask_num_orders10 | np.int32 | 买10档委托笔数 | | num_trades | np.int32 | 成交笔数 | | volume | np.int64 | 当日累计成交量 | | amount | np.float64 | 当日成交额(元) | | total_bid_volume | np.int64 | 委买总量 | | total_ask_volume | np.int64 | 委卖总量 | | bid_avg_price | np.float32 | 加权平均委买价 | | ask_avg_price | np.float32 | 加权平均委卖价 | ## 读取示例 ``` import dai dai.query("SELECT * FROM cpt_dwc_2026_stock_hs300_snapshot", filters={"date": ["2023-01-01 00:00:00", "2023-01-05 23:59:59"]}).df().head() ``` | | date | instrument_id | pre_close | open | high | low | price | ask_price1 | ask_price2 | ask_price3 | ask_price4 | ask_price5 | ask_price6 | ask_price7 | ask_price8 | ask_price9 | ask_price10 | ask_volume1 | ask_volume2 | ask_volume3 | ask_volume4 | ask_volume5 | ask_volume6 | ask_volume7 | ask_volume8 | ask_volume9 | ask_volume10 | bid_price1 | bid_price2 | bid_price3 | bid_price4 | bid_price5 | bid_price6 | bid_price7 | bid_price8 | bid_price9 | bid_price10 | bid_volume1 | bid_volume2 | bid_volume3 | bid_volume4 | bid_volume5 | bid_volume6 | bid_volume7 | bid_volume8 | bid_volume9 | bid_volume10 | bid_num_orders1 | bid_num_orders2 | bid_num_orders3 | bid_num_orders4 | bid_num_orders5 | bid_num_orders6 | bid_num_orders7 | bid_num_orders8 | bid_num_orders9 | bid_num_orders10 | ask_num_orders1 | ask_num_orders2 | ask_num_orders3 | ask_num_orders4 | ask_num_orders5 | ask_num_orders6 | ask_num_orders7 | ask_num_orders8 | ask_num_orders9 | ask_num_orders10 | num_trades | volume | amount | total_bid_volume | total_ask_volume | bid_avg_price | ask_avg_price | |---:|:--------------------|----------------:|------------:|-------:|-------:|------:|--------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|---------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|---------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|-------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|-------------------:|-------------:|---------:|---------:|-------------------:|-------------------:|----------------:|----------------:| | 0 | 2023-01-03 09:15:00 | 1 | 13.16 | 0 | 0 | 0 | 0 | 13.15 | 0 | nan | nan | nan | nan | nan | nan | nan | nan | 3200 | 3900 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 13.15 | nan | nan | nan | nan | nan | nan | nan | nan | nan | 3200 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 1 | 2023-01-03 09:15:00 | 2 | 18.2 | 0 | 0 | 0 | 0 | 18.2 | 0 | nan | nan | nan | nan | nan | nan | nan | nan | 12000 | 4600 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 18.2 | nan | nan | nan | nan | nan | nan | nan | nan | nan | 12000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 2 | 2023-01-03 09:15:00 | 56 | 25.86 | 0 | 0 | 0 | 0 | 25.86 | nan | nan | nan | nan | nan | nan | nan | nan | nan | 1500 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 25.86 | 0 | nan | nan | nan | nan | nan | nan | nan | nan | 1500 | 400 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 3 | 2023-01-03 09:15:00 | 60 | 5.33 | 0 | 0 | 0 | 0 | 5.36 | 0 | nan | nan | nan | nan | nan | nan | nan | nan | 1000 | 500 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5.36 | nan | nan | nan | nan | nan | nan | nan | nan | nan | 1000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 4 | 2023-01-03 09:15:00 | 68 | 3.72 | 0 | 0 | 0 | 0 | 3.73 | 0 | nan | nan | nan | nan | nan | nan | nan | nan | 19600 | 1773200 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3.73 | nan | nan | nan | nan | nan | nan | nan | nan | nan | 19600 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 可以注意到 cpt_dwc_2026_stock_hs300_snapshot 的 **instrument_id** 是 BigQuant 平台的自定义的代码ID,没有特殊含义。如果要转换为我们常见的证券代码,可以通过 all_instruments 表进行映射 ``` import dai dai.query(""" SELECT all_instruments.instrument, cpt_dwc_2026_stock_hs300_snapshot.* FROM cpt_dwc_2026_stock_hs300_snapshot LEFT JOIN all_instruments USING (instrument_id) """, filters={"date": ["2023-01-01 00:00:00", "2023-01-05 23:59:59"]}).df().head() ``` | | instrument | date | instrument_id | pre_close | open | high | low | price | ask_price1 | ask_price2 | ask_price3 | ask_price4 | ask_price5 | ask_price6 | ask_price7 | ask_price8 | ask_price9 | ask_price10 | ask_volume1 | ask_volume2 | ask_volume3 | ask_volume4 | ask_volume5 | ask_volume6 | ask_volume7 | ask_volume8 | ask_volume9 | ask_volume10 | bid_price1 | bid_price2 | bid_price3 | bid_price4 | bid_price5 | bid_price6 | bid_price7 | bid_price8 | bid_price9 | bid_price10 | bid_volume1 | bid_volume2 | bid_volume3 | bid_volume4 | bid_volume5 | bid_volume6 | bid_volume7 | bid_volume8 | bid_volume9 | bid_volume10 | bid_num_orders1 | bid_num_orders2 | bid_num_orders3 | bid_num_orders4 | bid_num_orders5 | bid_num_orders6 | bid_num_orders7 | bid_num_orders8 | bid_num_orders9 | bid_num_orders10 | ask_num_orders1 | ask_num_orders2 | ask_num_orders3 | ask_num_orders4 | ask_num_orders5 | ask_num_orders6 | ask_num_orders7 | ask_num_orders8 | ask_num_orders9 | ask_num_orders10 | num_trades | volume | amount | total_bid_volume | total_ask_volume | bid_avg_price | ask_avg_price | |---:|:-------------|:--------------------|----------------:|------------:|-------:|-------:|-------:|--------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|---------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|-------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|--------------:|---------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|-------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|------------------:|-------------------:|-------------:|---------:|------------:|-------------------:|-------------------:|----------------:|----------------:| | 0 | 600436.SH | 2023-01-03 09:37:44 | 3442 | 288.46 | 288.5 | 290.51 | 285.52 | 285.81 | 286.29 | 286.3 | 286.71 | 286.72 | 286.75 | 286.96 | 287.07 | 287.93 | 287.94 | 287.98 | 200 | 100 | 100 | 600 | 100 | 600 | 100 | 100 | 100 | 100 | 285.81 | 285.8 | 285.76 | 285.61 | 285.6 | 285.59 | 285.58 | 285.57 | 285.53 | 285.52 | 200 | 600 | 100 | 100 | 1000 | 100 | 600 | 1700 | 600 | 300 | 1 | 3 | 1 | 1 | 6 | 1 | 6 | 6 | 5 | 3 | 1 | 1 | 1 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1041 | 166800 | 4.79901e+07 | 52800 | 165970 | 280.649 | 299.794 | | 1 | 600438.SH | 2023-01-03 09:37:44 | 3443 | 38.58 | 38.55 | 38.64 | 37.89 | 38.31 | 38.31 | 38.32 | 38.33 | 38.34 | 38.35 | 38.36 | 38.37 | 38.38 | 38.39 | 38.4 | 100 | 600 | 2400 | 2900 | 1000 | 800 | 1400 | 9300 | 100 | 3000 | 38.3 | 38.29 | 38.28 | 38.27 | 38.26 | 38.25 | 38.23 | 38.22 | 38.21 | 38.2 | 26800 | 500 | 1100 | 4000 | 1100 | 2000 | 1100 | 3300 | 1900 | 19500 | 1 | 2 | 5 | 2 | 4 | 3 | 3 | 7 | 6 | 17 | 1 | 2 | 10 | 5 | 4 | 3 | 6 | 8 | 1 | 7 | 8319 | 4436485 | 1.69521e+08 | 1610900 | 2002900 | 36.416 | 40.487 | | 2 | 600570.SH | 2023-01-03 09:37:44 | 3547 | 40.46 | 40.35 | 40.81 | 40.11 | 40.5 | 40.49 | 40.5 | 40.51 | 40.58 | 40.59 | 40.6 | 40.61 | 40.62 | 40.64 | 40.65 | 2000 | 294 | 3300 | 600 | 600 | 5000 | 3100 | 3000 | 100 | 400 | 40.48 | 40.45 | 40.44 | 40.43 | 40.4 | 40.38 | 40.34 | 40.32 | 40.31 | 40.3 | 100 | 14600 | 90 | 200 | 2500 | 800 | 600 | 800 | 2000 | 3600 | 1 | 4 | 1 | 1 | 3 | 2 | 1 | 1 | 1 | 5 | 1 | 1 | 1 | 5 | 3 | 4 | 3 | 2 | 1 | 2 | 2093 | 808200 | 3.27148e+07 | 176490 | 1007273 | 39.494 | 43.263 | | 3 | 600588.SH | 2023-01-03 09:37:44 | 3564 | 24.17 | 24.17 | 24.56 | 24 | 24.53 | 24.54 | 24.55 | 24.56 | 24.57 | 24.58 | 24.59 | 24.6 | 24.61 | 24.62 | 24.63 | 6200 | 10100 | 9800 | 22200 | 27200 | 19600 | 28900 | 500 | 100 | 700 | 24.53 | 24.5 | 24.49 | 24.48 | 24.47 | 24.46 | 24.45 | 24.44 | 24.42 | 24.41 | 800 | 9300 | 1300 | 2300 | 7900 | 14100 | 6800 | 900 | 5200 | 700 | 2 | 2 | 5 | 3 | 2 | 3 | 4 | 5 | 3 | 2 | 4 | 15 | 12 | 14 | 23 | 14 | 37 | 2 | 1 | 2 | 4941 | 2390201 | 5.82448e+07 | 479600 | 1544200 | 23.742 | 25.626 | | 4 | 600600.SH | 2023-01-03 09:37:44 | 3576 | 107.5 | 107.99 | 107.99 | 104.66 | 105.44 | 105.49 | 105.52 | 105.6 | 105.84 | 105.9 | 105.93 | 105.96 | 105.97 | 105.98 | 105.99 | 100 | 100 | 100 | 100 | 100 | 500 | 200 | 300 | 200 | 100 | 105.26 | 105.2 | 105.19 | 105.11 | 105.1 | 105.09 | 105.08 | 105.05 | 105.04 | 105.01 | 1200 | 1700 | 300 | 100 | 100 | 200 | 2900 | 400 | 200 | 100 | 4 | 3 | 3 | 1 | 1 | 1 | 3 | 4 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 1 | 1 | 1 | 2403 | 489543 | 5.17393e+07 | 75173 | 149000 | 103.917 | 110.062 | ## 因子计算示例 ### DAI 数据引擎 DAI 内置多种算子/函数,参考 [DAI函数文档](https://bigquant.com/wiki/doc/Rceb2JQBdS)。DAI是专为AI/量化场景优化的超高性能计算引擎,能充分利用现代CPU/GPU能力。 ``` import dai dai.query(""" SELECT date::DATE::DATETIME AS date, instrument_id, AVG(price) / LAST(price) AS factor FROM cpt_dwc_2026_stock_hs300_snapshot GROUP BY date::DATE, instrument_id ORDER BY date, instrument_id """, filters={"date": ["2023-01-01 00:00:00", "2023-02-01 23:59:59"]}, compression=True).df().head() ``` | | date | instrument_id | factor | |---:|:--------------------|----------------:|---------:| | 0 | 2023-01-03 00:00:00 | 1 | 0.986934 | | 1 | 2023-01-03 00:00:00 | 2 | 0.982757 | | 2 | 2023-01-03 00:00:00 | 56 | 0.983466 | | 3 | 2023-01-03 00:00:00 | 60 | 0.984321 | | 4 | 2023-01-03 00:00:00 | 68 | 0.995045 | ### UDF DAI 数据引擎支持UDF(User-Defined Function,用户定义函数),指允许用户通过编写自定义函数来扩展算子。 ``` import dai # 定义计算因子的UDF - 带类型声明(推荐) def calculate_factor(instrument_id: str, prices: list) -> float: """计算因子:平均价格/最后价格""" if not prices: return None avg_price = sum(prices) / len(prices) last_price = prices[-1] # 避免除零错误 if last_price == 0: return None return avg_price / last_price # 计算因子 dai.query(""" WITH grouped_data AS ( SELECT date::DATE::DATETIME AS date, instrument_id, ARRAY_AGG(price ORDER BY date) AS price_list FROM cpt_dwc_2026_stock_hs300_snapshot GROUP BY date::DATE, instrument_id ) SELECT date, instrument_id, calculate_factor(instrument_id, price_list) AS factor FROM grouped_data ORDER BY date, instrument_id """, filters={"date": ["2023-01-01 00:00:00", "2023-02-01 23:59:59"]}, compression=True, udf_list=[ dai.DaiUDF( name="calculate_factor", function=calculate_factor, ) ]).df().head() ``` | | date | instrument_id | factor | |---:|:--------------------|----------------:|---------:| | 0 | 2023-01-03 00:00:00 | 1 | 0.973316 | | 1 | 2023-01-03 00:00:00 | 2 | 0.988687 | | 2 | 2023-01-03 00:00:00 | 56 | 0.989155 | | 3 | 2023-01-03 00:00:00 | 60 | 0.999206 | | 4 | 2023-01-03 00:00:00 | 68 | 0.981883 | ### 第三计算库 DAI 数据引擎也支持将数据转换为 pd.DataFrame、pl.DataFrame、arrow 等格式的数据类型。 ``` import dai data = dai.query("SELECT date, instrument, price FROM cpt_dwc_2026_stock_hs300_snapshot", 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 polars df = data.pl() # 转为 apache arrow,然后在 arrow 继续计算 df = data.arrow() # 更多参考 DAI 文档 ``` 更多参考 DAI 文档:[DAI文档](https://bigquant.com/wiki/doc/PLSbc1SbZX) ### 混合计算 dai 与 pandas 等混合计算,可以在 dai 中高性能的使用 pandas、polars、arrow等数据(通过参数 `bind_relations` 绑定),并支持JOIN等操作。 ``` import dai data = dai.query("SELECT date, instrument, price FROM cpt_dwc_2026_stock_hs300_snapshot", 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(price) AS avg_close FROM df GROUP BY date::DATE::DATETIME, instrument """, bind_relations={"df": df}).df() ``` ## Tips - 关于日期和时间 - `date::DATE` 只取得 `date` 的日期部分,e.g. `2025-01-03 14:24:31`::DATE 为 `2025-01-03`。注意:`date` 的类型是 TIMESTAMP,`date::DATE` 类型是 `DATE`,可能在部分比较时出现数据类型不一致问题 - `date::DATE::DATETIME` 可以这样再将数据类型转为 `DATETIME` - 更多日期/时间函数参考 [DAI函数文档](https://bigquant.com/wiki/doc/Rceb2JQBdS):`date_trunc`, `time_bucket` - 时序算子,DAI提供的函数,一般情况下,`m_` 前缀的是时序算子,并且默认基于 `GROUP BY instrument` 计算,e.g. `SELECT date, instrument, close / m_lag(close, 1) AS close_1 FROM cpt_dwc_2026_stock_hs300_snapshot` - 截面算子,DAI提供的函数,一般情况下,`c_` 前缀的是时序算子,并且默认基于 `GROUP BY instrument` 计算,e.g. `SELECT date, instrument, close / m_lag(close, 1) AS close_1, c_rank(close_1) FROM cpt_dwc_2026_stock_hs300_snapshot` ## 计算资源 - 使用 `compression=True` 参数可降低内存占用:`dai.query("SELECT * FROM cpt_dwc_2026_stock_hs300_snapshot", 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` 转会为字符串。 - 资源规格:在 aistudio 状态栏里可以点击计算资源规格并切换,推荐 4C/16G 或者更高的资源规格。参赛后平台会赠送宽币用于升级计算资源,用户也可以通过参加比赛培训、[邀请用户](https://bigquant.com/spark)等获得更多宽币。 ## DAI 文档 DAI(DATA FOR AI)是BigQuant研发的高性能分布式数据平台 * 使用简单:通过统一接口访问BigQuant各类数据。 * 数据丰富:提供PB级金融数据、另类投资数据和因子数据 (数据字典),并支持用户自定义数据。 * 技术先进:采用现代化的分布式架构,支持大规模数据的低延迟读写和高性能计算。 * 使用文档访问链接:https://bigquant.com/wiki/doc/PLSbc1SbZX ## 其他数据 本次大赛除了提供 L2 snapshot 因子数据供参赛者挖掘因子,同时在评估系统中使用因子库数据和行业成分数据进行因子正交化,考量该因子带来的增量信息,以下为数据表链接 * 因子库数据,参考:[cpt_dwc_factorlib](https://deepwin.bigquant.com/data/datasources/cpt_dwc_factorlib) * 行业成分数据,参考:[cpt_dwc_2026_stock_industry_component](https://deepwin.bigquant.com/data/datasources/cpt_dwc_2026_stock_industry_component) * 代码ID映射表,参考:[all_instruments](https://deepwin.bigquant.com/data/datasources/all_instruments)

比赛规则