kabuステーション®APIの使い方を解説【株の自動売買プログラムをPythonで自作しよう④】

この記事には広告を含む場合があります。

記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

前回の記事でkabuステーション®の設定が済んだので、kabuステーション®APIを使って株の発注をしたり、取引余力を取得したりすることができるようになりました。

次に自動売買のプログラムを作成していくのですが、kabuステーション®APIの使い方を理解する必要があります。

本記事では、kabuステーション®APIを使って注文を出すまでの手順をできるだけわかりやすく解説するので、参考にしてみてください。

kabuステーション®APIの仕様

kabuステーション®APIの仕様は、kabuステーション®APIのサイトREST API リファレンスから確認できます。また、Pythonのサンプルコードもダウンロードできるのでプログラム作成の参考にすることができます。

kabuステーション®には本番用環境と検証用環境があり、検証用環境では作成したプログラムの動作確認ができます。使い分ける方法ですが、localhostのアドレスを変更します。詳細は、リファレンスに各APIの本番用URLと検証用URLが記載されています。

kabuステーション®APIの使い方

kabuステーション®APIを使って注文を出すには、トークンを発行する必要があります。トークンとは、APIを利用するためのパスワードのようなものです。

まずは、公式のサンプルコードを引用して検証用環境で練習していきます。

注意点として、プログラムを実行する際はkabuステーション®を起動しておく必要があります。また、kabuステーション®の利用可能時間は、6:30から翌早朝6:15までとなっています。kabuステーション®を起動していても朝の6:15に強制的にログアウトされるので、6:30以降に再ログインしなければいけません。

トークン発行

Python
import urllib.request
import json
import pprint

obj = { 'APIPassword': 'YOUR_PASSWORD' }
json_data = json.dumps(obj).encode('utf8')

url = 'http://localhost:18081/kabusapi/token'
req = urllib.request.Request(url, json_data, method='POST')
req.add_header('Content-Type', 'application/json')

try:
    with urllib.request.urlopen(req) as res:
        print(res.status, res.reason)
        for header in res.getheaders():
            print(header)
        print()
        content = json.loads(res.read())
        pprint.pprint(content)
except urllib.error.HTTPError as e:
    print(e)
    content = json.loads(e.read())
    pprint.pprint(content)
except Exception as e:
    print(e)
    

APIPasswordには、APIシステム設定で設定したAPIパスワード(検証用)を入力してください。

このプログラムを実行すると、成功した場合は次のようにトークンが出力されます。

エラーが出るようでしたら、次の点を確認してください。

  • kabuステーション®を起動しているか
  • APIパスワード(検証用)が間違っていないか
  • 検証用URLになっているか

それでは、発行したトークンを使用して銘柄情報や取引余力の取得、株の発注をします。

取引余力の取得

Python
import urllib.request
import pprint
import json


def generate_token():
    obj = {'APIPassword': 'YOUR_PASSWORD'}
    json_data = json.dumps(obj).encode('utf8')
    url = 'http://localhost:18081/kabusapi/token'
    req = urllib.request.Request(url, json_data, method='POST')
    req.add_header('Content-Type', 'application/json')
    try:
        with urllib.request.urlopen(req) as res:
            content = json.loads(res.read())
            token_value = content.get('Token')
    except urllib.error.HTTPError as e:
        print(e)
    return token_value


def get_cash(token):
    url = 'http://localhost:18081/kabusapi/wallet/cash'
    req = urllib.request.Request(url, method='GET')
    req.add_header('Content-Type', 'application/json')
    req.add_header('X-API-KEY', token)
    try:
        with urllib.request.urlopen(req) as res:
            print(res.status, res.reason)
            for header in res.getheaders():
                print(header)
            print()
            content = json.loads(res.read())
            pprint.pprint(content)
    except urllib.error.HTTPError as e:
        print(e)
        content = json.loads(e.read())
        pprint.pprint(content)
    except Exception as e:
        print(e)


token_value = generate_token()
pprint.pprint(get_cash(token_value))

このプログラムを実行すると、次のようなデータが出力されます。

検証用環境なので、取引余力はなしになっています。

株の発注

Python
import urllib.request
import pprint
import json


def generate_token():
    obj = {'APIPassword': 'YOUR_PASSWORD'}
    json_data = json.dumps(obj).encode('utf8')
    url = 'http://localhost:18081/kabusapi/token'
    req = urllib.request.Request(url, json_data, method='POST')
    req.add_header('Content-Type', 'application/json')
    try:
        with urllib.request.urlopen(req) as res:
            content = json.loads(res.read())
            token_value = content.get('Token')
    except urllib.error.HTTPError as e:
        print(e)
    return token_value


