最近真的是啥都一片绿啊,股票也、基金也、哎!说多了都是泪,幸好我没买,嘻嘻。但是这种价格的大幅度的变动也让不少热爱风险的人看到了机会。想起以前学的东西,正好再复习一遍。所以这片短文以通过支持向量机、逻辑回归和神经网络这样三种方法来判断中证500指数的走势。(tushare ID:436348)
以中证500为例的股指涨跌预测
1.数据的获取
短文中所用的数据来自于Tushare大数据社区,获取过程比较简单:
-
**打开Tushare 社区,点击数据工具
-
点击你想要抓取的数据,并填写相关参数
-
点击运行调试可以预览数据;点击生成代码,可以自动生成从Tushare下载数据的程序代码;点击详细文档可以看到界面右边各个指标的详细含义,非常好用
# 导入需要的包
import tushare as ts
import pandas as pd
import numpy as np
from sklearn import svm
from sklearn.linear_model import LogisticRegression as LR
# 初始化pro接口
pro = ts.pro_api('你的token')
# 拉取数据 中证500从2021年1月1日开始的数据
这是Tushare自动生成的数据提取代码
df = pro.index_daily(**{
"ts_code": "000905.SH",
"trade_date": "",
"start_date": 20210101,
"end_date": "",
"limit": "",
"offset": ""
}, fields=[
"ts_code",
"trade_date",
"close",
"open",
"high",
"low",
"pre_close",
"change",
"pct_chg",
"vol",
"amount"
])
# 结果输出
print(df)
ts_code trade_date close open high low \
0 000905.SH 20220330 6377.8744 6272.0017 6377.8744 6261.8037
1 000905.SH 20220329 6253.0692 6289.4756 6316.3129 6233.2822
2 000905.SH 20220328 6283.2814 6230.1211 6322.1284 6176.2482
3 000905.SH 20220325 6268.2376 6346.7106 6373.4658 6268.2376
4 000905.SH 20220324 6344.1150 6370.9710 6384.4046 6315.1424
.. ... ... ... ... ... ...
295 000905.SH 20210108 6557.5964 6541.5576 6598.3812 6484.3979
296 000905.SH 20210107 6538.1162 6523.6756 6567.2727 6467.4371
297 000905.SH 20210106 6528.1425 6549.7310 6569.1990 6472.7446
298 000905.SH 20210105 6539.7315 6470.2503 6539.7315 6452.5245
299 000905.SH 20210104 6482.7868 6395.6118 6501.5892 6359.0797
pre_close change pct_chg vol amount
0 6253.0692 124.8052 1.9959 164014575.0 1.556008e+08
1 6283.2814 -30.2122 -0.4808 141362124.0 1.404014e+08
2 6268.2376 15.0438 0.2400 144857887.0 1.369917e+08
3 6344.1150 -75.8774 -1.1960 134972256.0 1.351818e+08
4 6398.1009 -53.9859 -0.8438 137749086.0 1.391760e+08
2.数据的处理
因为拿到的数据中,指标间的单位差别很大,为了便于比较同时也是常规的处理方法,即对承担解释功能的指标进行归一化处理。将股指的涨跌作为决策变量,按照其上涨或者下跌分别赋值为1或者0。
- **对决策变量进行走势标识
Y= df['pct_chg'].values
# 设置走势标识
Y[Y>0]=1
Y[Y<=0]= -1
Y= Y.reshape(len(Y),1)
# 删除本实验中用不到的数据
del df['pct_chg']
del df['change']
del df['ts_code']
del df['trade_date']
2. 对解释变量进行归一化
col = df.columns
for i in range(0,7):
dff[col[i]] = (df[col[i]]-df[col[i]].min())/(df[col[i]].max()-df[col[i]].min())
3.模型训练与求解
- **将数据划分为训练样本和测试样本
x_train = dff.iloc[:len(dff)-50,:]
y_train = Y[:len(Y)-50]
x_test = dff.iloc[len(dff)-50:,:]
y_test = Y[len(Y)-50:]
type(y_test)
2.训练并求解
# 支持向量机代码
clf = svm.SVC(kernel="rbf")
clf.fit(x_train,y_train)
rv1 = clf.score(x_train,y_train)
R = clf.predict(x_test)
R = R.reshape(len(R),1)
Z = R-y_test
Rs1 = len(Z[Z==0])/len(Z)
# l逻辑回归模型
lr = LR()
lr.fit(x_train,y_train)
rv2 = lr.score(x_train, y_train)
R = lr.predict(x_test)
R = R.reshape(len(R),1)
Z = R - y_test
Rs2 = len(Z[Z==0])/len(Z)
# 神经网络模型
from sklearn.neural_network import MLPClassifier
clf = MLPClassifier(solver='lbfgs',alpha = 1e-5,hidden_layer_sizes = (5,3),random_state=1)
clf.fit(x_train,y_train)
rv3 = clf.score(x_train, y_train)
R = clf.predict(x_test)
R = R.reshape(len(R),1)
Z = R - y_test
Rs3 = len(Z[Z==0])/len(Z)
# 结果输出
print('支持向量机模型准确率:',rv1)
print('逻辑模型准确率:',rv2)
print('神经网络模型准确率:',rv3)
print(" ="*30)
print('支持向量机模型预测准确率:',Rs1)
print('逻辑模型预测准确率:',Rs2)
print('神经网络模型预测准确率:',Rs3)
print(" ="*30)
4.结果与反思
支持向量机模型准确率: 0.7
逻辑模型准确率: 0.632
神经网络模型准确率: 0.56
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
支持向量机模型预测准确率: 0.66
逻辑模型预测准确率: 0.56
神经网络模型预测准确率: 0.52
从模型准确率来讲呢,最高的是支持向量机模型最低的是神经网络模型,逻辑回归模型居中;从预测准确率来讲最高的也是支持向量机模型,最低的也是神经网络模型,然后逻辑回归模型居中。总体上讲预测的结果都是还是难以差强人意。
反思:
准确率不高的原因有可能有1.数据的处理过于粗糙,比如有些在处理过程中先于变量的均值作比较再进行标准化归一化等操作;2.模型参数的设置需要改进;3.数据波动较大,预测较为困难,因为模型采用的是最近的数据,而最近新冠疫情、俄乌战争叠加影响,预测难度提高。当然还有其他原因,比如只考虑了交易层面的数据,也许加入宏观数据,结果会有改善。
5.结语
**从这次的小实验来看,想要仅仅依靠基本模型和简单的数据处理来判断股市,基本上是痴心妄想,嘻嘻。后期会在上述思考的基础上再进行试验,也会分享出来。最好祝福看到这篇文章的人都能发大财!
ps:文中的部分代码来自 黄恒秋、张良均等的《python金融数据分析与挖掘实战》一书,感兴趣的朋友也可以买来看看。