2016年10月31日月曜日

数独を解く2

10月28日付けブログの数独を解くプログラムで、数独を解いてみた。連続的に解くために若干の修正をしたが、本質的には変わりない。

サンプルとして挙げた「超極・激」には、対角線指定や、変形3×4などが含まれており、それらを除いた通常のもの130題を解いたものである。

出力の冒頭を以下に示す。



問題と解答と所要時間を示した。

解答時間の平均は0.692秒 最大3.44秒であった。使用マシンのCPUはi7である。解答時間の分布は



詳細を検討してみると、checkだけで解けているものも多数あり、solveを用いて試行錯誤的にアプローチしているものも多い。solveを用いた場合、再帰の深さは結構深いのが目につく。

前回の解法アルゴリズムで、1つのグループ内に例えば5の可能性のあるマスが1つだけならばそこが5である、というアルゴリズムを最後に付け加えた。

これを拡張して、1つのグループ内に可能性が5と8だけであるマスが2つあれば、そのグループのほかのマスからは5と8の可能性が削除できる。

また、1つのグループ内に 可能性5と8を含むますが2つだけならば、その2つのマスの5と8以外は削除できる。

さらに拡張すると、1つのグループ内に例えば可能性が5と8と9だけであるマスが3つあれば、そのグループのほかのマスからは5と8と9の可能性が削除できる。この場合、この3つのマスのうちの1つは「5と8」でもよい。など。

これらについてはまだ、実装してない。

2016年10月28日金曜日

数独を解く (sudoku ナンプレとも)

Rで数独を解いてみた。その中で、R独特の機能が結構有効であったので、解説してみる。サンプルとして、Take-Shobo「ナンプレ超極・激」の30番を使用した。次のような問題である。

結果は

整形してないので見にくいが、9文字ごとに改行を入れると答えになる。もちろん先頭の[1]などは除いて。

Rのプログラムというのだろうか、ソースは以下のようなものである。

1行目、qが問題である。81文字の数字で、0は空欄を表す。q すなわち question である。

2行目、qを1文字ずつに分解し、更に数値に変換している。0~9の数字81個のベクトルである。名前bはボードの意である。
プログラムの中で、bは重要な位置を占める。
数独の問題は、視覚的には平面であるが、プログラム内では1次元ベクトルとして表現している。実は、この方がよいのである。そのことはだんだんと分かってくる。
数独のマスに順に1~81までの番号を付け、この番号を「座標」と呼ぶことにする。座標はiであらわす。

3行目から10行めはグループの指定である。
数独では各1行の中に1~9のすべての数字が入る。各1列の中にも同様である。さらに、3×3に分けた9個の各正方形の中においても同様である。この、行・列・3×3正方形の1つずつを「グループ」と呼ぶことにする。gsは各グループの座標を持つ行列である。gsはグループスの意味である。内容は次のようになる。

[1,]は1行目を表す。[10,]は1列目を表す。[19,]は左上の3×3正方形を表す。
gsを用いて、各グループに同じ数字がないことを確認するのである。実は思いがけない利用法がある、対角線上に1~9があることを条件としたり、変な形の領域に1~9があることを条件にする問題があるが、ここを変えればよいのである。
グループは27個あり、その番号はkで指定する。また、一つのグループはベクトルgで表す。

11行めから44行めの関数checkが肝である。
引数が複雑だが、外から使うときはcheck(b)のように使えばよい。このように使うと、12行めで行列sbを作る。
このsbがこのプログラムのもう一つの重要点である。サブボードのつもりでsbという名前を付けた。
ボードの各マスには1~9のいずれかの数字が入るのだが、その候補を記録するのがsbである。
sbは81行9列の行列で、各行が、各座標に入る数字の候補を記録している。
sb[i,n]は、座標iに数字nが入る可能性があれば1、なければ0をとる。
例えば1行目が 1,1,0,0,0,0,1,1,1 となっているとすると、座標1のところには、1,2,7,8,9のいずれかが入る。逆に言えば3,4,5,6は入らないことを意味する。
sbの候補をどんどん減らしていって答えを見つけるのである。
最初はすべて1である。すなわち、すべての数字の入る可能性がある。

どのように候補を絞っていくかが、そのあとに続く。

15・16行めは、ボードに数字が入っている場合、すなわち0でない場合は、その座標のsbは、その数字のところを1とし、それ以外を0とする。

b[i]は座標iの位置にある数字である。「sb[i,-b[i]]=0」はsbのi行めのうちの、「b[i]すなわち座標iの数字」以外のところを0にする。普通の言語だとループでやるところだ。こんなに簡単にできる。(簡単というのは表現の文字数が少ないという意味だ。表現の理解はそう簡単ではない)

