如何預測股票分析--移動平均

近年來,隨着全球經濟與股市的快速發展,股票投資成爲人們最經常使用的理財方式之一。本文研究的主要目標是利用機器學習技術,應用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,可是結果不是很理想(從圖中能夠看出)。預測值與訓練集的觀測值的範圍相同(開始有上升趨勢,而後緩慢降低)。

參考:https://www.jiqizhixin.com/articles/2019-01-04-16

相關文章
相關標籤/搜索