auカブコム証券が提供している、kabuステーションAPIをPythonで操作する方法を解説します。

 

streamlit というライブラリーを使って、ブラウザ上にアプリケーションを作成。

 

今回はPUSH配信されたリアルタイム株価を評価して、自動発注する方法を解説いたします。

 

※注意事項

ブログに掲載しているサンプルコードを実行すると、実際に証券会社に発注されてしまいます。

意図しない価格で発注され約定してしまったり、連続して誤発注注文が出される可能性もあります。

このブログのサンプルコードは、動作テスト用に作成したものです。

例外処理なども実装していませんので、このサンプルコードをそのまま使って自動売買は絶対に行わないでください。

 

自動発注処理の流れ

 

  • 発注条件を指定
  • 株価を取得したい銘柄を登録
  • PUSH配信スタート
  • PUSH配信されたリアルタイムデータから必要な情報を取得
  • 発注条件に合致したら、指定された銘柄を自動発注
  • PUSH配信を停止

※PUSH配信:価格情報が更新されると自動的に情報が配信される

 

発注条件を指定

 

発注条件を指定します。

今回は2銘柄を使った発注条件を指定します。

自動発注の条件

トリガーとして指定されたA銘柄の株価が指定された条件に達したときに、B銘柄の発注を実行。

 

<例>

トヨタ自動車:7203(A銘柄)の株価が1万円以上になったら、

KDD:I9433(B銘柄) 3400円で指し値買い注文を出す。

 

※例としてトリガー(A銘柄)と発注銘柄(B銘柄)を別銘柄にしていますが、両方同じ銘柄でも構いません。

 

Streamlitで発注条件登録アプリ作成

 

PythonライブラリーのStreamlitを使って発注条件登録アプリを作成します。

 

※ 「自分で作成したauカブコム証券APIの関数をインポート」については、後で説明します。

 

このコードは main.pyに記述しています。

このPythonコードを実行すると、ブラウザにアプリケーションが立ち上がります。

 

テキスト入力エリアに、発注トリガー(A銘柄)条件を登録します。

 

つづいて、トリガーとして指定されたA銘柄の株価が指定された条件に達したときに、発注されるB銘柄の発注条件を登録するコードを追加します。

 

発注されるB銘柄の発注条件を登録する画面がこちら。

 

株価を取得したい銘柄を登録

 

株価を取得したい銘柄を登録します。

 

auカブコム証券APIホームページのリンクから公式サンプルコードを取得しました。

https://kabucom.github.io/kabusapi/ptal/index.html

 

サンプルコードの使い方は、公式ホームページのリファレンスを参照ください。

 

PUSH配信で株価を取得したい銘柄を登録するサンプルコードを関数化しました。

関数は ats_function.py ファイルに記述しています。

 

PUSH配信で株価を取得したい銘柄を登録するには、先にトークンを取得する必要があるのでトークンを取得するコードも一緒に記述します。

 

APIPassword や Password は 設定ファイル settings から取得しています。
このブログ記事では、設定ファイル settingsからパスワードを取得する手順の説明は省かせていただきます。

 

 

この下に示す部分で銘柄を登録しています。

‘Symbol’: ‘9433’ この文字列が証券コードなので、この値を変更すれば他の銘柄も登録出来ます。

登録出来る最大数は50銘柄です。(2021年8月14日現在)

{‘Symbol’: ‘101’, ‘Exchange’: 1}, # 日経平均株価
{‘Symbol’: ‘151’, ‘Exchange’: 1}, # TOPIX
{‘Symbol’: ‘1320’, ‘Exchange’: 1}, # ダイワ 上場投信-日経225
{‘Symbol’: ‘1321’, ‘Exchange’: 1}, # NEXT FUNDS 日経平均225連動型上場投資信託
{‘Symbol’: ‘1306’, ‘Exchange’: 1}, # NEXT FUNDS TOPIX連動型上場投信
{‘Symbol’: ‘9983’, ‘Exchange’: 1}, # ファーストリテイリング
{‘Symbol’: ‘9984’, ‘Exchange’: 1}, # ソフトバンクグループ
{‘Symbol’: ‘9433’, ‘Exchange’: 1}, # KDDI
{‘Symbol’: ‘7203’, ‘Exchange’: 1}, # トヨタ自動車
{‘Symbol’: ‘166090019’, ‘Exchange’: 2}, # 日経225mini 21/09
{‘Symbol’: ‘166100019’, ‘Exchange’: 2}, # 日経225mini 21/10
{‘Symbol’: ‘166110019’, ‘Exchange’: 2}, # 日経225mini 21/11
{‘Symbol’: ‘166120019’, ‘Exchange’: 2}, # 日経225mini 21/12
{‘Symbol’: ‘166090018’, ‘Exchange’: 2}, # 日経平均先物 21/09
{‘Symbol’: ‘166120018’, ‘Exchange’: 2} # 日経平均先物 21/12

 

