DataWhale 机器学习夏令营第二期——AI量化模型预测挑战赛 学习记录

这篇具有很好参考价值的文章主要介绍了DataWhale 机器学习夏令营第二期——AI量化模型预测挑战赛 学习记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DataWhale 机器学习夏令营第二期
——AI量化模型预测挑战赛
已跑通baseline,线上得分0.51138, 跑通修改后进阶代码,线上得分0.34497

学习记录一 (2023.08.06)

按照鱼佬直播分享按照以下常见思路分析机器学习竞赛:

DataWhale 机器学习夏令营第二期——AI量化模型预测挑战赛 学习记录,人工智能,机器学习,学习

1. 问题建模

1.1 赛事数据

数据集情况

给定数据集: 给定训练集(含验证集), 包括10只(不公开)股票、79个交易日的L1snapshot数据(前64个交易日为训练数据,用于训练;后15个交易日为测试数据,不能用于训练), 数据已进行规范化和隐藏处理,包括5档量/价,中间价,交易量等数据(具体可参考后续数据说明)。
预测任务:利用过往及当前数据预测未来中间价的移动方向,在数据上进行模型训练与预测
输入数据
行情频率:3秒一个数据点(也称为1个tick的snapshot);
每个数据点包括当前最新成交价/五档量价/过去3秒内的成交金额等数据;
训练集中每个数据点包含5个预测标签的标注; 允许利用过去不超过100tick(包含当前tick)的数据,预测未来N个tick后的中间价移动方向。
预测时间跨度:5、10、20、40、60个tick,5个预测任务;
即在t时刻,分别预测t+5tick,t+10tick,t+20tick,t+40tick,t+60tick以后: 最新中间价相较t时刻的中间价:下跌/不变/上涨。

数据分为训练集和测试集,训练集包括sym0 ~ 910个sym从date0 ~ 6364天每天上午和下午的数据,测试集则为后续date64 ~ 7814天的数据。数据量较大,典型的时间序列预测问题。时间步长为 3 s, 范围从 09:40:03~ 11:19:5713:10:03~14:49:57
思路:

  • 在构建时序特征时需要考虑按照每个上下午,分组进行构造来保证时间步长一致。
  • 对10只股票分开处理
  • 对5个任务分开处理, N=5,10 为一类, N = 20,40,60 一类
数据中缺失值
train_df.isnull().sum()

不存在缺失值

类别和数值特征的基本分布

查看数值型特征在训练集和测试集上的数据分布
DataWhale 机器学习夏令营第二期——AI量化模型预测挑战赛 学习记录,人工智能,机器学习,学习

  1. 价格类数值变量数值比较稳定,训练和测试集分布范围基本一致,如’n_close’,‘n_midprice’, ‘n_bid1’, 'n_ask1’等
  2. 而和交易量相关的数值变量训练集的变化比测试集较大, 训练集中存在交易量远大于测试集交易量的数据,后续分析可以研究这些高交易量对应的日期是否在一天,是否为特殊时刻,以及是否为异常值

1.2 评价指标

中间价的计算方式

n _ m i d p r i c e = n _ b i d 1 + n _ b i d 2 2 n\_midprice = \frac{n\_bid1+n\_bid2}{2} n_midprice=2n_bid1+n_bid2
其中,一个为0取另一个值

分析
查看为 n _ b i d 1 , n _ b i d 2 n\_bid1, n\_bid2 n_bid1,n_bid2中存在0的行:

train_df[(train_df['n_bid1'] == 0 )| (train_df['n_ask1'] == 0)].index
Index([   6641,    6642,    6645,    6646,    6647,    6648,    6649,    6650,
          6651,    6652,
       ...
       2446840, 2446842, 2446844, 2446845, 2446846, 2446848, 2446918, 2446919,
       2446920, 2446921],
      dtype='int64', length=175414)

上面为 n _ b i d 1 , n _ b i d 2 n\_bid1, n\_bid2 n_bid1,n_bid2中存在0的行索引,共175414行存在为0的值。这也说明了之前的箱线图分析中,交易值偏向于低端的原因,因此,后续可以对交易量相关特征进一步分析,包括:1)去除0值观察分布, 2)取对数。

去0后其实对分布影响不大,含0的数据量太少了:
DataWhale 机器学习夏令营第二期——AI量化模型预测挑战赛 学习记录,人工智能,机器学习,学习

此外,不存在都为0的行,该结果在缺失值分析中已经得到了。

价格移动方向说明

