2020年6月8日 星期一

[ORACLE]MATCH_RECOGNIZE子句使用

本文將說明如何在一連串的資料列(Rows)中辨識是否符合特定模式,如找出股市V形反轉之轉折點,先前版本中難以採用SQL直接完成,雖有一些解決方法,但通常都些許繁雜且難以撰寫,甚至可能還有效能議題,ORACLE12C 版本起提供MATCH_RECOGNIZE子句,可直接透過原生且高效之SQL指令來實作以滿足此類需求。
將以201911月台積電(2330)收盤價資料,找出反轉向下(V)模式為例,由以下趨勢圖呈現出四個反轉點,將以兩個範例說明:

201911-台積電(2330)收盤價走勢

#
DATE_ST
DATE_TOP
EDATE_ED
PRI_ST
PRI_TOP
PRI_ED
1
2019/11/1
2019/11/6
2019/11/11
299
311
301
2
2019/11/11
2019/11/12
2019/11/14
301
305
303.5
3
2019/11/14
2019/11/19
2019/11/25
303.5
315
307
4
2019/11/26
2019/11/27
2019/11/29
307
311
305
: 2019-11-30()為複製前一日收盤價,用以模擬平盤狀況。

測試1: 找出UP-FLAT-DOWN模式
2019-11月台積電收盤價走勢圖,得知共有四次漲跌循環(UP-FLAT-DOWN),由SQL可產生如上表中,如起漲點、反轉向下(高點)及低點等(注意,本文重點在於功能闡述,非投資概念),說明如下:
SELECT STK_NO
     , MNO
     , TO_CHAR(DATE_ST,  'YYYY-MM-DD')  DATE_ST
     , TO_CHAR(DATE_TOP, 'YYYY-MM-DD') DATE_TOP
     , TO_CHAR(EDATE_ED, 'YYYY-MM-DD') EDATE_ED
     , PRI_ST
     , PRI_TOP
     , PRI_ED
FROM STK
     MATCH_RECOGNIZE
     (
    PARTITION BY STK_NO
    ORDER BY Date_Cls
    MEASURES MATCH_NUMBER()      AS MNO
           , STRT.Date_Cls         AS DATE_ST
           , LAST(UP.Date_Cls)    AS DATE_TOP
           , LAST(DOWN.Date_Cls) AS EDATE_ED
           , STRT.Cls_Pri          AS PRI_ST
           , LAST(UP.Cls_Pri)     AS PRI_TOP
           , LAST(DOWN.Cls_Pri)  AS PRI_ED
    ONE ROW PER MATCH
    AFTER MATCH SKIP TO LAST DOWN
    PATTERN (STRT UP+ FLAT* DOWN+)           --測試1
    --PATTERN (STRT UP{2,} FLAT* DOWN{2,}) --測試2
    DEFINE
        UP    AS UP.Cls_Pri   > PREV(UP.Cls_Pri)
      , FLAT AS FLAT.Cls_Pri = PREV(FLAT.Cls_Pri)
      , DOWN AS DOWN.Cls_Pri < PREV(DOWN.Cls_Pri)
    ) MR
ORDER BY MR.STK_NO
       , MR.DATE_ST

