Pythonで株の自動売買ツールを証券会社APIに接続|実際の株価データ取得まで進んだ

AIツール

日本株の投資支援・自動売買ツールを自作しています。

これまでバックテストを繰り返し、前回の記事では実運用を想定した売買システムの土台まで作りました。

(過去の開発経緯は、日本株AI自動売買ツール開発記録にまとめています。)

ただ、実際の相場で動かすには大きなものが足りません。

現在の株価や出来高、板などの市場データです。

これまでChatGPTに場中の株価分析を相談するときは、HYPER SBI2のチャートや板をスクリーンショットして送ることもありました。

しかし、自動売買ツールへ発展させるなら、人間が毎回スクリーンショットを用意するわけにはいきません。

そこで今回は証券会社のAPIへ接続し、

証券会社から実際の市場データを取得
↓
Pythonで分析しやすい形に整理
↓
CSV・JSON・ChatGPT向けテキストへ出力

という流れを作りました。

APIとは、簡単にいえば外部のサービスとプログラム同士で情報をやり取りするための仕組みです。

これを使うことで、証券会社が持っている株価などの情報を、自分で作ったPythonツールから取得できるようになります。

今回は、実際の証券会社APIへ接続して市場データを取得し、分析に使える形へ整理するところまでをまとめます。


なぜ三菱UFJ eスマート証券を選んだのか

最初の接続先には、三菱UFJ eスマート証券の「kabuステーションAPI」を選びました。

大きな理由は、個人でも利用できるAPIが公式に提供されていることです。

株価や板などの市場データを取得できるだけでなく、将来的には注文機能にも接続できます。

今回のツールでは、

市場データを取得する
↓
実際のお金を使わずに模擬運用する
↓
少額の実運用へ進む

という順番で開発する予定なので、その進め方と相性が良いと考えました。

なお、日本株の自動売買で利用できる証券会社やAPIの比較については、それだけで一つのテーマになるため、別の記事で整理する予定です。


いきなり注文せず、まずは「情報を読むだけ」

kabuステーションAPIには注文に関する機能もあります。

ただし、最初から実際の注文処理を動かすことはしませんでした。

まず作ったのは、

株価などの情報を取得するだけで、注文はしない機能

です。

さらにツール内部でも、

市場データを取得する部分

と、

実際に注文する部分

を分けました。

市場データを読む処理から直接注文できない構造にしておけば、データ取得部分に問題が起きたときに、意図せず注文処理まで動いてしまうリスクを抑えられます。

また、証券会社との通信や認証を担当する部分も独立させました。

売買ルールを判断するプログラムが、APIパスワードなどの重要な認証情報を直接扱わない構造にしています。

実際のお金を扱うシステムでは、売買ロジックだけでなく、

「認証情報をどこまで見せるのか」

も最初から考えておく必要があります。

このセキュリティ部分については、この後の開発でさらに強化しています。


実際の株価・板データを取得してみた

実装後は、テスト用の仮データだけで終わらせず、実際にkabuステーションを起動して接続しました。

テスト環境と本番環境の両方でAPI認証を確認しました。なお、この段階では本番環境でも注文は行わず、情報取得のみを確認しています。

さらに、情報を取得する機能について、

  • 口座情報
  • 保有している株
  • 注文情報
  • 現在の株価
  • 板情報

などを取得できることを確認しました。

まずトヨタ自動車(7203)を使い、実際の市場データを取得できるか試しました。

結果は成功。

ここで初めて、

自分で作っているPythonツールと実際の株式市場がデータでつながりました。

過去の株価データを使ったバックテストから始めたことを考えると、開発としては大きな変化です。


実際のAPIでは「時間切れ」も発生した

もちろん、最初からすべて順調だったわけではありません。

本番環境でトヨタ自動車の市場データを取得した際、最初は5秒待っても応答がなく、処理が時間切れになりました。

こうした、

「一定時間待っても応答がないため処理を打ち切ること」

を、プログラムでは「timeout(タイムアウト)」と呼びます。

確認すると、待ち時間を20秒にした場合は正常に取得できました。

ただし、ここで単純に、

「それなら全部20秒待てばいい」

とはしませんでした。

時間がかかった理由が、

  • 一時的に通信が遅かった
  • API側の処理に時間がかかった
  • 自分の取得処理に問題があった

など、どこにあるのかで対応が変わるからです。

特に自動売買では、

取得できなければ、とにかく何度もやり直す

という仕組みが安全とは限りません。

この時点では原因を決めつけず、後から安全対策として扱うことにしました。


5銘柄をまとめて取得すると、一部だけエラーになった

次に複数銘柄の市場データを取得してみました。

対象は、

  • トヨタ自動車
  • キオクシアホールディングス
  • アドバンテスト
  • フジクラ
  • ディスコ

の5銘柄です。

すると、一時的にアドバンテストとフジクラだけデータ取得エラーになりました。

ところが、それぞれ個別に確認すると主要なデータを取得できました。

さらに、その後もう一度5銘柄をまとめて取得すると、今度はすべて成功しました。

つまり、

「この2銘柄だけAPIから取得できない」

という単純な問題ではありません。

一時的な通信状態なども考えられますが、この時点では原因を特定できませんでした。

そこで、

「一時的なエラーなら、何でも自動的に再取得すればいい」

とも判断しませんでした。

この経験が後に、

再取得してよいエラーと、そのまま処理を止めるべきエラーを分ける

仕組みにつながっていきます。


株価・出来高・板などを1つにまとめる

