2016年5月29日日曜日

コロン演算子

値がない場合の処理ネタです。

ベクトルvに対して for(i in 1:length(v))という回し方をすることがあります。

ついlength(v)が0だったら1回も実行しないことを期待してしまうのですが

とんでもないことです。

0回どころか、1と0の2回実行してしまいます。4:1は動作確認です。

ついでに調べてみました。


これは、高値を更新した回数を数えるという問題で遭遇した『問題』です。


【3行目】xts型からnumericに変換しなおかつna.omitをして用心深くやっています。xts型のままだと日付が違うと比較してくれないとかいろいろな問題が起きそうなので。こんなに用心したのに、

【4・5行め】泣く泣く入れました。

【7行め】問題の個所です。

【9行め】エラーはこの行で出ます。nが0の時、hの値がないので、比較できないと怒られます。

最初、forを使わないバージョンを作ったのですが、「それぞれの日の高値」と「それ以前の最高値」と比較するために、毎回maxをとるのはおかしいのではないかと思い、はじめの方から見ていき、最高値(m)の更新と、更新した回数を一回で調べています。1回で済むんですね、と変に感激。【行番号9】

例によって全銘柄に適用して、高値更新回数の多いほうからリストしてみます。


最近高値更新したかに関心があります。どのようにしたらよいか、またいずれ考えます。

なお、コロン演算子というのは私の勝手な命名です。pythonにありましたっけ?しばらく使ってないので忘れています。

2016年5月28日土曜日

従前



比率がわかるように、最小値の1、1.5、2、2.5、3、・・・倍に横線を入れてみた。

Vテクノロジーと関西スパは似たようなチャートだが実は比率がまるで違うことがわかる。

複数チャート

新高値銘柄の検索をしたのでそれらのチャートを一斉に見たくなった。

5月27日新高値を付けた銘柄の終値のチャート。

参考までに、5月26日新高値は


参考までにスクリプト。

値がない場合の処理・・・新高値のスクリーニング

値がない場合の処理は頭痛の種だ。今回の経緯は次の通り。

本日新高値を付けた銘柄を検索したいと思った。

いつも通りだが、ytは日本株式市場の各銘柄の直近約1年間の4本値(+α)データ(xts型)からなるリスト。たとえば、yt[[1]]は極洋の約1年間のデータ。

【行番号2~3】dayには本日の日付が入っている。day="2016-05-27"

【行番号4~12】zをytのうちの1つのデータとする。すなわち1銘柄のデータである。

【行番号14~16】max(Hi(z))==Hi(z[day])で本日が新高値かどうかの判定ができる。

【行番号17~27】これを全銘柄に適用すると、中には出来高のないものも存在するのが頭の痛いところである。

【行番号28~33】出来高のないものの検出にis.nullやis.na、is.nanなどを試みたが駄目であった。

【行番号34~36】直接sapplyした悲惨な結果が。

【行番号37、38】ところで、z["2016"]とすれば、2016年の全データが指定できる。z[day]で返るものは、xtsデータで、複数の値が返ることが想定されている。したがって、lengthを調べれば値がないことがわかるのではないか。

【行番号39】全銘柄に適用してみよう

【行番号40~45】うまくいった。

ifelseでlengthが0の時は0、それ以外の時はHi(z[day])を採用するようにした。0はFALSE扱いになることを用いている。



値がないことをlengthで判断したという、どうということのない話題であった。

xts型のデータの判定なのでnrowを使う方が適切かもしれない。というのはlengthで返るのはnrow×ncolだから。悩ましいが結局はxtsは何者であるかという理解が問われる問題であったようだ。

ちなみに

2016年5月20日金曜日

xtsのたし算

 株式出来高の合計の推移を見たいと思い、全銘柄の日毎の出来高合計を計算しようと思いたった。

同じ日であることを確認の上で、足さないといけない。

以前、xtsでは日付が同じでないと足せないということを書いた。ということは、自動的に同じ日のたし算をしてくれるのだろうか。確かめてみた。

パッケージquantmodを使っている。a,bはxts型の銘柄データである。 


すばらしい。同じ日の同じ項目でたし算をしてくれている。

Volumeだけを取り出して、cbindで横につなげてみると

日付のないところはNAが埋められている。

さて、全銘柄について、日毎の出来高の合計を出したいので全銘柄について横にcbindしていく。