18行めから26行め。for文を使ってしまった。applyか何かでやりたいところだが、今後の課題。
ここでは、ボード上で数字が入っていたら、その座標を含むグループのほかの座標ではその数字は使えないので、sbのその位置を0にする。もっと具体的に言うと、座標iの位置にある数字がnのとき、座標iを含むグループの他の座標jについて、sb[j,n]を0にするのだ。
プログラムに沿って解説する。
kはグループ番号で、1~27まで変わる。
k番目のグループをgとする。gは長さ9のベクトルで、k番目のグループの座標を持っている。
pはg内をポイントし、1~9変わる。
g[p]がグループgのp番目の座標なので、その位置の数字はn=b[g[p]]となる。nが0の時は数字はないので何もしない。0でないときは座標g[p]に数字nがあるので、そのグループ内のほかの座標のsbのnのところを0にしなければならない。なんとそれが、
sb[g[-p],n]=0でできてしまう。g[-p]はグループgのポイントしている以外のすべての座標からなるベクトルだ。それらの行のn番目を0にするのだ。

ここまではbの情報をもとにsbを変更した。

次の27行めから30行めは、sbをもとに、bを変更する部分である。

iはボード上の座標である。1~81の値をとる。
sb[i,]は座標iのサブボード情報である。すなわち、各数字が可能性があるかどうかを示す9つの数(0か1)からなる。
sum(sb[i,])が0だということは、その座標に入る数字がないことになる。すなわち、解(甲斐)なしである。NULLを返すこととした。
sum(sb[i,])が1だということは、座標iに入る数字が一つに決まったということである。その場合はボードに数字を書き込む。

15行めから30行目までを繰り返すと、易しい問題は解ける。繰り返しは必要で、sbからbに変更が加わるとそのbからまたsbに変更が生し、・・・ということがあるからである。13行めから42行目までがrepeatで囲まれているのはそのためである。
繰り返して、変更がなくなったらrepeatを抜けるのだが、その判断は、sbのフラグの総数の変化で調べている。sbのフラグ(1)の総数は単調減少だ。

31行めから40行めの説明は後回しにする。

43行め、返す値は、ボードbとサブボードsbのリストである。

checkだけで解ける問題は易しい問題である。checkだけでは解けない問題を試行錯誤で解くようにしたのがsolveである。
solveは最初の空欄に1~9までの数字を当てはめてcheckを繰り返す。1段階の当てはめでうまくいかない場合は、再帰的に多段階で挑戦させる。

solveの引数はl(エル)である。checkで返すリストを引数にする。リストなのでlだ。l[[1]]はボード、l[[2]]はサブボードだ。サブボードは渡さなくても計算できるが、せっかくそれまで計算したものをはじめから計算するのもどうかと思って、引数として渡すことにした。

さて、最後に残った31行めから40行めだ。
当初、これはつけないつもりでいた。試行錯誤させればよいと考えていたからだ。ところがサンプルの問題では1時間ほど動かしても答えが出ない。空欄が多い問題ではこうなるのは必然だ。

ここでやっていることは、1つのグループ内のsbのフラグをすべて見て、例えば5のフラグが1個しか立っていないならば、そこが5だ
ということを調べている。

このルーチンを付け加えたら、サンプル問題は一瞬で解けた。試行錯誤なしで、checkのみで解けた。「超極・激」というには情けない。まあ、30番だから。このあと難しいのがあるのだと思う。

このように実際の数独を解くときに使う戦略を組み込むと速度は劇的に改善する。今回Rで作ってみたが、以前に一度python3でプログラムしたことがある。その時の経験に基づいた発言である。

以上でこの稿は終わる。
しばらく、更新してなかったので、更新しなければという強迫観念で書いた。
きっと読みにくいだろうと思う。
面白いと思ってくれる人がいるのだろうか?

2016年9月1日木曜日

Print Edit ・・・FireFox アドオン

 WEBサイトを閲覧していて、ここぞというところを印刷したいことはよくある。chromeだと、選択部分の印刷ができるのだが、FireFoxの方は、アドオンを使えとつれない。

そんな中でこのアドオンに行き着いた。しかし、WEBで使い方を調べても、入口の説明しか見当たらない。で、いくらか調べてみたので、僭越ながら、紹介する。なお、アドオンのインストール方法などは割愛する。

アイコンは次のようなものである。

クリックすると

上の方にメニューが出ている。このメニューは大変長く、次のようになっている。

選択 隠す 削除 他の要素を隠す 他の要素を削除 フォーマット Text 元に戻す すべて元に戻す 保存 テキスト要素 Webスタイル プレビュー 閉じる ヘルプ ツール

この状態で、印刷したい部分(または印刷したくない部分)を選択する。下の図の赤で囲まれたところが選択された部分だ。今回は、赤い範囲の右下のあたりをクリックして選択した。

クリックして選択する以外に、ドラッグして範囲選択することもできる。ただし、ドラッグした中にすべてが含まれる要素が選択される。画像の半分とか、段落の一部とかの選択はできない(と思われる)。



