通过sklearn和python语句进行股票的预测,其中python用到了pandas和mpl_finance库,数据模型简历用的是sklearn库。不过mpl_finance已经不再维护,在运行的时候会有警告和提示,但不影响正常的程序运行。
数据遍历和保存
使用pandas库即可完成文件夹的遍历,文件的保存也是由pandas完成,保存到excel里面。
每个文件都有自己的文件名称,做到了动态保存。
数据处理
首先对数据进行导入和处理,在处理的时候发现有的数据是整块的重复或者丢失,当然了,pandas库提供了数据替换功能,但是无论用什么区替换重复的数据得到的还是一堆重复的数据,所以不得已将他删除掉。
降维后的数据、模型预测的数据,失误率,数据的描述形状都保存到了excel文件中
数据模型的建立
本次的模型采用的是神经网络的回归模型。与其他的回归模型相比,神经网络的回归更能对数据的前全局性有更好的掌握,逻辑回归过于垂直的模型结构会让他看起来“顾头不顾尾”。
数据失误率的计算
股票注重趋势和走向,通过开盘价和其他数据维度来预测本次收盘价,如果是上升趋势就购买,下降趋势就出售,所以本次的失误率计算的是趋势预测的失误率,但是我还是要求预测数据的精准度,准确的预测当然会让趋势预测更加精准。
数据可视化
本次可视化使用的是蜡烛图和折线图还有柱形图,不过mpl_finance的确存在一些缺点,就是如果在某个时间段内没有股票数据他还是会将图形绘制出来,这就会出现平直的折线,没有高度的蜡烛图和柱形图。
以下是代码:
from sklearn.metrics import accuracy_score
import matplotlib.ticker as ticker
from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import train_test_split
from matplotlib.pylab import date2num
import datetime
import os
import mpl_finance as mpf
from os import path
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import numpy as np
import matplotlib.pyplot as plt
#一、数据的导入概况信息了解
filenamelist=os.listdir(r'模型挑战赛数据文件') #遍历数据表
for i in filenamelist:
filename=path.join('j:/pycharm_lianxi/sklearn/模型挑战赛数据文件',i)
data = pd.read_csv(filename,encoding='gbk')
data0=data
data1=data['前收盘价(元)'].tail(100)
filepath='j:/pycharm_lianxi/sklearn/表格/数据综合表'+i+'.xlsx'
datashape=pd.DataFrame([[data.iloc[1,1],data.shape]],columns=['名称','shape'])
datadescribe=pd.DataFrame(data.describe())
workbook=pd.ExcelWriter(filepath)
datashape.to_excel(workbook, "形状",encoding='utf_8_sig')
datadescribe.to_excel(workbook, "概况描述",encoding='utf_8_sig')
#二、对数据进行异常值处理(空值的删除和填充)并不完善,其中称块状分布的重复值没有进行处理
data.replace(0, np.nan, inplace=True) #把0转化为空值
data.dropna(axis=1,thresh=100,inplace=True)#对空值过多的列删除
data.fillna(data.median(),inplace=True) #相对来说缺失值较少的进行均值填充
#data=data.loc[:, (data != 0).any(axis=0)] #删除都是0的列
data=data.drop_duplicates(subset='前收盘价(元)')
data.to_excel(workbook, "清洗后的数据", encoding='utf_8_sig')
pca = PCA(n_components=5)
new_data=pd.DataFrame(pca.fit_transform(data.iloc[:,3:])) #降为处理
new_data.to_excel(workbook,"降维后的数据",encoding='utf_8_sig')
var_ratio =np.array(pca.explained_variance_ratio_)
var_ratio=pd.DataFrame(var_ratio.reshape((1,5)))
var_ratio.to_excel(workbook,"主成分贡献率",encoding='utf_8_sig') #主成分贡献率存储
datastd=pd.DataFrame(StandardScaler().fit_transform(new_data))
datastd.to_excel(workbook, "标准化的数据",encoding='utf_8_sig')
#绘制K线图
data=pd.DataFrame(data[['日期','开盘价(元)','收盘价(元)','最高价(元)','最低价(元)','成交量(股)','代码','前收盘价(元)']])
data=data.tail(100)
def date_to_num(dates):
num_time=[]
for date in dates:
date_time=datetime.datetime.strptime(date,'%Y-%m-%d')
num_date=date2num(date_time)
num_time.append(num_date)
return num_time
data_arr=data.values
data_arr[:,0]=date_to_num(data_arr[:,0])
data['ma5']=data['收盘价(元)'].rolling(5).mean()
data['ma10'] = data['收盘价(元)'].rolling(10).mean()
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.facecolor'] = 'black'
fig,axes=plt.subplots(2,1,sharex=True,figsize=(13,6))
ax1,ax2=axes.flatten()
mpf.candlestick_ochl(ax1, data_arr, width=0.6, colorup='r', colordown='g', alpha=1.0)
ax1.plot(data_arr[:,0],data['ma5'])
ax1.plot(data_arr[:,0], data['ma10'])
ax1.set_title(data0.iloc[1,1]+'K线图')
ax1.set_ylabel('价格')
ax1.grid(True)
ax1.xaxis_date()
ax2.bar(data_arr[:,0],data_arr[:,5])
ax2.set_xlabel('日期')
ax2.set_ylabel('成交量')
ax2.grid(True)
ax2.xaxis_date()
savepath='j:/pycharm_lianxi/sklearn/图片/'+i+'_K线图.png'
plt.savefig(fname=savepath)
plt.clf()
#数据预测模型
log=MLPRegressor()
x=data[['开盘价(元)','前收盘价(元)']]
y=data['收盘价(元)']
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=1)
log.fit(x_train,y_train.astype('int'))
y_pred=log.predict(x_test)
X=data['日期'].tail(20)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.facecolor'] = 'black'
plt.plot(X,y_test,marker='.',c='green',label='真实值')
plt.plot(X,y_pred,marker='+',c='red',label='预测值')
plt.legend(bbox_to_anchor=(1,0),loc=3,borderaxespad=1,facecolor='white')
plt.title(data0.iloc[1,1]+'预测值和真实值')
plt.grid(True)
plt.xlabel('日期')
plt.ylabel('价格')
savepath2 = 'j:/pycharm_lianxi/sklearn/图片/' + i + '折线图.png'
plt.savefig(savepath2)
#预测值和实际值的比较和存储
y_pred=list(y_pred)
y_test=list(y_test)
q=0
tes_zheng = 0
pre_zheng=0
for s in range(len(y_test)-1):
if (y_test[s+1]-y_test[s]>=0):
tes_zheng=tes_zheng+1
for s in range(len(y_pred)-1):
if (y_pred[s+1]-y_pred[s]>=0):
pre_zheng=pre_zheng+1
if (tes_zheng-pre_zheng)!=0:
zhengqulv=abs((tes_zheng-pre_zheng)/(len(y_pred)/2))
else:
zhengqulv=0
print(tes_zheng,pre_zheng,zhengqulv,len(y_pred))
zhengquelvDF=pd.DataFrame([zhengqulv],columns=['失误率'])
predictdata=pd.DataFrame({'预测值':np.array(y_pred),'实际值':np.array(y_test)})
predictdata.to_excel(workbook, "预测值和实际值", encoding='utf_8_sig')
zhengquelvDF.to_excel(workbook, "失误率", encoding='utf_8_sig')
workbook.save()
workbook.close()
结果展示:
图片文件夹保存k线图和折线图,表格保存了数据的形状、概况描述、清洗后的数据、降维后的数据、主成分贡献率、标准化后的数据、预测值和真实值的对比数据表以及失误率。
图片展示:
k线图和柱状图均值折线图
预测值和真实值对比折线图,绿色真实值,红色预测值
表格展示:
形状
有零失误率的:
零失误真实值和预测值折线图
展示完毕。