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
> 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) #リターンの絶対値が0〜2%、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)