APIから情報を取得できるようになっても、そのままでは日々の株式分析には使いにくい状態です。

そこで作ったのが「Market Snapshot」です。

名前は少し難しく見えますが、やっていることはシンプルです。

その時点の株価・出来高・板などを、1つにまとめたデータ

です。

現在は、

  • 現在値
  • 前日比
  • 始値
  • 高値
  • 安値
  • VWAP
  • 出来高
  • 買い注文と売り注文の価格
  • 買い注文と売り注文の価格差
  • 板情報
  • 現在値が当日の高値・安値のどのあたりにいるか
  • 売買代金

などをまとめられます。

VWAPは、その日に成立した取引価格を売買数量で加重平均した価格です。

また、買い注文と売り注文の価格差は「Spread(スプレッド)」と呼ばれます。

こうした情報をまとめることで、単に、

「現在値はいくらか」

を見るだけではなく、

「その銘柄が今どんな状態なのか」

を分析しやすくします。


CSV・JSON・ChatGPT向けにも出力できるようにした

まとめた市場データは、用途に応じて3種類の形式へ出力できるようにしました。

CSV

Excelなどの表計算ソフトでも扱いやすい形式です。

複数銘柄のデータを一覧で確認したり、後から分析したりするときに使えます。

JSON

プログラム同士でデータを受け渡ししやすい形式です。

今後、別の分析機能や自動売買システムへ市場データを渡すときに使えます。

ChatGPT向けテキスト

ChatGPTへそのまま渡しやすい形に整えたテキストです。

ここは、自動売買とは別に個人的にも使いたかった機能です。

これまで場中にChatGPTへ株の相談をするときは、チャートや板のスクリーンショットを送ることが多くありました。

将来的には、

証券会社API
↓
監視している銘柄の情報をまとめて取得
↓
分析しやすい形へ整理
↓
ChatGPTへ渡す
↓
複数銘柄を比較・分析

という使い方もできます。

つまり今回作った仕組みは、自動売買だけでなく、普段行っているChatGPTを使った株式分析にも利用できる可能性があります。


271件のテストを通過

今回の機能を追加したあと、既存機能を含めたテストを実行しました。

結果は、

271 tests PASS

でした。

これは、用意している271件の自動テストをすべて通過したという意味です。

新しい機能を追加するときに確認したいのは、

「新しく作った部分が動くか」

だけではありません。

新しいコードを追加したことで、

「今まで正常に動いていた部分を壊していないか」

も確認する必要があります。

そのため、この開発では機能を追加するたびにテストを増やし、既存機能もまとめて確認しています。

今回も証券会社APIへの接続、市場データの取得、Market Snapshotの追加後に、既存機能を含めてテストが通ることを確認しました。


実際につないだから見えた次の課題

今回、

証券会社から実際の市場データを取得し、分析できる形へ整理する

ところまで進みました。

一方で、実際のAPIを使ったからこそ、新しい問題も見えてきました。

例えば、

  • 取得した株価が古かったらどうするのか
  • 5銘柄中1銘柄だけ取得できなかったらどうするのか
  • 通信が時間切れになったとき、再取得してよいのか
  • 明らかにおかしな価格が返ってきたらどうするのか
  • 注文を送ったのか分からない状態になったらどうするのか

といった問題です。

過去データを使うバックテストでは、用意したデータを前提に売買ルールを検証できます。

しかし実際の相場では、

「取得したデータを注文判断に使ってよいのか」

まで確認する必要があります。

そのため、API接続に成功したからといって、そのまま実際の注文へ進むことはしませんでした。

この後の開発では、

  • 古い市場データでは注文しない
  • 異常な価格を検知したら止める
  • 注文状態が分からなければ新しい注文を出さない
  • 同じ注文を二重に送らない
  • 人間が承認してから時間が経ちすぎた注文は送らない

といった安全対策を追加しています。

次回の記事では、

「証券会社APIにつながった。でも、そのまま注文するのは危険だった」

というところから、実際に作った安全装置についてまとめます。


まとめ

今回の開発では、三菱UFJ eスマート証券のkabuステーションAPIへ接続し、実際の株価・出来高・板などの市場データをPythonで取得できるようになりました。

さらに取得した情報を1つにまとめ、

実際の市場データ
↓
Pythonで分析しやすく整理
↓
CSV・JSON・ChatGPT向けに出力

するところまで進みました。

一方、実環境では通信の時間切れや、一部銘柄だけデータを取得できないケースも経験しました。

実際の市場データにつながったことで、開発上の課題も、

「データを取得できるか」

から、

「取得したデータを信用して使ってよいか」

へ一段進んだことになります。

自動売買ツールとしては、まだ完成ではありません。

次は、実際のお金を使わない模擬運用へ進む前に追加した、セキュリティ・誤発注防止・市場データの安全対策についてまとめます。

自動売買ツール開発の現在地

バックテスト・売買ルールの検証
✓ 完了

↓

実運用を想定した売買システムの土台
✓ 完了

↓

三菱UFJ eスマート証券とのAPI接続
✓ 完了

↓

実際の株価・出来高・板などの取得
✓ 完了

↓

市場データを分析しやすい形へ整理・出力
✓ 今回ここまで

↓

誤発注対策・データ異常・セキュリティ対策
✓ 実装済み・次の記事で紹介

↓

資金管理・損失上限・緊急停止機能
→ 開発中

↓

実際のお金を使わない模擬運用

↓

少額で、注文前に自分で確認する実運用

↓

実運用の結果を確認しながら段階的に自動化

コメント

タイトルとURLをコピーしました