深入浅出Python量化交易实战
上QQ阅读APP看书,第一时间看更新

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章所使用的回测方式不同,这里我们通过对算法交易收益与基准收益的对比来评估策略的业绩,而这种方法在实际应用中更加普遍。