kabu STATION API の現在価格を取得できるAPIについて、throttle(スロットル;単位時間内に何回のアクセスが可能か)を調査した。
実際にリクエストを投げたところ、短時間内に10回までのFetchが許容されているようだ。 これは公式リファレンスの記述と一致する。
情報系のリクエストは秒間10件ほどの流量制限を設けています。
kabuステーションAPIリファレンス
下記は実際に [7974] 任天堂
の株価取得系のリクエストを行った際の出力である。10回目迄は取得できており、11回目に失敗している。
$ python sample.py [2021-02-19T23:38:32.333948] [01] (o,h,l,c) = (67600.0, 68480.0, 67250.0, 68300.0) [2021-02-19T23:38:32.344125] [02] (o,h,l,c) = (67600.0, 68480.0, 67250.0, 68300.0) [2021-02-19T23:38:32.390870] [03] (o,h,l,c) = (67600.0, 68480.0, 67250.0, 68300.0) [2021-02-19T23:38:32.406898] [04] (o,h,l,c) = (67600.0, 68480.0, 67250.0, 68300.0) [2021-02-19T23:38:32.437029] [05] (o,h,l,c) = (67600.0, 68480.0, 67250.0, 68300.0) [2021-02-19T23:38:32.449052] [06] (o,h,l,c) = (67600.0, 68480.0, 67250.0, 68300.0) [2021-02-19T23:38:32.479196] [07] (o,h,l,c) = (67600.0, 68480.0, 67250.0, 68300.0) [2021-02-19T23:38:32.504326] [08] (o,h,l,c) = (67600.0, 68480.0, 67250.0, 68300.0) [2021-02-19T23:38:32.526826] [09] (o,h,l,c) = (67600.0, 68480.0, 67250.0, 68300.0) [2021-02-19T23:38:32.543205] [10] (o,h,l,c) = (67600.0, 68480.0, 67250.0, 68300.0) [2021-02-19T23:38:32.560598] Fetch failed {'Code': 4001006, 'Message': 'API実行回数エラー'}
つまり、適度に間隔を開けてアクセスすれば、全銘柄の四本値も取得可能かもしれない。
この場合、2月1日現在で全銘柄 3820銘柄
を 5回/秒
で取得すれば、 12.7分
で取得可能という計算になる。
計測に使用したスクリプトは下記のもの。
import kabusapi import os import pprint from typing import List import datetime pp = pprint.PrettyPrinter() url = "localhost" port = os.environ.get('PORT') # 検証用, 本番用は18080 password = os.environ.get('PASSWORD') TOUSHO = 1 # 初期設定・トークン取得 token = kabusapi.Context(url, port, password).token # print(token) # トークンを指定した初期設定 パスワードが不要 api = kabusapi.Context(url, port, token=token) def info(code: int, exchange: int=TOUSHO): # 銘柄情報 data = { "symbol": code, "exchange": exchange, } response = api.symbol(**data) return response def now() -> str: return datetime.datetime.now().isoformat() def board(code: int): # 時価情報・板情報 data = { "symbol": code, "exchange": 1, } response = api.board(**data) try: o, h, l, crr = ( response['OpeningPrice'], response['HighPrice'], response['LowPrice'], response['CurrentPrice']) # 大引け後なら終値 except: print('[%s] Fetch failed' % now()) pp.pprint(response) return (o,h,l,crr) # info('9433') for i in range(1,100): print('[%s] [%02d] (o,h,l,c) = %s' % (now(), i, str(board('7974'))))