BlankTar

about | blog | works | photo

pythonで株やFXなんかで使うローソク足チャートを書きたかったのですが、ちょっと苦戦したのでメモ。
完成品はこんな感じです。
matplotlibで作ったローソク足チャート

ソースコードはこんな感じ。

import pandas
import matplotlib.pyplot as plt
from matplotlib.finance import candlestick_ohlc


dat = pandas.read_csv('usdjpy.csv', parse_dates=['日付'])  # ファイルの読み込み。
dat = dat[-50:]  # データが多すぎるので減らす。

dates = dat['日付']  # あとでつかう。

tmp = dat['日付'].values.astype('datetime64[D]')  # ナノ秒精度とか無意味なので、精度を日単位まで落とす。
dat['日付'] = tmp.astype(float)  # Datetime64形式だと使えないので、floatに変換。

plt.xticks(  # 横軸の値と表示の対応の設定。[::5]はラベルを1週間ごとにするために使っている。
	dat['日付'][::5],
	[x.strftime('%Y-%m-%d') for x in dates][::5]
)
plt.grid()

ax = plt.subplot()
candlestick_ohlc(  # グラフを作る。
	ax,
	dat.values,  # 入力データ。左から順に、始値、高値、安値、終値にする。その後にデータが続いてても良いらしい。
	width=0.7,  # 棒の横幅。今回は日単位の精度に落としてあるので、0.7日分の幅になる。
	colorup='skyblue',
	colordown='black'
)

plt.show()

わりと簡単。

データファイルはマネースクウェア・ジャパンが配布しているドル円のcsvファイルを使う前提で書いています。
まあ、始値高値安値終値の順番が正しければなんでも良い。

candlestick_ochlなんて関数もあって、こっちは始値終値高値安値の順番になります。お好みで。

横軸の表示を設定する方法は色々あるようなのですが、もっとも単純っぽいこの方法にしました。
あまりにもデータ数が多いときには問題が出るかもしれませんが、そうでなければこれで良いはず。

お手軽にわりと綺麗なグラフが出て素敵なんですが、細かい調整はどうも出来ないようです。
箱に枠線を付けるとか、そういうのは無理っぽい。もしくはすごく面倒臭そう。

参考:
Candlestick OHLC graphs with Matplotlib - Python Programming Tutorials
python - plotting dates from time() since the epoch with matplotlib - Stack Overflow
finance — Matplotlib 1.5.0 documentatio

この記事はLC Advent Calenderの10日目の記事です。

このサイトを作り始めて大体3年くらいになります。我ながらずいぶんと長く続いたものだと思います。
うちのサークル(というかうちの大学?)は技術系にも関わらずブログを持っていない人が多すぎる気がするので、ブログを書くメリットについてまとめておきたいと思います。

忘れることが出来る

自分のやったこと、学んだことを記録しておけばメモになるので覚えておく必要がありません。便利です。
サイト内検索をしても良いですし、グーグルで検索して出て来たりするとちょっと嬉しい気持になります。
"こんなことが出来るツールがある"くらいまで知っておけば事足りる場面は結構あると思うので、そういうときにブログはかなり活躍します。滅多に使いそうにないライブラリとか、ソフトの機能とかね。

勉強になる

「人に教えると良い勉強になる」なんて話がよくありますが、ブログを書くのについても同じことが言えます。
説明することで理解が深まりますし、記事に書くためにより深く調べたり、試したりするのでかなり勉強になります。

むしろ勉強せざるをえない

ブログを書いていると、時々、というか頻繁に更新が滞ることがあります。
技術系ブログについて言えばそれは新しいことを学んでいない証拠になるので、否が応でも自分が勉強していないことを知ることになります。で、記事を書くために新しいことをする羽目になります。
自分がどのくらい学んでいるかを知る指針になるのは結構素敵だと思います。

アクセス数を見るのが楽しい

普通の日常的なことを書いているブログだとアクセス数を確保するのに苦労するのでしょうが、技術系のブログならある程度オリジナリティのある記事を書いていればばんばんアクセス数が稼げます。
このブログも始めたころは日に数人くらいだったのですが、3年で日に200人くらい来てくれるようになりました。
こういう数字は見ていて楽しいです。めちゃくちゃ楽しいです。

以上、大体そんなところかと思います。
総じて、ブログを書くのは楽しいです。かなり楽しいです。お勧めです。
書きましょう、ブログ。

という記事を、@5st7さんの誕生会(?)をしながら書きました。明日はその@5st7さんの記事です。お誕生日おめでとう。

最近pandasを触っております。
pandasで何をしているのかというと、FXの価格データをこねくり回しております。統計楽しいね。

で、pandasで移動平均を出します。今回出すのはとりあえず単純移動平均(SMA)と、指数移動平均(EMA)の二つ。

単純移動平均を出すには pandas.rolling_mean を使って、以下のようにします。

>>> import numpy
>>> import pandas

>>> data = numpy.array(range(10))

>>> pandas.rolling_mean(data, 2)
array([ nan,  0.5,  1.5,  2.5,  3.5,  4.5,  5.5,  6.5,  7.5,  8.5])

>>> pandas.rolling_mean(data, 3)
array([ nan,  nan,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.])

こんな感じ。シンプル。

nanになって欲しくないときは、以下のようにして最小の範囲を指定すればおっけーです。

>>> pandas.rolling_mean(data, 2, 1)
array([ 0.,  0.5,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.])

次は指数移動平均。といってもあまり変わりません。

>>> data = numpy.array(range(10))

>>> pandas.ewma(data, span=2)
array([ 0.        ,  0.75      ,  1.61538462,  2.55      ,  3.52066116,
        4.50824176,  5.5032022 ,  6.50121951,  7.50045727,  8.50016935])

>>> pandas.ewma(data, span=3)
array([ 0.        ,  0.66666667,  1.42857143,  2.26666667,  3.16129032,
        4.0952381 ,  5.05511811,  6.03137255,  7.01761252,  8.00977517])

こっちもシンプル。

どっちの関数も引数にnumpy.arrayを渡せばnumpy.arrayで返って来て、pandas.Seriesならpandas.Series、pandas.DataFrameならpandas.DataFrameで返って来ます。
tupleやlistだとエラーになります。注意。

[ << ] [ 11 ] [ 13 ] [ 15 ] [ >> ]