套件

# 資料整理工具
library(dplyr)
# 繪圖套件
library(plotly)
# 時間序列資料的相關套件
library(xts)
# 財金金融套件
library(quantmod)
setwd("/srv/shiny-server/asisstuc/08170442")

1 前言

動手做:任選一檔2020年的台股資料,定義早晨之星的各項參數

  • 6533晶心科

    • 抓出該檔股票的早晨之星訊號發生的日期
    • 畫出該日期附近的K線圖作為佐證

為何選擇該台股(6533晶心科)?

  • 是任天堂遊戲機Switch供應鏈
  • 在CPU IP市場耕耘已久
  • 外資介入及融資高
  • 容易受到傳統淡季、新台幣強升影響

2 介紹專有名詞

何謂早晨之星?

原意:在太陽尚未升起的時候,黎明前最黑暗的時刻,一顆明亮的啟明星在天邊指引著那些走向光明的夜行人。

在股市中,K線圖上的「早晨之星」是釋放出原本下跌趨勢的反轉訊號,即預示著跌勢將盡,大盤處於拉升的前夜,行情擺脫下跌的陰影,逐步走向光明。


何謂黃昏之星?

原意:太陽就像一顆紅色的淚珠,從西山之巔緩緩滾落。在夕陽的餘光之中,黃昏之星就像魔鬼的特使君臨股市。

在股市中,K線圖上的「黃昏之星」是比較強烈的趨勢轉弱信號,行情將隨之進入振盪下行趨勢中,投資者需要把握時機獲利了結或止損出局。


3 捕捉早晨之星

3.1 下載台股–6533晶心科

STEP 1:利用loadSymbols函數下載上市公司晶心(6533)之股票資料,並篩選2020年之資料

TW6533 = loadSymbols(Symbols = "6533.TW", 
                     from = "2020-01-01",
                     to = "2020-12-31",
                     auto.assign = FALSE)
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
## 
## This message is shown once per session and may be disabled by setting 
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.

STEP 2:利用data.frame建立資料框,並更改欄位名稱、刪除欄位“Adjusted”,最後將資料框存成csv檔,並將檔案轉成xts時序類別,刪除Date欄位名稱

  • K線圖是由以下數值繪製而成:

    • 開盤價(Open)
    • 最高價(High)
    • 最低價(Low)
    • 收盤價(Close)
TW6533.df <- data.frame(Date = index(TW6533),coredata(TW6533))

colnames(TW6533.df) = c("Date", "Open", "High", "Low", "Close", "Volume", "Adjusted")
TW6533.df <- TW6533.df[,-7]

write.csv(TW6533.df, "./TW6533.csv")

data0 <- read.csv('./TW6533.csv')
head(data0)
##   X       Date  Open  High   Low Close  Volume
## 1 1 2020-01-02 133.0 134.0 132.0 133.5  680014
## 2 2 2020-01-03 137.0 137.5 129.0 129.0 1984974
## 3 3 2020-01-06 129.0 130.5 127.5 129.0  494222
## 4 4 2020-01-07 130.5 130.5 125.0 126.0  715466
## 5 5 2020-01-08 124.5 126.5 124.5 125.5  477620
## 6 6 2020-01-09 128.0 128.0 125.5 128.0  549272
data0 <- xts(data0[,-c(1,2)],
             order.by = as.Date(data0$Date))
head(data0, n = 2)
##            Open  High Low Close  Volume
## 2020-01-02  133 134.0 132 133.5  680014
## 2020-01-03  137 137.5 129 129.0 1984974

3.2 捕捉早晨之星

  • 蠟燭實體的定義

    • 第一天(前兩期)的收盤價低於開盤價(delta1)
    • 第二天(前一期)的收盤價和開盤價大致相等,差別控制在一個範圍內(delta2)
    • 第三天(當期)的收盤價高於開盤價(delta3)


  • 連續3根蠟蠋圖組成

    • 第1根: 較長綠色實體
    • 第2根: 十字星線,實體在第一、二根實體下方
    • 第3根: 紅色實體(大於等於第1根綠色實體的一半)


  • 十字星實體位置的定義

    • 第二天(前一期)的收盤價與開盤價均小於第一天(前兩期)的收盤價與第三天(當期)的開盤價


  • 下跌趨勢的定義

    • 利用前兩期與前三期來看原本是下跌或上漲趨勢
    • 用收盤價來計算股票的收益率,收益率為負表示下跌


