株のシステムトレードをしよう - 1から始める株自動取引システムの作り方

株式をコンピュータに売買させる仕組みを少しずつ作っていきます。できあがってから公開ではなく、書いたら途中でも記事として即掲載して、後から固定ページにして体裁を整える方式で進めていきます。

kabu STATION APIの実行回数の調査

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'))))

(C) 2020 dogwood008 禁無断転載 不許複製 Reprinting, reproducing are prohibited.