零基础《AI挑战虚拟股票预测大赛》入门教程

策略分享
标签: #<Tag:0x00007f9d721885f0>

(lzl) #1
克隆策略

前言

早上看到社区中有一篇《在BigQuant上用AI挑战虚拟股票预测竞赛》

对这个竞赛比较感兴趣,但是这篇文章里一会操作代码,一会又图形界面,理解不能。

帖子下面倒是有个兄弟提交了自己的版本,就是复杂了点。 这里我写一个极简的入门版,大家可以在其基础上随意的发挥。

如果大家对xgboost, lgb或者rnn, lstm在这块的应用感兴趣或者有问题,我们可以后续讨论。

依赖导入

该竞赛是个二分类任务,可以导入简单的逻辑回归模型使用,不太清楚的萌新可以去看一篇绿团的介绍帖子,写的挺好。 又注意到官网中的提交实例,再导入一个回归模型使用。

In [1]:
#导入必要依赖 pd和np已有
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDRegressor
import numpy as np
from sklearn.metrics import log_loss

数据的导入和预处理

数据分为测试集和训练集,根据官网说明,除了特征外,还增加了字段group。训练集中还包括 label, weight, era分别是对应目标值y, 计算损失函数时的权重以及一个用于交叉验证的参数。

这里我使用的w2的数据,最新已经更新到w7,但是在预测时会报错。先用回w2的,这个问题回头再看吧。

In [29]:
#导入训练集和测试集

m1 = M.convert_csv_to_hdf.v1(
    input_ds=DataSource('bigquant-challengerai-trendsense-w2-testset')
)

df_test = m1.data.read_df()

df_test.head()
[2017-10-17 14:56:53.859480] INFO: bigquant: convert_csv_to_hdf.v1 开始运行..
[2017-10-17 14:56:53.863820] INFO: bigquant: 命中缓存
[2017-10-17 14:56:53.864658] INFO: bigquant: convert_csv_to_hdf.v1 运行完成[0.005206s].
Out[29]:
id feature0 feature1 feature2 feature3 feature4 feature5 feature6 feature7 feature8 ... feature79 feature80 feature81 feature82 feature83 feature84 feature85 feature86 feature87 group
0 321674 0.255856 -0.278881 1.127581 -0.449974 -0.344445 0.449047 0.034932 -0.481797 -0.197660 ... -0.453264 -0.429316 1.691644 -0.124150 1.242681 0.085073 -0.323258 0.124773 -0.465927 22
1 321675 -0.790751 0.372275 -0.783686 0.851273 0.587238 2.367607 -0.015127 -0.547054 0.115664 ... -0.175375 0.048157 -0.031081 1.575099 0.408154 1.818531 -0.220388 -0.115196 -0.189173 3
2 321676 0.925605 0.527352 1.040952 0.056474 -0.971639 1.467063 0.015657 0.788053 0.673573 ... 0.076082 1.317862 1.240052 1.650083 1.008927 2.338741 0.113103 0.287835 0.744033 16
3 321677 0.956306 -0.021904 -0.600540 0.388416 0.255451 -0.815715 0.022111 -0.530962 0.520117 ... -0.291778 -0.405415 -0.082949 -0.474896 0.879151 -0.732962 -0.120135 0.640420 -0.651555 24
4 321678 0.807960 -1.133254 0.267594 0.921103 0.637006 -0.454575 0.078964 0.119100 -1.215426 ... -0.312871 -0.427784 1.018837 0.136058 1.803501 -0.276203 -0.313906 -0.722224 -0.565949 6

5 rows × 90 columns

In [30]:
m2 = M.convert_csv_to_hdf.v1(
    input_ds=DataSource('bigquant-challengerai-trendsense-w2-trainingset')
)

df_train = m2.data.read_df()

