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()
表示
最終的には次のように表示されます。
next
次は移動平均の表示ですね。あとデータを取得保存するためデータベースの操作方法も考えたいと思います。
参考
参考にさせていただいたWebサイトです。