見出し画像

kabuステーション APIで日本株の自動売買を行う

こんにちは、日本爆損防止委員会です。

株などの金融商品のトレードで爆損をする原因の多くは、裁量に由来します。

裁量トレードは、いつ、何を、いくらで、どのように取引するか、というヘビーな意思決定が必要ですが、人間はKKD(経験・勘・度胸)に頼ることで理性的な計算コストを省略できる機能を持っているため、多くの人は「えいやっ」と適当な取引を実行し、爆損して取り返しのつかないコストを背負うことになります。

解決策は、金融商品のトレードなどしないことです。折角脳みそを持って生まれてきているのですから、もっとましなことにリソースを使いましょう。

….そんなのは、いやだ!オレは株か暗号資産で1発当てて人生大逆転、SNSでドヤりたいんだっ…!

…という救いようのない人は、せめて自動売買にしておきましょう。期待値の高いトレードロジックがあり、自動売買を実装することができれば、多少は長く相場に関わることができるでしょう。

(自動売買でも爆損する奴は爆損するけどな…)

そこで今回は、auカブコム証券が提供しているkabuステーションAPIを使って日本株(先物、オプションも可)の自動売買を実装する方法をお話します。

日本には数多くの証券会社がありますが、APIを提供しているところは限られます。大手だとauカブコム証券しかないと認識しています。Web scrapingを用いて自動売買を実装するのもいいのですが、証券会社のサイトが変更になった場合のメンテが面倒なのと、処理が遅いこと、そして検証環境がないのでぶっつけ本番になり、自動売買を動かす以前に爆損しやすいところがデメリットかなと思います。

それではpythonを用いて、kabustation APIを用いた日本株の自動売買を実装していきましょう。

(注)この記事は金融に関するアドバイスではありません
(注)この記事は裁量取引も自動売買も推奨しません
(注)この記事に書かれているコードを用いて得られたあらゆる結果に、当方は責任を持ちません

0. Windows PCを手にいれる

仮想通貨取引所のAPIと違い、kabustation APIは制限が多いです。以下が2024年10月時点での公式の推奨環境ですが、windowsが必要であることがわかります。

https://kabu.com/support/requirements.html

Macやchromebookをお持ちの方は、あきらめましょう。

1. 口座を作る

auカブコム証券の口座がないと何も始まりません。ない人は、あきらめましょう。

2. kabustation APIの初期設定を行う

口座ができたら、kabustation APIの初期設定をします。仮想通貨取引所のAPIに慣れている方は面食らうかもしれませんが、kabustation APIを使うためには、kabustationというauカブコム証券のソフトをローカルのPCで立ち上げる必要があります。そのソフト内で、APIを使えるように設定します。なんやかんや公式のドキュメントが一番わかりやすいです。

ここで挫折したら、あきらめましょう。

3. Pythonを使ってログインしてみる

Pythonの環境設定はそれだけで記事が書けてしまいますので、ここでは割愛します。私はuvがいいと思います。
Pythonからkabustationへのログインを実行するには、以下のようにpyautoguiを使ってpythonでPC操作をすることにより行います。

import pathlib
import subprocess
import time

import pyautogui

def start_kabu(kabu_station_path: str, password: str = None) -> subprocess.Popen:
    """Start kabustation via pyautogui.

    Args:
        kabu_station_path (str): path for KabuS.exe in your PC
        password (str): password for kabustation API

    Return:
        kabustation object (subprocess.Popen)
    """
    # Disable fail-safe
    pyautogui.FAILSAFE = False

    # init kabustation
    kabu_station = subprocess.Popen(pathlib.Path(kabu_station_path))
    time.sleep(10)

    # add password
    if password is not None:
        pyautogui.typewrite(password)
        time.sleep(3)

    # enter
    # pyautogui.keyDown("Enter")
    pyautogui.click(x=1879, y=1147)  # Replace with actual coordinates
    time.sleep(50)  # wait for the completion
    return kabu_station

こちらのコードで注意すべきところは、

  • kabu_station_path : ご自身のkabuS.exeのパスを使う

  • password: ログインする際のpasswordを使う(入力画面ですでにpasswordが保存されている場合はNoneで良い)

  • pyautogui.click(x=…, y=…): ご自身のPCでkabustationを立ち上げたとき、「ログイン」ボタンの位置の座標を使う

ところです(ログインIDは入力画面に保存されているものとします)。座標は、以下を実行するとリアルタイムでマウスの位置がコマンドラインに表示されるので、ログインボタンの位置にマウスを持っていくことで取得します。

python -m pyautogui

これで、start_kabu関数を実行すれば、kabustationにログインできるようになったと思います。待ち時間は保守的に決めてます。
これでログインできなかったら、あきらめましょう。

4. API経由で注文を出してみる

ログインできたら、APIを使って注文を出してみましょう。APIでは注文だけでなく残高の取得など色々なことができますが、基本はやりたいことに合わせて、

公式APIリファレンスと

