PythonでHyper SBI 2 APIと連携して自動売買する方法と現実

基礎知識・戦略

※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。

SBI証券が提供する高機能トレーディングツール「Hyper SBI 2」は、国内個人投資家に最も利用されているツールの一つです。リアルタイムの板情報やチャート分析、ワンクリック発注など、裁量トレードに必要な機能を網羅しています。

そのため「Hyper SBI 2にAPIがあれば、Pythonで自動売買ができるのではないか」と考えるのは自然な発想です。ただし、インターネット経由で使えるクラウド型のオープンREST APIは提供されていません。HYPER SBI 2が提供しているのは、同一PC上(Windowsのみ)で動作するローカルHTTP API(localhost:18080)です。

この記事では、Hyper SBI 2のAPI事情の現実、SBI証券全体のAPI提供状況、非公式な接続手段のリスク、そしてPythonで株価分析を実現するための現実的な代替手段を、技術的な視点から体系的に解説します。

Hyper SBI 2の概要と機能

まずはHyper SBI 2がどのようなツールであり、何ができるのかを整理します。

Hyper SBI 2の基本情報

Hyper SBI 2は、SBI証券が口座開設者向けに無料提供しているWindows専用のデスクトップアプリケーションです。2022年にリリースされ、旧バージョンの「HYPER SBI」の後継として位置づけられています。

項目 内容
提供元 SBI証券
対応OS Windows 10 / 11
利用料金 無料(SBI証券口座が必要)
主な機能 リアルタイム株価、板情報、チャート、発注、ニュース
対象市場 国内株式、先物・オプション、米国株式

Hyper SBI 2の主要機能

Hyper SBI 2が備える主な機能は以下のとおりです。

  • リアルタイム株価ボード: 複数銘柄の株価をリアルタイムで一覧監視
  • 高機能チャート: テクニカル指標の重ね表示、描画ツール
  • 板情報(気配値): フル板表示に対応
  • ワンクリック発注: チャートや板から直接注文を送信
  • アラート機能: 条件に合致した銘柄を通知

Hyper SBI 2に「API」はあるのか

ここが最も重要なポイントです。HYPER SBI 2にはローカルHTTP APIが公式機能として提供されています。同一PC上の http://localhost:18080 でAPIサーバーが動作し、PythonなどからHTTPリクエストで株価取得・注文送信が可能です。

ただし、このAPIはインターネット経由でアクセスできるクラウド型のオープンAPIではありません。HYPER SBI 2が起動している同一PC(Windowsのみ対応、Mac非対応)からのローカルアクセスに限られます。

API設定の場所:HYPER SBI 2のメニューから「環境設定」→「API設定」を開き、「APIサーバー機能を有効にする」にチェックを入れます。デフォルトポートは18080です。特別な申請・審査は不要で、SBI証券口座があれば即日利用できます。

HYPER SBI 2のAPIはSBI証券が公式に提供するローカルHTTP APIです。クラウド経由のオープンREST APIは提供されていませんが、同一PC上(Windows環境)からのローカル接続でPython連携が可能です。

SBI証券のAPI提供状況

HYPER SBI 2にはローカルAPIが提供されていますが、SBI証券全体としてのAPI提供状況も合わせて確認します。

SBI証券のAPI関連サービスの現状

SBI証券は、API連携に関連するいくつかの取り組みを行っています。ただし、個人投資家が「Python + REST API」で自由に売買できる環境は、2026年2月時点では限定的です。

サービス・取り組み 対象 個人利用の可否
Hyper SBI 2 個人投資家 ローカルHTTP API あり(localhost:18080、Windowsのみ)
SBI証券の法人向けAPI 法人・FinTech企業 個人は原則利用不可
SBIネオトレード証券(旧ライブスター) 個人投資家 一部API提供の動きあり
kabuステーション(auカブコム証券) 個人投資家 REST API公式提供あり(参考)

国内証券会社のAPI比較

Python連携を前提とした場合、国内証券会社のAPI提供状況を比較すると以下のとおりです。

  • auカブコム証券(kabuステーションAPI): REST API を個人向けに公式提供。Pythonからの発注が可能
  • 楽天証券: マーケットスピード II RSS(Excel連携)はあるが、PythonからのREST API は未提供
  • SBI証券: 個人向けの公式REST APIは一般公開されていない
  • 松井証券: 個人向けの公式REST APIは一般公開されていない

2026年2月時点で、個人投資家がPythonからREST APIで発注まで行える国内証券はauカブコム証券(kabuステーションAPI)が代表的な選択肢です。

SBI証券を使い続けたい場合の選択肢

SBI証券をメイン口座として使い続けながらPythonを活用したい場合、以下のような役割分担が現実的です。

  • データ分析・シグナル生成: Pythonで実装(yfinanceなどを活用)
  • 実際の発注: Hyper SBI 2のGUIから手動で執行
  • または: 発注のみauカブコム証券のAPIを利用し、SBI証券は保有資産管理に使う

非公式な接続手段(スクレイピング)のリスク

