CFA协会杯 2026量化投资比赛
比赛时间: -
赋能青年金融人才,深耕量化投资领域
主办方:深圳CFA协会
比赛介绍
## **赛事介绍**
本次竞赛由**深圳CFA协会、深圳市金融局**联合主办,旨在汇聚青年金融人才,激发大学生在量化投资领域的创新潜能。
作为本次竞赛的技术与学术支持方,我们致力于通过严谨的数据分析和先进的计算方法,在复杂的金融市场中为投资者创造价值。我们相信,最卓越的投资思想往往源于开放的探索与协作。因此,我们选择通过本次挑战赛,开放真实的、高颗粒度的市场数据,邀请全国顶尖高校的人才与我们共同迎接这一挑战。
在本次比赛中,您将有机会接触到稀缺、高质量的A股市场分钟级行情数据。您的任务是利用这些数据,构建一个能够预测未来股票收益的创新因子。您的因子模型将在两个阶段进行评估:首先是在历史数据上进行回测的“公榜”得分,然后是在全新的、动态更新的市场数据上进行模拟的“私榜”得分,以确保您的策略在真实世界中的稳健性。
通过本次竞赛,您将获得处理大规模金融时序数据的宝贵实战经验,深入理解市场微观结构,并直面量化机构在日常研究中遇到的真实挑战。
**入门指南**
为了帮助参赛者更好地准备,主办方准备了一系列入门资源:
* **技术工作坊**:由平台方工程师主讲,详细介绍平台功能、API使用、数据结构及因子分析框架。
* **模版代码**:我们将提供一个包含数据读取、因子构建范例和评估流程的核心代码 Notebook,帮助您快速上手。
* **线上答疑会**:我们将在赛程中安排由大湾区顶尖量化机构负责人组成的评审团成员进行线上讲座与答疑。
---
## **数据说明**
本次竞赛提供高质量的A股市场历史行情数据,具体如下:
* **股票池**:中证1000指数在历史相应时间点上的成分股。
* **时间范围**:2023-01-01至2024-12-31。
* **数据频率**:1分钟级别K线及盘口快照数据。
* **数据内容**:包含开、高、收、低、成交量、成交额以及买卖盘口等字段。
---
## **模版代码**
本次竞赛采用“**高频因子低频化**”的方式,平台提供高频数据,参赛者构建日频因子并提交。主办方将提供如下多个模版代码供参赛者参考:
* 用SQL计算vwap因子,参考 `demo_sql.ipynb`。
* 用Python计算vwap因子,参考 `demo_spread.ipynb`。
---
### **赛程安排**
#### **阶段一:报名(2026年3月 - 4月)**
* **通知发布(3月)**:正式发布竞赛通知,公布赛事细则、报名方式。
* **报名与组队(4月)**:参赛队伍完成线上报名。
* **组队要求**:以学校为单位自由组队,建议3-5人(单一队伍最多不超过5人),每队可设1-2名指导老师。
* **报名截止**:2026年4月30日。
#### **阶段二:初赛与方案提交(2026年5月 - 11月)**
* **第一阶段方案提交(5月)**:参赛队伍提交量化投资设计方案思路及编写完成的程序代码。
* **模拟投资阶段(6月 - 9月)**:
* **运行机制**:主办方搭建统一模拟交易环境。参赛队伍可利用平台提供的数据开发因子并按照规范提交代码。
* **公榜(Public Leaderboard)**:平台使用验证集数据(2025年1月至8月部分数据)计算得分并实时更新排名。
* **第二阶段方案优化(10月)**:参赛队伍结合模拟投资结果,提交改进思路及优化后的新程序代码,体现策略的迭代能力。
* **私榜评选(11月)**:
* **私榜(Private Leaderboard)**:评审团结合第一稿、第二稿方案及模拟投资期间(6-9月)的收益率、风控能力等核心指标进行综合打分。
#### **阶段三:决赛与答辩(2026年11月底)**
* **决赛名单公布**:根据综合评分,评选出10支优秀队伍晋级线下评审。
* **线下答辩会**:采用“10分钟展示 + 5分钟评委问答”的形式。10支晋级队伍展示方案设计、代码逻辑及模拟交易复盘。
---
## **评估体系**
### **1. 公榜与私榜量化评估**
评估分为两个步骤:数据检测和得分计算。
* **数据检测**:因子数据文件必须且仅包含三列:`date` (交易日), `instrument` (股票代码), `factor` (因子值)。因子值缺失率在每个交易日不得高于 **40%**。
* **数据处理**:系统会将因子数据与 BARRA 风险因子进行回归取残差,剔除风格因子影响。
* **最终得分 (Score)**:
系统将基于因子值计算 **IC均值、ICIR、夏普比率、换手率** 等指标,公式如下:
$$
ore = 0.4 \times \text{Rank}_{IC_{mean}} + 0.3 \times \text{Rank}_{IC_{IR}} + 0.2 \times \text{Rank}_{SR} + 0.1 \times \text{Rank}_{Turnover}
$$
*注:Rank为实时排名,得分越低,综合表现越优。*
### **2. 决赛综合评估标准**
* **因子质量与创新性 (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 |
| ... | ... | ... |
---
## **赛事奖励**
所有获奖荣誉及奖励将由**深圳CFA协会、深圳市金融局**联合颁发:
* **团队奖项**:
* **冠军、亚军、季军**:各1支队伍。颁发荣誉证书、**CFA考试奖学金**及**量化机构实习绿色通道**。
* **优秀奖**:其余7支晋级队伍。颁发优秀参赛证书及相应奖励。
* **个人奖项**:
* **优秀个人奖**:共3名。结合个人在代码编写及答辩中的表现评选,颁发荣誉证书、**CFA考试专项奖学金**及**量化机构实习推荐机会**。
---
## **竞赛规则与代码要求**
* **代码环境**:所有提交必须在指定的线上平台Notebook环境中运行。
* **运行时长**:CPU Notebook ≤ 3 小时。
* **诚信要求**:参赛作品需为原创。严禁任何形式的抄袭、作弊。一经发现,取消参赛资格并通报所在学校。
* **知识产权**:参赛作品知识产权归参赛队伍所有。主办方拥有非商业性的评审、展示权利,及同等条件下的优先商业合作洽谈权。
奖金&奖项
1. 荣誉证书
2. CFA考试奖学金
3. BigQuant 投研平台权益
4. 量化机构实习绿色通道
比赛数据
## Overview
本比赛只可使用指定的数据源来构建因子。评判程序会 `import` 参赛用户提交代码里的 `main` 函数,并传入数据源名、开始日期时间、结束日期时间来调用。
## 数据源
- 股票池:中证1000指数在历史相应时间点上的成分股
- 数据频率:1分钟级别K线及盘口快照数据
- 开发数据源:[cpt_gcfa_2026_stock_zz1000_bar1m](https://deepwin.bigquant.com/data/datasources/cpt_gcfa_2026_stock_zz1000_bar1m) 包含2023年1月1日至2024年12月31日的数据
- 公榜数据源:参赛用户不可见。
- 私榜数据源:参赛用户不可见。
## 数据格式
参考:[cpt_gcfa_2026_stock_zz1000_bar1m](https://deepwin.bigquant.com/data/datasources/cpt_gcfa_2026_stock_zz1000_bar1m)
以下是根据您提供的内容转换成的 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_gcfa_2026_stock_zz1000_bar1m", 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_gcfa_2026_stock_zz1000_bar1m 的 **instrument_id** 是 BigQuant 平台的自定义的代码ID,没有特殊含义。如果要转换为我们常见的证券代码,可以通过 all_instruments 表进行映射
```
import dai
dai.query("""
SELECT
all_instruments.instrument,
cpt_gcfa_2026_stock_zz1000_bar1m.*
FROM cpt_gcfa_2026_stock_zz1000_bar1m
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_gcfa_2026_stock_zz1000_bar1m
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_gcfa_2026_stock_zz1000_bar1m
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_gcfa_2026_stock_zz1000_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 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_gcfa_2026_stock_zz1000_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(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_gcfa_2026_stock_zz1000_bar1m`
- 截面算子,DAI提供的函数,一般情况下,`c_` 前缀的是时序算子,并且默认基于 `GROUP BY instrument` 计算,e.g. `SELECT date, instrument, close / m_lag(close, 1) AS close_1, c_rank(close_1) FROM cpt_gcfa_2026_stock_zz1000_bar1m`
## 计算资源
- 使用 `compression=True` 参数可降低内存占用:`dai.query("SELECT * FROM cpt_gcfa_2026_stock_zz1000_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` 转会为字符串。
- 资源规格:在 aistudio 状态栏里可以点击计算资源规格并切换,推荐 4C/16G 或者更高的资源规格。参赛后平台会赠送宽币用于升级计算资源,用户也可以通过参加比赛培训、[邀请用户](https://bigquant.com/spark)等获得更多宽币。
## DAI 文档
DAI(DATA FOR AI)是BigQuant研发的高性能分布式数据平台
* 使用简单:通过统一接口访问BigQuant各类数据。
* 数据丰富:提供PB级金融数据、另类投资数据和因子数据 (数据字典),并支持用户自定义数据。
* 技术先进:采用现代化的分布式架构,支持大规模数据的低延迟读写和高性能计算。
* 使用文档访问链接:https://bigquant.com/wiki/doc/PLSbc1SbZX
比赛规则
## **赛事通用规则**
### **参赛资格**
* **个人参赛者**
* 您必须是报名时年龄为18周岁或以上的高校在校生(本科、硕士、博士)。
* 参赛即表示您同意本规则。主办方保留在任何时候核实参赛资格并对任何争议进行裁决的权利。
* **团队参赛者**
* 参赛队伍人数限制在1至3人之间。
* 每位选手只能加入一支队伍。
* 所有团队成员必须单独注册,然后按照赛事官网说明组建或加入团队。
### **主办方与合作方**
* 本赛事由深圳CFA协会主办。
* 本赛事与国内主流线上量化平台合作,由合作平台提供稳定的回测引擎与技术支持。您理解并同意,合作平台仅提供技术支持,不负责评选获胜者或颁发任何奖项。
### **比赛阶段**
* 比赛将从开始日期持续至最终提交截止日期。
* 赛事时间线(包括公榜阶段、私榜阶段、决赛名单公布、答辩与颁奖)将在赛事官网公布,如有任何更新或额外截止日期,主办方将及时在官网和官方社群公布。
### **参赛作品**
* 参赛者需在赛事官网注册。
* 参赛作品 (“提交内容”) 必须符合赛事官网和本规则中规定的要求。
* 提交内容不得使用或包含任何人工标注或人工预测的验证集或测试数据记录。
### **提交限制**
* **公榜阶段**:参赛队伍可以不限次数、不限时间地提交因子代码。
* **私榜阶段**:以截止日期前最后一次提交的代码为准,之后不允许修改代码。
### **赛事数据**
* “赛事数据”指从赛事官网或合作平台获取的,用于参赛的数据或数据集。
* 您仅可将赛事数据用于参加本赛事。主办方保留取消任何不按规定使用赛事数据的参赛者资格的权利。
* 您不可以使用赛事数据以外的数据(“外部数据”)来开发和测试您的提交内容。
### **代码要求**
* **私下分享限制**:禁止在团队外私下分享与赛事数据相关的代码或可执行文件。除非团队合并,否则禁止在不同团队之间共享代码。
* **公开分享**:允许公开分享代码。如果您选择公开分享代码,则必须在官方讨论区或相关平台进行,以惠及所有参赛者。通过分享,您被视为已在开源许可下授权该代码,且该许可不应限制其商业用途。
### **决赛与评审**
* **初赛**:潜在获胜者将根据私榜阶段的最终得分和排名确定。
* **决赛**:入围决赛的队伍需提交因子研究报告、答辩演示文稿等材料,并通过现场答辩的形式进行综合评估。
* **评审标准**:
* **公榜/私榜**:100%量化评估(数据检测与最终得分)。
* **决赛**:综合评估(因子质量与创新性40%,研究深度与规范性30%,现场表现30%)。
* **平局处理**:如果出现分数平局,将以最先提交的提交内容为胜者。
### **获奖者义务**
作为获得奖项的先决条件,获奖者必须履行以下义务:
* 交付用于生成获胜提交内容的最终模型的软件代码及相关文档。
* 向主办方授予本规则中规定的获胜者授权。
* 签署并返还主办方或合作平台可能要求的所有奖项接受文件。
### **奖项**
* 奖项详情将在赛事官网公布。
* 所有奖项均需经过主办方对参赛者资格和提交内容合规性的审核和验证。
### **税务**
所有奖项所产生的税费均由获奖者自行承担。主办方将按法律要求代扣代缴相关税款。
### **隐私权**
您知晓并同意,主办方和合作平台可能会收集、存储、共享和使用您在注册和参赛期间提供的个人信息(“个人信息”)。合作平台将根据其隐私政策使用这些信息。
### **保证与免责**
* 您保证您的提交内容是您的原创作品,且您是其唯一所有者和权利持有人,并有权进行提交和授予所有必要的许可。
* 您同意,您的提交内容不侵犯任何第三方的知识产权或任何其他权利,也不违反任何适用法律。
* 在法律允许的最大范围内,您同意就因您的行为、违约或不作为以及违反本规则中的任何保证而产生的所有索赔、损失和费用对主办方和合作平台进行赔偿,并使其免受损害。
### **最终解释权**
* 如果因计算机病毒、欺诈、技术故障或其他任何原因导致赛事无法按计划进行,主办方保留取消、终止、修改或暂停赛事的权利。
* 主办方保留取消任何试图通过作弊、欺骗或其他不公平行为破坏赛事正常运营的参赛者资格的权利。
## **赛事特定规则**
### **赛事名称**
CFA协会杯 · 首届量化因子挖掘挑战赛
### **赛事主办方**
深圳CFA协会
### **数据使用**
* **范围**:本次比赛提供中证1000指数成分股过去两年(2023年1月1日至2024年12月31日)的5分钟级别历史行情数据(含盘口数据)。
* **用途**:数据仅限用于本次比赛。
### **自动化机器学习工具**
* 参赛者和团队可以使用自动化机器学习工具来创建提交内容。
* 使用此类工具的参赛者或团队必须确保拥有适当的许可。

