はじめに
平均足(Heikin-Ashi)とは、通常「1日分」のデータを使ってローソクチャートを作成するところを、その倍の「2日分」のデータを用いて作成するローソクチャートのこと を言います。
そのため、細かなノイズが省かれて、トレンドの流れを視覚的に把握しやすいチャート ** になると考えられています。また、海外でも、「Heikin-Ashi」と言われるほど、一般的に浸透しているテクニカルなチャートのようですね。
平均足の見方としては、
「陽線が連続すると、上昇トレンド」、
「陰線が連続すると、下降トレンド」 と分かり易いです。
また、ローソク足の実体の大きさがトレンドの勢いを示すようです。
今回、ビットコイン(BTC)のデータとggplot2を使って、平均足のキャンドルチャートを作成することにします。
また、ストキャスティクスRSIなどのテクニカル指標も併せてやってみたいと思います。
関連パッケージ
まずは、Rで、関連パッケージをインストールします。
pack <- c ( "quantmod" , "dygraphs" , "htmltools" , "magrittr" , "TTR" , "xts" , "ggplot2" , "gridExtra" , "lubridate" )
install.packages ( pack[ ! ( pack %in% unique ( rownames ( installed.packages ())))])
for ( n in 1 : length ( pack)){ eval ( parse ( text = paste0 ( "library(" , pack[ n], ")" ))) }; rm ( "n" , "pack" )
また、平均足を計算する関数などのスクリプト(Heikin_Ashi.R)を読み込みます。
上記のインストール実行も含まれます。
source ( "https://gist.githubusercontent.com/kumeS/2fc0b2e020044710226d1bed51c45ad2/raw/3de658478008d4045f9914f8a0fddba7bc2b8eb5/Heikin_Ashi.R" )
BTCの月足データの平均足チャートを作成する
まずは、BTCの月足データから、平均足チャートを作成します。
quantmod::getSymbols関数で、periodicityを「monthly」に設定することで月足データが得られます。期間は、「2014-10-01」以降としています。
BTCm <- getSymbols ( "BTC-USD" ,
from = "2014-10-01" ,
to = "2023-12-31" ,
periodicity = 'monthly' ,
src = "yahoo" ,
verbose = F ,
auto.assign= FALSE )
BTCm <- setNames ( BTCm,
nm = c ( "Open" , "High" , "Low" , "Close" , "Volume" , "Adjusted" ))
head ( BTCm)
tail ( BTCm)
p1 <- ggChandles ( x= BTCm,
term= c ( "2020-01-01" , "2023-12-31" ),
TsukiAshi= TRUE )
p2 <- ggChandles ( heikin_ashi ( BTCm),
term= c ( "2020-01-01" , "2023-12-31" ),
Tittle= "BTC-USD Heikin-Ashi" ,
TsukiAshi= TRUE )
gridExtra:: grid.arrange ( p1, p2, nrow = 1 )
通常のローソク足だと、上がったり下がったりがノイズ的に見えてますが、
平均足だと、2021年末以降ずっと下落トレンドですね。
一目瞭然ですね!!
月足データのストキャスティクスRSIオシレーター
続いて、ストキャスティクスRSIオシレーター(以下、StochRSI)を計算します。
StochRSIは、通常のRSI(Relative Strength Index、相対力指数)がN日間の期間中、相対的にどの水準を推移しているかを示す指標です。通常のRSIよりも、ある期間中の変動幅(高値・安値)に対する値位置をより明確に見極められます。
また、今回自作したstRSI
関数は、StochRSIをより鋭敏にした関数です。
BTCm.stoch <- stochRSI ( BTCm)
BTCm.st <- stRSI ( BTCm)
a <- with ( BTCm.stoch,
stochRSI[ index ( BTCm.stoch) >= "2020-01-01" ])
plot ( a, main= "BTCm.stoch / BTCm.st" , ylim= c ( - 0.01 , 1.01 ))
lines ( BTCm.st, col= alpha ( "red" , 0.7 ), lwd= 2 )
BTCm.stoch.heikin <- stochRSI ( heikin_ashi ( BTCm))
BTCm.st.heikin <- stRSI ( heikin_ashi ( BTCm))
a <- with ( BTCm.stoch.heikin,
stochRSI[ index ( BTCm.stoch.heikin) >= "2020-01-01" ])
plot ( a,
main= "BTCm.stoch.heikin / BTCm.st.heikin" ,
ylim= c ( - 0.01 , 1.01 ))
lines ( BTCm.st.heikin, col= alpha ( "green" , 0.7 ), lwd= 2 )
次には、キャンドルチャートと両方併せて、プロットしてみます。
p <- ggChandles ( BTCm,
term= c ( "2020-01-01" , "2023-12-31" ),
TsukiAshi= TRUE )
BTCm.s <- cbind ( BTCm.stoch, BTCm.st)
p2 <- ggChart ( x= BTCm.s, y= "stochRSI" ,
term= c ( "2020-01-01" , "2023-12-31" ),
Tittle= "BTC: stochRSI / stRSI" )
p2 <- p2 + geom_line ( aes ( x= Index, y= stRSI),
colour= alpha ( "red" , 0.7 ),
linetype= "solid" )
p1 <- ggChandles ( heikin_ashi ( BTCm),
term= c ( "2020-01-01" , "2023-12-31" ),
TsukiAshi= TRUE ,
Tittle= "BTC-USD Heikin" )
BTCm.sh <- cbind ( BTCm.stoch.heikin, BTCm.st.heikin)
p3 <- ggChart ( x= BTCm.sh, y= "stochRSI" ,
term= c ( "2020-01-01" , "2023-12-31" ),
Tittle= "BTC: stoch.heikin / st.heikin" )
p3 <- p3 + geom_line ( aes ( x= Index, y= stRSI),
colour= alpha ( "green" , 0.7 ),
linetype= "solid" )
layout <- rbind ( c ( 1 , 1 , 2 , 2 ), c ( 1 , 1 , 2 , 2 ), c ( 3 , 3 , 4 , 4 ))
gridExtra:: grid.arrange ( p, p1, p2, p3, layout_matrix= layout)
stRSIの結果から、2021年10月ごろが最後のピークだったってことがよく分かりますね。
BTCの週足データの平均足チャートを作成する
次に、BTCの週足データから、平均足チャートを作成してみます。
月足データと同じ手順で行います。
BTCw <- getSymbols ( "BTC-USD" ,
from = "2014-10-01" ,
to = "2023-12-31" ,
periodicity = 'weekly' ,
src = "yahoo" ,
verbose = F ,
auto.assign= FALSE )
BTCw <- setNames ( BTCw,
nm = c ( "Open" , "High" , "Low" , "Close" , "Volume" , "Adjusted" ))
head ( BTCw)
p1 <- ggChandles ( x= BTCw,
term= c ( "2021-06-01" , "2023-12-31" ),
lwd= 0.15 )
p2 <- ggChandles ( heikin_ashi ( BTCw),
term= c ( "2021-06-01" , "2023-12-31" ),
Tittle= "BTC-USD Heikin-Ashi" ,
lwd= 0.15 )
gridExtra:: grid.arrange ( p1, p2, nrow = 1 )
2022年初め以降の傾向だと、週足データでの上昇トレンドは、続いて4週間というのが良いとこかも。
続いて、stRSIの結果も一緒にプロットしてみます。
p <- ggChandles ( BTCw,
term= c ( "2021-01-01" , "2023-12-31" ),
lwd= 0.15 )
BTCw.stoch <- stochRSI ( BTCw)
BTCw.st <- stRSI ( BTCw)
BTCw.s <- cbind ( BTCw.stoch, BTCw.st)
p2 <- ggChart ( x= BTCw.s, y= "stochRSI" ,
term= c ( "2021-01-01" , "2023-12-01" ),
Tittle= "BTC: stochRSI / stRSI" )
p2 <- p2 + geom_line ( aes ( x= Index, y= stRSI),
colour= alpha ( "red" , 0.7 ),
linetype= "solid" )
p1 <- ggChandles ( heikin_ashi ( BTCw),
term= c ( "2021-01-01" , "2023-12-01" ),
Tittle= "BTC-USD Heikin" ,
lwd= 0.15 )
BTCw.stoch.heikin <- stochRSI ( heikin_ashi ( BTCw))
BTCw.st.heikin <- stRSI ( heikin_ashi ( BTCw))
BTCw.sh <- cbind ( BTCw.stoch.heikin, BTCw.st.heikin)
p3 <- ggChart ( x= BTCw.sh, y= "stochRSI" ,
term= c ( "2021-01-01" , "2023-12-01" ),
Tittle= "BTC: stoch.heikin / st.heikin" )
p3 <- p3 + geom_line ( aes ( x= Index, y= stRSI),
colour= alpha ( "green" , 0.7 ),
linetype= "solid" )
layout <- rbind ( c ( 1 , 1 , 2 , 2 ), c ( 1 , 1 , 2 , 2 ), c ( 3 , 3 , 4 , 4 ))
gridExtra:: grid.arrange ( p, p1, p2, p3, layout_matrix= layout)
週足のstRSIの結果から、局所的な高値がより分かり易くなったように見えますね。
BTCの日足データの平均足チャートを作成する
今回、stRSIの期間を、14、25、50、75日に設定して計算して、下図としてプロットしてみます。
過去180日間の日足データを用います。
BTCd <- getSymbols ( "BTC-USD" ,
from = lubridate:: today () - lubridate:: ddays ( 180 ),
to = lubridate:: today (),
periodicity = 'daily' ,
src = "yahoo" ,
verbose = F ,
auto.assign= FALSE ) %>%
setNames ( nm = c ( "Open" , "High" , "Low" , "Close" , "Volume" , "Adjusted" ))
head ( BTCd)
p <- ggChandles ( BTCd,
term= c ( "2022-10-01" , "2023-12-31" ),
lwd= 0.15 )
BTCd.st14 <- stRSI ( BTCd, n = 14 )
BTCd.st25 <- stRSI ( BTCd, n = 25 )
BTCd.st50 <- stRSI ( BTCd, n = 50 )
BTCd.st75 <- stRSI ( BTCd, n = 75 )
BTCd.s <- cbind ( BTCd.st14, BTCd.st25, BTCd.st50, BTCd.st75) %>%
setNames ( nm = c ( "stRSI14" , "stRSI25" , "stRSI50" , "stRSI75" ))
p2 <- ggChart ( x= BTCd.s, y= "stRSI14" ,
term= c ( "2022-10-01" , "2023-12-31" ),
Tittle= "BTC: stRSI" ) +
geom_line ( aes ( x= Index, y= stRSI25),
colour= alpha ( "red" , 0.7 ),
linetype= "solid" ) +
geom_line ( aes ( x= Index, y= stRSI50),
colour= alpha ( "blue" , 0.7 ),
linetype= "solid" ) +
geom_line ( aes ( x= Index, y= stRSI75),
colour= alpha ( "green" , 0.7 ),
linetype= "solid" )
p1 <- ggChandles ( heikin_ashi ( BTCd),
term= c ( "2022-10-01" , "2023-12-31" ),
Tittle= "BTC-USD Heikin" ,
lwd= 0.15 )
BTCd.st14.heikin <- stRSI ( heikin_ashi ( BTCd), n = 14 )
BTCd.st25.heikin <- stRSI ( heikin_ashi ( BTCd), n = 25 )
BTCd.st50.heikin <- stRSI ( heikin_ashi ( BTCd), n = 50 )
BTCd.st75.heikin <- stRSI ( heikin_ashi ( BTCd), n = 75 )
BTCd.sh <- cbind ( BTCd.st14.heikin, BTCd.st25.heikin,
BTCd.st50.heikin, BTCd.st75.heikin) %>%
setNames ( nm = c ( "stRSI14" , "stRSI25" , "stRSI50" , "stRSI75" ))
p3 <- ggChart ( x= BTCd.sh, y= "stRSI14" ,
term= c ( "2022-10-01" , "2023-12-31" ),
Tittle= "BTC: stoch.heikin / st.heikin" ) +
geom_line ( aes ( x= Index, y= stRSI25),
colour= alpha ( "red" , 0.7 ),
linetype= "solid" ) +
geom_line ( aes ( x= Index, y= stRSI50),
colour= alpha ( "blue" , 0.7 ),
linetype= "solid" ) +
geom_line ( aes ( x= Index, y= stRSI75),
colour= alpha ( "green" , 0.7 ),
linetype= "solid" )
layout <- rbind ( c ( 1 , 1 , 2 , 2 ), c ( 1 , 1 , 2 , 2 ), c ( 3 , 3 , 4 , 4 ))
gridExtra:: grid.arrange ( p, p1, p2, p3, layout_matrix= layout)
このstRSIの結果では、もう一杯一杯の上昇をしているのだが、さぁ、どうなるのでしょうかね。
dygraphsで複数のローソクチャートを描く
最後に、dygraphsで、複数のローソクチャートを描く方法を紹介します。プロット結果をリストでまとめて、htmltools::browsableとhtmltools::tagListを使用します。
css <- "
.dygraph-title {
background-color: white;
color:black;
text-align: left;
margin-left: 10%;
}
.dygraph-ylabel {
text-align:center; font-size: 15px;
margin-left: 0px;
margin-top: -5px;
}"
write ( css, "dygraph.css" )
a <- dygraph ( BTCd[, c ( "Open" , "High" , "Low" , "Close" )]) %>%
dyCandlestick () %>%
dyAxis ( "y" , label = "Price / USD" , labelWidth= 20 ) %>%
dyAxis ( "x" , label = "Date" , rangePad= 5 , labelHeight= 20 ) %>%
dyCSS ( "dygraph.css" )
b <- dygraph ( heikin_ashi ( BTCd)) %>%
dyCandlestick () %>%
dyAxis ( "y" , label = "Price / USD" , labelWidth= 20 ) %>%
dyAxis ( "x" , label = "Date" , rangePad= 5 , labelHeight= 20 ) %>%
dyCSS ( "dygraph.css" )
plotobj <- list ( a, b)
htmltools:: browsable ( htmltools:: tagList ( plotobj))
https://kumes.github.io/Blog/R_BTC/09.html
まとめ
平均足のローソクチャート、RSIは、まだまだ奥が深いですね。
補足
月足データにケルトナー・チャンネルを重ねてみると、、
Keltner Channels (ケルトナー・チャンネル)は、移動平均の上下に設定されたボラティリティ・ベースの包括的な指標です。
この指標は、ボリンジャーバンドに似ていますが、ケルトナー チャネルは、チャネル距離を設定するために、ATR(Average True Range)を使用しています。
kc <- keltnerChannels ( BTCm[, c ( "High" , "Low" , "Close" )],
n = 21 )
BTCm.kc <- cbind ( BTCm, kc)
colnames ( BTCm.kc) <- c ( "Open" , "High" , "Low" , "Close" ,
"Volume" , "Adjusted" ,
"dn" , "mavg" , "up" )
p <- ggChandles ( BTCm.kc,
term= c ( "2020-01-01" , "2023-12-31" ),
TsukiAshi= TRUE )
p <- p + geom_line ( aes ( x= Index, y= dn),
colour= "blue" , linetype= "dashed" )
p <- p + geom_line ( aes ( x= Index, y= up),
colour= "red" , linetype= "dashed" )
p <- p + geom_line ( aes ( x= Index, y= mavg),
colour= "black" , linetype= "dashed" )
p
ほぼ願望を込めて、、下限線は12000ドル当たりで引いています。悪しからず。。
Rコード
gist.github.com
参考資料
stackoverflow.com
array.cell-innovator.com
stackoverflow.com
stackoverflow.com
rdrr.io
github.com
stackoverflow.com
stackoverflow.com
qiita.com
id.fnshr.info
misaki-blog.com