SBI証券APIは個人で使える?申請の壁と「yfinance」という賢い選択肢

準備・環境構築

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

Pythonでシステムトレードや株価分析の自動化を始めようとしたとき、国内最大手であるSBI証券のAPIを使いたいと考えるのは自然な発想です。しかし、実際に技術情報を調べてみると、具体的な接続方法やサンプルコードがほとんど見つからず、途方に暮れるケースが非常に多いのが現実です。

結論から述べると、SBI証券は個人投資家向けに自由に使えるオープンなREST APIを広く公開していません。一部のAPI連携サービスは存在しますが、利用条件や技術的ハードルが高く、初心者が気軽に試せる環境ではありません。

この記事では、SBI証券APIの現状と利用条件を正確に整理した上で、無料かつ登録不要で株価データを取得できるオープンソースライブラリ「yfinance」を使った現実的な代替手段を、動くコード付きで解説します。

SBI証券APIの現状を正しく理解する

まずは、SBI証券が提供するAPI関連サービスの実態を把握しておく必要があります。

SBI証券が提供するツールとAPIの関係

SBI証券は個人投資家向けに「HYPER SBI 2」や「SBI証券 株アプリ」といった取引ツールを提供しています。これらは高機能なツールですが、外部のPythonスクリプトから直接データを取得したり、発注命令を送信したりするためのAPIとは根本的に異なるものです。

一般的に「API」とは、プログラムから直接HTTPリクエストを送ってデータの取得や注文の実行ができるインターフェースを指します。SBI証券の場合、以下のような状況になっています。

項目 状況
個人向けオープンREST API 一般公開されていない
HYPER SBI 2 デスクトップ取引ツール(API連携非対応)
SBI証券 株アプリ モバイル取引アプリ(API連携非対応)
法人・FinTech向けAPI 個別契約・審査制で一部提供

個人がSBI証券APIを利用するハードル

SBI証券では、法人やFinTech事業者向けにAPI連携の仕組みを提供している側面があります。しかし、個人投資家がPythonから自由にアクセスする用途については、以下のようなハードルが存在します。

  • 利用申請の審査: 利用目的や開発体制に関する審査が必要となる場合がある
  • 契約条件: 個別のAPI利用契約が求められ、個人利用は想定されていないケースが多い
  • 技術ドキュメントの非公開: エンドポイントやリクエスト仕様が一般に公開されていない
  • サポート体制: 個人開発者向けのテクニカルサポートは提供されていない

SBI証券の公式サイトにも、個人投資家が自由に利用できるAPI申請フォームや技術ドキュメントは公開されていません(2026年2月時点)。

kabuステーションAPI(auカブコム証券)との比較

国内証券会社の中で、個人投資家向けにREST APIを比較的オープンに提供しているのはauカブコム証券の「kabuステーションAPI」です。比較すると、SBI証券の現状がより明確になります。

比較項目 SBI証券 auカブコム証券(kabuステーションAPI)
個人向けAPI公開 非公開 公開済み(無料)
REST API仕様書 非公開 公式ドキュメントあり
Python対応 不可 対応(サンプルコードあり)
発注機能 利用不可 利用可能
利用条件 不明確 kabuステーション契約が必要

ただし、kabuステーションAPIにも「kabuステーション(有料ツール)の契約が必要」「ローカルPCでkabuステーションを起動しておく必要がある」といった制約があります。

スクレイピング(非公式接続)を推奨しない理由

SBI証券の公式APIが使えないとなると、「ブラウザ操作を自動化してログインすればいいのでは」と考える方もいます。しかし、この方法には重大なリスクが伴います。

スクレイピングの技術的リスク

GitHubなどには、SeleniumやPlaywrightを使ってSBI証券のWebサイトにログインし、データ取得や発注を行う非公式ライブラリが存在します。しかし、以下の問題点があります。

  • サイト仕様の変更で即座に動かなくなる: HTML構造やURL体系が変更されるたびにコードの修正が必要になる
  • レスポンス遅延: ブラウザ操作を介するため、API接続と比較して圧倒的に遅い
  • 二要素認証への非対応: セキュリティ強化によりログイン自体が困難になるケースがある

規約違反と口座凍結のリスク

