Python數據挖掘與機器學習實戰——3.5 基於線性迴歸的股票預測

3.5 基於線性迴歸的股票預測

1.數據獲取

我們需要的數據集要通過quandl包獲取,Anaconda 3並未默認安裝quandl,

需要我們打開Anaconda prompt輸入“pip install quandl”進行安裝。

通過quandl包可以獲取到股票數據

股票特徵數據包括:

Open(開盤價)、High(最高價)、Low(最低價)、Close(收盤價)、Volume(交易額)

Adj. Open(調整後開盤價)、Adj. Low(調整後最低價)、Adj. Close(調整後收盤價)、Adj. Volume(調整後交易額)等數據。

import quandl
# 我們需要的數據集要通過quandl包獲取
# 安裝新的包,需要打開anaconda prompt輸入“pip install quandl”進行安裝
# Anaconda3中添加quandl庫的方法:
#(1)開始——Anaconda——打開Anaconda Prompt
#(2)輸入pip install quandl(自動安裝)
#(3)輸入conda list,檢查有無quandl,有則成功
# 關於quandl包可以參考https://zhuanlan.zhihu.com/p/41063833
# 通過prompt安裝其他包也是同理
from sklearn import preprocessing
#df = quandl.get('WIKI/GOOGL')  #先註釋這一行,預測Google股票時再啓用
df = quandl.get('WIKI/AAPL')
print(df)


# 輸出結果如下:
              Open    High     Low  ...    Adj. Low  Adj. Close  Adj. Volume
Date                                ...                                     
1980-12-12   28.75   28.87   28.75  ...    0.422706    0.422706  117258400.0
1980-12-15   27.38   27.38   27.25  ...    0.400652    0.400652   43971200.0
1980-12-16   25.37   25.37   25.25  ...    0.371246    0.371246   26432000.0
1980-12-17   25.87   26.00   25.87  ...    0.380362    0.380362   21610400.0
1980-12-18   26.63   26.75   26.63  ...    0.391536    0.391536   18362400.0
...            ...     ...     ...  ...         ...         ...          ...
2018-03-21  175.04  175.09  171.26  ...  171.260000  171.270000   35247358.0
2018-03-22  170.00  172.68  168.60  ...  168.600000  168.845000   41051076.0
2018-03-23  168.39  169.92  164.94  ...  164.940000  164.940000   40248954.0
2018-03-26  168.07  173.10  166.44  ...  166.440000  172.770000   36272617.0
2018-03-27  173.68  175.15  166.92  ...  166.920000  168.340000   38962839.0

[9400 rows x 12 columns]

可以看到獲取到AAPL公司股票數據是9400行*12列的

2.數據預處理

由於帶Adj.前綴的數據是除權後的數據,更能反映數據特徵,所以主要使用的特徵數據爲:

Adj. Open(調整後開盤價)、Adj. Low(調整後最低價)、Adj. Close(調整後收盤價)、Adj. Volume(調整後交易額)

爲了方便數據分析,我們新建兩個特徵數據如下:

HL_PCT爲股票最高價與最低價的變化百分比

HL_PCT = (Adj. High- Adj. Close) / Adj. Close * 100%

PCT_change爲股票收盤價與開盤價的變化百分比

PCT_change = (Adj. Close - Adj. Open) / Adj. Open * 100%

我們以Adj. Close(調整後收盤價)、HL_PCT、PCT_change、Adj. Volume(調整後交易額)作爲自變量

以Adj. Close(除權後的收盤價)爲因變量(也就是我們要預測的值)。

最後,對自變量數據進行規範化處理,只是服從正態分佈。(執行一下語句即可處理)

X = preprocessing.scale(X)

然後使用Sklearn做線性迴歸,建立線性迴歸模型,進行線性模擬,

使用predict()函數對需要預測的數據進行預測,模型評估主要使用精度(accuracy)參數。調用線性模型中的精度評估參數score()。

from sklearn.linear_model import LinearRegression
# 生成scikit-learn的線性迴歸對象
clf = LinearRegression(n_jobs=-1)
# 開始訓練
clf.fit(X_train, y_train)
# 進行預測
forecast_set = clf.predict(X_lately)
# 用測試數據評估準確性
accuracy = clf.score(X_test, y_test)

3.編碼實現