df_train.head()
[2017-10-17 14:56:59.277036] INFO: bigquant: convert_csv_to_hdf.v1 开始运行..
[2017-10-17 14:56:59.281611] INFO: bigquant: 命中缓存
[2017-10-17 14:56:59.302923] INFO: bigquant: convert_csv_to_hdf.v1 运行完成[0.025903s].
Out[30]:
id feature0 feature1 feature2 feature3 feature4 feature5 feature6 feature7 feature8 ... feature82 feature83 feature84 feature85 feature86 feature87 weight label group era
0 0 0.107954 1.582347 -1.204869 1.264255 0.883198 1.062319 -2.971055 0.577812 1.136794 ... 3.243251 0.112862 1.972788 1.546578 1.262472 1.152019 4.0 0.0 1 1
1 1 -1.421022 0.918693 -1.181220 2.643235 2.676836 1.510575 -0.080755 -0.450483 0.587664 ... 1.135997 -1.870068 0.681383 0.709638 0.895141 0.348629 6.0 0.0 17 1
2 2 0.381821 0.528956 -0.577431 -1.297461 -0.743595 -0.649770 0.012370 -0.543270 0.569810 ... -0.766037 -0.335140 -0.714933 -0.373302 0.142528 -0.016769 3.0 1.0 1 1
3 3 -0.051851 1.682325 -0.643879 0.320799 0.207362 2.280668 -0.073632 0.140232 1.120968 ... 1.123548 -1.732129 1.329500 1.265733 1.497634 1.175674 2.0 0.0 12 1
4 4 0.453592 0.279396 -0.818497 -0.315710 -0.326581 0.240477 0.010752 -0.234692 0.608943 ... 0.117369 -0.802374 0.284055 -0.562131 -0.606422 0.061120 1.0 0.0 1 1

5 rows × 93 columns

特征提取

交叉验证只是为了防止训练过拟合,这里先不予考虑。

In [31]:
#提取权重
sample_weight = df_train.weight
In [32]:
#获取训练集y
train_y = df_train.label.values
In [33]:
#获取测试集x
pred_x = df_test.drop(['id','group'], axis=1)
In [34]:
#获取训练集x
train_x = df_train[pred_x.columns]

模型训练和预测

模型定义

这里使用SGDRegressor进行回归计算,想要分类的可以直接注释掉的模型。

In [35]:
#model = LogisticRegression()
model = SGDRegressor()
In [36]:
#模型训练
model.fit(train_x, train_y)
Out[36]:
SGDRegressor(alpha=0.0001, average=False, epsilon=0.1, eta0=0.01,
       fit_intercept=True, l1_ratio=0.15, learning_rate='invscaling',
       loss='squared_loss', n_iter=5, penalty='l2', power_t=0.25,
       random_state=None, shuffle=True, verbose=0, warm_start=False)
In [37]:
#模型打分,只是示例,这种打分完全过拟合
model.score(train_x, train_y)
Out[37]:
0.025766970505655351
In [40]:
#模型预测
pred_y = model.predict(pred_x)
print(pred_y)
[ 0.53376478  0.3282028   0.62878198 ...,  0.51822302  0.63009163
  0.49649907]

结果的输出和保存

In [41]:
pred = pd.DataFrame()
pred['id'] = df_test.id.values
pred['proba'] = pred_y

pred.head()
Out[41]:
id proba
0 321674 0.533765
1 321675 0.328203
2 321676 0.628782
3 321677 0.475210
4 321678 0.432527
In [42]:
pred.to_csv('simple.csv')

最后

智障官网还需要实名认证,没带身份证,暂时没法提交也不打算提交这个结果。

本文主要是展示简单的过程,欢迎各种指导意见。

In [ ]:
 

【AI挑战虚拟股票预测大赛】周冠军进阶教程
在BigQuant上用AI挑战虚拟股票预测竞赛 (附代码)
(bluexxxx) #2

猜测举办方 实名认证是为了保证比赛尽可能公平。对了,你用w7为何会报错呢?
虽然你的模型简单,但可能也能排进名次~~~


(lzl) #3

在新的训练集的特整里,有NaN
image


(lzl) #4

如果想提交成绩,还需要修复文章里的两处bug:

#考虑到概率范围,人工修正一下结果,否则提交测试报错
pred_y[pred_y > 1] = 1
pred_y[pred_y < 0] = 0

此外csv导出的方式也要修改:
pred.to_csv('simple-w7.csv',index=False)