3.3.3 使用分类算法制定交易策略
接下来,我们就使用上一步中定义的函数来处理下载好的股票数据,生成训练集与验证集,并训练一个简单的模型,以执行我们的交易策略。输入代码如下:
#使用classification_tc函数生成数据集的特征与目标 df, X, y = classification_tc(zgpa) #将数据集拆分为训练集与验证集 X_train, X_test, y_train, y_test =\ train_test_split(X, y, train_size=0.8)
运行代码后,我们会得到训练集与预测集。现在就使用KNN算法来进行模型的训练,并查看模型的性能。输入代码如下:
#创建一个KNN实例,n_neighbors取95 knn_clf = KNeighborsClassifier(n_neighbors=95) #使用KNN拟合训练集 knn_clf.fit(X_train, y_train) #输出模型在训练集中的准确率 print(knn_clf.score(X_train, y_train)) #输出模型在验证集中的准确率 print(knn_clf.score(X_test, y_test))
运行代码,会得到以下结果:
0.5421686746987951 0.541095890410959
【结果分析】从代码运行结果可以看到,使用经处理的数据集训练的KNN模型,在训练集中的准确率是54%左右,在验证集中的准确率也是54%左右。这个准确率远谈不上理想,相当于只有一半时间里模型对股价的涨跌预测正确。原因是我们训练模型的样本特征确实太少了,无法支撑模型做出正确的判断。不过大家也不要担心,我们只是初步做一个演示而已。
既然模型已经可以做出预测(先不论准确率如何),接下来我们就可以来验证一下,使用模型预测作为交易信号(trading signal)来进行交易,并且与基准收益进行对比。首先我们要计算出基准收益和基于模型预测的策略所带来的收益。输入代码如下:
#使用KNN模型预测每日股票的涨跌,保存为Predict_Signal df['Predict_Signal'] = knn_reg.predict(X) #在数据集中添加一个字段,用当日收盘价除以前一日收盘价,并取其自然对数 df['Return'] = np.log(df['Close']/df['Close'].shift(1)) #查看一下 df.head()
运行代码,可以得到如表3.2所示的结果。
表3.2 添加预测信号和收益率的数据表
【结果分析】从表3.2中可以看到,数据表中的Predict_Signal存储的是KNN模型对股票涨跌的预测,而Return是指当日股票价格变动所带来的收益。
下面我们定义一个函数,计算一下累计的基准收益。输入代码如下:
运行代码,就完成了这个函数的定义。接下来我们再定义一个函数,计算基于KNN模型预测的交易信号所进行的策略交易带来的收益。输入代码如下:
定义完上面的函数之后,我们就可以很快计算出算法模型所带来的累计收益了。为了方便对比,我们再来定义一个进行可视化的函数,输入代码如下:
绘图函数定义好之后,我们就可以对KNN模型带来的策略收益和基准收益进行对比了。输入代码如下:
运行代码,可以得到如图3.3所示的结果。
图3.3 KNN算法交易收益与基准收益对比
【结果分析】从图3.3中可以看到,虚线部分是该股票的累积基准收益,实线部分是使用算法进行交易的累计收益。虽然这里使用的KNN分类模型的准确率并不高,但是使用该模型进行涨跌预测后,进行交易的收益还是高于该股票的基准收益的。如果我们通过补充因子(或者说数据集的特征)的方法来进一步提高模型的准确率的话,则算法交易带来的收益还会显著提高。
注意:与第2章所使用的回测方式不同,这里我们通过对算法交易收益与基准收益的对比来评估策略的业绩,而这种方法在实际应用中更加普遍。