本文中包含的思考:
- 什么是时刻序列回归猜测问题?
- 为什么时刻序列回归猜测问题能够运用CatBoost,LightGBM、XGBoost等树模型?
- 为什么说树模型能够比较好地处理数值型数据,可解释性较高?
- catboost和xgboost、LightGBM有什么差异和联系?
- 如果运用深度学习办法处理时刻序列回归猜测问题,我应该运用什么样的办法比较好?为什么?
- 岭回归(
Ridge
)的简介 - RepeatedKFold与KFold做穿插验证的差异
- stacking过程中,运用
pd.concat
兼并猜测成果意味着什么?
赛题官方解读
以下出自官方baseline
2.2 赛事使命
给定数据集: 给定练习集(含验证集), 包含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时刻的中心价:跌落/不变/上涨。
2.3 赛题数据集
- 行情频率: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时刻的中心价:跌落/不变/上涨。
字段 | 含义 | 字段 | 含义 |
date | 日期 | n_bid1 | 买一价 |
time时刻 | 时刻戳 | n_bsize1 | 买一量 |
sym | 标的(仅序号) | n_bid2 | 买二价 |
close | 最新价/收盘价 | n_bsize2 | 买二量 |
amount_delta | 成交量改变 | n_bid3 | 买三价 |
n_midprice | 中心价 | n_bsize3 | 买三量 |
n_bid4 | 买四价 | n_ask1 | 卖一价 |
n_bsize4 | 买四量 | n_asize1 | 卖一量 |
n_bid5 | 买五价 | n_ask2 | 卖二价 |
n_bsize5 | 买五量 | n_asize2 | 卖二量 |
n_ask3 | 卖三价 | label5 | 5tick价格移动方向 |
n_asize3 | 卖三量 | label10 | 10tick价格移动方向 |
n_ask4 | 卖四价 | label20 | 20tick价格移动方向 |
n_asize4 | 卖四量 | label40 | 40tick价格移动方向 |
n_ask5 | 卖五价 | label60 | 60tick价格移动方向 |
n_asize5 | 卖五量 |
2.4 评价指标
本模型依据提交的成果文件,采用macro-F1 score进行评价,取label_5, label_10, label_20, label_40, label_60五项中的最高分作为终究得分。
官方解题思路
本题的使命是构建一种AI量化模型,运用过往及当时数据猜测未来中心价的移动方向。
这种AI量化使命是典型的时刻序列回归猜测问题。处理该问题,一般引荐运用机器学习办法,如CatBoost,LightGBM、XGBoost等树模型,树模型能够比较好地处理数值型数据,可解释性较高。或许运用深度学习办法,但深度模型的建立上比较复杂,需求自己构建模型结构,关于数值型数据需求进行标准化处理,可解释性弱。 咱们在处理机器学习问题时,一般会遵循以下流程:
我对解题思路的了解
时刻序列回归猜测问题
时刻序列回归猜测问题涉及到根据曩昔的观测值来猜测未来的一个或多个时刻点的值。例如,股票价格、气温或销售量的猜测。
为什么时刻序列回归猜测问题能够运用CatBoost、LightGBM、XGBoost这些树模型?
CatBoost、LightGBM、XGBoost等树模型尽管并非专为时刻序列规划,但它们能够很好地捕捉到特征与方针之间的非线性关系。当咱们为时刻序列问题创立特征时(如滞后、滑动窗口计算等),这些模型能够有效地运用这些特征进行猜测。
树模型的优势:
树模型,特别是决议计划树,能够直观地展现数据的割裂和决议计划过程,因此可解释性很强。此外,它们能够很好地处理数值型和分类型数据,不需求预先的特征缩放,能够自然地处理特征之间的交互,并且能够处理缺失数据。
CatBoost、XGBoost和LightGBM的差异和联系:
-
CatBoost:
- 全称为”Category Boosting”。
- 专为处理分类特征而规划,并且不需求大量的数据预处理,如独热编码。
- 通常在默认参数下体现得很好,不需求大量调参。
-
XGBoost:
- 全称为”Extreme Gradient Boosting”。
- 是一个优化的分布式梯度增强库,旨在高效、灵敏和便携。
- 有很好的功能和速度。
-
LightGBM:
- 全称为”Light Gradient Boosting Machine”。
- 运用根据树的学习算法,但与其他算法不同,它按叶子进行增长,而不是按层进行。
- 更快,需求更少的内存。
三者都是根据树的模型,特别是根据梯度增强决议计划树(GBDT)。它们都能够处理分类和回归使命。
那么,如果运用深度学习办法,有什么合适时刻序列猜测问题吗?
关于时刻序列猜测,能够考虑运用循环神经网络(RNN)和其变种,如长短时记忆网络(LSTM)和门控循环单元(GRU)。这些模型特别合适处理序列数据,因为它们能够捕捉到数据中的时刻依赖性。
挑选深度学习的原因是,当数据量很大,并且存在复杂的非线性形式时,深度学习模型往往能够供给更好的功能。
之前和同学沟通发现也有论文是运用决议计划树、梯度增强树以及随机森林等采模型集成办法对大数据时刻序列问题进行猜测的.
在baseline中学到的
1. 数据处理
- 数据集的根本情况
- 能够运用可视化查看
- 数据预处理,包含去掉异常值、缺失值处理、数据类型转换等
2. 特征工程
本次官方供给了两种视点作为优化思路,其间进阶实战用了时刻序列猜测视点构建特征.
从业务视点构建特征,在量化生意方向中,常说的因子与机器学习中的特征根本共同,趋势因子、收益动摇率因子、生意压力、同成交量衰减、斜率 价差/深度,能够环绕成交量、买价和卖价进行构建。
也能够从时刻序列猜测视点构建特征,比方前史平移特征、差分特征、和窗口计算特征。
- 生意特征:根据生意价格和生意量进行构建,主要考虑买一卖一和买二卖二的相关特征。
- 前史平移特征:获取上个阶段的信息。
- 差分特征:获取相邻阶段的增长差异。能够进一步构建相邻数据比值改变、二阶差分等。
- 窗口计算特征:根据不同的窗口大小,计算均值、最大值、最小值、中位数、方差等。
3. 模型交融
-
baseline中模型交融的办法有简略的取均匀和stacking。
-
stacking是一种分层模型集成框架。以两层为例:
- 第一层有多个基学习器,其输入为原始练习集。
- 第二层的模型则是以第一层基学习器的输出作为特征再进行练习。
之前净好大佬做的模型交融就是取均匀, 当然他也用了stacking的办法. 详见我之前的笔记
经典交融方式为stacking,stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始练习集,第二层的模型则是以第一层基学习器的输出作为特征加入练习集进行再练习,然后得到完好的stacking模型。
第一层:(类比cv_model函数)
-
区分练习数据为K折(5折为例,每次挑选其间四份作为练习集,一份作为验证集);
-
针对各个模型RF、ET、GBDT、XGB,别离进行5次练习,每次练习保留一份样本用作练习时的验证,练习完成后别离对Validation set,Test set进行猜测,关于Test set一个模型会对应5个猜测成果,将这5个成果取均匀;关于Validation set一个模型经过5次穿插验证后,一切验证集数据都含有一个标签。此过程结束后:**5个验证集(总数相当于练习集悉数)在每个模型下别离有一个猜测标签,每行数据共有4个标签(4个算法模型),测验集每行数据也具有四个标签(4个模型别离猜测得到的) **
第二层:(类比stack_model函数)
- 将练习会集的四个标签外加实在标签当作五列新的特征作为新的练习集,选取一个练习模型,根据新的练习集进行练习,然后运用测验集的四个标签组成的测验集进行猜测作为终究的result。
Stacking参阅代码(二分类):
def stack_model(oof_1, oof_2, oof_3, predictions_1, predictions_2, predictions_3, y):
'''
输入的oof_1, oof_2, oof_3能够对应lgb_oof,xgb_oof,cat_oof
predictions_1, predictions_2, predictions_3对应lgb_test,xgb_test,cat_test
'''
train_stack = pd.concat([oof_1, oof_2, oof_3], axis=1)
test_stack = pd.concat([predictions_1, predictions_2, predictions_3], axis=1)
oof = np.zeros((train_stack.shape[0],))
predictions = np.zeros((test_stack.shape[0],))
scores = []
from sklearn.model_selection import RepeatedKFold
folds = RepeatedKFold(n_splits=5, n_repeats=2, random_state=2021)
for fold_, (trn_idx, val_idx) in enumerate(folds.split(train_stack, train_stack)):
print("fold n{}".format(fold_+1))
trn_data, trn_y = train_stack.loc[trn_idx], y[trn_idx]
val_data, val_y = train_stack.loc[val_idx], y[val_idx]
clf = Ridge(random_state=2021)
clf.fit(trn_data, trn_y)
oof[val_idx] = clf.predict(val_data)
predictions += clf.predict(test_stack) / (5 * 2)
score_single = roc_auc_score(val_y, oof[val_idx])
scores.append(score_single)
print(f'{fold_+1}/{5}', score_single)
print('mean: ',np.mean(scores))
return oof, predictions
- 输入参数
-
oof_1, oof_2, oof_3
:别离对应三个模型(如LightGBM、XGBoost、CatBoost)在练习集上的out-of-fold猜测成果。 -
predictions_1, predictions_2, predictions_3
:别离对应这三个模型在测验集上的猜测成果。 -
y
:练习集的实在方针值。
- 特征堆叠
- 运用
pd.concat
将三个模型在练习集和测验集上的猜测成果兼并,构成新的练习集和测验集。- 简而言之,
pd.concat
在这里的作用是将三个模型的猜测成果并列放在一起,作为新的特征输入到二级模型进行练习和猜测。 -
pd.concat
是沿着列的方向(axis=1)兼并数据的,也就是说,它并不是简略地取这三个模型的均匀值,而是将它们的猜测成果作为新的特征放在一起。具体来说,如果oof_1
、oof_2
和oof_3
别离有M个猜测成果,那么train_stack
会有3M个特征。 - 这样做的好处是,当咱们运用岭回归或其他模型时,能够学习到这三个模型猜测成果之间的关系和权重,然后得到一个更好的交融猜测。
- 简而言之,
- 初始化变量
-
oof
:用于存储练习集上的交融猜测成果。 -
predictions
:用于存储测验集上的交融猜测成果。 -
scores
:用于存储每折验证的功能得分。
- 穿插验证战略
- 运用
RepeatedKFold
进行穿插验证,其间进行了5折验证并重复了2次。- KFold:是一种常见的穿插验证办法,将数据集分为K个不相交的子集,每次挑选一个子集作为验证集,其他的作为练习集。这个过程会重复K次,每个子集都会作为验证集一次。
- RepeatedKFold:是KFold的扩展,它会重复执行KFold穿插验证N次。这样能够得到K*N个模型和猜测成果,然后更稳健地评价模型的功能。
- Stacking过程
-
关于每一折数据:
- 区分出练习和验证子集。
- 运用岭回归(
Ridge
)作为二级模型进行练习。- 岭回归是线性回归的一种正则化版本。它通过在丢失函数中添加一个L2正则化项(一切系数的平方和)来防止过拟合。这个正则化项会惩罚那些权重过大的特征,使得模型愈加稳健。
- 岭回归的丢失函数为:L()=∥Y−X∥2+∥∥2L(\beta)=\|Y-X \beta\|^2+\lambda\|\beta\|^2
- 其间, \beta 是模型的参数,
- \lambda 是正则化强度,控制正则化的程度。
- 当 \lambda 很大时,正则化的作用 更强,权重会更接近于0;
- 当 \lambda 为 0 时,岭回归就变成了一般的线性回归。
- 对验证子集和测验集进行猜测。
- 计算并打印该折的功能得分。
参阅资料
官方baseline