以涨跌幅为基准,分为 2(涨)、1(不变)、0(跌)
L a b e l t N = σ ( n _ m i d p r i c e t + N − n _ m i d p r i c e t ) Label_t^N = \sigma(n\_midprice_{t+N} - n\_midprice_t) LabeltN=σ(n_midpricet+Nn_midpricet)
赛题公式说明
这里我目前还没理解清楚,按照给的公式我去计算了下标签,发现不太一致。另外,如果有了这个具体的指标确定的话不是可以直接用于测试集的计算?

1.3 线下验证

Baseline 采取的是K折交叉验证,时序数据为了保证数据一致性,后续打算采用训练集中data50~63共14天数据作为验证集以尽可能保持线上线下一致性,用来分析后续特征工程中衍生特征的好坏。


下一步打算对数据进一步分析,构建交叉特征,同时对不同股票不同天的上下午构建时序特征,对五种不同预测任务构建不同的模型,并采用训练集后14天作为验证集进行验证(K折太久了)。此外,收集些业务信息,感觉对赛题的理解还不够清晰。

PS:

  1. 一轮赛制,按照目前的排行榜基本无了
  2. 认真看赛题,两次提交失败都是因为没注意到赛题已经说明 文件详细说明:以zip文件格式提交,编码为UTF-8,文件格式:submit.zip文件,包含文件夹submit


学习记录二(2023.08.09)

2. 特征工程

每次加载和训练模型的速度都太慢了,做了些优化。

  1. 按照群里的提示把数据存为了 pickle 格式
# 保存为 pickle
with open('train.pickle', 'wb') as f:
	pickle.dump(train_df, f)
	
with open('test.pickle', 'wb') as f:
	pickle.dump(train_df, f)
	
# 加载 pickle
train_df = pd.read_pickle('train_pickle')
test_df = pd.read_pickle('test_pickle')
  1. 为了更好的评估特征,只选用了sym=0第0股的股票的label_5进行线下特征评估。
    同时也不采用K折交叉验证,另外考虑时序性的问题,手动划分51-57天数据作为验证集,63天暂时舍去,0-50天作为训练集。
train_df1 = train_df[train_df['sym'] == 0].sort_values(by = ['date','time'])
cols = [f for f in train_df1.columns if f not in ['uuid','time','file', 'label_5', 'label_10','label_20','label_40','label_60']]
train_df1_train = train_df1[train_df1['date'].isin(train_df1.date.unique()[:-8])]
train_df1_val = train_df1[train_df1['date'].isin(train_df1.date.unique()[-8:-1])]
train_x, train_y = train_df1_train[cols], train_df1_train['label_5']
val_x, val_y = train_df1_val[cols], train_df1_val['label_5']

结合上一次对赛题的一点点理解和和目前的比赛情况(好几个刷到0.99的), 然后我尝试了之前数据探索思考的想法,构建了穿越特征,打算看看有什么效果,线下表现非常好,然后我就在baseline的基础上附加了穿越特征,同时为了更快的得到结果,取消了K折验证。结果刷到0.99899… 虽然并没有用到测试集来训练,但本身这种方法也是不符合实际情况的,所以之后还是应该按照正常的特征衍生思路来进行比赛。

收集了些关于时间序列的建模思路:

  1. 交叉验证:滚动交叉验证
import numpy as np
from sklearn.model_selection import TimeSeriesSplit
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4, 5, 6])
time_series = TimeSeriesSplit()
print(time_series)
for train_index, test_index in time_series.split(X):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

7种交叉验证方法

  1. 基本规则方法

    • 加权平均
    • 指数平滑
      时间序列预测:指数平滑法及python实现
  2. 时间序列模式

    • 趋势性
      • 一阶趋势:构建相邻时间单位的数据差分、比例;
      • 二阶趋势:反映一阶趋势变化
    • 周期性
      • 环比,将上周期同时期数据作为特征
      • 构造时间特征,如时间在周期中的位置,距离峰值的时间差
    • 相关性(自相关):shift平移、历史时刻统计值
    • 随机性:异常标记 或者 预处理剔除
  3. 特征提取文章来源地址https://www.toymoban.com/news/detail-664767.html

    • 历史平移
    • 窗口统计
    • 序列熵特征
    • 时间特征
    • 统计特征

