套件
# 資料整理工具
library(dplyr)
# 繪圖套件
library(plotly)
# 時間序列資料的相關套件
library(xts)
# 財金金融套件
library(quantmod)setwd("/srv/shiny-server/asisstuc/08170442")動手做:任選一檔2020年的台股資料,定義早晨之星的各項參數
6533晶心科
為何選擇該台股(6533晶心科)?
何謂早晨之星?
原意:在太陽尚未升起的時候,黎明前最黑暗的時刻,一顆明亮的啟明星在天邊指引著那些走向光明的夜行人。
在股市中,K線圖上的「早晨之星」是釋放出原本下跌趨勢的反轉訊號,即預示著跌勢將盡,大盤處於拉升的前夜,行情擺脫下跌的陰影,逐步走向光明。
何謂黃昏之星?
原意:太陽就像一顆紅色的淚珠,從西山之巔緩緩滾落。在夕陽的餘光之中,黃昏之星就像魔鬼的特使君臨股市。
在股市中,K線圖上的「黃昏之星」是比較強烈的趨勢轉弱信號,行情將隨之進入振盪下行趨勢中,投資者需要把握時機獲利了結或止損出局。
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線圖是由以下數值繪製而成:
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根蠟蠋圖組成
十字星實體位置的定義
下跌趨勢的定義
彙整程式碼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"
dataPlot <- data0["2020-12-01/2020-12-31"]
chartSeries(dataPlot, theme='white',
up.col='red',dn.col='green')「標準的晨星」定義為何?
標準的早晨之星,其形成過程如下。
(1)在下跌過程中,價格延續跌勢,產生一根較長的實體陰線,顯示大勢不妙,同時也説明空方能量得到進一步宣泄。
(2)第二天,價格跳空低開,但跌勢趨緩,呈低位震盪盤整走勢。收盤價與開盤價差不多在同一個水平,形成一個十字星形態。收出小實體陰陽K線亦可,其分析意義更佳。這根K線為早晨之星形態的主體部分。
(3)第三天,價格強勢上漲,出現強勁的反彈走勢,收盤收出一根較長的實體陽線、其實體部分或全部吞掉第一根陰線實體,顯示出多頭已經開始了初步的反攻。
也就是說,第一天或第三天不可以跟第二天太相近,不然早晨之星較不明顯;第二天的收盤價與開盤價價差不必一定趨近於0,但價差也不能太大,我會以正負2以內作為標準
在台股中,我認為價差超過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')將數值往下調,終於發現第二個早晨之星。不過當時設定第一天的數值和第二天的數值一樣,這是不合理的,調整三天的價差之後,發現雖然符合早晨之星的原則,但第二天和第一天及第三天的價差太接近,所以我會稱 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')依然不死心,再將數值往下調,終於找到第三個早晨之星。調整三天的數值後,都有符合早晨之星的原則,但雖然第一天及第三天的數值差距大,可是第一天和第二天的數值差距很小,所以我會稱他為「較標準的晨星」
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')想要尋找出「標準的晨星」,我認為: