学习新知识和新技能的一种好方式是直接使用,在使用的过程中发现问题,解决问题。
为熟悉著名的机器学习开源库 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 学习笔记-线性回归预测股价(一)”的想法;

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据