Friday, May 27, 2011

Oracle Time Series Forecast Stock Price

首先,我要說的是,這純綷是好玩,除了熟悉與了解Oracle Database Mining的功能外,不具其它目的。
文章的做法是參考Time Series Forecasting,有興趣了解詳情的人,可前往參考。
使用Time Series進行預測,基本上採用上列網址所描述的方法:


  1. Variance stabilization and trend removal
  2. Target normalization
  3. 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個時間點

由上幾個圖,其實很難找到"定期"的模式。由上圖,我們抓14天為一週期。
以下為建立 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的價格。一直重覆這樣的步驟,到所有要預測的日期都預測結束。
我們先補足所要被預測價格的日期。