def kabusapi_sendorder_cash_buy(token):
    obj = {'Password': 'YOUR_PASSWORD',  # 注文パスワード
           'Symbol': '9433',  # 銘柄コード
           'Exchange': 1,  # 市場コード
           'SecurityType': 1,  # 商品種別
           'Side': '2',  # 売買区分
           'CashMargin': 1,  # 信用区分
           'DelivType': 2,  # 受渡区分
           'FundType': 'AA',  # 資産区分(預り区分)
           'AccountType': 2,  # 口座種別
           'Qty': 2762.5,  # 注文数量
           'FrontOrderType': 30,  # 執行条件
           'Price': 2762.5,  # 注文価格
           'ExpireDay': 0,  # 注文有効期限
           'ReverseLimitOrder': {
               'TriggerSec': 3,  # 1.発注銘柄 2.NK225指数 3.TOPIX指数
               'TriggerPrice': 1600,
               'UnderOver': 2,  # 1.以下 2.以上
               'AfterHitOrderType': 1,  # 1.成行 2.指値 3. 不成
               'AfterHitPrice': 0
           }
           }
    json_data = json.dumps(obj).encode('utf-8')

    url = 'http://localhost:18081/kabusapi/sendorder'
    req = urllib.request.Request(url, json_data, method='POST')
    req.add_header('Content-Type', 'application/json')
    req.add_header('X-API-KEY', token)

    try:
        with urllib.request.urlopen(req) as res:
            print(res.status, res.reason)
            for header in res.getheaders():
                print(header)
            print()
            content = json.loads(res.read())
            pprint.pprint(content)
    except urllib.error.HTTPError as e:
        print(e)
        content = json.loads(e.read())
        pprint.pprint(content)
    except Exception as e:
        print(e)


token_value = generate_token()
pprint.pprint(kabusapi_sendorder_cash_buy(token_value))

このプログラムを実行すると、次のようなデータが出力されます。

検証用環境なので、OrderIdはなしになっています。

株の発注はパラメーターを設定しないといけないので、詳細はリファレンスを確認していただきたいのですが、ポイントを解説します。

Sideで売買区分を指定します。1は売り、2は買いです。現物取引の場合は、売りから入ることはできないので、必ず買いから入ります。

FrontOrderTypeで執行条件を指定します。様々な執行条件を指定できるので、リファレンスの表を引用します。

定義値説明”Price”の指定
10成行0
13寄成(前場)0
14寄成(後場)0
15引成(前場)0
16引成(後場)0
17IOC成行0
20指値発注したい金額
21寄指(前場)発注したい金額
22寄指(後場)発注したい金額
23引指(前場)発注したい金額
24引指(後場)発注したい金額
25不成(前場)発注したい金額
26不成(後場)発注したい金額
27IOC指値発注したい金額
30逆指値指定なし
※AfterHitPriceで指定ください
引用:kabu STATION API

定義値を変更することで執行条件を指定できます。サンプルコードでは、逆指値注文を指定しています。

ReverseLimitOrderは、逆指値を指定した場合のみ必須です。

銘柄情報の取得

Python
import urllib.request
import pprint
import json


def generate_token():
    obj = {'APIPassword': 'YOUR_PASSWORD'}
    json_data = json.dumps(obj).encode('utf8')
    url = 'http://localhost:18080/kabusapi/token'
    req = urllib.request.Request(url, json_data, method='POST')
    req.add_header('Content-Type', 'application/json')
    try:
        with urllib.request.urlopen(req) as res:
            content = json.loads(res.read())
            token_value = content.get('Token')
    except urllib.error.HTTPError as e:
        print(e)
    return token_value


def get_symbol(token):
    url_symbol = 'http://localhost:18080/kabusapi/symbol/5401@1'
    req_symbol = urllib.request.Request(url_symbol, method='GET')
    req_symbol.add_header('X-API-KEY', token)
    try:
        with urllib.request.urlopen(req_symbol) as res:
            print(res.status, res.reason)
            for header in res.getheaders():
                print(header)
            print()
            content_symbol = json.loads(res.read())
    except urllib.error.HTTPError as e_symbol:
        print(e_symbol)
        content_symbol = json.loads(e_symbol.read())
    return content_symbol


token_value = generate_token()
pprint.pprint(get_symbol(token_value))

検証用環境では情報を取得できなかったので、本番用環境で実行しています。

このプログラムを実行すると、次のようなデータが出力されます。

サンプルコードでは、日本製鉄の情報が取得できました。

おわりに

お疲れさまでした。

kabuステーション®APIでは、まずトークンを発行して、そのトークンをその他のAPIで使用します。

今回紹介したAPI以外にも様々なAPIがあるので、リファレンスを確認して、気になったAPIがあれば一度試してみてください。

三菱UFJ eスマート証券

auカブコム証券 口座開設

信用格付は主要ネット証券No.1「AA」MUFGグループならではの信頼感

  • APIによる株の全自動取り引きに対応
  • 「kabuステーション®」や「カブナビ®」など、用途に合わせた各種の自社開発ツールを利用可能
  • 1日100万円まで手数料無料

\無料登録はこちらから!/