赛题理解
建模目标:给定 t t t时间点的股价数据(买/卖五价、买/卖五量),预测 t + N f t+N_f t+Nf (即 N f u t u r e N_{future} Nfuture)时间点后的中间价相对于t时间点的变化方向( 0 0 0表示下跌幅度超过 a a a, 1 1 1表示变化幅度不超过 a a a, 2 2 2表示上涨幅度超过 a a a)。 a a a可以理解为对模型“分辨率”的要求。当$ N_f=5, 10$ 时, a = 0.0005 a=0.0005 a=0.0005,当 N = 20 , 40 , 60 N=20, 40, 60 N=20,40,60 时, a = 0.001 a=0.001 a=0.001。
因此该赛题本质上是一个分类问题,其中输入模型的特征变量( X ( t − N p , t ] X_{(t-Np,\ t]} X(t−Np, t],即 N p a s t N_{past} Npast)为历史股价(可包括从t-99到t时间点,即 N p ≤ 100 Np\leq 100 Np≤100),模型预测的目标变量( L a b e l t Label_t Labelt)为未来第 N N N个时间点中间价的变化情况( L a b e l t ∈ 0 , 1 , 2 Label_t \in {0,1,2} Labelt∈0,1,2)。
模型预测的好坏由Macro F1-score评价,这是一个评价多元分类模型的指标。对于一个一元分类模型的分类结果,可以由F1-score评价好坏。而
F 1 = 2 1 / P r e c i s i o n + 1 / R e c a l l F_1=\frac{2}{1/Precision+1/Recall} F1=1/Precision+1/Recall2
,其中Precision定义为正确判定为“真”的样本占所有判定为“真”的样本的比例,Recall定义为正确判定为“真”的样本占所有实际为“真”样本的比例。而在作用于多个分类任务的情况下(例如三个),对于每个分类任务的结果都可以计算Precision和Recall,记为
P
1
,
P
2
,
P
3
P_1,P_2,P_3
P1,P2,P3和
R
1
,
R
2
,
R
3
R_1,R_2,R_3
R1,R2,R3。可以进一步求出
P
m
e
a
n
=
(
P
1
+
P
2
+
P
3
)
/
3
P_{mean}=(P_1+P_2+P_3)/3
Pmean=(P1+P2+P3)/3,
R
m
e
a
n
=
(
R
1
+
R
2
+
R
3
)
/
3
R_{mean}=(R_1+R_2+R_3)/3
Rmean=(R1+R2+R3)/3。那么
M
a
c
r
o
F
1
=
2
1
/
P
m
e
a
n
+
1
/
R
m
e
a
n
Macro\ F_1=\frac{2}{1/P_{mean}+1/R_{mean}}
Macro F1=1/Pmean+1/Rmean2
而类似的评价标准还有Micro F1-score。
解决一个机器学习问题的基本流程如下图所示。
通过分析问题明确模型选择和建模目标后,可以在python中继续完成建模和分析步骤。
库导入
-
交叉验证相关
sklearn.model_selection.KFold
sklearn.model_selection.StratifiedKFold
sklearn.model_selection.
-
分类模型
catboost.CatBoostClassifier
-
模型评价相关
sklearn.metrics.accuracy_score
sklearn.metrics.f1_score
sklearn.metrics.roc_auc_score
sklearn.metrics.log_loss
sklearn.metrics.mean_squared_log_error
特征工程
-
当前时刻基本特征:
“时间”信息中的【小时】和【分钟】
买1价与卖1价的差值、各档中间价等
寻找特征与特征之间是否有很强的相关性,如有,则可剔除特征或尝试做正交化
-
历史平移
引入历史中上一阶段的数据
-
差分特征
相邻数据点/阶段的比值、差分
-
窗口统计特征
将数据划分为多个窗口(每个窗口长度固定),构建该时间窗口内的统计量(均值、中位数、标准差等)。
模型选择
由于是分类问题,可以使用树模型(XGBoost/Light GBM/CatBoost),其中CatBoost使用对称二叉树的结构,一方面能加速计算,另一方面又有一定的正则化作用。在训练数据上进行模型拟合,在验证集上进行模型效果验证,基本代码为:
from catboost import CatBoostClassifier
from sklearn.metrics import f1_score
model = CatBoostClassifier(iterations=1000, **params) # 实例化模型
model.fit(train_X, train_y, eval_set=(val_X, val_y)) # 模型拟合
# 模型预测效果反馈
val_pred = model.predict_proba(val_X)
F1 = f1_score(val_y, np.argmax(val_pred, axis=1), average='macro')
上分探索
- 投票法:使用多个模型(例如knn、svm)同时训练,通过soft voting让这些模型共同得出预测结果。
- 超参数优化:关于上述模型有多个超参数,可以使用sklearn.model_selection.GridSearchCV和RandomizedSearchCV获得一组更优的超参数。
- 深度学习:可以尝试例如循环神经网络的深度学习模型,这类模型在进行与时间序列有关的预测任务上可能有非常好的表现。
参考
- 【赛题baseline】https://aistudio.baidu.com/aistudio/projectdetail/6610961
- 【详解CatBoost】https://blog.csdn.net/weixin_49708196/article/details/124018649