文章的做法是參考Time Series Forecasting,有興趣了解詳情的人,可前往參考。
使用Time Series進行預測,基本上採用上列網址所描述的方法:
- Variance stabilization and trend removal
- Target normalization
- Lagged attribute selection
資料來源:台灣証券交易所每日個股成交行情。
我選擇使用1326台化,資料範圍:2001/4/26 ~2011/5/26,計2,500筆資料。(再重申一遍,只是純綷個人選擇與熟悉Oracle Database Data Mining)我想要預測的目標值為當日最低價格。
依據網址所提供步驟,需要將資料進行1. Variance stabilization and trend removal; 2. Target normalization
建立 View tw1326_xfrm1
CREATE VIEW tw1326_xfrm1 AS
SELECT a.*
FROM (SELECT tx_date, lowest,
tp - LAG(tp,1) OVER (ORDER BY tx_date) tp
FROM (SELECT tx_date, lowest,
tp - LAG(tp,1) OVER (ORDER BY tx_date) tp
FROM (SELECT tx_date, lowest, LOG(10,lowest) tp
FROM tw1326))) a;
在建立Normalized View需要先知道AVG與STDDEV
select avg(tp), STDDEV(TP) from tw1326_xfrm1;
AVG =-0.00000159300346119353465928925527311818673339
STDDEV= 0.0113938809872619115175711395449817433574
提供經過LOG Transformation之後的圖
經過First order differencing after log transformation的圖
轉化成Normalized Table/View
我是利用SQL Developer 的 Data Miner來做Transform的設定,我選用Z-score
其結果的分佈圖如下:
個人覺得,這個部分應該是最難的部分了。因為週期的長短會決定模型與其最後的預測準確度,當然週期愈長,所需要計算的時間也愈長。
使用已Normalized Table/View計算correlation
依原作者的方式,建立XCORR procedure
關於LAG,我選了2,500(所有資料
所有2,500個時間點
只看前面365個時間點
再看少一些的點:180個時間點
90個時間點
以下為建立 TW1326_LAG View
CREATE VIEW tw1326_lag AS
SELECT a.*
FROM (SELECT TX_DATE, LOWEST, TP_NORM,
LAG(TP_NORM, 1) OVER (ORDER BY TX_DATE) L1,
LAG(TP_NORM, 2) OVER (ORDER BY TX_DATE) L2,
LAG(TP_NORM, 3) OVER (ORDER BY TX_DATE) L3,
LAG(TP_NORM, 4) OVER (ORDER BY TX_DATE) L4,
LAG(TP_NORM, 5) OVER (ORDER BY TX_DATE) L5,
LAG(TP_NORM, 6) OVER (ORDER BY TX_DATE) L6,
LAG(TP_NORM, 7) OVER (ORDER BY TX_DATE) L7,
LAG(TP_NORM, 8) OVER (ORDER BY TX_DATE) L8,
LAG(TP_NORM, 9) OVER (ORDER BY TX_DATE) L9,
LAG(TP_NORM, 10) OVER (ORDER BY TX_DATE) L10,
LAG(TP_NORM, 11) OVER (ORDER BY TX_DATE) L11,
LAG(TP_NORM, 12) OVER (ORDER BY TX_DATE) L12,
LAG(TP_NORM, 13) OVER (ORDER BY TX_DATE) L13,
LAG(TP_NORM, 14) OVER (ORDER BY TX_DATE) L14
FROM TW1326_norm) a;
接下來要準備建立Data Mining 資料模型的訓練資料(Training)與測試資料(Testing),我們的比例抓6:4(要扣除前面沒有資料的16筆,日期2001/05/18日之前。)
CREATE OR REPLACE VIEW TW1326_Train AS
SELECT To_CHAR(TX_Date, 'YYYYMMDD') as CASE_ID, TP_NORM, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14
FROM TW1326_lag a
WHERE TX_DATE > TO_DATE('2001/05/17','YYYY/MM/DD') AND TX_DATE < TO_DATE('2007/06/01','YYYY/MM/DD');
CREATE OR REPLACE VIEW TW1326_Test AS
SELECT To_CHAR(TX_Date, 'YYYYMMDD') as CASE_ID, TP_NORM, L1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14
FROM TW1326_lag a
WHERE TX_DATE > TO_DATE('2007/05/31','YYYY/MM/DD');
利用SQL Developer Data Miner 建立模型與測試
使用Regression模型來進行預測,在Oracle Data Miner會使用GLM(Generalized Linear Model)與SVM(Support Vector Machine)2種演算法,進行回歸預測。下圖為二種演算法回歸預測的比較圖
GLM看起來比SVM要來的好
兩種演算法的Residual Plot
首先是SVM Residual Plot
GLM Residual Plot
預測明日股價
由於在進Normalized時,選AVG= -0.000001593;STDDEV=0.000001593。在建立預測Table做下列修正
CREATE TABLE TW1326_pred AS
SELECT tx_date, lowest, power(10, svm_pred) svm_pred, power(10, glm_pred) glm_pred
FROM (SELECT tx_date, Lowest,
svm_pred + LAG(lp,1) OVER (ORDER BY tx_date) as svm_pred,
glm_pred + LAG(lp,1) OVER (ORDER BY tx_date) as glm_pred
FROM (SELECT tx_date, Lowest, LOG(10, lowest) lp,
(PREDICTION(tw1326_SVM USING a.*)
* 0.000001593 + -0.000001593) svm_pred,
(PREDICTION(REGR_GLM_1_7 USING a.*)
* 0.000001593 + -0.000001593) glm_pred
FROM tw1326_lag a));
其結果
看起來都相當不錯
部分預測資料結果如下
在原始資料再加入一行,只有日期 27-5月-11,然後再重新預測(執行Create Table TW1326_PRED),就會多出一行預測(註:目前的做法只能預測下一日,我們也稱做"Single-Step Prediction),其結果如下;
27-5月-11當日最低價格:107.00(預測值為106.499=106.5)
預測未來股價
由於模型只能依據既有的資料(前14日,記得我們選擇採用14日的週期)來預測次一日的股價。因此想要預測未來的日子的價格,就只能將次一日的預測值,當成預測次二日的前一日實際值來做預測,然後重覆這一步驟,直到完成所有的預測。以上被稱為"Multi-Step Forecasting"。
舉例來說,我們只有2011/05/26的資料,要預測未來一週的股價,我們先根據目前既有的資料,預測2011/5/27的價格,然後再將2011/5/27的價格當成真實價格,再預測2011/5/30的價格。一直重覆這樣的步驟,到所有要預測的日期都預測結束。
我們先補足所要被預測價格的日期。
No comments:
Post a Comment