import quandl
# 我們需要的數據集要通過quandl包獲取
# 安裝新的包,需要打開anaconda prompt輸入“pip install quandl”進行安裝
# Anaconda3中添加quandl庫的方法:
#(1)開始——Anaconda——打開Anaconda Prompt
#(2)輸入pip install quandl(自動安裝)
#(3)輸入conda list,檢查有無quandl,有則成功
# 關於quandl包可以參考https://zhuanlan.zhihu.com/p/41063833
# 通過prompt安裝其他包也是同理
from sklearn import preprocessing
#df = quandl.get('WIKI/GOOGL')  #先註釋這一行,預測Google股票時再啓用
df = quandl.get('WIKI/AAPL')

import math
import numpy as np
# 定義預測列變量,它存放研究對象的標籤名
forecast_col = 'Adj. Close'
# 定義預測天數,這裏設置爲所有數據量長度的1%
forecast_out = int(math.ceil(0.01*len(df)))
# 只用到df中下面的幾個字段
df = df[['Adj. Open', 'Adj. High', 'Adj. Low', 'Adj. Close', 'Adj. Volume']]
# 構造兩個新的列
# HL_PCT爲股票最高價與最低價的變化百分比
df['HL_PCT'] = (df['Adj. High'] - df['Adj. Close']) / df['Adj. Close'] * 100.0
# PCT_change爲股票收盤價與開盤價的變化百分比
df['PCT_change'] = (df['Adj. Close'] - df['Adj. Open']) / df['Adj. Open'] * 100.0
# 下面爲真正用到的特徵字段
df = df[['Adj. Close', 'HL_PCT', 'PCT_change', 'Adj. Volume']]
# 因爲scikit-learn並不會處理空數據,需要把爲空的數據都設置爲一個比較難出現的值,這裏取-9999,
df.fillna(-99999, inplace=True)
# 用label代表該字段,是預測結果
# 通過讓與Adj. Close列的數據往前移動1%行來表示
df['label'] = df[forecast_col].shift(-forecast_out)
# 最後生成真正在模型中使用的數據X和y和預測時用到的數據數據X_lately
X = np.array(df.drop(['label'], 1))
X = preprocessing.scale(X)
# 上面生成label列時留下的最後1%行的數據,這些行並沒有label數據,因此我們可以拿他們作爲預測時用到的輸入數據
X_lately = X[-forecast_out:]
X = X[:-forecast_out]
# 拋棄label列中爲空的那些行
df.dropna(inplace=True)
y = np.array(df['label'])
# scikit-learn從0.2版本開始廢棄cross_validation,改用model_selection
from sklearn import  model_selection, svm
from sklearn.linear_model import LinearRegression
# 開始前,先X和y把數據分成兩部分,一部分用來訓練,一部分用來測試
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.2)
# 生成scikit-learn的線性迴歸對象
clf = LinearRegression(n_jobs=-1)

# 開始訓練
clf.fit(X_train, y_train)
# 用測試數據評估準確性
accuracy = clf.score(X_test, y_test)

# 進行預測
forecast_set = clf.predict(X_lately)
print(forecast_set, accuracy)
import matplotlib.pyplot as plt
from matplotlib import style
import datetime
# 修改matplotlib樣式
style.use('ggplot')
one_day = 86400
# 在df中新建Forecast列,用於存放預測結果的數據
df['Forecast'] = np.nan
# 取df最後一行的時間索引
last_date = df.iloc[-1].name
last_unix = last_date.timestamp()
next_unix = last_unix + one_day
# 遍歷預測結果,用它往df追加行
# 這些行除了Forecast字段,其他都設爲np.nan
for i in forecast_set:
    next_date = datetime.datetime.fromtimestamp(next_unix)
    next_unix += one_day
    # [np.nan for _ in range(len(df.columns) - 1)]生成不包含Forecast字段的列表
    # 而[i]是隻包含Forecast值的列表
    # 上述兩個列表拼接在一起就組成了新行,按日期追加到df的下面
    df.loc[next_date] = [np.nan for _ in range(len(df.columns) - 1)] + [i]

# 開始繪圖
df['Adj. Close'].plot()
df['Forecast'].plot()
plt.legend(loc=4)
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()

4.結果分析

運行代碼可以得到下圖。

對GOOGL股票預測精度爲:0.9790193056600901,表明預測較好

對AAPL股票預測精度爲:0.9757872096045515,表明預測較好


可以一起看下這篇文章,寫的很不錯,推薦下:

https://www.jianshu.com/p/e6b7a61fd63d

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章