印刷したい部分が選択できたら、「他の要素を削除」すると、「Restricted」「Without Flow」「Unrestricted」から一つ選ぶ。「Without Flow」を選んだのが次の図だ。なお、「Restricted」を選ぶと、左にマージンが出た。「Unrestricted」だと、フォーマットせずにべたな感じになった。



これで、プレビュー → 印刷 すればよい。

と、ここまではほかのサイトでもよく書かれている。

選択範囲が長くなると、適当なところで改ページしたい場合がある。その方法を以下に示す。

「今これがほしい」を選択して、「フォーマット」ボタンを押し、更に、赤1でプロパティを表示し、赤2で「Page Break」にチェックを入れたが次の図である。この画面では改ページされていないが、プレビューすると改ページが入ったことがわかる。



フォーマットで出てくる項目は改ページだけでではない。色やフォントやマージンなどの変更ができることがわかるだろう。

では、文字を入れたい場合はどうするか。

「甚大な被害」の写真を含むブロックを選択して、「Text」ボタンを押して、次の図。



テキストボックスに「大注目!!!」と入力した。また、その左下、「inline After」を選択した。OKすると、



選択した部分の「次」に、文字列が挿入されている。

それ以外のメニューなどを、ざっくり紹介しておこう。

左端の「選択」は、何か選択すると「選択解除」というメニューにかわる

「隠す」は選択した部分を白くする。詰めたりはしない。

「削除」は選択した部分を削除して、空間が開けばそこを詰める。

「他の要素を隠す」「他の要素を隠す」は隠す・削除を選択した以外の要素に適用する。

「フォーマット」「Text」は前述した。

「元に戻す」「すべて元に戻す」はその通りで、いろいろと試行錯誤できる。

「保存」はいろいろな形で保存できる。今のところ使う必要を感じない。

「テキスト要素」「Webスタイル」わからない。

「プレビュー」「閉じる」この通り。

「ヘルプ」マウスアクションとショートカットのヘルプ

「ツール」設定はわかるが、「Fix Page Breaks」の意味が分からない。


以上です。大変便利です。画像がぼけててすみません。

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年について同様の操作をしたものである。


左の方が陽線が目立つ。

2016年7月18日月曜日

損切ラインと利益確定ラインについて

 私は、始値で買って、±5%程度で、指値と逆指値を入れるということを試しています。損切も利益確定も同じ幅にしています。それはなぜかというと、損切を小さく、利益確定を大きくすると損切に達する確率が高くなって、結局のところいつも損切にあってしまうのではないかとの危惧と、同じ幅にしておけば、上がると予想したことが外れたと原因がはっきりすると考えたからです。

今回この戦略をテストしてみました。対象は2132アイレップ 2015-03-13~2016-07-13です。

始値で買って、損切ラインや利益確定ラインに達すればその値段で売り、売れなかったら大引けで手仕舞うという想定です。

手元のデータは4本値だけなので、損切と利益確定の両方に達した時、どちらに先に達しているかは判別できません。

次は、損切を始値の5円下、利益確定を10円上に設定した場合です。

1行目、入力の説明をします。

culcは関数名です。

zはアイレップの4本値データ(xts)です。

続く引数の5,10は損切幅と利益確定幅の指定です。

2・3行目 出力の説明をします。

損回は損切に達した回数です。 Lo(z) <= Op(z)-5 の回数を数えています。 利回は利益確定ラインに達した回数です。 Hi(z)>= Op(z)+10 の回数を数えています。

損利両回は両方のラインに達した回数です。実際にはどちらに達しているのかわかりません。

引回は両ラインに到達せず、大引けで売った回数です。

引損益は大引けで売ったときの損益です。

損切は損切ラインの値段で売れたものと仮定しています。実際にはそれより下がることもありますが。従って損の合計は損回*-5円となります。同様に利益確定の合計は利回*10円、全計はこの2つに引損益を加えたものです。

修正計は、両ラインに達した時、損切ラインに達したものとして同様の合計を出したものです。

この場合は、損切ライン到達が160回、利益確定ラインに到達が122回、両ラインに到達したものが63回。大引けで売ったのが109回で、両方に到達しているときすべて損切ラインに到達したとすると、最終損益は-180円であるということを意味しています。

損切ラインと利益確定ラインを変えると、どうなるでしょうか。損切ラインを1~100円、利益確定ラインも1~100円にして、10000通りの組み合わせで、計算してみました。10000行表示してもいかがかと思うので、主なところを以下に示します。write.csv出力してexcelで開いた画面のハードコピーです。



最も成績の良いのが損切-18円、利益確定+57円です。

損切ライン到達が57回、損益-18*57=-1206円。利益確定ラインに到達が11回、57*11=+627円。両方に到達したケースはありませんでした。大引けまで行ったのが260回、+1201円。最終損益は802円です。

