2016年8月20日土曜日

ローソク足の順序変更 その2 移動平均乖離率

 先のローソク足の順序変更で議論したものを関数化した。次のようなチャートになる。

チャート中の赤い曲線はオープンギャップ(当日始値/前日終値-1)の値である。また、ローソク足は、実際の金額ではなくて、始値からの比率とした。例えば、終値については 終値/始値-1 の値である。そのほかも同じで、始値は0となる。
オープンギャップだけではもったいないので、ほか指数でも同様にソートしてローソク足を表示するようにしてみた。
関数名はsortChartで第1引数に日足4本値データ、第2引数に指数を書く。5日移動平均からの乖離率を指数とするには次のように使う。


第2引数 lag(Delt(SMA(Cl(z),5),Cl(z))) について説明する。zは日足4本値データxts型で、Cl(z)はその終値である。SMAは移動平均を求める関数で、SMA(Cl(Z),5)で5日移動平均を求めている。Deltは比率を求める関数で、Delt(a,b)でb/a-1を計算する。Delt(SMA(Cl(z),5),Cl(z))で5日移動平均からの乖離率となる。lagを付けないとピッタリ符合するのだが、前日の終値の乖離率から判断するのだからlagが必要だ。チャートの赤い線が乖離率である。



同様に25日移動平均からの乖離率でみると


参考までにソースは次の通り

8行め中ほどのinfo(z)は私設の関数。zのコード・銘柄名・市場・業種と、次の1は貸借銘柄を意味する文字列を返す。もしも万が一このコードを動かしてみたいと思われるのならば、この部分を削除し、先頭に library(quantmod) と入れれば動くと思われる。 

9行めのコメントは10行めと取り換えると、指数をチャート内に表示するように縮尺する。

第2引数を省略するとオープンギャップを採用する。

各値がわかるように、データフレームを返すようにしてある。

ローソク足の順序変更・・・OGP オープンギャッププレー

 前日の終値と当日の始値の差をギャップというらしい。ギャップと当日の様子を比較するにはどうしたらよいかと考えるうちに、ギャップ順にソートしたローソク足を見たいと思い立った。
 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年について同様の操作をしたものである。


左の方が陽線が目立つ。