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