現在の終値は872円ですので、18円というのは2%にあたります。

この期間の始値292円、終値872円。単に持っていれば+580円です。

損切ラインは思いのほか小さいこと、利益確定ラインはなくてもいいくらいですが、高いところに設定しておけば、引けに向けて値下がりするときに有効なことがあるということでしょうか。勉強になりました。

ほかの銘柄で同様なことをやってみると、損切幅1円などという銘柄が多数出てきました。全体に値下がりしている銘柄はそうなるのでしょう。アイレップは右肩上がりの銘柄であったということも大きな要因かと思います。また、アイレップにしても現在大幅な下降局面に入った感があり、この戦略を今、当てはめてみようとは、思いません。なお、アイレップは2015年の11月ごろから値動きの様子が大幅に変化しました。この時期後で同じことをやってみると損切幅17円でした。

見る人もいますまいが、一応culcのソースをあげておきます。



2016年7月14日木曜日

xtsのcsv出力

zzはxts型のデータである。

これをcsv出力すると、次のようになる。

日付が消えてしまう。この場合は、write.zooを使う


Stack Overflow に出ていた。


2016年6月25日土曜日

quantmod チャート上をクリックする

quantmodのチャートをクリックして、特定の日を選んだり、直線を引いたりしたいと思った。

quantmodにはzooomという関数がある。これはチャートの2点をクリックするとその期間をzoomしてくれるというものだ。

その関数のソースを調べてみた。その中でget.chobという関数でチャートオブジェクトを得ている。このオブジェクトにはチャートに関する様々な情報が格納されていた。また、関数chartSeriesのソースを調べると、実際に描くのはchartSeries.chobという関数であることがわかり、さらにchartSeries.chobを調べて、チャートオブジェクトの情報のうちで、使えそうなものを見つけた。それらの調査から次のような関数を作った。

この関数は、実行するとlocatorの十字が表示されるので、クリックすると、その日のデータを表示するというものである。参考として関数内で得ている値も表示した。プログラムと実行結果は次の通り。


3行めのcoがチャートオブジェクトである。

xdataはチャートを描くxts型のデータ。

xsubsetはsubsetで指定されたデータを整数値で示したもの、例えば125,126,127,...などとなっている、xdata内の行番号の列である。

nはデータ数(=xsubsetの長さ)

dxは1日分のデータのx軸上の幅である。

chartSeries.chobのソースによれば、i番目のデータのx座標は 1+(i-1)*dx を中心とするので、その前後 dx/2 の範囲をi番目のデータと認識するようにした。8行めである。

14行目以降が表示されたものである。

これができるといろいろできそうだ。

2016年6月20日月曜日

新高値更新回数を数える・・・累積最大値cummax

5月29日に、新高値の回数を数える問題を考えた。

当日の最高値がそれ以前の最高値以上となる日数を数える問題だ。

for文で回していたのだが、cummaxの存在を忘れていた。

zはxts型のオブジェクト(約1年分の4値データ)である。


これだけでOKだ。

一応解説しておく。

Hiは4値のうちの高値を求める関数。高値のベクトル(実はxts型)となる。
cummaxは累積最大値。それ以前の最大値からなるベクトルとなる。(xts型)
sum関数内では、TRUEは1、FALSEは0として扱われる。

恥ずかしいことです。

なお、前日以前の最高値と当日の高値が同じ場合は、本来は新高値ではないけれど、上の方法では新高値としてカウントされてしまう。
それを避けるなら、


lagで前日までの最高値を求め、当日の高値の方が高い日を数える。lagを使うと初日にNAが入る。NAが入るとsumはNAになってしまう。従って、na.rm=TでNAは除いて数えている。

2016年6月12日日曜日

複数チャート(plot.xts)

quantmodのチャートは詳細で素晴らしいのだが、画面分割できない。こんなに素晴らしくなくてよいので、ざっくり複数のチャートを見る方法を探ってみた。

あった。plot.xtsでチャートを描いてくれる。



zはxts型のオブジェクトである。ポイントはwidthであろか。width=25000。この位の大きさでないと、線のようなチャートになる。

また、通常のローソク足とは違って、土日など空いている日は空間が開く。これはこれでいいのではないかと思って受け入れることにする。

髭の色がgrayなので見にくい。髭・陽線・陰線の色などを指定すると次のようになる。



これに、移動平均線とボリンジャーバンドを入れると次の通り。



線が出てこないので日数をちょっと増やした。

SMAとBBandsはモジュールxtsの関数。5日移動平均が青色、25日移動平均が緑、ボリンジャーバンドはデフォルトの20日移動平均と±2σのラインを赤で描いてある。

これを複数描いたのが次の図だ。画面分割、余白調整、最小値の1.5倍及び整数倍に横線、コード・銘柄・最終終値を付け加えた。

