はじめに
pytonで株価チャートを描ければいいなと思い、作ることにしました。株価を取得する方法やチャートを描く方法は色々あると思いますが、ここでは、楽天マーケットスピードIIのRSS関数を使い、エクセルに株価を表示させて、pandasのデータフレームに変換し、mplfinanceでチャートを描くようにしました。
RSS関数について
エクセルに入力する関数は、
=RssChart( ヘッダー行 , 銘柄コード , 足種 , 初期表示本数 )
それぞれの引数は、
ヘッダー行
省略の場合下記の項目が出ます
「銘柄名称, 市場名称, 足種, 日付, 時刻, 始値, 高値, 安値, 終値, 出来高」
銘柄コード
国内株式 数値4桁 例えば「トヨタ自動車」は7203
足種
T:ティック, 1M:1分足, 2M:2分足, 3M:3分足, 4M:4分足, 5M:5分足, 10M:10分足, 15M:15分足
30M:30分足, 60M:60分足, 2H:2時間足, 4H:4時間足, 8H:8時間足, D:日足, W:週足, M:月足
初期表示本数 1~3000
1分足:9日分、2分足:9日分、3分足:9日分、4分足:9日分、5分足:31日分、10分足:61日分
15分足:91日分、30分足:121日分、60分足:2年分、日足:10年分、週足:20年分、
月足:30年分(1995年5月以降のデータ)
RSS関数の詳細については、下記をご覧ください。
pythonのプログラムで、RSS関数は、次のようにしました。
code=7203 # 銘柄コード
bar="M" # 足種
number=50 # 表示本数
command_line="=RssChart("+","+str(code)+","+"\""+bar+"\""+","+str(number)+")"
ws.Cells(1, 1).Formula =command_line
コード
pythonのプログラムです。
実行前に、マーケットスピードIIのログインと、
エクセルを起動し、空白のブックを開き、RSSの接続が必要です。
import win32com.client #エクセル用
import mplfinance as mpf #グラフ用
import pandas as pd #データフレーム用
import time #時間調整用
#変数設定
code=7203 # 銘柄コード
bar="M" # 足種
number=50 # 表示本数
row, column=1,1 # Rssの関数を入れる場所
#Rss関数で取り込んだエクセルデータをpandasのデータフレームへ変換する関数
def get_data(code, bar, number, row, column):
#エクセルに入れる関数 RssChart(ヘッダー行,銘柄コード,足種,初期表示本数)
command_line="=RssChart("+","+str(code)+","+"\""+bar+"\""+","+str(number)+")"
#Rss関数をエクセルに記入
ws.Cells(row, column).Formula =command_line
#エクセルに取り込んだデータを変数「data」に取り込む
data=ws.Range(ws.Cells(row+2,column+3), ws.Cells(row+number+1,column+9)).Value
#データフレームに変換 columnsで各列に対応するタイトルを入れる。
data=pd.DataFrame(data, columns=["date", "time", 'Open', 'High', 'Low', 'Close', 'Volume'])
#日付と時間を合わせて、日時とする
date_time =data["date"]+"/"+data["time"]
#グラフの横軸に設定できるよう日時の文字をdatetime型へ変更する
data["date"] = pd.to_datetime(date_time)
#日時をインデックスとして、グラフの横軸にする
data.set_index("date", inplace=True)
return data
#今、開いているエクセルのシート「sheet1」をwsとする
try:
wb = win32com.client.GetObject(Class="Excel.Application")
except:
print("エクセルが開いていません。")
exit()
wb.Visible=True
ws = wb.Worksheets('Sheet1')
#株価チャートの表示
while True:
try:
data=get_data(code, bar, number, row, column)
mpf.plot(data, type="candle",volume=True)
break
except:
print("再試行中...")
time.sleep(1) # 待機する時間(秒)を指定する
エクセルに株価を取り込むときに、時間がかかる場合があります。
取り込み前にチャートを表示するとエラーになるため、
try、exceptを入れています。