sklearn股票预测

通过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()

结果展示:

sklearn股票预测_第1张图片

 图片文件夹保存k线图和折线图,表格保存了数据的形状、概况描述、清洗后的数据、降维后的数据、主成分贡献率、标准化后的数据、预测值和真实值的对比数据表以及失误率。

图片展示:

k线图和柱状图均值折线图

sklearn股票预测_第2张图片

 预测值和真实值对比折线图,绿色真实值,红色预测值

sklearn股票预测_第3张图片

表格展示:

形状

sklearn股票预测_第4张图片不挨个展示了直接展示失误率

sklearn股票预测_第5张图片

 有零失误率的:

sklearn股票预测_第6张图片

 零失误真实值和预测值折线图

sklearn股票预测_第7张图片

展示完毕。 

你可能感兴趣的:(python,机器学习,sklearn)