2016年6月10日(金)に至る最終の3日間終値が前日の終値を上回っているマザーズの銘柄のチャート。

期間は2016年4月以降である。

線が左端から描かれているのは、データは約1年分を与えて、チャートを描く範囲のみを制限しているからである。





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]で当日以降を表した。 
 

2016年4月27日水曜日

GMMA

GMMAというチャートがあるそうです。

アイネット証券のサイトによれば、

「GMMAチャートとは、12本の指数平滑移動平均線(EMA)を一度に表示して、価格トレンドをビジュアル化しようとするトレンド系のテクニカル指標です。開発者Daryl Guppy氏の名前を取ってGuppy Multi Moving Averageと呼ばれ、GMMAと略されます。 」

とのことです。更に、

「短期線は、計測期間の短い3・5・8・10・12・15のEMA6本、長期線は、計測期間の長い30・35・40・45・50・60のEMA6本で構成されています。」

面白そうなので、quantmodでやってみました。

6行目のTAの指定がポイントです。

chartSeriesのTAに渡す文字列TAを、1・2行目で作っています。短期線は青、長期線はピンクとしました。

文字列TAが長くなるので2列にしました。途中に改行コードが入りますが、chartSeriesの方では問題なく動きました。だめならpaste,collapseを使います。

(Rの文字列結合は面倒で閉口します。)




7行め、multi.col=Tは、陽線・陰線の区別だけでなく、前日の終値と当日の始値との関係で4色にするものです。

例えば灰色は、当日は陽線で、前日の終値が当日の始値より高い場合です。

2016年4月21日木曜日

データフレームのxts化

データフレームwは4つの列名Open,Close,High,Lowからできています。これをxts化します。

これは、自動的に1970年1月2日からの日付が振られます。
日付データがあれば、それを関数xtsの第2引数に指定します。

この場合、変換するデータに日付があると全体が文字列に変換されてしまうので、数値データのみ指定しています。(6行目のw[1:4])

2016年4月17日日曜日

xtsでの単純な足し算

xtsオブジェクトで単純な足し算ができないという現象に悩まされました。
zは御覧の通りのxtsデータです。

先頭の終値は35550円です。

先頭とその次の終値を足してみます。

関数Clがquantmodのものなので、それを使わないでみましょう。

解消法を2つ

この現象はzooでも起きるようですが、tsでは起きませんでした。

同じ日付の場合、計算できるようです。

zがxtsの場合、z[[n]]でn番目の要素にアクセスできます。要素番号nは縦並びで数えます。matrixの場合と同じです。
上記の操作の結果がまたxtsになるので、[[ ]]でアクセス可能です。tsとの違いをご覧ください。


2016年4月10日日曜日

バックテスト2(昨日の反省)

 昨日、「 My Life as a Mock Quant(2011-03-29) およびその中で紹介されている FOSS Trading: How to backtest a strategy in R を参考にして」と書きましたが、落ち着いて見直してみると、参考にしたことになっているのかどうか心配になってきたので、現在感じている問題点を論じてみたいと思います。

 まず、本質的でない点を2点。

 その1、昨日の東証1部でのシミュレーションでは株式分割について考慮していません。手持ちのデータでは株式分割を知るすべはありません。また、あったとして、どのような対処が必要かについて考えていません。原典でも考慮していないと思われます。

 その2、指標について。原典のFOSSではDVIを使っています。DVIではデフォルトで252日分以上のデータが必要であるように思われます。My Life as a Mock Quant(2011-03-29)ではrsiを用いています。最終的なパフォーマンスではどのような指標を作るかが問題になるのでしょうが、今回は本質的でない話題ということで処理いたしました。

 今回本質的と思うのはステップ4:トレーディングルールについてです。

 昨日のモデルは、現金に注目して、売買は寄成に限りました。

 FOSSでは昨日書いたようにロングアンドショートという、株を買うか、空売りするかのどちらかというモデルでした。

 この場合は現金に注目してもうまくいかないのでしょう。FOSSの日々のリターンを計算するコードは次の通りでした。



 sigはステップ3で作成した指標です。日々1または-1の値をとっています。1がロング(買い)、-1がショート(空売り)です。

 GSPCは株価データです。

 Clで日々の終値をとっています。

 ROCはrate of change 変化率とでも訳すのでしょうか。イメージとしては「(当日の終値-前日の終値)/前日の終値」です。

ROCの定義をネット上でいろいろ調べてみたのですが、どうもはっきりとした定義が与えられていない。で関数のコードを見ました。要点を書くと、


の2つの定義があり、オプションでどちらを使うかが指定できます。デフォルトは下の式です。

上の定義はイメージ通りのものです。

下の定義では、log(x)-log(lag(x))=log(x/lag(x))ですから、x/lag(x)が1に近いとき、x/lag(x)-1で近似できます。これが上の式です。