前述SQL重點在於如何利用MATCH_RECOGNIZE子句辨識特定模式(上漲-持平-下跌),找出股票反轉點向下日期及價格。針對MATCH_RECOGNIZE進行分析說明如下:
MATCH_RECOGNIZE子句
#
子句
用途/說明
1
PARTITION BY STK_NO
ORDER BY Date_Cls
MATCH_RECOGNIZE所用資料進行邏輯分群及排序。
以股票代碼分群,以收盤價日期進行排序。
2
MEASURES
度量定義,於SQL其他查詢部分所引用。
- LAST()函數:取得符合匹配模式中最後收盤日的資料
- MATCH_NUMBER():取得符合匹配模式流水編號。
3
[ONE| ALL] ROW PER MATCH
--測試1:
ONE ROW PER MATCH
--測試2:
ALL ROWS PER MATCH
WITH UNMATCHED ROWS
ONE: 類以群組概念,滿足模式識別者
ALL: 顯示所有可呈現資料
WITH UNMATCHED ROWS: 顯示未匹配資料列(Row)
4
AFTER MATCH SKIP TO LAST DOWN
當符合模式匹配後,定義重新搜索另一模式匹配。以此為例將於DOWN模數變數的最後一筆重新展開搜尋,如2019/11/11為模式匹配群組1最後一筆資料(下跌反轉),也將作為匹配群組2之起始點。
5
PATTERN
--測試1
(STRT UP+ FLAT* DOWN+)
--測試2
(STRT UP{2,} FLAT* DOWN{2,})
定義資料列(Row)之匹配模式,規則運算式定義在括弧中,並佐以POSIX語法定義出現次數態樣。
- STRT:由於STRT未指定條件,任何資料列均可被映射,可作為測試匹配之起點。
- UP+:符合UP(上漲)模式變數,一次以上。
- FLAT*:符合FLAT(平盤)模式變數,0次或多次。
- DOWN+:符合DOWN(下跌)模式變數,一次以上
: {2,}為符合2()以上。
6
DEFINE
UP AS UP.Cls_Pri>PREV(UP.Cls_Pri)
定義模式變數及其邏輯運算式(必要子句)。資料列被映射至特定模式變數所須滿足的邏輯運算式。
UP變數(上漲)為例定義為其價格需大於前期價格,透過PREV()函數以取得前期資料。

測試2: 連續上漲2UP{2,}及連續下跌二天DOWN{2,}模式
上圖中,(1)(3)兩群才符合連續上漲二天及連續下跌二天之需求,也可用ONE ROW PER MATCH產生出彙總表亦可得知結果
SDATE
PDATE
EDATE
PRI_ST
PRI_TOP
PRI_ED
MNO
CFR
2019/11/01
2019/11/06
2019/11/11
299
311
301
1
DOWN
2019/11/14
2019/11/19
2019/11/25
303.5
315
307
2
DOWN


再者利用ALL ROWS PER MATCH WITH UNMATCHED ROWS模式列出原始資料,由下表如何產生出彙總資料。
DATE_CLS
CLS_PRI
MNO
CFR
SDATE
PDATE
EDATE
PRI_ST
PRI_TOP
PRI_ED
2019/11/01
299.00
1
STRT
11/01
299
2019/11/04
307.00
1
UP
11/01
11/04
299
307
2019/11/05
310.50
1
UP
11/01
11/05
299
310.5
2019/11/06
311.00
1
UP
11/01
11/06
299
311
2019/11/07
309.00
1
DOWN
11/01
11/06
11/07
299
311
309
2019/11/08
305.50
1
DOWN
11/01
11/06
11/08
299
311
305.5
2019/11/11
301.00
1
DOWN
11/01
11/06
11/11
299
311
301
2019/11/12
305.00



2019/11/13
304.00



2019/11/14
303.50
2
STRT
11/14
303.5
2019/11/15
307.00
2
UP
11/14
11/15
303.5
307
2019/11/18
311.00
2
UP
11/14
11/18
303.5
311
2019/11/19
315.00
2
UP
11/14
11/19
303.5
315
2019/11/20
313.50
2
DOWN
11/14
11/19
11/20
303.5
315
313.5
2019/11/21
311.00
2
DOWN
11/14
11/19
11/21
303.5
315
311
2019/11/22
309.00
2
DOWN
11/14
11/19
11/22
303.5
315
309
2019/11/25
307.00
2
DOWN
11/14
11/19
11/25
303.5
315
307
2019/11/26
307.00



2019/11/27
311.00



2019/11/28
309.50



2019/11/29
305.00




MATCH_RECOGNIZE簡便且彈性針對一系列的資料進行分析,查看是否呈現特定模式,如SPC(Statistical Process Control統計製程分析上應用,找出機台產出不良品問題是否呈現連續五點/七點等特定模式(Pattern),諸如此類的分析資料樣貌找出可能問題之應用,此指令提供更為簡便之方法,解決過去難題。

參考文件:
 2. https://www.oracle.com/technetwork/database/bi-datawarehousing/mr-deep-dive-3769287.pdf

沒有留言:

張貼留言