手把手:用Python搭建機器學習模型預測黃金價格

大資料文摘發表於2018-02-16

新年總是跟黃金密不可分。新年第一天,讓我們嘗試用python搭建一個機器學習線性迴歸模型,預測金價!

自古以來,黃金一直作為貨幣而存在,就是在今天,黃金也具有非常高的儲藏價值,那麼有沒有可能預測出黃金價格的變化趨勢呢?

答案是肯定的,讓我們使用機器學習中的迴歸演算法來預測世界上貴重金屬之一,黃金的價格吧。

我們將建立一個機器學習線性迴歸模型,它將從黃金ETF (GLD)的歷史價格中獲取資訊,並返回黃金ETF價格在第二天的預測值。

GLD 是最大的以黃金進行直接投資的ETF交易基金。

(詳見:http://www.etf.com/GLD)

在python的開發環境下用機器學習預測黃金價格的步驟:

  • 匯入Python庫並讀取黃金ETF 的資料

  • 定義解釋變數

  • 將資料切分為模型訓練資料集和測試資料集

  • 建立線性迴歸模型

  • 預測黃金ETF的價格

匯入Python庫並讀取黃金 ETF 的資料

首先:匯入實現此策略所需的所有必要的庫(LinearRegression,pandas,numpy,matplotlib,seaborn和fix_yahoo_finance)

# LinearRegression is a machine learning library for linear regression from sklearn.linear_model import LinearRegression # pandas and numpy are used for data manipulation import pandas as pd import numpy as np # matplotlib and seaborn are used for plotting graphs import matplotlib.pyplot as plt import seaborn # fix_yahoo_finance is used to fetch data import fix_yahoo_finance as yf

然後我們讀取過去10年間每天黃金ETF的價格資料,並將資料儲存在Df中。我們移除那些不相關的變數並使用dropna函式刪除NaN值。然後我們繪製出黃金ETF的收盤價格。

# Read data Df = yf.download('GLD','2008-01-01','2017-12-31') # Only keep close columns Df=Df[['Close']] # Drop rows with missing values Df= Df.dropna() # Plot the closing price of GLD Df.Close.plot(figsize=(10,5)) plt.ylabel("Gold ETF Prices") plt.show()

輸出

手把手:用Python搭建機器學習模型預測黃金價格

定義解釋變數

解釋變數是被用來決定第二天黃金ETF價格數值的變數。簡單地說,就是我們用來預測黃金ETF價格的特徵值。本例中的解釋變數是過去3天和9天的價格移動平均值。我們使用dropna()函式刪除NaN值,並將特徵變數存於X中。

然而,你還可以在X中放入更多你認為對於預測黃金ETF價格有用的變數。這些變數可以是技術指標,也可以是另一種ETF的價格(如黃金礦工ETF (簡稱GDX)或石油ETF(簡稱USO))或美國經濟資料。

Df['S_3'] = Df['Close'].shift(1).rolling(window=3).mean() Df['S_9']= Df['Close'].shift(1).rolling(window=9).mean() Df= Df.dropna() X = Df[['S_3','S_9']] X.head()

輸出

手把手:用Python搭建機器學習模型預測黃金價格

定義因變數

同樣,因變數是取決於解釋變數的“被解釋變數”。簡單地說,在這裡就是我們試圖預測的黃金ETF價格。我們將黃金ETF的價格賦值為y。

y = Df['Close'] y.head()

輸出

2008-02-08    91.000000 2008-02-11    91.330002 2008-02-12    89.330002 2008-02-13    89.440002 2008-02-14    89.709999 Name: Close, dtype: float64

將資料切分為模型訓練資料集和測試資料集

在此步驟中,我們將預測變數(解釋變數)資料和輸出(因變數)資料拆分為訓練資料集和測試資料集。訓練資料用於建立線性迴歸模型,將輸入與預期輸出配對。測試資料用於評估模型的訓練效果。

手把手:用Python搭建機器學習模型預測黃金價格

  • 前80%的資料用於訓練模型,其餘的資料用來測試模型。

  • X_train 和y_train是訓練資料集。

  • X_test & y_test是測試資料集。

t=.8 t = int(t*len(Df)) # Train dataset X_train = X[:t] y_train = y[:t]   # Test dataset X_test = X[t:] y_test = y[t:]

建立線性迴歸模型

接下來我們將建立一個線性迴歸模型。什麼是線性迴歸呢?

如果我們試圖捕捉可以最優解釋Y觀測值的X變數和Y變數之間的數學關係,我們將在X的觀測值形成的散點圖中去擬合一條線,那麼這條線,也就是x和y之間的方程就被稱為線性迴歸分析。

手把手:用Python搭建機器學習模型預測黃金價格

再進一步地說,迴歸解釋了因變數在自變數上的變化。因變數y是你想要預測的變數。自變數x是用來預測因變數的解釋變數。下面的迴歸方程描述了這種關係:

Y = m1 * X1 + m2 * X2 + CGold ETF price = m1 * 3 days moving average + m2 * 15 days moving average + c

然後我們利用擬合方法來擬合自變數和因變數(x和y),從而生成係數和迴歸常數。

linear = LinearRegression().fit(X_train,y_train) print "Gold ETF Price =", round(linear.coef_[0],2), \ "* 3 Days Moving Average", round(linear.coef_[1],2), \ "* 9 Days Moving Average +", round(linear.intercept_,2)

輸出

黃金ETF價格=1.2×3天的移動平均價-0.2×9天的移動平均價+0.39

預測黃金ETF的價格

現在,是時候檢查模型是否在測試資料集中有效了。我們使用由訓練資料集建立的線性模型來預測黃金ETF的價格。預測模型可以得到給定解釋變數X後相應的黃金ETF價格(y)。

predicted_price = linear.predict(X_test)   predicted_price = pd.DataFrame(predicted_price,index=y_test.index,columns = ['price'])   predicted_price.plot(figsize=(10,5))   y_test.plot()   plt.legend(['predicted_price','actual_price'])   plt.ylabel("Gold ETF Price")   plt.show()

輸出

手把手:用Python搭建機器學習模型預測黃金價格

圖表顯示了黃金ETF價格的預測值和實際值(藍線是預測值,綠線是實際值)。

現在,讓我們使用score()函式來計算模型的擬合優度。

r2_score = linear.score(X[t:],y[t:])*100   float("{0:.2f}".format(r2_score))

可以看出,模型的R²是95.81%。R²總是在0到100%之間。接近100%的分數表明該模型能很好地解釋黃金ETF的價格。

祝賀你,你剛剛學會了一種基本而又強大的機器學習技巧。

相關文章