繼續上一篇,接下來是股票分析中使用線性迴歸html
在現實世界中,存在着大量這樣的狀況:兩個變量例如X和Y有一些依賴關係。由X能夠部分地決定Y的值,但這種決定每每不很確切。經常用來講明這種依賴關係的最簡單、直觀的例子是體重與身高,用Y表示他的體重。衆所周知,通常說來,當X大時,Y也傾向於大,但由X不能嚴格地決定Y。又如,城市生活用電量Y與氣溫X有很大的關係。在夏天氣溫很高或冬天氣溫很低時,因爲室內空調、冰箱等家用電器的使用,可能用電就高,相反,在春秋季節氣溫不高也不低,用電量就可能少。但咱們不能由氣溫X準確地決定用電量Y。相似的例子還不少,變量之間的這種關係稱爲「相關關係」,迴歸模型就是研究相關關係的一個有力工具。python
線性迴歸模型生成一個肯定自變量和因變量之間關係的方程。算法
線性迴歸方程能夠寫成:數組
x1, x2, ....xn表明自變量,係數θ1,θ2,....θn表明權重。函數
使用時間(date)列提取特徵,如- day, month, year, mon/fri等,而後擬合線性迴歸模型。工具
首先按升序對數據集進行排序,而後建立一個單獨的數據集,這樣建立的任何新特性都不會影響原始數據。性能
#setting index as date values 以date做爲索引測試
df['Date'] = pd.to_datetime(df.Date,format='%Y-%m-%d')orm
df.index = df['Date']htm
#sorting 升序排列
data = df.sort_index(ascending=True, axis=0)
#creating a separate dataset 建立一個單獨的數據集
new_data = pd.DataFrame(index=range(0,len(df)),columns=['Date', 'Close'])
#將數據中的date和close都放到一個list中
for i in range(0,len(data)):
new_data['Date'][i] = data['Date'][i]
new_data['Close'][i] = data['Close'][i]
#create features 本身添加一些特徵,同時第三行刪除了一些數據
from fastai.structured import add_datepart
add_datepart(new_data, 'Date')
new_data.drop('Elapsed', axis=1, inplace=True) #elapsed will be the time stamp
這將建立如下特徵:
‘Year’, ‘Month’, ‘Week’, ‘Day’, ‘Dayofweek’, ‘Dayofyear’, ‘Is_month_end’, ‘Is_month_start’, ‘Is_quarter_end’, ‘Is_quarter_start’, ‘Is_year_end’, and ‘Is_year_start’.
注意:我使用了來自fastai庫的add_datepart。若是您沒有安裝它,您能夠簡單地使用命令pip install fastai。您也可使用python中的簡單for循環來建立這些特性。我在下面展現了一個例子。
除此以外,咱們還能夠添加本身的一組特性,咱們認爲這些特性與預測相關。例如,個人假設是,本週的頭幾天和最後幾天對股票收盤價的影響可能遠遠超過其餘日子。所以,我建立了一個特性來識別給定的一天是星期一/星期五仍是星期二/星期三/星期四。這能夠用如下幾行代碼來完成:
new_data['Dayofweek'][i] == 0 表明 週日 (由於數組下標標註都是從0開始的)
new_data['Dayofweek'][i] == 4 表明 週一
mon_fri其實就是一個flag,若是是星期日或星期五,列值將爲1,不然爲0。
new_data['mon_fri'] = 0
for i in range(0,len(new_data)):
if (new_data['Dayofweek'][i] == 0 or new_data['Dayofweek'][i] == 4):
new_data['mon_fri'][i] = 1
else:
new_data['mon_fri'][i] = 0
相似地,您能夠建立多個有助於預測股價的特徵
如今咱們將把數據分紅訓練集和驗證集來檢查模型的性能。
#split into train and validation 分紅訓練集和驗證
train = new_data[:987]
valid = new_data[987:]
#這裏把訓練集和驗證集中的close的列剔除
x_train = train.drop('Close', axis=1)
y_train = train['Close']
x_valid = valid.drop('Close', axis=1)
y_valid = valid['Close']
#implement linear regression 使用sklearn的庫函數構建模型
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x_train,y_train)
#make predictions and find the rmse模型預測,計算rmse
preds = model.predict(x_valid)
rms=np.sqrt(np.mean(np.power((np.array(y_valid)-np.array(preds)),2)))
#這下面兩行是計算結果,可不執行
rms
121.16291596523156
RMSE值高於以前的方法,這清楚地代表線性迴歸的表現不好。讓咱們看看這個圖,並理解爲何線性迴歸預測效果不是很好:
#plot 打印繪圖
valid['Predictions'] = 0
valid['Predictions'] = preds
#下面這兩行顛倒一下會好理解一些,分別取兩個數據集的索引
valid.index = new_data[987:].index
train.index = new_data[:987].index
#打印訓練集中close的部分(以前訓練的時候刪除了),打印測試集中close和預測值
plt.plot(train['Close'])
plt.plot(valid[['Close', 'Predictions']])
線性迴歸是一種簡單的技術,很容易解釋,但也有一些明顯的缺點。
使用迴歸算法的一個問題是,模型過分擬合了日期和月份。模型將考慮一個月前相同日期或一年前相同日期/月的值,而不是從預測的角度考慮之前的值。
從上圖能夠看出,2016年1月和2017年1月,股價出現下跌。該模型預測2018年1月也將如此。
線性迴歸技術能夠很好地解決像大賣場銷售這樣的問題,在這些問題中,獨立的特徵對於肯定目標值是有用的。