Rでローソク足を書く

前回はgnuplotとshで色々頑張りましたが,統計処理はRに任せたほうが楽ではないかということで試してみました.
グラフ作成には,ローソク足チャートを書いてくれるquantmodというライブラリを使いました.

テキスト版


# usdjpy_hiasi.txtの1行目に
# "Date" "Open" "High" "Low" "Close"
# (間はタブ区切り)を追加すること
library("quantmod")
data <- read.zoo("usdjpy_hiasi.txt", header=T, sep=" ") data<-to.monthly(data) candleChart(data)

usdjpy_hiasi.txtから平成以降の日足データを読み込み,to.monthlyなる関数で月足に変換してグラフを描画させています.
前回のシェルスクリプトでゴリ押ししたのと比べてスマートです.さらに,グラフ表示はgnuplotと比べて綺麗です.

次に2010年の日足です.
gnuplotでは休場日を左詰めにして表示できなかったのですが,quantmodでは勝手にやってくれます.また,特に工夫しなくてもグラフ描画が綺麗です.

テキスト版


# usdjpy_hiasi.txtの1行目に
# "Date" "Open" "High" "Low" "Close"
# (間はタブ区切り)を追加すること
library("quantmod")
data <- read.zoo("2010_hiasi.txt", header=T, sep=" ") candleChart(data)

総評:gnuplotより楽で綺麗です.ただし,グラフをpngやepsに出力する方法が不明です.このままではシェルスクリプトで一括処理(あるいは自動処理)できません.

参考:
quantmod本家
http://www.quantmod.com/

Rでローソク足を描く
http://entre2formosas.blogspot.com/2010/11/r.html

Rでローソク足チャート
http://sohgetsu.blogspot.com/2009/04/r.html

gnuplotでローソク足を表示させる

twitterでこんなことをつぶやきました:

手軽かつ詳細に,環境に依存せず為替の履歴をローソク足で見られるサイト作ったら便利かなと思った.第一感ではCSVさえ手に入ればRuby + sh + crontabですぐできそうだが.

まあいきなりは無理ですので,とりあえず今日は,ドル円と日経225を月足で表示することにしました.
期間は,1980年代から現在までのデータを見つけられたので,まあその付近ということにしました.

すぐできるだろと思ってたら,データ加工に手間取り半日がかりの作業となりました.

・日経先物225
米Yahooのサイトに,月足のCSVデータがあったので簡単に作れました.

中身はこんな感じです.gnuplotで扱うために,カンマではなくタブで区切ってます.ですので厳密にはCSVではありません.

$ cat kabu.txt
# 年月日 始値 高値 安値 終値
2010/12/01 9939.8 10394.22 9918.55 10228.92
2010/11/01 9166.85 10157.97 9123.62 9937.04
2010/10/01 9440.52 9716.92 9179.15 9202.45

(略)

1984/03/01 9920 10929 9920 10929
1984/02/01 10201 10201 9830 10031
1984/01/04 9927 10236 9927 10196

set xdata time
set timefmt "%Y/%m/%d"
set format x "%Y"
set xlabel 'Year'
set title 'Transition of NIKKEI225 by soraochi'
set ylabel 'NIKKEI225 [Yen]'
plot "kabu.txt" using 1:2:3:4:5 with candlesticks linetype -1 notitle, 10000 lt 7, 20000 lt 7, 30000 lt 7

・ドル円
日足でのCSVは見つかったのですが(参考文献),月足のCSVは見つけられませんでした.
まず,拾ってきた日足データを下記のような形式に加工しました.


$ cat ./hiasi.txt
# 年月日 始値 高値 安値 終値
1989/1/03 123.60 125.56 123.35 123.60
1989/1/04 123.65 125.15 123.65 125.05
1989/1/05 125.05 125.76 125.05 125.59

(略)

2010/12/27 82.82 82.99 82.65 82.83
2010/12/28 82.80 82.81 81.81 82.36
2010/12/29 82.45 82.45 81.60 81.62

awkで扱いやすくするため,日付のフォーマットを日経225のときとは変えてあります.
このままでは日足なので,月足に変換するシェルスクリプトを書きました.

シェルスクリプトのテキスト版

#!/bin/bash

TEMPFILE=/tmp/rosoku.$$;

rm ./rosoku.txt;
touch ./rosoku.txt;

YEAR=1989;
while [ `test $YEAR -le 2010;echo $?` = 0 ]
do
 MONTH=1;
 while [ `test $MONTH -le 12;echo $?` = 0 ]
 do
  cat ./hiasi.txt | grep `echo $YEAR/$MONTH/` > $TEMPFILE;
  HAJIMENE=`cat $TEMPFILE | head -1 | awk '{print $2}'`;
  OWARINE=`cat $TEMPFILE | tail -1 | awk '{print $5}'`;
  TAKANE=`cat $TEMPFILE | awk 'BEGIN{ taka = 0.0 }{if ($3 > taka){taka = $3}}END{print taka}'`;
  YASUNE=`cat $TEMPFILE | awk 'BEGIN{ yasu = 1000.0 }{if ($4 < yasu){yasu = $4}}END{print yasu}'`;   echo -e "$YEAR/$MONTHt$HAJIMENEt$TAKANEt$YASUNEt$OWARINE" >> ./rosoku.txt;
  MONTH=`expr $MONTH + 1`;
 done
 YEAR=`expr $YEAR + 1`;
done

rm $TEMPFILE

月足の高値(安値)は,その月に属する日足の高値(安値)のうち最も高い(安い)ものです.twitterでつぶやいた通りです:

Σxi=A(for i:= 1 to N)のとき,集合Aの最小値は,部分集合xiの最小値xi_minのうちのどれかか.∀xi_minが既知なら,集合Aの最小値はN-1回の比較演算だけで求められると.

出力(rosoku.txt)は以下のようになりました

$ cat rosoku.txt
1989/1 123.60 130.98 123.35 130.50
1989/2 130.35 130.90 125.20 126.87
1989/3 126.85 133.55 126.85 132.77

(略)

2010/10 83.49 84.01 80.41 80.48
2010/11 80.33 84.41 80.24 83.65
2010/12 83.68 84.52 81.60 81.62

作った月足データをgnuplotで出力しました

set xdata time
set timefmt "%Y/%m"
set format x "%Y"
set title 'Transition of USDJPY=X by soraochi'
set xlabel 'Year'
set ylabel 'USDJPY=X'
plot "rosoku.txt" using 1:2:3:4:5 with candlesticks linetype -1 notitle, 80 lt 7 w l, 160 lt 7 w l

CSVデータは概ね加工できたので,次は任意の期間と足を指定できるCGIを作るかもしれません.

・参考文献
gnuplotでローソク足を表示させるのに参考になりました
http://park8.wakwak.com/~sohgetsu/cgi-bin/wiki.cgi?page=gnuplot

awkで文字列を扱う時,参考にしました
http://www.osaka-kyoiku.ac.jp/~kokugo/nonami/awk/awkmini.html

日銀の統計サイト.あまり役に立ちませんでした
http://www.stat-search.boj.or.jp/index.html

日経225の古いデータがあります
http://finance.yahoo.com/q/hp?s=^N225

ドル円,先物などのデータがあります
http://www.sankayo-jp.com/download.htm

ドル円の古いデータがあります
http://www.fxlabo.com/content/tradematerial/zai_deta.htm