当前位置:   article > 正文

基于线性回归的股票预测(scikit-learn)

基于线性回归的股票预测
  1. #线性回归算法一般用于解决”使用已知样本对未知公式参数的估计“类问题
  2. #获取数据
  3. # 股票数据特征:开盘价(Open)、最高价(High)、最低价(Low)、收盘价(Close)、交易额(Volume)
  4. # 及调整后的开盘价(Adj. Open)、最高价(Adj. High)、最低价(Adj. Low)、收盘价(Adj. Close)、交易额(Adj. Volume)
  5. #数据预处理
  6. #除权后的数据更能反映数据特征,选择调整后的数据为主要使用的数据特征
  7. #两个数据特征:HL_PCT(股票最高价与最低价变化百分比)、PCT_change(股票收盘价与最低价的变化百分比)
  8. #自变量为:Adj.Close、HL_PCT、PCT_change、Adj.Volume
  9. #因变量为:Adj.Close
  10. import quandl
  11. from sklearn import preprocessing
  12. df = quandl.get('WIKI/GOOGL')
  13. # df = quandl.get('WIKI/AAPL')
  14. # print(df)
  15. import math
  16. import numpy as np
  17. #定义预测列变量,存放研究对象的标签名
  18. forecast_col = 'Adj. Close'
  19. #定义预测天数,这里设置为所有数据量长度的1%
  20. forecast_out = int(math.ceil(0.01*len(df)))
  21. #只用到df中的下面几个字段
  22. df = df[['Adj. Open','Adj. High','Adj. Low','Adj. Close','Adj. Volume']]
  23. #构造两个新列
  24. df['HL_PCT'] = (df['Adj. High']-df['Adj. Close'])/df['Adj. Close']*100.0
  25. df['PCT_change'] = (df['Adj. Close']-df['Adj. Open'])/df['Adj. Open']*100.0
  26. #真正用到的特征
  27. df = df[['Adj. Close','HL_PCT','PCT_change','Adj. Volume']]
  28. #处理空值,这里设置为-99999
  29. df.fillna(-99999, inplace=True)
  30. #label代表预测结果,通过让Adj. Close列的数据往前移动1%行来表示
  31. df['label'] = df[forecast_col].shift(-forecast_out)
  32. #生成在模型中使用的数据X,y,以及预测时用到的数据X_lately
  33. X = np.array(df.drop(['label'],1))
  34. X = preprocessing.scale(X)
  35. #上面生成的label列时留下的最后1%行的数据,这些行并没有label 数据,用作预测时用到的输入数据
  36. X_lately = X[-forecast_out:]
  37. X = X[:-forecast_out]
  38. #抛弃label列中为空的那些行
  39. df.dropna(inplace=True)
  40. y = np.array(df['label'])
  41. from sklearn import model_selection,svm
  42. from sklearn.linear_model import LinearRegression
  43. #先把X,y数据分成两部份,训练和测试
  44. X_train,X_test,y_train,y_test = model_selection.train_test_split(X,y,test_size=0.2)
  45. #生成线性回归对象
  46. clf = LinearRegression(n_jobs=-1)
  47. #开始训练
  48. clf.fit(X_train,y_train)
  49. #用测试数据评估准确性
  50. accuracy = clf.score(X_test,y_test)
  51. #进行预测
  52. foreca_set = clf.predict(X_lately)
  53. print(foreca_set,accuracy)
  54. import matplotlib.pyplot as plt
  55. from matplotlib import style
  56. import datetime
  57. #修改matplotlib样式
  58. style.use('ggplot')
  59. one_day = 86400
  60. #在df中新建Forecast列,用于存放预测结果的数据
  61. df['Forecast'] = np.nan
  62. #取df最后一行的时间索引
  63. last_date = df.iloc[-1].name
  64. last_unix = last_date.timestamp()
  65. next_unix = last_unix+one_day
  66. #遍历预测结果,用它向df中追加行
  67. for i in foreca_set:
  68. next_date = datetime.datetime.fromtimestamp(next_unix)
  69. next_unix+=one_day
  70. # [np.nan for _ in range(len(df.columns)-1)]生成不包含Forecast字段的列表
  71. #而[i]是只包含Forecast字段的列表
  72. #拼在一起组成新行,按日期追加到df下面
  73. df.loc[next_date] = [np.nan for _ in range(len(df.columns)-1)]+[i]
  74. #绘图
  75. df['Adj. Close'].plot()
  76. df['Forecast'].plot()
  77. plt.legend(loc=4)
  78. plt.xlabel('Date')
  79. plt.ylabel('Price')
  80. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/906917
推荐阅读
相关标签
  

闽ICP备14008679号