Pythonで株式チャートの表示 1

Pythonを勉強し始めました。(なんか最近組み込みでも使われているみたいなので。) 手始めに組み込みで関係ないのですが、勉強がてらにPythonで株価のチャートを書いてみようとトライしました。

目標はなるべくSBI証券に出てくるグラフに近づけるようにしました。

データの用意

まずpandasのDataFrameでn225の名前で下記のようなデータを90日分作ります。

n225.head(10)
Out[83]: 
   index  Close       Date   High    Low   Open  Volume
0   6869  22880 2017-12-18  22890  22710  22750   34271
1   6870  22800 2017-12-19  22960  22790  22930   29074
2   6871  22860 2017-12-20  22900  22770  22800   19750
3   6872  22800 2017-12-21  22870  22690  22820   25308
4   6873  22850 2017-12-22  22880  22770  22810   20173
5   6874  22880 2017-12-25  22920  22840  22860    8801
6   6875  22850 2017-12-26  22920  22840  22890   12085
7   6876  22890 2017-12-27  22940  22860  22880   16805
8   6877  22780 2017-12-28  22950  22720  22930   28503
9   6878  22750 2017-12-29  22880  22740  22810   20804

n225['index']はSqliteにこのデータを保存しているときにくっついていました。このデータは今回は使いません。データベースへの保存はただいま勉強中です。

表示する領域データ

表示する領域データの最大値などを作ります。これをしないとグラフがぴちぴちになって見づらいためです。

#グラフ表示領域の最大値最小値を設定
cellnum = 500 #日経平均株価の横軸の間隔設定
maxprice = (max(n225.High)+cellnum)//cellnum*cellnum #cellnum円単位で切り上げ
minprice = min(n225.Low)//cellnum*cellnum #切り下げ
print("Yen max :{} {} min:{} {}".format(max(n225.High),maxprice,min(n225.Low),minprice))

#出来高横軸設定
cellvolume=10000
gridvolume=50000
gridday=10
maxvolume=(max(n225.Volume)+cellvolume)//cellvolume*cellvolume #丸め処理 出来高の最小値は0でいいのでMaxのみ
print("Volume max:{} cell:{}".format(max(n225.Volume),maxvolume))

#何度も使うデータをまとめます
days_num = len(n225.index)
xticks_list = [x for x in range(0,days_num,gridday)]

グラフの表示

面倒くさかったのは右側に値を表示するところでした。株のチャートは右側のほうが重要なため、この表示はやっておきたいところでした。 これが良いやり方かどうかわかりませんが、あまりこのようなことをしているサイトが見つかりませんでしたので自分なりのやり方を試みました。 やり方は2重グラフを書いて左右のY軸をそれぞれのものにするときに使うtwinxを使って書きました。右左ダミーで書いて左側を最後に消すという面倒なやりかです。

fig = plt.figure(figsize=(16,9))
gs = gridspec.GridSpec(3,1) #上と下のチャートを2:1で表示させるため縦3 横1の大きな枠組み設定
plt.subplots_adjust(hspace=0.07) #上のチャートと下の間隔を調整

#ローソクチャート
ax1 = plt.subplot(gs[0:2,0])
ax1.grid(color='black',linestyle=':',lw=0.7)
ax1.set_xlim(-1,days_num)
ax1.set_xticks(xticks_list,minor=False)
ax1.set_xticklabels([])
ax1.set_ylim(minprice,maxprice)
ax1.set_yticks(range(minprice,maxprice,500))
#価格のY軸を左側へ表示
ax1tmp=ax1.twinx()
ax1tmp.set_ylim(ax1.get_ylim())
ax1tmp.set_yticks(ax1.get_yticks())
ax1tmp.set_yticklabels(['']+[x for x in range(minprice+cellnum,maxprice,cellnum)])
#ax1tmp.set_ylabel('Yen')
ax1tmp.grid() #Y軸左側を削除したとき線が消えるのでここで表示

candlestick2_ohlc(ax1, n225.Open, n225.High, n225.Low, n225.Close, width=0.8, colorup='red', colordown='green')
ax1.set_yticks([]) #Y軸左側削除

あと日経平均出来高の高さの比を2:1にしたいために subplotをつかって調整しています。 次のソースが出来高の表示です。

#出来高表示
ax2 = plt.subplot(gs[2,0])
ax2.set_xlim(-1,days_num)
ax2.set_xticks(xticks_list)
ax2.set_xticklabels([x.strftime('%Y-%m-%d') for x in n225.Date][0::gridday])
ax2.set_ylim(0,maxvolume)
ax2.set_yticks(range(0,maxvolume,gridvolume))
ax2.grid(color='black',linestyle=':',lw=0.7)
#ax2.set_xlabel('Date')
#y軸を左側へ
ax2tmp=ax2.twinx()
ax2tmp.set_ylim(ax2.get_ylim())
ax2tmp.set_yticks(ax2.get_yticks())
ax2tmp.set_yticklabels(['']+[x for x in range(gridvolume,maxvolume,gridvolume)])
ax2tmp.grid()

ax2.bar(n225.index,n225.Volume,width=0.7,color='gray')
ax2.set_yticks([]) #Y軸左側削除

#fig.autofmt_xdate() #x軸のオートフォーマット
plt.show()

表示

最終的には次のように表示されます。 

f:id:mechagocha:20180331092045p:plain

next

次は移動平均の表示ですね。あとデータを取得保存するためデータベースの操作方法も考えたいと思います。

mechagocha.hatenablog.com

参考

参考にさせていただいたWebサイトです。

www.stockdog.work

python-remrin.hatenadiary.jp