14上证指数涨跌预测
上证指数涨跌预测
数据介绍:网易财经上获得的上证指数的历史数据,爬取了150天的上证指数数据。
实验目的:根据给出当前时间前150天的历史数据,预测当天上证指数的涨跌。
技术路线:sklearn.svm.svc
数据实例:中核科技1990年到2017年的股票数据部分截图,红框部分为选取的特征值。
文件:000777.csv
实验过程
使用算法: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是将当天的开盘价引人作为一条特征数据。
数据预处理:
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%左右。
交叉验证
基本思想:交叉验证法先将数据集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,我也不知道怎么上传,要用到了再说