14上证指数涨跌预测

上证指数涨跌预测

数据介绍:网易财经上获得的上证指数的历史数据,爬取了150天的上证指数数据。

实验目的:根据给出当前时间前150天的历史数据,预测当天上证指数的涨跌。

技术路线:sklearn.svm.svc

数据实例:中核科技1990年到2017年的股票数据部分截图,红框部分为选取的特征值。

文件:000777.csv

image


实验过程

使用算法:SVM

实现过程:

1、建立工程,导入sklearn相关包

  • import pandas as pd

    import numpy as npfrom sklearn import svm

    from sklearn import cross_validation

2、数据加载和数据预处理

读人数据:

  • 选取5列数据作为特征:收盘价、最高价、最低价、开盘价、成交量

    pd:pandas包的实例参数

    sort_index():data按照时间升序排列

    dayfeature:选取150天的数据

    featurenum:选取的5个特征*天数

    x:记录150天的5个特征值

    y:记录涨或者跌

data.shape[0]-dayfeature意思是因为我们要用150天数据做训练,对于条目为200条的数据,只有50条数据是有前150天的数据来训练的,所以训练集的大小就是200-150,对于每一条数据,他的特征是前150天的所有特征数据,即150*5,+1是将当天的开盘价引人作为一条特征数据。

数据预处理:

image


3、创建SVM并进行交叉验证


具体代码:

import pandas as pd
import numpy as np
from sklearn import svm
from sklearn import model_selection

# pandas.read_csv(数据源, encoding=编码格式为utf-8, parse_dates=第0列解析为日期, index_col=用作行索引的列编号)
# 教学视频里用的encoding=编码格式为utf-8会有问题,要把encoding改成gb2312国标码编码
data = pd.read_csv('000777.csv', encoding='gb2312', parse_dates=[0], index_col=0)
# DataFrame.sort_index(axis=0 (按0列排), ascending=True(升序), inplace=False(排序后是否覆盖原数据))
# data 按照时间升序排列
data.sort_index(0, ascending=True, inplace=True)

dayfeature = 150  # 选取150天的数据
featurenum = 5 * dayfeature  # 选取5列数据作为特征:收盘价 最高价 最低价 开盘价 成交量
sampleNum = data.shape[0]
'''
data.shape[0]-dayfeature意思是因为我们要用150天数据做训练,对于条目为200条的数据,只有50条数
据是有前150天的数据来训练的,所以训练集的大小就是200-150, 对于每一条数据,他的特征是前150
天的所有特征数据,即150*5, +1是将当天的开盘价引入作为一条特征数据
'''
x = np.zeros((sampleNum - dayfeature, featurenum + 1))  # 记录150天的5个特征值
y = np.zeros((sampleNum - dayfeature))  # 记录涨或者跌

# 对于特征数据
for i in range(0, sampleNum - dayfeature):
    # 每条数据的特征为该数据前面的150天的所有特征数据+当天的开盘价
    x[i, 0:featurenum] = np.array(data[i:i + dayfeature][['收盘价', '最高价', '最低价', '开盘价', '成交量']]).reshape(
        (1, featurenum))  # 转换成行向量
    x[i, featurenum] = data.iloc[i + dayfeature]['开盘价']
# 对于标签数据
for i in range(0, sampleNum - dayfeature):
    # 如果当天收盘价高于开盘价,y[i]=1代表涨,0代表跌
    if data.iloc[i + dayfeature]['收盘价'] >= data.iloc[i + dayfeature]['开盘价']:
        y[i] = 1
    else:
        y[i] = 0

        # 调用svm函数,并设置kernel参数,默认是rbf,其它:‘linear’‘poly’‘sigmoid’
clf = svm.SVC(kernel='rbf')
result = []
# 5次交叉验证
for i in range(5):
    # x和y的验证集和测试集,切分80-20%的测试集
    x_train, x_test, y_train, y_test = model_selection.train_test_split(x, y, test_size=0.2)
    # 训练
    clf.fit(x_train, y_train)
    # 训练集与预测结果进行对比
    result.append(np.mean(y_test == clf.predict(x_test)))
print("svm classifier accuacy:")
print(result)



实验结果

最后的输出结果,等了大概一分钟,我以为又出什么bug了,还好最后还是输出啦

svm classifier accuacy:
[0.5504885993485342, 0.5179153094462541, 0.5331161780673181, 0.5494028230184582, 0.5602605863192183]

本次实验运用了两个核函数做实验,准确率由表中数据所示。5次交叉验证的准确率相近,均为53%左右。

image



交叉验证

基本思想:交叉验证法先将数据集D划分为k个大小相似的互斥子集,每个子集都尽可能保持数据分布的一致性,即从D中通过分层采样得到。然后,每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集;这样就可获得k组训练测试集,从而可进行k次训练和测试。最终返回的是这个k个测试结果的均值。通常把交叉验证法称为“k者交叉验证”,k最常用的取值是10,此时称为10折交叉验证。



最后的思考

果然不出所料的报错了呜呜呜,可能是sklearn更新了,视频太老了。

1、cross_validation无法使用

from sklearn import cross_validation

# 报错ImportError: cannot import name 'cross_validation' from 'sklearn'

解决方法:把这一句换成from sklearn import model_selection,下面代码里也要改


2、文件打开编码问题

data = pd.read_csv('000777.csv', encoding='utf-8', parse_dates=[0], index_col=0)

# 报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0: invalid continuation byte

解决方法:把encoding改成'gb2312',使用国标码编码。


3、对象没有属性ix

data.ix[i + dayfeature]['开盘价']

# 报错AttributeError: 'DataFrame' object has no attribute 'ix'

原因:新库对名称变化

解决方法:将ix改成iloc



最后的输出结果,等了大概一分钟,才输出result,不过还好最后还是输出啦
数据文件,000777.csv,我也不知道怎么上传,要用到了再说

posted @ 2021-10-16 15:46  奶酥  阅读(205)  评论(0编辑  收藏  举报