GitHubなどには、SBI証券のWebサイトやHyper SBI 2をブラウザ自動操作(Selenium等)で制御する非公式ライブラリが存在します。しかし、これらの利用には重大なリスクが伴います。

スクレイピングによる自動売買の問題点

非公式な方法でSBI証券に接続することには、以下の問題があります。

  • 利用規約違反のリスク: 自動化ツールによるアクセスは多くの証券会社の利用規約で禁止または制限されている
  • 口座凍結の可能性: 規約違反と判断された場合、口座が凍結される可能性がある
  • 技術的な不安定さ: SBI証券のWebサイトやアプリのUIが変更されると、即座にスクリプトが動作しなくなる
  • 誤発注リスク: UI変更に気づかないまま動作した場合、意図しない注文が執行される可能性がある
  • セキュリティリスク: ログイン情報をスクリプトに平文で記述する必要があり、漏洩リスクが高い

スクレイピングが「動かなくなる」典型パターン

非公式スクリプトが停止する典型的なシナリオは以下のとおりです。

  1. SBI証券がWebサイトのHTML構造を変更する
  2. CSSセレクタやXPathが一致しなくなる
  3. スクリプトがエラーで停止する
  4. 停止に気づかず、シグナルが出ても発注されない

非公式な接続手段は「動いているうちは便利」に見えますが、最も重要な場面(急な相場変動時)で動かなくなるリスクを抱えています。資金を預けるシステムとしては推奨されません。

Pythonで実現できる「現実解」

Hyper SBI 2のAPIが使えない状況でも、Pythonを活用して投資の効率を大幅に向上させることは可能です。

戦略1:データ分析特化型アプローチ

発注は手動(Hyper SBI 2で執行)に割り切り、Pythonは分析とシグナル生成に特化させるアプローチです。

  • 株価データの自動取得と蓄積
  • テクニカル指標の自動計算
  • 売買シグナルの自動検知とアラート通知
  • ポートフォリオのリスク分析

戦略2:yfinanceによる株価データ分析基盤の構築

yfinanceは、Yahoo Finance経由で株価データを無料取得できるオープンソースライブラリです。登録不要で、日本株にも対応しています。

【コピペOK】yfinanceで移動平均クロスのシグナルを検出するコード

以下のコードは、指定銘柄の短期・長期移動平均線を計算し、ゴールデンクロス(買いシグナル)とデッドクロス(売りシグナル)を自動検出します。


import yfinance as yf
import pandas as pd

# ==============================
# 設定エリア
# ==============================
SYMBOL = "7203.T"           # トヨタ自動車
SHORT_WINDOW = 5            # 短期移動平均(5日)
LONG_WINDOW = 25            # 長期移動平均(25日)
DATA_PERIOD = "6mo"         # 取得期間(6ヶ月)

# ==============================
# データ取得と移動平均計算
# ==============================
def analyze_cross_signal():
    print(f"--- {SYMBOL} の移動平均クロス分析 ---n")

    ticker = yf.Ticker(SYMBOL)
    df = ticker.history(period=DATA_PERIOD)

    if df.empty:
        print("データ取得に失敗しました。")
        return

    # 移動平均の計算
    df["SMA_Short"] = df["Close"].rolling(window=SHORT_WINDOW).mean()
    df["SMA_Long"] = df["Close"].rolling(window=LONG_WINDOW).mean()

    # クロス判定
    df["Signal"] = 0
    df.loc[df["SMA_Short"] > df["SMA_Long"], "Signal"] = 1
    df.loc[df["SMA_Short"] <= df["SMA_Long"], "Signal"] = -1
    df["CrossEvent"] = df["Signal"].diff()

    # 直近のクロスイベントを抽出
    cross_events = df[df["CrossEvent"] != 0].dropna(subset=["CrossEvent"])

    if cross_events.empty:
        print("期間内にクロスイベントはありませんでした。")
    else:
        print(f"{'日付':<14} {'種類':<18} {'終値':>10} {'短期SMA':>10} {'長期SMA':>10}")
        print("-" * 65)
        for date, row in cross_events.iterrows():
            if row["CrossEvent"] == 2:
                event_type = "ゴールデンクロス"
            elif row["CrossEvent"] == -2:
                event_type = "デッドクロス"
            else:
                continue
            print(
                f"{date.strftime('%Y-%m-%d'):<14} "
                f"{event_type:<18} "
                f"{row['Close']:>10,.1f} "
                f"{row['SMA_Short']:>10,.1f} "
                f"{row['SMA_Long']:>10,.1f}"
            )

    # 直近の状態を表示
    latest = df.iloc[-1]
    print(f"n--- 直近の状態 ({df.index[-1].strftime('%Y-%m-%d')}) ---")
    print(f"終値     : {latest['Close']:,.1f}")
    print(f"短期SMA  : {latest['SMA_Short']:,.1f}")
    print(f"長期SMA  : {latest['SMA_Long']:,.1f}")

    if latest["SMA_Short"] > latest["SMA_Long"]:
        print("判定     : 短期SMAが長期SMAの上 → 上昇トレンド傾向")
    else:
        print("判定     : 短期SMAが長期SMAの下 → 下降トレンド傾向")