到了这里,关于DataWhale 机器学习夏令营第二期——AI量化模型预测挑战赛 学习记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DataWhale 机器学习夏令营第三期——任务二:可视化分析

    DataWhale 机器学习夏令营第三期 ——用户新增预测挑战赛 2023.08.17 已跑通baseline,换为lightgbm基线,不加任何特征线上得分 0.52214 ; 添加baseline特征,线上得分 0.78176 ; 暴力衍生特征并微调模型参数,线上得分 0.86068 2023.08.23 数据分析、衍生特征: 0.87488 衍生特征、模型调参:

    2024年02月11日
    浏览(29)
  • Datawhale AI夏令营 - 用户新增预测挑战赛 | 学习笔记

      如果将submit.csv提交到讯飞比赛页面,会有多少的分数? 代码中如何对udmp进行了人工的onehot? 1:0.62710 2:对umap列中的字典元素按键取值,初始为一个九维的向量,将字典中键对应的值覆盖到向量中的对应位置。   字段x1至x8为用户相关的属性,为匿名处理字段。添加代码

    2024年02月10日
    浏览(25)
  • 【Datawhale夏令营】任务二学习笔记

    目录 一:python语法回顾 1.1  print() 1.2  列表与字典 1.3自定义函数与return 1.4火车类(面向对象)  实例化总结: 二:LightGBM 代码精读 2.1导入库 2.2数据准备与参数设置  2.3时间特征函数   2.4优化  2.5训练与预测 三:优化讲解 3.1: 3.2优化建议: 一:python语法回顾 1.1  print

    2024年02月14日
    浏览(37)
  • Datawhale-AI夏令营:脑PET图像分析和疾病预测挑战赛baseline解读

    这段代码是一个完整的深度学习模型训练和预测的流程。下面我会逐步解释每个步骤的作用。 首先,这段代码导入了必要的库,包括PyTorch、numpy、pandas等。接着,打印出CUDA版本和是否可用GPU,并将模型部署到GPU上(如果可用)。 接下来是数据预处理的部分。通过glob.glob函数

    2024年02月16日
    浏览(24)
  • AI夏令营第三期用户新增挑战赛学习笔记

    通过pd库的df.info()方法查看数据框属性,发现只有udmap字段为类别类型,其余皆为数值类型。 相关性热力图颜色越深代表相关性越强,所以x7和x8变量之间的关系更加密切,还有common_ts与x6也是。即存在很强的多重共线性,进行特征工程时可以考虑剔除二者中的一个变量,以免

    2024年02月11日
    浏览(24)
  • DatawhaleAI夏令营第三期机器学习用户新增预测挑战赛baseline新手教程

    本教程会带领大家项目制学习,由浅入深,逐渐进阶。从竞赛通用流程与跑通最简的Baseline,到深入各个竞赛环节,精读Baseline与进阶实践技巧的学习。 千里之行,始于足下,从这里,开启你的 AI 学习之旅吧! —— Datawhale贡献者团队 用户新增预测挑战赛: https://challenge.xf

    2024年02月12日
    浏览(31)
  • AI夏令营笔记——任务2

    任务要求与任务1一样: 从论文标题、摘要作者等信息,判断该论文是否属于医学领域的文献。 可以将任务看作是一个文本二分类任务。机器需要根据对论文摘要等信息的理解,将论文划分为医学领域的文献和非医学领域的文献两个类别之一。 使用预训练的大语言模型进行建

    2024年02月11日
    浏览(23)
  • acm夏令营课后题(持续更新)

                                            米有程序题就懒得写哩           acm夏令营贪心算法选题_李卓航哇哇咔~的博客-CSDN博客  上面这个自己写的不知道为什么错哩,在网上找了下面这个。   这道题写的很顺      (这道题答案来源于网上)  网上答案写的很详细

    2024年02月13日
    浏览(29)
  • 考研保研、夏令营推免的简历模板

      本文介绍在保研夏令营、考研复试等场景中, 个人简历 的制作模板与撰写注意事项。   这里就将当初我自己的简历分享一下,供大家参考。其实我的简历是那种比较简单、质朴的,通篇就一个颜色,没有太多花里胡哨的部分。我个人感觉,对于读研、升学而言,其实

    2024年02月04日
    浏览(28)
  • 北京大学2014计算机学科夏令营上机考试

    暴力必超时  利用栈的思想,利用一个(模仿栈)的数组,遇到男孩则入栈(即加入数组),记录当前位置(更新相对下标、绝对下表); 而遇到女孩,则出栈(男孩相对下标--),输出女孩与男孩的绝对位置。 2014计算机学科夏令营上机考试 B:排队游戏 找规律……#¥%……

    2024年02月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包