top of page
作家相片FastRetrieve.ai

Blog #1: 使用線性迴歸預測台股

已更新:2020年6月16日

閱讀難度:★★☆☆☆


相信對於 AI、機器學習感到陌生的讀者,談到機器學習到底能做什麼?對我的生活可以有什麼幫助?都感到相當好奇吧!


為了帶大家一步步踏進這個神秘的世界,今天這天字第一號的文章,我們將示範非常經典、一般人會有興趣的應用:如何使用線性迴歸模型,對你有興趣的股票做簡單的預測


我們將會依序介紹:

  1. 使用 Yahoo finance 下載股價資訊

  2. 將股價資訊用 matplotlib 做圖、視覺化

  3. 使用 sklearn 套件做線性迴歸


廢話不多說,那就開始吧!

 

第 0 步:載入需要的套件


首先我們要載入所需的套件,包含:科學計算、數據處理、作圖、下載股價和建模。

# 載入需要的套件

### 科學計算、數據處理常用的兩個基礎套件
import numpy as np
import pandas as pd

### 作圖、視覺化的套件
import matplotlib.pyplot as plt
%matplotlib inline

### Yahoo finance 套件,用來下載股價資訊
import fix_yahoo_finance as yf
from pandas_datareader import data as pdr
import datetime

### SciKit-Learn (sklearn) 套件,用來快速、簡單建構基礎模型的套件
import sklearn
from sklearn.linear_model import LinearRegression

其中相當重要的 numpy 套件,也會在 Python+AI 夏令營的機器學習應用班教到歐!想要學習的你還在猶豫什麼,趕緊上課程網站看看:https://www.fastretrieve-ai-course.com/


 

第 1 步:使用 Yahoo finance 套件,下載股價資訊


接著當然是要先把想要的股價資料下載下來啦!但是到各個財經網站去手動下載,實在是不切實際而且又要另外處理資料格式,所以這邊我們就直接使用 Yahoo finance 這個套件,來讓大家 coding 的日子輕鬆一點~


這次我們研究的對象就是大名鼎鼎的台積電股票代碼:2330),時間的話就從 2019/01/01 到 昨天 2020/06/14 吧!

### 設定想要的股票代碼資訊,以及要下載股價資訊的時間範圍
stock_name = '2330.TW'
start = datetime.datetime(2019, 1, 1)
end = datetime.datetime(2020, 6, 14)

### 下載股價資訊
df_full = pdr.get_data_yahoo(stock_name, start=start, end=end).reset_index()
df_full.to_csv(stock_name+'.csv',index=False)

### 看一下前幾筆資料長什麼樣子
df_full.head()

可以看到下載的資料格式,包含有日期、最高最低、開收盤、成交量和調整收盤價這幾個項目。

 

第 2 步:作圖、視覺化股價資訊


有了資料之後,首先該做的就是先拿來分析囉!


畫圖絕對是對人類而言最直觀的方式了,這裡我們除了將原本的價格畫出來之外,也畫了一般股市分析常用的:移動平均線 (Moving Average),可以讓我們觀察在一段時間內,股價的變化!


### 畫出股價資訊 2019/01/01~2020/06/14
df_full.set_index('Date', inplace=True)
df_raw = df_full[df_full.columns[-1]]
df_raw.plot(label=stock_name, figsize=(16,8), title=df_full.columns[-1], grid=True, legend=True)


接著來畫上移動平均線,沒聽過或是不清楚移動平均線沒關係,其實概念很簡單,就是將 k 天內的數值做平均,1 天 1天滾動式的計算,這邊我們就取 k=20 天作為移動的基本單位。


### 畫出移動平均線,每 20 天為一個移動單位
window = 20
df_MA = df_full[df_full.columns[-1]].rolling(window).mean()
df_raw.plot(label=stock_name, figsize=(16,8), title=df_full.columns[-1], grid=True, legend=True)
df_MA.plot(label=stock_name+'_MA', figsize=(16,8), title=df_full.columns[-1], grid=True, legend=True)

仔細看圖可以發現,橘色的移動平均線,前面幾天怎麼沒有東西呢?這是因為前面 19 天還不夠以 20 天作為單位來計算出一個值,不過初始值的做法,在每個地方可能有一些差異,因為不是今天的重點,這邊就先不深入討論了!


 

