接上一篇文章(期货ML策略(一)数据获取),这篇文章开始构建机器学习模型。
如何构建一个机器学习模型,其最本质还是要看你需要机器学习为你做什么贡献。我这边希望能够利用机器学习帮助我预测未来一段时间上涨还是下跌,这样我就可以对应进行做多或者做空。太高频的策略一般会比较耗费手续费,太低频的策略又容易出现很多意想不到的巨额损失,因此需要设置一个合理的预测时间,这个时间我设置的是20分钟(期货是T+0操作)。通过模型预测20分钟后的涨跌情况,策略进行相应的做多或做空(有点像我之前的超短策略)。
训练一个传统的机器学习的模型主要有如下步:(1)数据获取;(2)标签制作;(3)特征构建;(4)模型选择及模型训练;(5)结果分析。对于数据获取,上一篇文章(期货ML策略(一)数据获取)已经简要的阐述过了,这篇文章将会介绍后面四步。
1. 标签制作
因为我是需要知道20分钟后的涨跌情况。所以我的标签制作规则为:如果20分钟后的价格大于等于当前价格,标签为1否则为0。但是考虑到实际情况中,当我们计算完涨跌之后,往往并不能马上买入,因此这边我加了1分钟的延迟时间,即20分钟后的价格大于等于下一分钟的价格,标签为1否则为0。
核心代码如下:
def get_label(df_min):
# 20 分钟后的涨幅,且日内交易
delta_t = 20
df_label = []
tmp_col = ['ts_code', 'trade_date', 'datetime', 'mean', 'low', 'high']
for i, g in tqdm(df_min[tmp_col].groupby(['ts_code', 'trade_date'])):
g = g.sort_values('datetime', ascending=True).reset_index(drop=True)
g['mean_shift1'] = g['mean'].shift(-1)
g['mean_latter'] = g['mean'].shift(-delta_t)
g['lowest'] = g.rolling(delta_t)['low'].min().shift(-delta_t)
g['highest'] = g.rolling(delta_t)['high'].max().shift(-delta_t)
df_label.append(g)
df_label = pd.concat(df_label)
return df_label
if os.path.exists(os.path.join(base_path, 'label.csv')):
df_label = pd.read_csv(os.path.join(base_path, 'label.csv'))
else:
df_label = get_label(df_min)
df_label.to_csv(os.path.join(base_path, 'label.csv'), index=None)
df_label['datetime'] = pd.to_datetime(df_label['datetime']