彙整程式碼10步驟:  

STEP 1:拉出開盤價和收盤價,並計算每個交易日開盤價與收盤價的價差

STEP 2:結合三期資料:本期差值、前一期差值、前二期差值  

STEP 3:蠟燭實體的定義(delta1、delta2、delta3),撰寫檢查是否合格的函數

STEP 4:轉換成矩陣再運算,並轉換成xts格式物件

STEP 5:定義十字星實體位置所需要的資料

STEP 6:x 為一個向量,有四個元素,分別是“Open.3”, “Open.2”, “Close.2”, “Close.1”,撰寫檢查是否為十字星的函數

STEP 7:定義十字星實體位置,要在其前後綠色實體和紅色實體下方,捕捉符合十字星實體位置的K線圖,並轉換成xts時間序列類別

STEP 8:捕捉下跌趨勢並計算收益率

STEP 9:定義下跌函數,並轉換成xts格式物件

STEP 10:開始尋找早晨之星,組裝資料、刪除遺失值,轉換成xts,並找出日期
註:需要三種(delta1、delta2、delta3)都合乎規定才可以

MorningStar.ft = function(data0, delta1, delta2, delta3){
  
  Close <- data0$Close
  Open <- data0$Open

  # STEP 1:計算價差    
  CL_OP <- Close-Open
  names(CL_OP) <- "CL_OP"
  
  # STEP 2:結合三期資料
  dataCL_OP <- merge(CL_OP, stats::lag(CL_OP,1), stats::lag(CL_OP,2))
  
  # STEP 3:x = c(第三天, 第二天, 第一天)
  morning.K = function(x, delta1, delta2, delta3){
    
    flag1 = x[3] < -1*delta1
    flag2 = abs(x[2]) < delta2
    flag3 = x[1] > delta3
    flag4 = abs(x[1]) > abs(x[3])*0.5
    
    return(ifelse(flag1&flag2&flag3&flag4, 1, 0))
  }
  
  # STEP 4:轉換矩陣及 xts 格式
  candle <- apply(dataCL_OP,
                  MARGIN = 1, 
                  FUN = morning.K, delta1, delta2, delta3)
  
  candle <- xts(as.numeric(candle),
                order.by = index(dataCL_OP))
  
  names(candle) <- "candle"
  
  # STEP 5:定義十字星實體位置所需要的資料
  dataCOP <- merge(Open, 
                   stats::lag(Open,1), stats::lag(Close,1),
                   stats::lag(Close,2))
  names(dataCOP) = c("Open.3", "Open.2", "Close.2", "Close.1")
  
  # STEP 6:撰寫檢查是否為十字星的函數 
  star.ft = function(x){
    
    flag1 = x[3] < x[4]
    flag2 = x[3] < x[1]
    flag3 = x[2] < x[4]
    flag4 = x[2] < x[1]
    
    return(ifelse(flag1&flag2&flag3&flag4, 1, 0))
  }
  
  # STEP 7:捕捉符合十字星實體位置的K線圖
  Doji <- apply(dataCOP,
                MARGIN=1,
                FUN=star.ft)
  
  Doji <- xts(as.numeric(Doji),
              order.by=index(dataCOP))
  
  
  # STEP 8:捕捉下跌趨勢並計算收益率
  ret <- ROC(Close, type = "discrete")
  names(ret) <- "SSEC2012.ret"
  dataret <- merge(stats::lag(ret,2), stats::lag(ret, 1))
  
  # STEP 9:定義下跌函數,並轉換成xts格式物件
  down.ft = function(x){
    
    flag1 = x[1]<0
    flag2 = x[2]<0
    
    return(ifelse(flag1&flag2, 1, 0))
  }
  
  trend <- apply(dataret,
               MARGIN = 1,FUN = down.ft)
  
  trend <- xts(as.numeric(trend),order.by = index(dataret))
  names(trend) <- "trend"
  
  # STEP 10:開始尋找早晨之星,組裝資料、刪除遺失值,轉換成xts,並找出日期
  MorningStar <- function(candle, Doji, trend){
    
    star <- na.omit(merge(candle, Doji, trend))
    
    signal <- apply(star,
                    1,
                    function(x){
                      ifelse(all(x == 1),1,0)
                      }
                    )

    signal <- xts(as.numeric(signal), order.by = index(star))
    
    return(index(signal[signal == 1]))
  }
  MorningStar(candle, Doji, trend)
  
}

