机器学习/Sklearn 学习笔记-线性回归预测股价(一)
学习新知识和新技能的一种好方式是直接使用,在使用的过程中发现问题,解决问题。
为熟悉著名的机器学习开源库 sklearn 的基本使用,尝试用其预测股价。广义线性回归相对简单,就先用最简单的方式来上手。
依据历史开盘价,收盘价,最高价,最低价,成交量信息来预测未来的收盘价
一、 获取需要的数据
股票的历史价格很好获取,有tushare,baostock,quandl,wind,也可以直接解析股票交易软件如通达信、同花顺的数据文件。
#使用quandl 获取Google股票的历史信息
#pip install quandl
import quandl
df = quandl.get('WIKI/GOOGL')
获取的数据包含一些我们暂时用不上的信息,提取我们需要的信息。
# 查看获取的信息的前五行
print(df.head())
Open High Low Close Volume Ex-Dividend \
Date
2004-08-19 100.01 104.06 95.96 100.335 44659000.0 0.0
2004-08-20 101.01 109.08 100.50 108.310 22834300.0 0.0
2004-08-23 110.76 113.48 109.05 109.400 18256100.0 0.0
2004-08-24 111.24 111.60 103.57 104.870 15247300.0 0.0
2004-08-25 104.76 108.00 103.88 106.000 9188600.0 0.0
Split Ratio Adj. Open Adj. High Adj. Low Adj. Close \
Date
2004-08-19 1.0 50.159839 52.191109 48.128568 50.322842
2004-08-20 1.0 50.661387 54.708881 50.405597 54.322689
2004-08-23 1.0 55.551482 56.915693 54.693835 54.869377
2004-08-24 1.0 55.792225 55.972783 51.945350 52.597363
2004-08-25 1.0 52.542193 54.167209 52.100830 53.164113
Adj. Volume
Date
2004-08-19 44659000.0
2004-08-20 22834300.0
2004-08-23 18256100.0
2004-08-24 15247300.0
2004-08-25 9188600.0
# 提取需要的列
df1 = df[['Adj. Open','Adj. High', 'Adj. Low', 'Adj. Close', 'Adj. Volume']].copy()
print(df1.tail())
Adj. Open Adj. High Adj. Low Adj. Close Adj. Volume
Date
2018-03-21 1092.57 1108.70 1087.21 1094.00 1990515.0
2018-03-22 1080.01 1083.92 1049.64 1053.15 3418154.0
2018-03-23 1051.37 1066.78 1024.87 1026.55 2413517.0
2018-03-26 1050.60 1059.27 1010.58 1054.09 3272409.0
2018-03-27 1063.90 1064.54 997.62 1006.94 2940957.0
二、 训练线性回归模型
我们要让机器预测未来5天的收盘价,就需要告诉机器一个准确率是100%的预测模型的输入输出是什么样子。当然我们知道不可能有准确率是100%的预测模型,
但是我们需要告诉机器我们理想中的模型能够从什么样的已知条件中给出什么样的结论。
#将收盘价前移5天
df1['predict'] = df1['Adj. Close'].shift(-5)
#删除没有预测值的行
df1.dropna(inplace = True)
print('----------------------------------------------------------------------------')
print(df1.tail(10))
----------------------------------------------------------------------------
Adj. Open Adj. High Adj. Low Adj. Close Adj. Volume predict
Date
2018-02-28 1122.00 1127.65 1103.00 1103.92 2431023.0 1115.04
2018-03-01 1109.54 1111.27 1067.29 1071.41 2766856.0 1129.38
2018-03-02 1057.98 1086.89 1050.11 1084.14 2508145.0 1160.84
2018-03-05 1078.13 1101.18 1072.27 1094.76 1432369.0 1165.93
2018-03-06 1102.10 1105.63 1094.50 1100.90 1169068.0 1139.91
2018-03-07 1092.82 1116.20 1089.91 1115.04 1537429.0 1148.89
2018-03-08 1117.20 1131.44 1117.20 1129.38 1510478.0 1150.61
2018-03-09 1139.50 1161.00 1134.29 1160.84 2070174.0 1134.42
2018-03-12 1165.05 1178.16 1159.20 1165.93 2129297.0 1100.07
2018-03-13 1171.83 1178.00 1134.57 1139.91 2129435.0 1095.80
现在我们得到了理想模型的输入输出的一些采样。我们假装不知道这个理想的模型存不存在。我们还要天真地假设这个理想模型就是y=Ax+b这种简单的线性模型。在这个例子中,x是长度为5的列向量,y和b是标量,A是长度为5的向量。我们让sklearn 帮我们从我们得到的采样中,算出A是多少,b是多少。
known = df1.drop('predict',axis=1)
predict = df1['predict']
reg = linear_model.LinearRegression()
reg.fit(known,predict)
print(f"A={reg.coef_}")
print(f"b={reg.intercept_}")
A=[-1.86094967e-01 2.29712844e-01 1.64598669e-01 7.92392545e-01
-8.51830115e-08]
b=1.7962771118304772
现在sklearn 确实给出了A和b,但是这个模型到底怎么样呢?研究机器学习和统计的科学家们已经帮我们想出了评价一个模型是否准确的方法,我们就拿用吧。
print(f"Score={reg.score(known,predict)}")
Score=0.9959753984668108
这个Score 有个专业名字叫可决系数。它的最大值为1,越接近1,就代表我们的模型越可能是有效的,记住只是可能。
三、使用和评估模型
Sklearn的score很接近1,貌似很有效。我们这么容易就发现了发家致富的捷径,先用用试试。
print(f"Predict={reg.predict(known[-5:])}\nFact={predict[-5:]}")
Predict=[1117.64960749 1132.47053847 1162.8049165 1170.12045712 1144.14984821]
Fact=Date
2018-03-07 1148.89
2018-03-08 1150.61
2018-03-09 1134.42
2018-03-12 1100.07
2018-03-13 1095.80
Name: predict, dtype: float64
差距还是很大嘛。如果用这个模型来指导我们的交易,肯定要亏得裤衩都不剩。
1 对 “机器学习/Sklearn 学习笔记-线性回归预测股价(一)”的想法;