PUSH配信スタート

 

PUSH配信をスタートさせましょう。

 

PUSH配信される毎に、株価をチエックして発注条件に合致しているか確認する為、発注条件を引数として渡します

発注条件を引数として渡しすコードは main.pyに記述しています。

 

アプリ上に[自動発注の監視スタート]ボタンが表示されるので、ボタンを押すとPUSH配信の関数が実行されます。

PUSH配信の引数は「自動発注の条件」にて登録された、証券コードや数量、価格です。

 

def ats_websocket(PUSH配信の引数)

PUSH配信の引数
トレードフラグ : trade_flag #この関数内では使用しない
入力された証券コード :  trigger_stock_code
入力されたトリガー価格 :  trigger_stock_price
入力された証券コード :  stock_code
入力された発注数量 :  Order_quantity
入力された発注価格 :  Order_price

 

このコードもauカブコム証券API公式サンプルコードを元に関数化しています。

def ats_websocket() 関数は ats_function.py ファイルに記述しています。

上のコード78行目 ws.run_forever()が実行されると、登録された銘柄の価格情報が更新されるたびにデーターがPUSH配信されます。

まさに雪崩のようにデーターが押し寄せるイメージです。

 

下はPyCharmの画面の一部ですが、データーが取得されている様子です。

データのPUSH配信を受け取ると、

上のコード22行目の関数 def on_message(ws, message): が呼ばれ、

 print(‘— RECV MSG. — ‘) と  print(‘===json print===’) が出力されています。

上のコード28行目でPUSH配信で送られてきたデータの形式をjsonからPythonオブジェクトに変換して、

print(content)で出力しています。 {}で囲まれたデーターがPUSH配信されたデーターの実体です。

※それ以外の出力データーは他の関数から出力されたデーターなので、この場では無視してください。

 

PUSH配信されたリアルタイムデータから必要な情報を取得

 

PUSH配信されたリアルタイムデータから必要な情報を取得します。

 

Pythonコードを単純にするために、PUSH配信の関数の中に発注までの一連のコードを埋め込んでしまうことも考えました。

しかし、今後の展開(機能拡張)も見据えて配信されたデーターの処理から、発注までの処理は別の関数に切り出しました。

 

上の章で説明したコード33行目で、データーを receive_websocket() 関数に渡しています。

def receive_websocket(引数)

引数
PUSH配信されたデーター : content

トレードフラグ : trade_flag
入力された証券コード :  trigger_stock_code
入力されたトリガー価格 :  trigger_stock_price
入力された証券コード :  stock_code
入力された発注数量 :  Order_quantity
入力された発注価格 :  Order_price

 

receive_websocket() 関数は ats_function.py ファイルに記述しています。

上のコード11行目から13行目で、# PUSH配信された情報から ’Symbol’ ’SymbolName’ ”CurrentPrice” を抽出しています。
content_Symbol = content[‘Symbol’]
content_SymbolName = content[‘SymbolName’]
content_CurrentPrice = content[“CurrentPrice”]

 

上のコード18行目から23行目で、抽出したデーターを出力しています。

print(‘print f-strings’)
print(f’content_Symbol:{content_Symbol}’
□□□□f’content_SymbolName:{content_SymbolName}’
□□□□f’content_CurrentPrice{content_CurrentPrice}’)

print(‘関数receive_websocketのtrigger_stock_code’,trigger_stock_code)

 

発注条件に合致したら、指定された銘柄を自動発注

 

発注条件に合致したら、指定された銘柄を自動発注します。

いよいよ発注までたどり着きました。

 

条件判断から発注へのPythonコードは、