MorningStar.ft(data0, 10, 2, 6)
## [1] "2020-12-30"

3.3 畫出K線圖

dataPlot <- data0["2020-12-01/2020-12-31"]
chartSeries(dataPlot, theme='white',
            up.col='red',dn.col='green')

4 補充

「標準的晨星」定義為何?

標準的早晨之星,其形成過程如下。

(1)在下跌過程中,價格延續跌勢,產生一根較長的實體陰線,顯示大勢不妙,同時也説明空方能量得到進一步宣泄。

(2)第二天,價格跳空低開,但跌勢趨緩,呈低位震盪盤整走勢。收盤價與開盤價差不多在同一個水平,形成一個十字星形態。收出小實體陰陽K線亦可,其分析意義更佳。這根K線為早晨之星形態的主體部分。

(3)第三天,價格強勢上漲,出現強勁的反彈走勢,收盤收出一根較長的實體陽線、其實體部分或全部吞掉第一根陰線實體,顯示出多頭已經開始了初步的反攻。

也就是說,第一天或第三天不可以跟第二天太相近,不然早晨之星較不明顯;第二天的收盤價與開盤價價差不必一定趨近於0,但價差也不能太大,我會以正負2以內作為標準


4.1 尋找標準的晨星

4.1.1 標準的晨星

在台股中,我認為價差超過10的早晨之星很少(因為我都找不到)。所以當我找出 2020-12-30 有早晨之星的現象時,發現第一天的價差有16、第三天有25,而價差都遠大於第二天,所以我會稱 2020-12-30 的k線圖為「標準的晨星」

MorningStar.ft(data0, 10, 2, 6)
## [1] "2020-12-30"
# 標準的晨星 2020-12-30
MorningStar.ft(data0, 16, 2, 25)
## [1] "2020-12-30"
dataPlot <- data0["2020-12-01/2020-12-31"]
chartSeries(dataPlot, theme = 'white',
            up.col = 'red',dn.col = 'green')

4.1.2 不標準的晨星

將數值往下調,終於發現第二個早晨之星。不過當時設定第一天的數值和第二天的數值一樣,這是不合理的,調整三天的價差之後,發現雖然符合早晨之星的原則,但第二天和第一天及第三天的價差太接近,所以我會稱 2020-02-11 的早晨之星為「不標準的晨星」

MorningStar.ft(data0, 2, 2, 1.3)
## [1] "2020-02-11" "2020-12-30"
# 不標準的晨星 2020-02-11
MorningStar.ft(data0, 3.4, 1.1, 1.9)
## [1] "2020-02-11" "2020-12-30"
dataPlot <- data0["2020-02-01/2020-02-27"]
chartSeries(dataPlot, theme = 'white',
            up.col = 'red',dn.col = 'green')

4.1.3 較標準的晨星

依然不死心,再將數值往下調,終於找到第三個早晨之星。調整三天的數值後,都有符合早晨之星的原則,但雖然第一天及第三天的數值差距大,可是第一天和第二天的數值差距很小,所以我會稱他為「較標準的晨星」

MorningStar.ft(data0, 0.6, 2, 0.4)
## [1] "2020-02-11" "2020-08-04" "2020-12-30"
# 較標準的晨星 2020-08-04
MorningStar.ft(data0, 0.9, 0.6, 6)
## [1] "2020-08-04"
dataPlot <- data0["2020-07-21/2020-08-11"]
chartSeries(dataPlot, theme = 'white',
            up.col = 'red',dn.col = 'green')

4.2 總結

想要尋找出「標準的晨星」,我認為:

  • 對於台股,數值不要設太高
  • 三天的數值不要太相近(差值5以上會更好)
  • 第二天的差價介於正負2以內