ggplot2でグラフ作成

前回は「quantmodでグラフ作成」だったが、今回はggplot2を使用する。

データの確認。

> head(T6758)
           YJ6758.T.Open YJ6758.T.High YJ6758.T.Low YJ6758.T.Close YJ6758.T.Volume YJ6758.T.Adjusted
1983-01-04          1755          1770         1745           1745          309800           1586.36
1983-01-05          1750          1760         1745           1755          511800           1595.45
1983-01-06          1740          1750         1735           1735          498000           1577.27
1983-01-07          1770          1775         1750           1750          405800           1590.91
1983-01-08          1740          1745         1715           1740          378800           1581.82
1983-01-10          1725          1740         1720           1720          351800           1563.64

出来高と調整後終値を使用するため、その2列のみ取り出す。

> dataT6758<-T6758[,c("YJ6758.T.Adjusted", "YJ6758.T.Volume")]
> head(dataT6758)
           YJ6758.T.Adjusted YJ6758.T.Volume
1983-01-04           1586.36          309800
1983-01-05           1595.45          511800
1983-01-06           1577.27          498000
1983-01-07           1590.91          405800
1983-01-08           1581.82          378800
1983-01-10           1563.64          351800

株価のリターンを「終値の前日からの変化率」と定義してリターンを計算。
※)「(当日株価−前日株価)/前日株価=株価の変化率=log(1+株価の変化率)=log(当日株価)-log(前日株価)」として、対数近似していることに注意。

> dataT6758$return <- diff(log(dataT6758[,1]))
> head(dataT6758$return)
                 return
1983-01-04           NA
1983-01-05  0.005713745
1983-01-06 -0.011460324
1983-01-07  0.008610675
1983-01-08 -0.005730097
1983-01-10 -0.011559646

returnを追加したものから「1983-01-04」を取り除いたデータを新たにdataT6758とする。

> dataT6758 <- dataT6758[-1,]
> head(dataT6758)
           YJ6758.T.Adjusted YJ6758.T.Volume       return
1983-01-05           1595.45          511800  0.005713745
1983-01-06           1577.27          498000 -0.011460324
1983-01-07           1590.91          405800  0.008610675
1983-01-08           1581.82          378800 -0.005730097
1983-01-10           1563.64          351800 -0.011559646
1983-01-11           1531.82          920000 -0.020559866

関数cut()を使用して、リターンを分類する。
cut()については、?cutとしてリファレンスを見るか、このblogを参照。
分類について、開区間か閉区間かといった細かなところも確認できる。

> dataT6758$cuts <- cut(abs(dataT6758$return), breaks=c(0, 0.02, 0.04, 0.25), include.lowest = TRUE) #リターンの絶対値が02%、2%〜4%、4%〜25%の3つで分類。
> head(dataT6758$cuts)
           cuts
1983-01-05    1
1983-01-06    1
1983-01-07    1
1983-01-08    1
1983-01-10    1
1983-01-11    2
> head(dataT6758)
           YJ6758.T.Adjusted YJ6758.T.Volume       return cuts
1983-01-05           1595.45          511800  0.005713745    1
1983-01-06           1577.27          498000 -0.011460324    1
1983-01-07           1590.91          405800  0.008610675    1
1983-01-08           1581.82          378800 -0.005730097    1
1983-01-10           1563.64          351800 -0.011559646    1
1983-01-11           1531.82          920000 -0.020559866    2

平均値の列を追加。

> dataT6758$means <- NA
> head(dataT6758$means)
           means
1983-01-05    NA
1983-01-06    NA
1983-01-07    NA
1983-01-08    NA
1983-01-10    NA
1983-01-11    NA
> head(dataT6758)
           YJ6758.T.Adjusted YJ6758.T.Volume       return cuts means
1983-01-05           1595.45          511800  0.005713745    1    NA
1983-01-06           1577.27          498000 -0.011460324    1    NA
1983-01-07           1590.91          405800  0.008610675    1    NA
1983-01-08           1581.82          378800 -0.005730097    1    NA
1983-01-10           1563.64          351800 -0.011559646    1    NA
1983-01-11           1531.82          920000 -0.020559866    2    NA

グルーピングした各グループ毎に出来高の平均を計算する。
which(dataT6758$cuts == i)によって、グループiに該当する添字を取得する(これによってグループiに該当する出来高を取得できることになる)。
そして、mean(dataT6758$YJ6758.T.Volume[group])によって平均を計算する。

> for(i in 1:3){
+  group <- which(dataT6758$cuts == i)
+  if(length(group) >0){
+    dataT6758$means[group] <- mean(dataT6758$YJ6758.T.Volume[group])
+  }
+ }
> head(group)
[1]  18  58 133 158 198 201
> head(dataT6758$means)
             means
1983-01-05 3864653
1983-01-06 3864653
1983-01-07 3864653
1983-01-08 3864653
1983-01-10 3864653
1983-01-11 5974401
> head(dataT6758)
           YJ6758.T.Adjusted YJ6758.T.Volume       return cuts   means
1983-01-05           1595.45          511800  0.005713745    1 3864653
1983-01-06           1577.27          498000 -0.011460324    1 3864653
1983-01-07           1590.91          405800  0.008610675    1 3864653
1983-01-08           1581.82          378800 -0.005730097    1 3864653
1983-01-10           1563.64          351800 -0.011559646    1 3864653
1983-01-11           1531.82          920000 -0.020559866    2 5974401

最後に、グループ(グループ1,2,3)毎に、出来高のグラフをggplotを使用して描く。

> library(ggplot2)
 警告メッセージ: 
 パッケージ ‘ggplot2’ はバージョン 3.2.2 の R の下で造られました  
> ggplot(dataT6758)+geom_histogram(aes(x=YJ6758.T.Volume))+facet_grid(cuts ~ .) + geom_vline(aes(xintercept=means), linetype="dashed", size=1)