SBI証券の利用規約には、自動化ツールによるアクセスを制限する条項が含まれている可能性があります。規約違反と判断された場合、以下のリスクが発生します。

  • 口座の一時凍結または永久停止
  • 取引履歴やポートフォリオへのアクセス喪失
  • 今後の口座開設拒否

非公式なスクレイピングによるSBI証券へのアクセスは、技術的にも規約的にも推奨されません。資金が入った本番口座で実行するのは絶対に避けてください。

リスク比較まとめ

接続方法 安定性 リスク 推奨度
SBI証券 公式API 個人利用不可 ×
スクレイピング(非公式) 口座凍結・規約違反リスク ×
kabuステーションAPI 有料ツール契約が必要
yfinance(データ取得特化) 無料・登録不要・発注不可

yfinanceという「現実解」を選ぶべき理由

SBI証券のAPIが使えない現状において、Python初心者が最初に取るべき選択肢はyfinanceです。

yfinanceとは何か

yfinanceは、Yahoo Financeのデータソースを利用して株価情報を取得できるオープンソースのPythonライブラリです。世界中の開発者に利用されており、GitHubでのスター数は14,000を超えています(2026年2月時点)。

主な特徴は以下のとおりです。

  • 完全無料: 料金は一切発生しない
  • 登録不要: APIキーの取得や会員登録が不要
  • 日本株対応: 東証上場銘柄は「銘柄コード.T」で取得可能
  • 豊富なデータ: 株価(OHLCV)、財務情報、配当情報など多岐にわたる

yfinanceの制約と注意点

万能ではないため、以下の制約を理解した上で利用する必要があります。

  • リアルタイムデータではない: 数分〜20分程度の遅延がある
  • 発注機能はない: データの取得・分析のみに対応
  • データソースの仕様変更: Yahoo Finance側の仕様変更でエラーが発生する可能性がある
  • 利用規約: 大量リクエストの送信は制限される場合がある

yfinanceはデータ取得と分析に特化したツールです。実際の売買発注は、SBI証券のHYPER SBI 2やスマホアプリで手動実行するか、kabuステーションAPIなどの発注対応APIを別途利用する必要があります。

SBI証券ユーザーにとっての最適な運用フロー

SBI証券で取引をしているユーザーが、yfinanceを組み合わせて活用する際の推奨フローは以下のとおりです。

  1. yfinanceで株価データを自動取得する(Python)
  2. テクニカル指標を算出して売買シグナルを判定する(Python)
  3. シグナルが発生したら通知を受け取る(メール・LINE等)
  4. SBI証券のツールで手動発注する(HYPER SBI 2 / アプリ)

この「分析は自動・発注は手動」という運用であれば、規約違反のリスクなく安全にシステムトレードの恩恵を受けることができます。

【コピペOK】yfinanceで日本株データを取得するコード

ここからは、実際に動作するコードを使ってyfinanceの基本操作を解説します。

基本:単一銘柄の株価を取得する

以下のコードをコピーして fetch_stock.py として保存し、実行してください。


import yfinance as yf
import pandas as pd

# ==============================
# 設定エリア
# ==============================
SYMBOL = "7203.T"  # トヨタ自動車(東証)
PERIOD = "6mo"      # 取得期間(6ヶ月)

# ==============================
# 株価データ取得
# ==============================
def fetch_single_stock():
    print(f"--- {SYMBOL} の株価データを取得中 ---")
    ticker = yf.Ticker(SYMBOL)
    df = ticker.history(period=PERIOD)

    if df.empty:
        print("データが取得できませんでした。銘柄コードを確認してください。")
        return

    # 直近5日分を表示
    print(df.tail())
    print()

    # 基本統計情報
    print("=== 基本統計 ===")
    print(f"期間中の最高値 : {df['High'].max():,.0f} 円")
    print(f"期間中の最安値 : {df['Low'].min():,.0f} 円")
    print(f"直近の終値     : {df['Close'].iloc[-1]:,.0f} 円")
    print(f"平均出来高     : {df['Volume'].mean():,.0f} 株")

    # CSV保存
    filename = f"{SYMBOL.replace('.', '_')}_history.csv"
    df.to_csv(filename)
    print(f"n--- CSV保存完了: {filename} ---")