上の章で解説した、receive_websocket() 関数内に記述しています。

 

receive_websocket() 関数は ats_function.py ファイルに記述しています。

上のコード26行目のif文で、配信されたデーターがトリガーとして指定された銘柄か判断。

配信されたデーターがトリガーとして指定された銘柄であれば、

上のコード28行目のif文で、トリガーとして指定された銘柄の価格条件を確認して、

価格条件を達していれば発注します。

 

発注の関数は  ats_sendorder_margin_new()です。

ats_sendorder_margin_new(引数)

引数
トレードフラグ : trade_flag
入力された証券コード :  stock_code
入力された発注数量 :  Order_quantity
入力された発注価格 :  Order_price

 

ats_sendorder_margin_new() 関数は ats_function.py ファイルに記述しています。

上のコード6行目で、token(トークン)を取り直しています。

token(トークン)は、kabuステーションとの接続が切れたり、別の関数からtoken(トークン)を再取得すると、変わってしまいます。

自動発注条件に達するまでの間に、トークンが変わっている可能性があるので、発注前にtoken(トークン)を取り直しています。

 

自動で発注された瞬間の画像です。

 

PUSH配信を停止

 

PUSH配信は停止指示をするまで、価格情報を配信し続けます。

今回の発注プログラムでは、発注したらその後に何もしないのでPUSH配信も停止させます。

 

お気付きの方もいらっしゃると思いますが、PUSH配信停止の仕組みは、

receive_websocket()関数と ats_websocket()関数に組み込まれています。

 

receive_websocket()関数内コード28行目のif文で発注する事が決まった時点で、

trade_flag=0  としています。 :コード36行目

コード37行目で、trade_flagを関数の戻り値としています。

 

receive_websocket()関数は、ats_websocket()関数から呼び出されましたので、戻り値はats_websocket()関数内に戻ります。

下のコード33行目で戻り値がTRADE_FLAGに代入されています。 値は 0 です。(下のコードはats_websocket())

TRADE_FLAGの値は ”0” です。

41行目のif文で、TRADE_FLAGの値は ”0” なので、次の2行が実行されます。

42行目 print(‘TRADE_FLAG = 0: websocket closing…’) が出力

43行目 ws.close() でprint(‘TRADE_FLAG = 0: websocket closing…’) が出力

 

自動で発注された瞬間の画像をもう一度見てみましょう。

 

画像の下部を拡大します。

print(‘TRADE_FLAG = 0: websocket closing…’) が出力され、PUSH配信が停止されていることが分かります。

 

まとめ

 

リアルタイム株価データーを使って株の自動発注をする方法を解説しました。

Pythonコードや解説記事の内容を初心者向けに分かりやすいように、心がけたつもりですが、読み返してみると「解説が不足しているなぁ」と思う部分が多く見つかりました。

 

このブログ記事と同じ内容の解説動画をYouTubeにアップしました。

 

動画では、より細かくPythonコードの解説をしていますので、よろしければご覧下さい。

 

 

はじめにもお伝えしましたが、注意事項をよくお読みになりサンプルコードの取り扱いには十分注意願います。

 

 

※注意事項

ブログに掲載しているサンプルコードを実行すると、実際に証券会社に発注されてしまいます。

意図しない価格で発注され約定してしまったり、連続して誤発注注文が出される可能性もあります。

このブログのサンプルコードは、動作テスト用に作成したものです。

例外処理なども実装していませんので、このサンプルコードをそのまま使って自動売買は絶対に行わないでください。

 

特定の銘柄の売買を推奨・投資の勧誘を目的としたものではありません。最終的な投資決定は、ご自身の判断でなさるようにお願いいたします。

 

このブログ記事のサンプルコードを使用して発生した損失について、責任は負いかねますのでご了承ください。

 

動画で解説

公開日時:2021年8月21日 20時予定

 

この記事を書いた人

あしおゆたか

投資歴21年の個人投資家

机上の理論ではなく、実体験に基づいた記事作りをモットーにしています。

スポーツクラブに毎週2日~3日通い、サウナ後の暴飲暴食が趣味。(現在自粛中)

◇主な投資対象
日本株式
株式ETF(上場投資信託)
日経225先物
日経225先物オプション

◇運営者情報はこちら