有沒有可能通過機器學習預測股價走勢?
如果給定一組股價數據集我們是不是有可能預測出未來的股價走勢?從機器學習的角度來說,預測股價走勢就是一個數據科學問題,但從有效市場理論來說,股票市場因為受眾多因素影響是隨機的和不可預測的。
在本文中我們將嘗試使用三種不同的模型來預測蘋果公司的股價,并且我們會把這三種模型的結果繪制在一張圖上以進行比較。因此,本文主要將分為如下四部分:
安裝依賴項
收集數據
編寫模型腳本
可視化分析
下面是本實現所需要的四個依賴項:
pip install csv
pip install numpy
pip install scikit-learn
pip install matplotlib
其中,CSV 允許我們從股價 CSV 格式的文件中讀取數據,Numpy 允許我們在數據集上執行計算,而 sikit-learn 允許我們構建預測模型,當然最后我們還需要使用 matplotlib 繪制數據點和模型曲線,因此我們才能進行可視化分析。
下面,首先需要從 Google Finance 下載數據集,我們可以在如下搜索框鍵入「NASDAQ:AAPL」,在點擊左側的歷史數據后選擇下載。
下面我們需要寫模型,首先我們要導入函數庫,小編使用的是 Jupyter notebook,上面四個包是 Anaconda 預安裝的,所以直接導入并沒有報錯。
import csv
import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt
下面則是定義變量和讀取數據的函數 get_data():
dates = []
prices = []
def get_data(filename):
with open(filename, 'r') as csvfile:
csvFileReader = csv.reader(csvfile)
next(csvFileReader)
for row in csvFileReader:
dates.append(int(row[0].split('-')[0]))
prices.append(float(row[1]))
return
在上面的代碼中,我們首先需要初始化兩個空列表,即 dates 和 prices。下面我們需要構建 get_data() 以讀取股票數據并存入變量中,其中 filename 就是我們所下載的數據集名稱。在這個函數中,我們需要打開 CSV 格式的文件,讀取并儲存在 CSV 文件變量中。Open() 函數代表抽取文件內容,其中'r'代表讀取操作。如上所示,我們在使用 csv.reader() 讀取 csv 文件變量后將其賦予 csvFileReader 變量。并且隨后采用一個循環語句對于 csv 文件的每一行,將日期和價格分別添加到我們前面所定義的變量中,python 中的 append 方法會在列表尾部添加一個新元素。而 Python 中的 split() 方法通過指定分隔符對字符串進行切片,在本文的語句中 row[0].split('-')[0] 代表 csv 文件每行的第一元素以'-'為標準進行分割,并且只取分割后的第一個元素,也就是每個月的哪一天。
def predict_prices(dates, prices, x):
dates = np.reshape(dates, (len(dates), 1))
svr_lin = SVR(kernel= 'linear', C=1e3)
svr_poly = SVR(kernel= 'poly', C=1e3, degree= 2)
svr_rbf = SVR(kernel= 'rbf', C=1e3, gamma=0.1)
svr_lin.fit(dates, prices)
svr_poly.fit(dates, prices)
svr_rbf.fit(dates, prices)
如上所示的代碼,下面我們需要構建預測模型。首先需要使用 Numpy 將列表元素轉換為 n*1 的矩陣,其中 reshape 函數的三個參數分別代表所要重塑的列表元素、長度為列表元素的個數、并且為 1*n 維矩陣,n 的值等于我們數據量的大小。下面我們創建出三種支持向量機模型。
支持向量機是一種強大的分類模型,它試圖在保留最大間隔的條件下尋找決策邊界并將數據分割出來,然后模型根據決策邊界對新數據進行預測。SVM 同樣可以用于回歸任務,支持向量回歸同樣也是一種 SVM 模型,它將數據點間的間隔作為誤差以預測最可能出現的下一個數據點。
plt.scatter(dates,
prices,
color="black",
label="Data")
plt.plot(dates,
svr_rbf.predict(dates),
color="red",
label="RBF Model")
plt.plot(dates,
svr_lin.predict(dates),
color="green",
label='linear Model')
plt.plot(dates,
svr_poly.predict(dates),
color="blue",
label="Ploynomial Model")
plt.xlabel('Dates')
plt.ylabel('Price')
plt.title('Support Vector Reg')
plt.legend()
plt.show()
return svr_rbf.predict(x)[0], svr_lin.predict(x)[0], svr_poly.predict(x)[0]
get_data('aapl.csv')
predicted_prices = predict_prices(dates, prices, 29)
print(predicted_prices)
隨后我們可以創建圖表,我們可以將初始數據點表示為黑點,不同的模式使用不同顏色的曲線表示。如上所示,我們在使用 plot() 函數時,因為要在一張圖上繪制所有的信息,所以我們需要將所有信息繪制完成后在 plot.show() 展示圖像。其中 plt.scatter() 表示繪制散點圖,而 plt.plot() 表示繪制連線圖。在繪制模型曲線時,我們需要調用前面使用 scikit-learn 訓練的模型預測器,比如說 svr_lin.fit(dates, prices) 代表使用數據擬合線性支持向量回歸,而后面需要調用這一模型進行預測就需要使用 svr_lin.predict(dates),其代表著調用模型對變量 datas 中的數據進行預測。
下面展示了這三個模型所繪制出的可視化圖表。