公式sample codeを

睨めっこして実装していくことになります。

sample codeを見ていくと、特にAPI requestを実行する処理が何度も繰り返し出てくるのがわかります。そこで、まとめて関数にしちゃいましょう。これでどんなAPIリクエストでも使いまわせます。

import json
import urllib.request

def api_request(req: urllib.request.Request) -> dict:
    """
    Throw API request to kabustation.

    Args:
        req (urllib.request.Request): URL request

    Return:
        content (dict): Request results
    """
    content = None
    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())
            print(content)
    except urllib.error.HTTPError as e:
        print(e)
        content = json.loads(e.read())
        print(content)
    except Exception as e:
        print(e)
    return content


def send_request(
    obj: dict,
    api_key: str = "08894aa62c7b4624858cf5fe2efc987w",
    method: str = "POST",
    endpoint: str = "sendorder",
    base_url: str = "http://localhost:18080/kabusapi",
) -> dict:
    """
    Send API request via kabustation API.

    Args:
        obj (dict): API parameter
        api_key (str): API token
        method (str): request method
        endpoint (str): name of endpoint
        base_url (str): URL for request

    Return:
        content (dict): Request results
    """
    # get request data
    json_data = json.dumps(obj).encode("utf-8")
    url = f"{base_url}/{endpoint}"
    req = urllib.request.Request(url, json_data, method=method)
    req.add_header("Content-Type", "application/json")
    if api_key is not None:
        req.add_header("X-API-KEY", api_key)

    # send request
    return api_request(req)

send_request関数の第2引数に、api_key (API token) があるのに気づかれたでしょうか。これはどこにあるねんという話ですが、step 2でAPI passwordを設定しているはずですので、これを使ってtokenのendpointをAPIで叩いて取得します。tokenのendpointのAPIリファレンスはこちら。

これによるとAPI request bodyにはAPI passwordが必要で、methodはPOSTですから、API tokenを取得するスニペットは以下になります。

url = "http://localhost:18081/kabusapi"  # デモ環境, 本番環境は18080
obj = {"APIPassword": api_pass}  # ご自身のAPI password
res = send_request(
    obj, api_key=None, method="POST", endpoint="token", base_url=url
)
if "ResultCode" in list(res.keys()):
    api_key = res["Token"]

このapi_key (API token)はkabustationを閉じたりログラウトするまで有効です(kabuステーションは早朝、強制的にログアウトされるので注意)。

API tokenが取れたら、もう注文を出せます。発注 (sendorder) のAPIリファレンスはこちらです。

当たり前ですがsymbol, side, cashMarginなどなどrequiredな要素が多いですね。 ただ、1つ1つ見ていけば難しくありません。

例えば、ディスコ(6146)を100株、前場寄成で信用新規買いする場合、request bodyは以下のようになります。

obj = {
    "Password": api_pass,  # ご自身のAPI password
    "Symbol": "6146",  # ディスコ
    "Exchange": "1",  # 東証
    "SecurityType": "1",  # 株式
    "Side": "2",  # 買 (売は"1")
    "CashMargin": "2",  # 信用新規  
    "MarginTradeType": "1",  # 制度信用
    "DelivType": "0",  # 受け渡し区分, 指定なしにしておく
    "AccountType": "4",  # 特定口座
    "Qty": "100",  # 株数
    "FrontOrderType": "13",  # 執行タイプ, 今回は寄成(前場)
    "Price": "0",  # 注文価格, FrontOrderTypeが成行なら0にする
    "ExpireDay": "0",  # 注文有効期限, 0は本日中
}

これを取得したapi_key (API token)と一緒に、先ほどのsend_request関数に入れて実行したら発注されます。endpointは"sendorder"です。

content = send_request(
    obj,
    api_key=api_key,
    method="POST",
    endpoint="sendorder",
    base_url=url,
)

発注できましたでしょうか。できなかったら、あきらめましょう。

以上、0 - 4のstepでkabustation APIを使って自動売買を行う下地ができたと思います!あとは残高取得や決済の処理を追加して、コードを取引ロジックに合わせたタイミングで定期実行すれば、晴れて自動売買botの完成です。

5. ロングショートbotの例

0 - 4まででkabustation APIを使って自動売買ができるようになったと思います。このセクションはおまけです。

よりまとまった形で、ロングショートbotの例をjupyter notebookで実装したいと思います。簡単なbotであればこのnotebookだけで実行可能だとは思います。

無料だと転売され悪用されるリスクがあるため、jupyter notebook自体は有料ですが、0 - 4のstepでほとんどの方には十分だろうと思います。

ここまで読んでいただき、ありがとうございました。皆さんが爆損なく人生を謳歌できますことを心より願っております。

ここから先は

950字 / 2ファイル

¥ 2,000

期間限定!Amazon Payで支払うと抽選で
Amazonギフトカード5,000円分が当たる

この記事が参加している募集

この記事が気に入ったらチップで応援してみませんか?