ret はこの値を持ちます。

総資産の評価に


という式が出てきます。

終値を古いほうからx1, x2, x3, ..., xnと書くことにしましょう。

空売りなしの場合には、retの内容は log(x2)-log(x1), log(x3)-log(x2), log(x4)-log(x3), ... と続きます。

これのcumsumをとりますから、隣同士消えて、log(xn)-log(x1)となります。exp(log(xn)-log(x1))ですから、これはxn/x1となります。

すなわち、最初の価格が何倍になったかを示すことになります。

FOSSのステップ4の最後は


総資産の変化の様子を見て終わります。

昨日の記事とだいぶ違いますか?参考にしてバックテストをしてみたというスタンスでご理解ください。

ステップ5は今後の課題ということで。


2016年4月9日土曜日

バックテスト

 ブログ My Life as a Mock Quant(2011-03-29) およびその中で紹介されている FOSS Trading: How to backtest a strategy in R を参考にして、バックテストを作ってみました。
ステップ1:データを取得する。
ステップ2:指標作成。
ステップ3:トレーディング戦略を作る。
ステップ4:トレーディングルール。
ステップ5:戦略のパフォーマンス評価
となっています。FOSSでの戦略はロングアンドショートというものらしいです。買うか空売りするかという選択をしているようです。ちょっと敷居が高いので、買うか売るかだけの戦略にしてみました。パフォーマンス評価の部分はまだ未学習ですが、その前のところについては、大方理解が進んだのではないかと考えています。
問題を次のように整理しました。
1:1株を、持つか、持たないかの2つの状態のうち1つである。
2:それを判断するために指標を作る。この指標が1なら「持つ」。すなわち、買うまたは既に買ってあればそのまま。指標が0なら「持たない」売るかまたは既に売ってあればそのまま。
3:指標は、今回は簡単のため、前日が陽線なら当日「持つ」(1)、それ以外なら「持たない」(0)とした。
4:買い、売りは当日の寄成とした。すなわち、始値で売り買いする。
5:現金は0円スタートとし、買えばマイナス、売ればプラスとなる。


省略しましたが、quantmodパッケージを利用しています。
1行め:zはxts型の変数です。約1年分の特定銘柄(極洋)のデータです。
2行め:指標です。前日が陽線(終値>始値)なら、1、それ以外なら0をとります。前日のデータを見るのでlagです。OpClは(終値-始値)/始値の値を計算する関数です。騰落率という言い方でよいでしょうか?符号だけ利用しています。Cl(z)-Op(z)でもよいですね。Clは終値(Close)、Opは始値(Open)をとる関数です。quantmodの関数です。
3行め:lagをとっているのでsig[1]がNAになります。うまくないので0にしました。
4行め:現金の出し入れについては、前日と当日の株の保有状態によって4つのケースがあります。
① 前日保有・当日保有・・・現金の出し入れはありません
② 前日保有・当日なし・・・当日売るので、現金が入ります。
③ 前日なし・当日保有・・・当日買うので現金が出ます。
④ 前日なし・当日なし・・・現金の出し入れはありません
現金の出入りがあるのは②と③の場合だけです。lag(sig)-sigによって②の時は1、③の時は-1、①④の時は0となります。売り買いする値段は始値ですからOp(z)です。
5行め:4行めでやはり初日はNAになるのでその修正です。
6行め:累積和をとればそれぞれの日の現金の状態がわかります。lastで最後の現金を変数genkinに代入します。
7行め:最後に株を持って終わるか売って終わるかの違いがあります。終値でその株を評価します。
8行め:手持ち現金、株資産、合計最終損益を表示します。

最終

という状況でした。現金-265円、持ち株評価額259円で最終損益-6円です。


動作を確認するため、zとsigとmoneyを並べて示しました。OpCl.zはsigのことです。しばらく買いサインが出ず(OpCl.z0が5日続いた)3月23日に、終値>始値となって3月24日に買いサインが出ました。3月24日の始値303円で買うので、現金-303円となります。この日は始値≧終値なので、3月25日は買いサインがでませんから、始値301円で売ります。・・・とこのような調子です。
このルールで、手持ちの東証1部1956銘柄に適用してみたところ、平均-78円、最大6765円、最小-25498円。利益が出た銘柄845銘柄、損失1096銘柄、±0が5銘柄、データ不足で計算不能10銘柄でした。
記事には、バックテスト後のパフォーマンス評価が大事だと書かれています。今後学んで報告できれば良いですが、本日の記事でアップアップなので、いつになりますか。

2016年4月8日金曜日

連続回数

同じ値が何回続いているか調べたいことがあったので、そのような関数を作ってみました。出来上がりイメージは次のようになります。

8が5回、9が2回、0が1回、8が3回出たことを示しています。ソースは次のようになります。


