Showing posts with label Data Mining. Show all posts
Showing posts with label Data Mining. Show all posts

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的價格。一直重覆這樣的步驟,到所有要預測的日期都預測結束。
我們先補足所要被預測價格的日期。