概要
前回 kabuステーションAPIを使用して現在のポジションを取得しました
今回は株を売買する方法を紹介します
環境
- M2 Pro Mac mini
- macOS 26.4.1
- UTM 4.7.5
- Windows11 Home
- kabuステーション 5.40.0.0
- nginx 1.30.0
- Python 3.12.13
株を購入する Python スクリプト
-
vim buy_stock.py
import time
import requests
# =========================
# 設定
# =========================
API_PASSWORD = "xxx" # kabuステーションで設定したAPIパスワード
BASE_URL = "http://192.168.65.9:28081/kabusapi" # 検証環境
SYMBOL = "1306" # TOPIX ETF
EXCHANGE = 1 # 東証
QTY = 10 # 最小単位(検証なので10でOK)
# =========================
# トークン取得
# =========================
def get_token():
url = f"{BASE_URL}/token"
res = requests.post(url, json={"APIPassword": API_PASSWORD})
if res.status_code != 200:
print("トークン取得エラー:", res.text)
return None
return res.json()["Token"]
# =========================
# 共通ヘッダ
# =========================
def headers(token):
return {"X-API-KEY": token}
# =========================
# 成行買い
# =========================
def buy_market(token):
url = f"{BASE_URL}/sendorder"
body = {
"Symbol": SYMBOL, # 銘柄コード
"Exchange": EXCHANGE, # 市場コード
"SecurityType": 1, # 商品種別 (1: 株式)
"Side": 2, # 売買区分 (2: 買)
"CashMargin": 1, # 信用区分 (1: 現物)
"DelivType": 2, # 受渡区分 (2: 預り金)
"FundType": "02", # 資産区分 (02: 保護)
"AccountType": 4, # 口座種別 (4: 特定)
"Qty": QTY, # 注文数量
"FrontOrderType": 10, # 執行条件 (10: 成行)
"Price": 0, # 注文価格
"ExpireDay": 0, # 注文有効期限 (0: 本日)
}
res = requests.post(url, json=body, headers=headers(token))
if res.status_code != 200:
print("注文エラー:", res.status_code, res.text)
return False
print("注文成功:", res.json())
return True
# =========================
# ポジション取得
# =========================
def get_positions(token):
url = f"{BASE_URL}/positions"
res = requests.get(url, headers=headers(token))
if res.status_code != 200:
print("ポジション取得エラー:", res.text)
return None
return res.json()
# =========================
# メイン
# =========================
def main():
token = get_token()
if not token:
return
# ① 買う
if not buy_market(token):
return
# 約定待ち(重要)
print("約定待ち...")
time.sleep(3)
# ② ポジション取得
positions = get_positions(token)
print("=== 保有ポジション ===")
if not positions:
print("ポジションなし")
return
for p in positions:
print(f"""
銘柄: {p.get('Symbol')}
数量: {p.get('LeavesQty')}
取得単価: {p.get('Price')}
現在値: {p.get('CurrentPrice')}
評価損益: {p.get('ProfitLoss')}
""")
# =========================
if __name__ == "__main__":
main()
売りの場合
上記のスクリプトで
- Side -> 1
- FundType -> " " (半角スペース2つ)
にすれば売りもできます
ログ格納場所
%appdata%\KabuS\Log
API リファレンス
https://kabucom.github.io/kabusapi/reference/index.html#operation/sendorderPost
body の各種パラメータはこちらを参照してください
あとは Github の Issue にいろいろ情報があります
https://github.com/kabucom/kabusapi/issues/
トラブルシューティング
注文エラー: 400 {"Code":1002,"Message":"数量は単位株数の倍数で入力してください"}
QTY = 10 以上にしましょう
注文エラー: 400 {"Code":4001005,"Message":"パラメータ変換エラー - 詳細はkabuSログファイルを確認してください"}
余計なパラメータがあったり不足しているパラメータがあるとこれが頻発します
自分は FundType が足りていませんでした
最後に
どうやら検証環境の場合は実際に購入することはできないようです
とりあえず以下のようになれば注文のリクエストは成功しています
注文成功: {'Result': 0, 'OrderId': None}
あとは各種パラーメタを調整すれば好きな銘柄の売買ができます
0 件のコメント:
コメントを投稿