前日の終値と当日の始値の差をギャップというらしい。ギャップと当日の様子を比較するにはどうしたらよいかと考えるうちに、ギャップ順にソートしたローソク足を見たいと思い立った。
xts型のデータの順序を変えてチャートを描けばよいのだが、うまくいかない。悪戦苦闘の状況を以下に記す。試してうまくいかなかったことも記録したので(こちらの方が主かもしれない)冗長である。
コンソール出力に続いて、コメントの形でその解説という順序で記述してある。
> z
Open High Low Close Volume B
2016-08-15 734 775 732 762 107200 80887900
2016-08-16 754 805 754 783 178800 140945300
2016-08-17 768 792 726 726 177100 133505500
2016-08-18 705 712 671 676 157300 108283000
2016-08-19 666 704 651 695 226500 152292900
#zは4本値データである。
> g=Delt(lag(Cl(z)),Op(z))
> g
Delt.0.arithmetic
2016-08-15 NA
2016-08-16 -0.01049869
2016-08-17 -0.01915709
2016-08-18 -0.02892562
2016-08-19 -0.01479290
#ギャップの計算。前日終値と当日始値の差ではなくて、比率を採用した。
#具体的には g = 当日始値/前日終値-1
> order(g)
[1] 4 3 5 2 1
> z[order(g)]
Open High Low Close Volume B
2016-08-15 734 775 732 762 107200 80887900
2016-08-16 754 805 754 783 178800 140945300
2016-08-17 768 792 726 726 177100 133505500
2016-08-18 705 712 671 676 157300 108283000
2016-08-19 666 704 651 695 226500 152292900
#order(g)順に並べると、先頭は4番目のデータであるから08-18であるが、順序は変わっていない。xts型のデータの表示には自動的に日付順に並べ替えられるのだろう。ということは、zのxts属性を落とせばいいのではないか。
> as.data.frame(z)[order(g),]
Open High Low Close Volume B
2016-08-18 705 712 671 676 157300 108283000
2016-08-17 768 792 726 726 177100 133505500
2016-08-19 666 704 651 695 226500 152292900
2016-08-16 754 805 754 783 178800 140945300
2016-08-15 734 775 732 762 107200 80887900
#お、うまくいっている。
> mc0(as.data.frame(z)[order(g),])

#mc0はchartSeriesのラッパー関数だ。chartSeriesで再び日付順に並べ替えられてしまうらしい。ということは、結局、日付を変えなければだめということか。方針変更
> rank(g)
Error in if (xi == xj) 0L else if (xi > xj) 1L else -1L :
argument is of length zero
#gの順位を日付に埋め込もうと思う。またしてもgがxts型であることが問題らしい。
> rank(unclass(g))
[1] 5 4 2 1 3
#gの型をなくしたらうまくいった。
> xts(z,as.Date(rank(unclass(g))))
Open High Low Close Volume B
1970-01-02 734 775 732 762 107200 80887900
1970-01-03 754 805 754 783 178800 140945300
1970-01-04 768 792 726 726 177100 133505500
1970-01-05 705 712 671 676 157300 108283000
1970-01-06 666 704 651 695 226500 152292900
#関数xtsの第2引数は日付(時間)をとる。確かに日付は変わっているが、順序が変わっていない。zがxts型のせいだろう。
> xts(unclass(z),as.Date(rank(unclass(g))))
Open High Low Close Volume B
1970-01-02 705 712 671 676 157300 108283000
1970-01-03 768 792 726 726 177100 133505500
1970-01-04 666 704 651 695 226500 152292900
1970-01-05 754 805 754 783 178800 140945300
1970-01-06 734 775 732 762 107200 80887900
#おお、うまくいった。
> mc0(xts(unclass(z),as.Date(rank(unclass(g)))))
#これでよい。
> mc0(xts(unclass(z-as.numeric(Op(z))),as.Date(rank(unclass(g)))))

#始値をそろえてみた。左の方が前日終値より始値の方が低いので、当日は陽線が期待されるのだが、この5つの例では低いほうがさらに陰線になるという、ほんとかいなという状況である。
以下は、2132アイレップ、7203トヨタ、8411みずほの2016年について同様の操作をしたものである。


左の方が陽線が目立つ。