第 3 步:使用 sklearn 套件做線性迴歸模型的訓練和預測


在開始訓練之前,要特別注意時序資料使用上的一個小細節


常理來說,我們應該是只能拿前一天或歷史的股價資訊,來預測當下或是未來的股價

所以這邊我們 X 只拿第 1 天到第 N-1 天,而 y 則取第 2 天到第 N 天。


如此來做模型的訓練和預測,才不會落入時間的謬誤裡面!(拿現在預測現在或是提前使用未來的資料)


首先我們先將要用來訓練、測試的 X, y 準備好,一般會以一個比例切分,這邊我們就用 80% 做訓練,20%做測試吧!

### X 只拿第 1 天到第 N-1 天,而 y 則取第 2 天到第 N 天
df_X = df_full.iloc[:-1,:-1]
df_y = df_full.iloc[1:,-1]

X = df_X.to_numpy() 
y = df_y.to_numpy() 

### 訓練/測試的資料分割,以前 80% 的天數資料做訓練,後 20% 來做測試
num_data = df_X.shape[0]
split_ratio = 0.8
ind_split = int(split_ratio * num_data)

X_train = X[:ind_split]
y_train = y[:ind_split].reshape(-1,1)
X_test = X[ind_split:]
y_test = y[ind_split:].reshape(-1,1)

split_time = df_X.index[ind_split]

再來建立線性迴歸模型,並且訓練模型,預測未來股價!

# 建立線性迴歸模型
### 訓練模型
reg_linear = LinearRegression()
reg_linear.fit(X_train, y_train)

### 將訓練好的模型,用來做預測
trainings = reg_linear.predict(X_train).reshape(-1,1)
predictions = reg_linear.predict(X_test).reshape(-1,1)

### 將預測結果合在一起
all_pred = np.concatenate((trainings, predictions), axis=0)

### 計算方均根差
train_rmse = np.sqrt(1/X_train.shape[0]*np.squeeze(np.dot((trainings - y_train).T, (trainings - y_train))))
test_rmse = np.sqrt(1/X_test.shape[0]*np.squeeze(np.dot((predictions - y_test).T, (predictions - y_test))))

print("Training RMSE is: %f" % train_rmse)
print("Testing RMSE is: %f" % test_rmse)
Training RMSE is: 4.850907
Testing RMSE is: 9.213288

可以看到訓練資料的方均根差大約是 4.85,而測試資料的方均根差仍偏高約是 9.21,由此可見,未來可不是用這麼簡單的模型,就能讓你輕鬆預測的啊


 

第 4 步:將模型訓練結果作圖,看看效果如何


訓練完模型後,當然要看看我們的模型效果怎麼樣摟,Let's 畫!


### 將預測和真實的股價,放進 df_linear 以便做圖
df_linear = pd.DataFrame(all_pred, columns=['Linear '+df_full.columns[-1]], index=df_y.index)
df_linear[df_full.columns[-1]] = y

### 畫出結果
df_linear.plot(figsize=(16,8), title=df_full.columns[-1], grid=True, legend=True, color=['r','C0'])
plt.axvline(pd.Timestamp(split_time),color='orange')


從圖上可以看到,紅色線是我們線性迴歸模型預測的結果。


在橘色直線時間點之前,是有參與訓練的資料,看起來和真實資料藍色線較為靠近


而橘色直線時間點之後,是完全沒參與訓練,只用來做測試的資料,雖然較為偏離藍色線,但是可以看到趨勢竟然跟真實股價還蠻接近的呢!


 

結論:


恭喜你學會如何使用線性迴歸模型,對你有興趣的股票做簡單的預測


在這次的實作中,我們示範如何將台股的資料下載,並使用線性迴歸模型做訓練、預測


第一眼看起來的預測結果好像有這麼一回事,不過實際上如果要拿來賺錢可還是差得遠呢(汗


不過沒關係,隨著你跟著我們一起在機器學習、深度學習的領域中學習,相信你就可以掌握越來越多的知識與技巧。


或許有一天你能靠自己寫出可以賺錢的自動交易操作策略也說不定呦!


如果想在 2020年暑假和我們一起學習,請參考課程網站:https://www.fastretrieve-ai-course.com/



有任何問題歡迎聯絡我們:



3,405 次查看0 則留言

最新文章

查看全部

Comments


bottom of page