近年來,隨着全球經濟與股市的快速發展,股票投資成爲人們最經常使用的理財方式之一。本文研究的主要目標是利用機器學習技術,應用Python編程語言構建股票預測模型,對我國股票市場進行分析與預測。html
今天主要來回顧的是 移動平均 參考機器之心的文章,對代碼進行了中文的解釋,同時加入了本身的看法編程
首先來處理一下數據,選用的是來自塔塔飲料的數據集,獲取數據的方式能夠查看 傳送門app
#import packages 導入pandas、numpy庫機器學習
import pandas as pd編程語言
import numpy as np學習
#to plot within notebook 繪圖的庫,若是不是在jupytor裏面運行的話第二行能夠省略ui
import matplotlib.pyplot as pltspa
%matplotlib inline3d
#setting figure size設定畫布大小orm
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 20,10
#for normalizing data 數據歸一化
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
#read the file 讀取文件夾,注意這裏的數據集要放在同一個文件夾下面
df = pd.read_csv('NSE-TATAGLOBAL(1).csv')
#print the head 打印數據前幾行
df.head()
能夠觀察到數據集中有多個變量——日期(date)、開盤價(open)、最高價(high)、最低價(low)、最後交易價(last)、收盤價(close)、總交易額(total_trade_quantity)和營業額(turnover)。
開盤價和收盤價表明股票在某一天交易的起始價和最終價。
最高價、最低價和最後交易價表示當天股票的最高價、最低價和最後交易價格。
交易總量是指當天買賣的股票數量,而營業額(Lacs)是指某一特定公司在某一特定日期的營業額。
要注意的另外一點是,市場在週末和公共假期休市。注意上表缺失了一些日期值——2/10/201八、6/10/201八、7/10/2018。其中2號是國慶節,6號和7號是週末。
損益的計算一般由股票當日的收盤價決定,所以咱們將收盤價做爲目標變量。讓咱們畫出目標變量來理解它在咱們的數據集中的分佈:
#setting index as date 把date這一列做爲索引
df['Date'] = pd.to_datetime(df.Date,format='%Y-%m-%d')
df.index = df['Date']
#plot 打印收盤價(按照上面的索引來)
plt.figure(figsize=(16,8))
plt.plot(df['Close'], label='Close Price history')
接下來探索這些變量,並使用移動平均技術來預測股票的每日收盤價。
取黃色的部分的平均值做爲黃色的下一個的預測,以後扔掉最開始的,把預測的上,繼續預測再下一個區域,能夠理解爲一個固定的窗口的滑動,每次取窗口內的a v g,預測窗口後一個的值
第一步是建立一個只包含日期和收盤價列的數據框,而後將其拆分爲訓練集和驗證集來驗證咱們的預測。
#creating dataframe with date and the target variable建立一個只包含日期和收盤價列的數據框
data = df.sort_index(ascending=True, axis=0)
new_data = pd.DataFrame(index=range(0,len(df)),columns=['Date', 'Close'])
# 將全部日期和收盤價列的數據放到一個list中來
for i in range(0,len(data)):
new_data['Date'][i] = data['Date'][i]
new_data['Close'][i] = data['Close'][i]
在將數據分割爲訓練和驗證時,咱們不能使用隨機分割,由於這會破壞時間順序。將去年的數據做爲驗證集,將以前4年的數據做爲訓練集。
#splitting into train and validation 數據分割爲訓練和驗證集
train = new_data[:987]
valid = new_data[987:]
# 查看數據的狀況(規模),和訓練自己無關,可不執行
new_data.shape, train.shape, valid.shape
((1235, 2), (987, 2), (248, 2))
# 查看數據的狀況(最大最小值),和訓練自己無關,可不執行
train['Date'].min(), train['Date'].max(), valid['Date'].min(), valid['Date'].max()
(Timestamp('2013-10-08 00:00:00'),
Timestamp('2017-10-06 00:00:00'),
Timestamp('2017-10-09 00:00:00'),
Timestamp('2018-10-08 00:00:00'))
下一步是爲驗證集建立預測值,並使用真實值來檢查RMSE偏差。
#make predictions 爲驗證集建立預測值
preds = []
for i in range(0,248):
a = train['Close'][len(train)-248+i:].sum() + sum(preds)
b = a/248
preds.append(b)
#calculate rmse 計算RMSE偏差。
rms=np.sqrt(np.mean(np.power((np.array(valid['Close'])-preds),2)))
rms
104.51415465984348
僅僅檢查RMSE並不能幫助咱們評估模型預測效果的。讓咱們經過作圖獲得更直觀的理解。下面是預測值和實際值的曲線圖。
#plot 畫出訓練的數據(綠線)、預測值(藍線)與訓練集的觀測值(橙線)
#對於第一行的做用爲何是0不是很理解,若是有知道的大佬麻煩留言處指點迷津
valid['Predictions'] = 0
valid['Predictions'] = preds
plt.plot(train['Close'])
plt.plot(valid[['Close', 'Predictions']])
RMSE值接近105,可是結果不是很理想(從圖中能夠看出)。預測值與訓練集的觀測值的範圍相同(開始有上升趨勢,而後緩慢降低)。