全然Rっぽくないのが不満です。

2016年4月2日土曜日

ボリンジャーバンド

もうちょっとquantmodを使っている感のあるものをやってみたいと思う。ボリンジャーバンドとは、平均から±2σのところに引いた線のことである。正規分布理論によれば±2σからはずれるのはおよそ5%。ここから外れれば次は戻るだろうという理論と理解してよいだろうか。BBandsという関数がある。quantmodというかxtsパッケージの説明によると、(H+L+C)/3をTP(typical price)といい、TPの直近20日間の移動平均と移動標準偏差σを用いて、-2σの位置を0、+2σの位置を1として、当日のTPの位置を返す。


大きなデータを引用した。xt[[1]]はある銘柄のおよそ250日間の株価データで、xts型である。BBandsではHigh,Low,Closeの3つのデータを使うので、xt[[1]][,2:4]としている。20日間の移動平均を用いるので最初の19日間はNAである。項目名のmavgはmoving average 移動平均である。dnとupはそれぞれ-2σと+2σの値である。pctBは%Bなどと表記されるが、当日の値の位置である。位置の表し方は先に述べたようにー2σのところを0、+2σのところを1とした数値である。-2σを割るというのは%Bが0より小さくなるという意味である。本日の株価がー2σを割っているかどうかが問題なので、次のようにする。

なんと、最初から割れている。なにせ、本日は大荒れの日だったから。これを各銘柄について確認して、割れている銘柄のコードを集める。

やはりいろいろとエラーが出るので、tryで囲んでおいた。

いい加減にやるので、文字列になってしまった。"TRUE"の数を数えよう。

銘柄総数は
> length(xt)
[1] 1956
であるので、実に32%がー2σを割っている。異常事態である。xt[[1]]のチャートを描く。


ろうそく足の上下にある赤い点線の間のグレーゾーンがボリンジャーバンドである。最終日、すなわち右端ではー2σを割っているのがわかる。明日、反発するのかなあ??過去の様子を見るとー2σに沿ってだらだら下降している時期も短からずあるし・・・。

陽線の次は陽線か陰線か

陽線の翌日は陽線が多いのだろうか、陰線が多いのだろうか。陰線の翌日はどうだろうか。調べてみよう。

xtについての説明は、本日のブログを参照。東証1部各銘柄の直近250日間のxts型のデータのリストである。
陽線か陰線かはClose-Openでわかる。正なら陽線、負なら陰線だ。特定の銘柄についてClose-Openを求めてみよう。上記のzを使う。

sとlag(s)については

lag(s)は前日のデータである。lag(s)の3月20日のところには3月19日のデータが来ている。すると、一つ上の表の表示、ttについては、左側縦列が当日、上側横行が前日ということになるので、この表からは陽線の翌日は陽線が33、陰線が37ということになる。同様に、陰線の翌日は陽線38、陰線51ということになる。

陽線と陰線について、前日と翌日が独立だという仮説は棄却されない。簡単に言えば前日の状況から翌日は予測できないということだ。実に残念である。さて、これを全銘柄に適用してみよう。p-valueの値を取得する。

最初tryなしでやってみたがxは最低2要素が必要だとのエラーが出た。いずれかの銘柄で、データが(少)ないものがあったようだ。とりあえずtryで囲んで実行できるようにしてみた。

小さいほうから表示してみよう。

通例、p-valueが5%以下だと有意であると判断する。これらの銘柄は有力か??
p-valueが0.05以下の銘柄がいくつあるか数えてみよう。

ところで、

であった。

有意水準5%で検定するということは、偶然でも5%程度は発生するということだ。この数字はただの偶然だと言っているのだろうか。ちなみに有意っぽい銘柄を紹介しておく。

4月1日大荒れ

今、xに三菱UFJの直近250日分のxtsデータが入っている。
> head(x)
Open High Low Close Volume B
2015-03-26 777.0 777.7 761.0 765.1 76876300 59066990800
2015-03-27 756.0 775.4 747.0 752.2 79314300 60202202570
2015-03-30 749.5 761.0 738.6 756.5 56267600 42334099610
2015-03-31 769.0 771.9 743.7 743.7 63092000 47765287060
2015-04-01 742.6 758.1 735.6 748.7 75510400 56313185200
2015-04-02 748.7 781.7 747.8 773.0 100087400 77006686960
>
このようなデータを東証1部の各銘柄について、用意し、codeで参照できるようにした。
例えば、
> head(xt[["8306-T"]])
Open High Low Close Volume B
2015-03-13 781.0 795.4 778.0 789.5 134578900 105896527510
2015-03-16 797.1 809.5 790.0 797.0 92907600 74319257560
2015-03-17 807.0 811.0 792.5 793.2 72521700 58100512040
2015-03-18 792.1 808.9 787.0 806.6 75154500 59901916890
2015-03-19 803.0 805.6 781.2 785.0 101420600 80007293730
2015-03-20 783.7 790.0 777.0 790.0 59188500 46364901100
>
上記xと違うのは、xtはしばらく前にダウンロードしたデータをもとに作ったので、開始日が早い。その後、日々のデータを追加している。
xtはxtsデータからなるリストである。これを用いて、4月1日の株価下落の様子を調べてみよう。
前日の終値と比べて、本日(4月1日)の終値が下がっているか上がっているかを調べる。