if __name__ == "__main__":
    analyze_cross_signal()

このスクリプトを毎日実行し、シグナルが発生した場合にHyper SBI 2で手動発注する運用フローが、現時点での最も安全かつ現実的な方法です。

【コピペOK】複数銘柄のスクリーニングを自動化するコード

監視銘柄を複数設定し、一括でシグナル判定を行うスクリプトです。


import yfinance as yf
import pandas as pd

# ==============================
# 設定エリア
# ==============================
WATCHLIST = {
    "7203.T": "トヨタ自動車",
    "9984.T": "ソフトバンクG",
    "6758.T": "ソニーG",
    "8306.T": "三菱UFJ",
    "9432.T": "NTT",
}
SHORT_WINDOW = 5
LONG_WINDOW = 25

# ==============================
# 一括スクリーニング
# ==============================
def screen_watchlist():
    print("=== ウォッチリスト一括スクリーニング ===n")
    print(f"{'銘柄コード':<12} {'銘柄名':<16} {'終値':>10} {'短期SMA':>10} {'長期SMA':>10} {'判定':<10}")
    print("-" * 75)

    for symbol, name in WATCHLIST.items():
        try:
            ticker = yf.Ticker(symbol)
            df = ticker.history(period="3mo")

            if df.empty or len(df) < LONG_WINDOW:
                print(f"{symbol:<12} {name:<16} {'データ不足':>10}")
                continue

            df["SMA_Short"] = df["Close"].rolling(window=SHORT_WINDOW).mean()
            df["SMA_Long"] = df["Close"].rolling(window=LONG_WINDOW).mean()

            latest = df.iloc[-1]
            prev = df.iloc[-2]

            # クロス判定
            if prev["SMA_Short"] <= prev["SMA_Long"] and latest["SMA_Short"] > latest["SMA_Long"]:
                signal = "★買いシグナル"
            elif prev["SMA_Short"] >= prev["SMA_Long"] and latest["SMA_Short"] < latest["SMA_Long"]:
                signal = "★売りシグナル"
            elif latest["SMA_Short"] > latest["SMA_Long"]:
                signal = "上昇トレンド"
            else:
                signal = "下降トレンド"

            print(
                f"{symbol:<12} "
                f"{name:<16} "
                f"{latest['Close']:>10,.1f} "
                f"{latest['SMA_Short']:>10,.1f} "
                f"{latest['SMA_Long']:>10,.1f} "
                f"{signal:<10}"
            )
        except Exception as e:
            print(f"{symbol:<12} {name:<16} エラー: {e}")

    print("n=== スクリーニング完了 ===")

if __name__ == "__main__":
    screen_watchlist()

WATCHLIST に銘柄コードと名称を追加するだけで、監視対象を自由に拡張できます。

よくあるエラーと対処法

yfinanceで日本株のデータが取得できない

日本株の銘柄コードには末尾に .T(東京証券取引所)を付ける必要があります。

  • 正しい例:7203.T(トヨタ自動車)
  • 誤った例:7203(データが返されない)

yfinanceのデータに遅延はあるか

yfinanceで取得できるデータには、数分から20分程度の遅延が含まれる場合があります。日足ベースの分析には十分な精度ですが、リアルタイム性が求められるデイトレードには適していません。

Hyper SBI 2のRSSデータ連携は使えるか

Hyper SBI 2にはExcelへのリアルタイムデータ連携(DDE/RSS)機能は搭載されていません。旧バージョンの「HYPER SBI」にはRSS機能がありましたが、Hyper SBI 2では廃止されています。

Excel連携によるリアルタイムデータ取得が必要な場合は、楽天証券の「マーケットスピード II RSS」が選択肢となります。

まとめ

Hyper SBI 2とPython連携の現実をまとめると、以下のとおりです。

  • Hyper SBI 2にはローカルHTTP API(localhost:18080)が公式機能として提供されており、個人投資家でも申請不要で利用可能(Windowsのみ)
  • SBI証券全体としても、個人向けのオープンなREST APIは限定的な状況にある
  • 非公式なスクレイピングによる接続は、規約違反・口座凍結・誤発注のリスクがあり推奨されない
  • 現実的なアプローチは、Pythonで分析・シグナル生成、Hyper SBI 2で手動発注という役割分担
  • Python側のデータ取得にはyfinanceを使えば、無料かつ登録不要で日本株データを扱える

API経由での完全自動売買を目指す場合は、auカブコム証券のkabuステーションAPIの利用を検討してください。SBI証券を使い続けたい場合は、Pythonを「分析の武器」として活用し、発注はHyper SBI 2で行うハイブリッド運用が最も安全かつ効果的な戦略です。

🔗 関連記事

SBI証券のCSVをPythonで読み込んで分析する方法【pandas・実例つき】

🔗 関連記事

Pythonで株価データをCSV保存・読み込みする方法【yfinance・pandas】

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