前阵子报名参加了一个数据竞赛,题目是展望5月15号(星期三)招商银行的股价,停止时刻是在5月12号(星期天)。在本次展望中,我用到的是岭回归。
一、岭回归
线性回归
先回忆一下一般线性回归。一般来讲,线性回归方程:y=w1x1+w2x2...+wnxn。我们把这组变量 xn 定成一个矩阵 X,把回归系数存放在向量W中,则 y=X*W。
存在的题目
(1)、特性数大于样本数
当特性数大于样本数的时刻,上面的式子就存在题目了。矩阵请求逆,就必须为满秩矩阵,当特性数大于样本数的时刻,就不为满秩了。能够浅显地明白为因为样本数目太少,没有办法供应充足的有用的信息。
(2)、多重共线性
多重共线性指线性回归模子中的诠释变量之间因为存在正确相干干系或高度相干干系而使模子预计失真或无法计算正确。举个例子,关于常人来讲,体重和身高是有很强的联系关系的,但若是我们须要展望某样器械,以这两者作为自变量,纵然能够很好的拟合,但这个模子的诠释性照样不敷。
因为上面两个题目的存在,岭回归就涌现了。它处置惩罚回归中严重疑难题目:消除多重共线性,举行变量的挑选,在存在共线性题目和病态数据偏多的研讨中有较大的实用价值。依照度娘的诠释:岭回归是一种专用于共线性数据剖析的有偏预计回归要领,实质上是一种革新的最小二乘预计法,经由过程摒弃最小二乘法的无偏性,以丧失局部信息、下降精度为价值取得回归系数更加符合实际、更牢靠的回归要领,对病态数据的拟合要强于最小二乘法。
岭回归在上面式子的基础上做了点儿革新:,(个中
称为岭参数)很好地处置惩罚了上面的题目,如果
是一个奇特矩阵(不满秩),增添
后能够保证其可逆。
二、数据猎取
本次数据是经由过程 Tushare 的 get_hist_data()猎取的。Tushare是一个免费、开源的python财经数据接口包。python装置tushare直接经由过程
pip install tushare 便可装置。
importtushare as ts
data= ts.get_hist_data('600848')
运转以后能够检察它的前后几行数据,依照tushare官方的申明,get_hist_data()只能猎取近3年的日线数据,而他的返回值的申明是如许的:
〖date:日期;open:收盘价;high:最高价;close:收盘价;low:最低价;volume:成交量;price_change:价钱更改;p_change:涨跌幅;ma5:5日均价;ma10:10日均价;ma20:20日均价;v_ma5:5日均量;v_ma10:10日均量;v_ma20:20日均量〗
均价的意义也许就是股票n天的成交价钱或指数的平均值。均量则跟成交量有关。至于其他的返回值,应该是一会儿就可以邃晓的吧。在取得数据以后,我们检察一下描述性统计,经由过程 data.describe()
检察是不是存在甚么非常值或许缺失值。
如许看来好像除因为周末以及节假日不收盘致使的当天的数据缺失之外,并没有其他的缺失和非常。然则这里我们不斟酌节假日的缺失值。
三、数据预处置惩罚
因为猎取的数据是按日期降序排序,但本次展望跟时刻序列有关,因而我们须要把递次转一下,让它依照日期升序排序。
data1 = data[::-1]
处置惩罚完递次以后,我们要做一下特性值的挑选。因为 volume 以及均量的值很大,若是不举行处置惩罚的话,很可能对团体的展望形成不良影响。因为时刻有限,并且斟酌到运算的复杂度,这里我没有对这些特性举行处置惩罚,而是直接将它们去掉了。至于均价,我是依照本身的明白,和10日均价、20日均价比拟,5日均价的局限没那么大,对近期的展望会比别的两个要好,因而生存5日均价。接着,我用 sklearn.model_selection 的 cross_val_score,离别检察除〖'open', 'close', 'high', 'low', 'ma5'〗之外的其他盈余属性对展望值的影响。发明 ‘p_change’、'price_change' 这两个属性对展望效果的影响不大,为了节约内存,增添运算速率,进步展望的正确性,也直接把它们去掉了。完了以后,检察前后三行数据。
data1 = data1[['open','high','low','ma5','close']]
data1.head(3), data1.tail(3)
四、建模展望
因为提交停止日期是周日,展望的是周三,因而须要先对周一周二的信息举行展望。在这里我倏忽想到一个题目,是用前一天的一切数据来练习模子以展望当天的 close 对照正确,照样用当天除 close 之外的其他数据来练习模子以练习当天的 close 对照准呢?为了考证这个题目,我离别对这两种要领做了试验。
为了削减代码量,界说了一个函数用以评价模子的错误率。
defget_score(X_train, y_train):
ridge_score= np.sqrt(-cross_val_score(ridge, X_train, y_train, cv=10, scoring='neg_mean_squared_error'))return np.mean(ridge_score)
(1)、用前一天的一切数据来当练习集
y_train = data1['close'].values[1:]
X_train= data1.values[:-1]
score= get_score(X_train, y_train)
输出效果大约为0.469,这个错误率就对照大了,不太公道,更何况还要展望其他特性值作为测试数据。
(2)、用当天除 close 之外的其他数据来当练习集
data2 =data1[:]
y_train= data2.pop('close').values
X_train=data2.values
score= get_score(X_train, y_train)
输出效果大约为0.183,跟第一个比拟几乎好多了。以是,就决定是你了!
接下来建模并把模子生存下来:
y_train = data1['close']
X_train= data1[['open', 'high', 'low', 'ma5']]
close_model=ridge.fit(X_train, y_train)
joblib.dump(ridge,'close_model.m')
在展望之前呢,我们先拿练习集的后8组数据做一下测试,做个图看看:
scores =[]for x in X_train[-8:]:
score= close_model.predict(np.array(x).reshape(1, -1))
scores.append(score)
x= np.arange(8)
fig, axes= plt.subplots(1, 1, figsize=(13, 6))
axes.plot(scores)
axes.plot(y_train[-8:])
plt.xticks(x, data1.index[-8:].values, size=13, rotation=0)
看到如许子我照样相对对照宁神的,不外,这个模子的练习值除“close”之外的属性都是已知的,要展望三天后的还得展望前两天的测试值。
defget_model(s):
y_train= data1[s].values[1:]
X_train= data1.values[:-1]
model=ridge.fit(X_train, y_train)return model
defget_results(X_test):
attrs= ['open', 'high', 'low', 'ma5']
results=[]for attr inattrs:
result=get_model(attr).predict(X_test)
results.append(result)return results
接下来展望三天的股价:
X_test = data1[-1:].valuesfor i in range(3):
results=get_results(X_test)
close= close_model.predict(np.array(results).reshape(1, -1))results.append(close)
X_test= np.array(results).reshape(1, -1)print("5月15日招商银行关盘时的股价为:" + str(round(close[0], 2)))
5月15日招商银行关盘时的股价为:33.44
五、总结
虽然展望效果是如许子,但觉得如许展望好像很菜啊。究竟结果展望的每一个值都邑有误差,多个误差累加起来就很多了,这让我有点畏惧。不晓得存不存在不展望其他值直接展望close的要领,或许说直接展望5月15号的而不消先展望13、14号的要领。虽然我晓得有种算法是时刻序列算法,但不是很懂。愿望哪位大神看了能给我一些发起,指点迷津。
关于一个自学数据剖析的在校学生,苦于没有项目履历,恰好遇上此次的【数据游戏】,能应用此次时机操纵一波真的很不错。
Comment here is closed