yを見てみると

Close
2016-03-31 258
2016-04-01 252

この銘柄は6円下がっている。差をとるには、numericに変換しないといけないようだ。


[1] -6
これを全銘柄に適用する。

> head(v)
1301-T 1332-T 1333-T 1352-T 1377-T 1379-T
-6  -8   -70  -1  -57  -45
>
先頭の6銘柄についての様子である。ちなみに

> length(v)
[1] 1956

下落した銘柄数、上昇した銘柄数を調べてみる。

> table(sign(v))
-1  0  1
1862  17 73

なんてこった。(一応説明すると下落1862銘柄、上昇73銘柄、変わらず17銘柄)
業種別にどうなっているか知りたくなった。
業種については

で取得したデータ
> head(d)
コード 市場 銘柄名 業種 始値 高値 安値 終値 出来高 売買代金
1 1301-T 東証1部 極洋 水産・農林業 258 259 251 252 408000 103496000
2 1305-T 東証 ダイワ上場投信-トピックス その他 1411 1411 1362 1364 625380 861540000
3 1306-T 東証 TOPIX連動型上場投資信託 その他 1390 1392 1344 1346 11197880 15220495740
4 1308-T 東証 上場インデックスファンドTOPIX その他 1378 1378 1331 1334 2757600 3700777800
5 1309-T 東証 上海株式指数・上証50連動型上場投資信託 その他 26750 26750 26200 26280 385 10206250
6 1310-T 東証 ダイワ上場投信-トピックス・コア30 その他 635 635 616 619 2330 1445340
>
に業種があるのでこれを使う。項目名をaからjに付け替え、更に、コードで参照できるようにする。

コードがa、業種がdである。例えば
> d["1301-T","c"]
[1] 極洋
> d["1301-T","d"]
[1] 水産・農林業
なお、それぞれの下にLevels表示がされたがカットした。

出力をこのまま乗せると形が崩れるので、データフレームの形にして乗せることにする。このようにやるようだ。
> as.data.frame.matrix(tt)





株式データ

Rで株式データを扱ってみる。データは、k-db.comからダウンロードする。k-db.comさんに大変大変、感謝感謝。

このコードを実行すると文字列sに次のようなデータが取得できる。
> head(s)
[1] "2016年04月01日"
[2] "コード,市場,銘柄名,業種,始値,高値,安値,終値,出来高,売買代金"
[3] "1301-T,東証1部,極洋,水産・農林業,258,259,251,252,408000,103496000"
[4] "1305-T,東証,ダイワ上場投信-トピックス,その他,1411,1411,1362,1364,625380,861540000"
[5] "1306-T,東証,TOPIX連動型上場投資信託,その他,1390,1392,1344,1346,11197880,15220495740"
[6] "1308-T,東証,上場インデックスファンドTOPIX,その他,1378,1378,1331,1334,2757600,3700777800"
>
確定した1日分のデータの最新のものである。これをcsvファイルとして読み込むには次のように行う。

1行目はスキップし、-はNAと変換する。
特定の銘柄について、時系列(日足)データを取得するには、

> head(d)
日付 始値 高値 安値 終値 出来高 売買代金
1 2016-04-01 520.0 523.0 507.8 508.7 92551200 47375260340
2 2016-03-31 517.7 534.2 517.1 521.5 92844400 48863109720
3 2016-03-30 530.0 532.0 510.6 512.2 71910100 37377438410
4 2016-03-29 527.0 535.7 524.3 532.9 62651300 33226625400
5 2016-03-28 540.0 540.6 530.2 538.1 60656100 32445384790
6 2016-03-25 522.4 539.7 520.5 535.7 65428500 34793388440
>
三菱UFJの直近250日分のデータである。どのようなアドレスにすればよいかは、k-db.comで希望のデータを表示させ、その時のアドレスバーの表示を参考にすればよい。
quantmodという素晴らしいパッケージがある。インストール方法は、ほかで調べてもらうとして、このデータからローソク足チャートを描いてみる。

まず、項目名を英語表記にする。
quantmodで処理するには、データをxts形式に変換しなければならない。xtsは拡張された時系列データ(extensible time series)の意味らしい。chartSeriesはチャートを描いてくれる。デフォルトでろうそく足(candle chart)となっている。themeを省略するとバックが黒になる。重苦しいので白にしてみた。
なんと簡単なんだろう。