yt[[i]]はi番目の銘柄のデータで、上記のaやbにあたる。

yt[[1]]をzzに代入し、そこへ次々cbindしていくという構造だ。

for文で回すのは避けたいところで、sapplyの利用など試行錯誤してみたがだめだった。総銘柄数3986、各銘柄についておよそ270日分のデータがある。このfor文の実行に1分11秒かかった。zzは273行3986列の膨大なデータである。

3行目apply関数を用いて、行ごとの合計をとった。

チャートは下のようになる。



中央部分の特に大きくなっているのは2015年8月25日。前日800円の大暴落であった。

2016年5月12日木曜日

チャートに横線を入れる

前回、比率を固定して、グラフがはみ出してもよいとしてグラフを描きましたが、縮尺を直感的に理解するための別な解決策を考えてみました。

それは、最小値の整数倍に赤線、半整数(1.5、2.5、・・・)倍に青線を引くというものです。




addLines( h = y0 ) で直線 y = y0 を引いてくれます。

いかがでしょう。チャートの比率が違うことがよくわかります。

今朝、問題の三菱自動車が日産の傘下に入るというニュースがありました。昨日まで三菱自動車の株は大低迷状態でしたが、このニュースで大量の三菱買いが殺到し、9:00~15:00の間、ずっと約定なしの状態でした。私も200株成行で買を入れてあったのですが、あきらめていたところ、15:47に証券会社から100株約定したとのメールがきました。メールによれば約定時刻は15:00だそうです。こういうことがあるのですね。初心者としては見るもの聞くものみな新鮮です。

2016年5月5日木曜日

同じ比率でチャートを見る

インターネットやパソコンで見るチャートは、グラフ全体が収まるようにサイズを自動的に調整してくれるので便利ですが、一方でその変動が大きいのか小さいのかわからないという弊害があります。変動の様子が直感的にわかるように、サイズを定めてみました。といっても、どの銘柄を見るときも、同じ軸でよいかというとそうでもないでしょう。単元株数も違いますし、株価自体が大きく違います。比率が見えるのが良いだろうと思うので、グラフの最小値の2倍が最大値となるようにしてみました。作った関数は次の通りです。


ytは個人的に作ったデータで、yt[["8411-T"]]はコード8411の銘柄の直近約1年間のxtsデータです。

ただし、ここでは、そのうちの今年分のみをチャート化しています。

関数名 mc は 「my chart」 の意です。

いつでも出来高最高の「みずほ」と最近人気の「そーせい」のグラフを見てみました。


そーせいの方は直近では上にはみ出していてグラフには出てきません。

グラフからはみ出すことはまずいことでしょうか?

はみ出すという重要な情報を、はみ出すという過激な手法で伝えています。

比較のために、通常見るチャートをあげておきます。


変動の量は同じように見えます。

2016年5月1日日曜日

指値注文は何日で約定するか

 指値注文した時、約定までに何日を要するかシミュレーションをしてみた。当日以降の高値で約定金額以上になる最初の日までの日数を調べるにはどんな関数を用いたらいいかわからず、以下のような解決をしたが、本来どのようにするべきだろうか??

 設定は、始値で買って、その5%増しで指値売注文をしたときに約定までに何日要するか。その日のうちに株価が上がれば当日約定することもある。

サンプルデータは

プログラムは

結果は

sasiが指値、dが約定までに要した日数である。当日約定の時は1となる。Infは約定しなかったものだ。

 例えば3月13日は始値が5020円だったので、指値は+5%の5271円、約定したのが8日後(3月24日、3月13日を1日目と数える。営業日のみのカウント)。この日の高値は5300円であったので売れたわけだ。

 2つのベクトルについて片方を固定して他方のベクトルを検索し、そのうえで最初のベクトルを動かすという順序性をどう解決するのか、手ごろな関数がありそうだが見つからなかった。ご存知の方があれば教えてもらいたい。(誰もこのブログは見ていないって)

 ベクトルv、定数aについて、min(which(v>a))はv中の最初にaを超える要素の添え字を返す。

 これは、対象vがxtsだとうまく動かないのでどちらもnumericに変換した。

 本当はsasiの値で回したいのだが、「この日以降」の参照がsasiの値からはできないので、sasi中のインデックス(添え字)iで回した。Hは高値からなるベクトルであるので、H[i:n]で当日以降を表した。