一、初赛
时间:4/30/2021—5/12/2021
1. 赛题理解
近年来,以A(artificial intelligence)B(big data)C(cloud)为代表的数据智能技术飞速发展。为适应新时期银行科技转型的发展战略,招商银行提出“轻运营”理念,通过对未来业务量进行精准预测,可以合理安排人力,提升关键工作节点的精确化和自动化能力,向着以卓越、高效、低成本为特点的精益运营更进一步。
本次竞赛给出的数据包含日期、节假日信息、时间段、岗位(含2种岗位A、B)、业务类型和业务量数据。赛题共有两个子任务,任务一的权重为0.7, 任务二的权重为0.3。因此优化任务一收益更高,我们需尽量提升任务一的分值。
任务1:预测未来31天各岗位每天的业务量总量
任务2:预测未来31天各岗位每天每半小时粒度的业务总量
竞赛的评价标准为mape,该指标真实值较小的数据的影响要远大于值较大的。
MAPE
=
1
N
∑
i
=
1
N
∣
Y
i
−
Y
^
i
Y
i
+
1
∣
×
100
%
\operatorname{MAPE}=\frac{1}{N} \sum_{i=1}^{N}\left|\frac{Y_{i}-\hat{Y}_{i}}{Y_{i}+1}\right| \times 100 \%
MAPE=N1i=1∑N∣∣∣∣∣Yi+1Yi−Y^i∣∣∣∣∣×100%
数据:
date:日期
post_id:A、B两种业务类型
biz_type:业务类型细分,A有13种,B只有一种
period:时段(每天48个)
amount:业务量(label)
2. 思路解析
比赛第三天有个大佬开源了自己的方案,开源方案github地址,参考大佬的代码,我做了一个基于规则的模型,由于期间还在准备春招实习和毕设系统,所以也没花太多时间,最终初赛185名,前两百名招行给面试机会,面试时间15分钟左右,问了一些很简单的项目问题,最后竟然进了复赛,运气略好。
比赛期间代码的mape值如下:
时间 | 榜单 | 任务1 & 方法 | 任务2 & 方法 |
---|---|---|---|
5/2 | A榜:0.20 | 0.12027 规则法 | 0.38963 规则法 |
5/4 | A榜:0.16289 | 0.12027 规则法 | 0.26233 lgb |
5/10 | B榜:0.21122 | 0.1287 规则法 | 0.4039 规则法 |
5/10 | B榜:0.14962 | 0.11743 规则法 | 0.1985 lgb |
5/11 | B榜: 0.13935 | 0.1140 规则法 | 0.1985 lgb |
切换B榜后只有三次提交机会,最后B榜任务1的提交方案中,因为疫情导致2019年数据异常,所以只使用18年的11->12月份数据增长率,推算2020年11月到12月份的增长率。而基数则是2020年11月份的业务量设为w,第一次提交base为w,第二次提交base设为1.05*w,发现效果有提升,但显然系数设置的保守了,如果再大些效果还会更好。
其他大佬的参考方案:
二、复赛:高频交易预测
时间:6月5日晚17点-6月7日早上5点,一共36小时
1. 赛题背景
高频交易是指从那些人们无法利用的极为短暂的市场变化中寻求获利的计算机化交易,比如,某种证券买入价和卖出价价差的微小变化。通过机器学习模型代替人工经验,在飞速变化的市场中捕捉正确的交易信号,成为新时代量化交易的挑战。我们希望参赛者能够建立一个预测模型,根据每一时刻市场的行情变化,选择当前时刻最佳的交易行动决策,捕捉正确的交易机会最大限度实现“低买高卖”。
课题研究要求
本次大赛为参赛选手提供了两个数据集(训练数据集和评分数据集),数据集中每一行都代表一次以秒为间隔的交易机会,包含买卖五档的价格和挂单量、当前成交量以及成交价的数据。训练集中会给出每次交易机会中采取不同行动值(action value)对应的下一时刻收益(return)。希望参赛选手基于训练数据集,构建交易行动的判断模型,并将模型应用在评分数据集上,输出每次交易机会下应采取的行动以实现尽可能多的收益。
比赛规则:
- 竞赛时间:6月5日17:30-6月7日5:00;
- 采用数据竞赛的形式,竞赛期间开放数据,预测结果数据限提交3次:6日16:00之前、6日22:00之前、7日5点之前,前两次可自主选择是否提交。
- 竞赛结束后,将过程中留存的代码、中间过程文件、实现方案及分工说明等可展现竞赛中工作的文件,以小组为单位,打包压缩后命名为“2021fintech-数据赛道-XX组.zip”,将文件放置服务器指定路径,将路径告知技术导师,截止时间为6月7日5:00,对小组的评价将参考压缩包中的内容。
评价标准
- 评价公式:评分数据集中所有交易机会,选择的交易行动对应的累计收益。
数据说明
- 训练与测试数据格式
本次比赛将会提供某一交易品种的秒级别交易数据,包含买卖五档的价格和挂单量、当前成交量以及成交价的数据。训练集还包括对应采取的行动值和收益。
训练集包含m个不同的连续交易时间段,评分数据集包含n个不同的连续交易时间段。
tick.csv 文件数据字段格式如下表所示:
字段 | 数据样例 | 说明 |
---|---|---|
date | 2 | 交易日期 |
tx_id | 4 | 每个时间段内的交易机会序号(以秒为间隔) |
best_bid_price_1 | 10 | 买一价 |
best_bid_size_1 | 5 | 买一量 |
best_ask_price_1 | 11 | 卖一价 |
best_ask_size_1 | 21 | 卖一量 |
best_bid_price_2 | 9 | 买二价 |
best_bid_size_2 | 19 | 买二量 |
best_ask_price_2 | 12 | 卖二价 |
best_ask_size_2 | 49 | 卖二量 |
best_bid_price_3 | 8 | 买三价 |
best_bid_size_3 | 13 | 买三量 |
best_ask_price_3 | 13 | 卖三价 |
best_ask_size_3 | 30 | 卖三量 |
best_bid_price_4 | 7 | 买四价 |
best_bid_size_4 | 138 | 买四量 |
best_ask_price_4 | 14 | 卖四价 |
best_ask_size_4 | 32 | 卖四量 |
best_bid_price_5 | 6 | 买五价 |
best_bid_size_5 | 417 | 买五量 |
best_ask_price_5 | 15 | 卖五价 |
best_ask_size_5 | 50 | 卖五量 |
last_price | 10 | 成交价 |
qty | 11 | 成交量 |
label.csv文件数据字段格式如下表所示:
字段 | 数据样例 | 说明 |
---|---|---|
date | 2 | 交易日期 |
tx_id | 4 | 每个时间段内的交易机会序号(以秒为间隔) |
return_1 | 2 | Action1对应的收益 |
return_2 | -10 | Action2对应的收益 |
return_3 | 3 | Action3对应的收益 |
return_4 | -4 | Action4对应的收益 |
注意:
1. (label字段经过了简化处理,只有4个)
2. Tick表中天与天的顺序被打乱了,无法有效利用前一天的交易数据预测后一天
注1:买i价和买i量是指市场中投资者委托在该档位的想要买入该交易品种的交易订单的价格和数量,同理卖j价和卖j量是指委托在该档位的想要卖出该期货合约的交易订单的价格和数量。买一到买五的价量按照价格从高到低排序,档位越低价格越高,所以档位越低越容易成交;卖一到卖五的价量按照价格从低到高排序,档位越低价格越低,所以档位越低越容易成交。请注意,委托价不是实际成交价,其反映市场参与者的心理价位。
注2:由于tick数据是通过网络实时获取的数据,由于网络抖动等原因,存在某一秒没有市场的交易数据,而有些时刻会有多条市场交易数据(1秒以内);在label文件中,存在收益为空的情况,意为无法交易,以0计入收益。
2. 结果评估
需要修改predict.py 脚本下predict方法,将训练的模型封装为该方法的形式,其接受一个时刻的市场行情信息作为输入,返回该时刻下的action(值为[0、1、2、3、4] 中之一,其中0代表拒绝交易,收益为0),考虑到特征构建的需要,每天的前900个时刻的action不做评估,不计入累计收益的计算,具体细节可参考eval.py脚本
提交结果时告知技术导师脚本路径,由技术导师运行eval脚本后告知小组模型的累计收益。
计分规则
- 基于所提交数据的结果排名,第一名获得10分,第二名获得9分,第三名获得8分,第四名获得7分,第五名及其以后获得6分;
基于具体结果,预测累计收益以5000为基准,收益每提高100(大于等于100、小于200),积0.1分。 - 由数据赛道导师组,根据比赛提交代码、使用模型、解决方案等进行评分,最高得分不超过2分。
2. 思路解析
这是个典型的高频交易预测问题,需要你根据买卖五档挂单价格和挂单量,以及之前的成交数据,预测下一个tick的交易点,然后采取行动赚取利差。有两种建模思路,
- 当作分类问题,赛题里已经把action划分为5种,可以直接以这五种action作为label输入模型,训练。
- 当作回归问题,预测交易价格的走势,然后根据价格,确实action,这种比较复杂,不太适合短期快速建模,因此最终采用第一种方案。
特征构造上,主要就是根据bid ask 成交价 成交量以及一些交易指标,划分不同的时间窗口做特征,也可以进行特征交叉。
另外还有一个难题就是最后的数据是一条一条读到模型中来的,因此需要动态的存储之前的数据然后实时构造特征,这一点代码实现也有点难度,还好队里有个大佬,这些问题基本都靠她解决。
训练营一共三期,我选了第一期,本期一共25队,其中研发赛道18队,数据赛道6队,最后的奖项有8个,数据赛道两个名额,研发6个名额,无奈自己太菜,跟着大佬最后拿了个阳光普照奖,结束本轮比赛。
三、总结
这是我自己参加的第一个建模比赛,通过这个比赛,学到了很多数据分析和建模的知识,运气好比赛时有大佬带路,因此才让我一路混到复赛,但自己水平太菜,所以最终只是水了一个经历。
6月8日比赛结束后,11日招行就开始发offer了,最终的offer分三档分别是:总行管培生,总行信息技术部,招银网络科技,含金量依次递减。复赛时每个队伍三个人,基本每个offer各一个,所以复赛offer发放率100%!
通过大家的交流,感觉最终offer发放情况如下:
- 管培生offer33%以上,这个感觉发了不止33%
- 总行信息技术部33%以上,这个应该是获得最多的
- 招引网络科技,这个做为兜底offer,剩下的人手一个,不到30%。
6月11号发offer时,招行先发的管培生offer,然后发信息技术部offer,这两种17:30分之前全部发完,此时群里开始讨论offer情况,然而自己并没有收到offer,已经预感到凉了。
晚上18点以后开始发招银网络科技的offer,我收到这个offer时,第一反应是自己在别人眼里,原来是这个水平,因此很生气,感觉自己被看扁了(虽然自己确实很水,但这个offer还不如不发,像在侮辱人一样😠)
机会面前,靠运气只能让你一时捡漏,但最终一定会被发现的,想要获得社会的认可,拿到满意的offer还需要凭实力,未来的路还很长,保持热爱,保持探索,保持一颗爱学习的心。
这个offer就像一个警钟,随时都在提醒我,一定要努力学习!