if __name__ == "__main__":
    fetch_single_stock()

応用:複数銘柄を一括取得する

複数の銘柄データを一括で取得し、比較分析に使えるCSVを出力するコードです。


import yfinance as yf
import pandas as pd

# ==============================
# 設定エリア
# ==============================
SYMBOLS = {
    "7203.T": "トヨタ自動車",
    "6758.T": "ソニーグループ",
    "9984.T": "ソフトバンクグループ",
    "8306.T": "三菱UFJ",
    "6861.T": "キーエンス",
}
PERIOD = "3mo"

# ==============================
# 複数銘柄一括取得
# ==============================
def fetch_multiple_stocks():
    print("=== 複数銘柄データ一括取得 ===n")
    results = []

    for symbol, name in SYMBOLS.items():
        print(f"[取得中] {name}({symbol})...")
        ticker = yf.Ticker(symbol)
        df = ticker.history(period=PERIOD)

        if df.empty:
            print(f"  → データ取得失敗: {symbol}n")
            continue

        latest = df.iloc[-1]
        results.append({
            "銘柄コード": symbol,
            "銘柄名": name,
            "直近終値": round(latest["Close"], 1),
            "直近出来高": int(latest["Volume"]),
            "期間高値": round(df["High"].max(), 1),
            "期間安値": round(df["Low"].min(), 1),
        })
        print(f"  → 取得成功({len(df)}日分)n")

    if results:
        summary = pd.DataFrame(results)
        print("=== 取得結果サマリー ===")
        print(summary.to_string(index=False))

        summary.to_csv("multi_stock_summary.csv", index=False, encoding="utf-8-sig")
        print("n--- CSV保存完了: multi_stock_summary.csv ---")

if __name__ == "__main__":
    fetch_multiple_stocks()

encoding="utf-8-sig" を指定すると、ExcelでCSVを開いた際に日本語が文字化けしません。

periodパラメータの一覧

ticker.history()period パラメータに指定できる値は以下のとおりです。

取得期間
1d 当日(分足データ)
5d 直近5日間
1mo 直近1ヶ月
3mo 直近3ヶ月
6mo 直近6ヶ月
1y 直近1年
2y 直近2年
5y 直近5年
10y 直近10年
max 取得可能な全期間

特定の日付範囲を指定したい場合は、period の代わりに startend パラメータを使用します。


df = ticker.history(start="2025-01-01", end="2025-12-31")

よくあるエラーと対処法

yfinanceで「No data found」と表示される

銘柄コードの形式が間違っている場合に発生します。東証上場銘柄の場合、数字4桁の後に .T を付ける必要があります。

  • 正しい例:7203.T(トヨタ自動車)
  • 誤った例:7203(取得できないか、別市場のデータが返る)

yfinanceのインストールでエラーが出る

pipでyfinanceをインストールする際にエラーが発生した場合は、まずpip自体を最新にしてから再実行してください。


python -m pip install --upgrade pip
python -m pip install yfinance

データの取得速度が遅い

複数銘柄を連続で取得する場合、サーバーへの負荷を考慮して各リクエストの間に待機時間を入れることを推奨します。


import time

for symbol in symbols:
    # データ取得処理
    time.sleep(1)  # 1秒待機

短時間に大量のリクエストを送信すると、一時的にアクセスが制限される場合があります。time.sleep() で適切な間隔を設けてください。

まとめ

SBI証券のAPIをPythonから個人利用することは、2026年2月時点では現実的ではありません。要点を整理すると以下のとおりです。

  • SBI証券は個人投資家向けにオープンなREST APIを公開していない
  • スクレイピングによる非公式接続は規約違反・口座凍結のリスクがある
  • yfinanceを使えば、無料・登録不要で日本株の株価データを取得できる
  • 「yfinanceで分析→SBI証券のツールで手動発注」が最も安全な運用フロー

yfinanceはデータ取得と分析において、個人投資家が今すぐ使える最も手軽で信頼性の高い選択肢です。まずはこの記事のコードを実行してデータ取得に慣れた上で、テクニカル指標の計算や売買シグナルの自動検出に進んでください。

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