Pythonで株価を取得するAPI比較|リアルタイム・日本株・自動保存まで解説
Pythonで株価を取得する方法を比較。yfinance、J-Quants API、Alpha Vantageの特徴、リアルタイムデータの注意点、CSV保存、チャート表示、自動取得までコード付きで解説します。
Pythonで株価を取得する方法には、yfinanceのようなライブラリ、取引所・証券会社・データ事業者が提供するAPI、Webスクレイピングがあります。どれも同じように見えますが、取得できる市場、更新頻度、料金、利用規約、商用利用の可否は異なります。
初心者が過去データを使って分析を学ぶならyfinanceが手軽です。日本株の継続的な分析ではJ-Quants API、米国株や為替・暗号資産を含むAPIを試したい場合はAlpha Vantageなどが候補になります。売買判断に直結するリアルタイムデータが必要なら、契約中の証券会社や正規データベンダーの公式サービスを優先してください。
この記事では、単にコードを並べるだけでなく、「自分の用途ならどの取得方法を選ぶべきか」を判断できるところまで解説します。
Pythonで株価を取得する主な方法
最初に、代表的な方法を比較します。
| 方法 | APIキー | 日本株 | 米国株 | リアルタイム性 | 向いている用途 |
|---|---|---|---|---|---|
| yfinance | 不要 | 対応例あり | 対応例あり | 保証なし | 学習、過去データ分析 |
| J-Quants API | 必要 | 強い | 対象外 | プラン・データごとに確認 | 日本株分析、財務データ |
| Alpha Vantage | 必要 | 銘柄ごとに確認 | 強い | エンドポイント・契約次第 | 米国株、為替、API学習 |
| 証券会社API | 必要 | サービス次第 | サービス次第 | 契約次第 | 注文連携、実運用 |
| Webスクレイピング | 不要の場合あり | ページ次第 | ページ次第 | ページ次第 | APIがない公開情報の補完 |
「無料かどうか」だけで決めないことが重要です。取得可能な期間、1分間・1日あたりの呼び出し上限、調整済み株価、配当、株式分割、データ再配信条件も比較します。
株価データで確認したいOHLCVとは
株価APIの多くは、OHLCVと呼ばれる形式を返します。
- Open:始値
- High:高値
- Low:安値
- Close:終値
- Volume:出来高
日足であれば1営業日につき1行、5分足であれば5分につき1行です。分析前に、タイムゾーン、取引所の休場日、調整済み価格か未調整価格かを確認してください。
調整済み株価が必要な理由
株式分割が行われると、実際には価値が急落していなくても、未調整の価格系列では大きな下落のように見える場合があります。長期リターンや移動平均を計算するときは、分割や配当をどのように扱うか決める必要があります。
日足と分足の違い
長期傾向を分析するなら日足・週足が扱いやすく、短期の値動きを見るなら分足が必要です。ただし、データが細かいほど行数、保存容量、API呼び出し回数が増えます。最初は日足から始めるのがおすすめです。
yfinanceで株価を取得する方法
yfinanceは、Yahoo Financeの公開情報へPythonからアクセスしやすくするオープンソースライブラリです。APIキーなしで試せるため、Pythonとpandasの学習に向いています。
公式ドキュメントでは、Yahooと提携・承認されたライブラリではないこと、研究・教育目的を想定していること、データの権利や利用条件をYahooの規約で確認することが案内されています。
インストールする
python -m pip install yfinance pandas matplotlibWindowsでpythonが認識されない場合は、環境に応じてpy -m pipを試してください。
日本株の日足を取得する
import yfinance as yf
symbol = "7203.T"
data = yf.download(
symbol,
period="1y",
interval="1d",
auto_adjust=True,
progress=False,
)
if data.empty:
raise RuntimeError("データを取得できませんでした")
print(data.tail())日本株では、証券コードの後ろに東京証券取引所を示す.Tを付ける例が一般的です。会社名から推測せず、Yahoo Financeなどでティッカー、市場、通貨が一致しているか確認します。
開始日と終了日を指定する
data = yf.download(
"7203.T",
start="2025-01-01",
end="2026-01-01",
interval="1d",
auto_adjust=True,
progress=False,
)startは期間に含まれ、endは含まれません。2025年12月31日まで必要なら、終了日は2026年1月1日とします。
複数銘柄をまとめて取得する
symbols = ["7203.T", "6758.T", "9984.T"]
prices = yf.download(
symbols,
period="6mo",
interval="1d",
auto_adjust=True,
progress=False,
)
close = prices["Close"]
print(close.tail())複数銘柄では列が階層構造になることがあります。print(prices.columns)で実際の列構造を確認してから処理してください。
J-Quants APIで日本株を取得する考え方
J-Quantsは、日本取引所グループ関連のサービスで、日本株の株価や財務情報をAPIで取得できます。利用できるデータ期間や種類、更新タイミングはプランによって異なるため、公式サイトの最新仕様を確認します。
J-Quantsが向いている人
- 日本株を中心に分析したい
- 株価と財務データを組み合わせたい
- APIキーを適切に管理できる
- 取得データの利用条件を確認して運用できる
認証情報をコードへ直接書かない
APIキーをGitHubや公開記事へ載せないでください。環境変数を利用します。
$env:JQUANTS_API_KEY="取得したAPIキー"Python側では次のように読み込みます。
import os
api_key = os.environ.get("JQUANTS_API_KEY")
if not api_key:
raise RuntimeError("JQUANTS_API_KEYが設定されていません")実際のエンドポイント、ヘッダー、パラメータは公式ドキュメントの現行例に合わせます。古い解説記事では認証方式が異なる場合があるため、コピーだけで実装しないことが大切です。
Alpha Vantageで株価APIを試す方法
Alpha Vantageは、株式、為替、暗号資産、テクニカル指標など複数のAPIを提供しています。公式ドキュメントでは、日次株価のTIME_SERIES_DAILYや、分足のTIME_SERIES_INTRADAYなどが案内されています。
APIキーを環境変数へ保存する
$env:ALPHA_VANTAGE_API_KEY="取得したAPIキー"米国株の日次データを取得する
import os
import requests
import pandas as pd
api_key = os.environ.get("ALPHA_VANTAGE_API_KEY")
if not api_key:
raise RuntimeError("APIキーが設定されていません")
params = {
"function": "TIME_SERIES_DAILY",
"symbol": "IBM",
"outputsize": "compact",
"apikey": api_key,
}
response = requests.get(
"https://www.alphavantage.co/query",
params=params,
timeout=30,
)
response.raise_for_status()
payload = response.json()
key = "Time Series (Daily)"
if key not in payload:
raise RuntimeError(f"API応答を確認してください: {payload}")
data = pd.DataFrame.from_dict(payload[key], orient="index")
data.index = pd.to_datetime(data.index)
data = data.sort_index()
data = data.astype(float)
print(data.tail())無料・有料プラン、呼び出し上限、リアルタイム・遅延データの扱いは変更される可能性があります。実装時点の公式ドキュメントを確認してください。
Pythonでリアルタイム株価を取得するときの注意点
検索では「リアルタイム」という表現がよく使われますが、実際には次の違いがあります。
- 真のリアルタイム配信
- 数秒・数分遅延のデータ
- 一定間隔で更新されるスナップショット
- 前営業日までの確定データ
画面が自動更新されることと、取引所のリアルタイム配信であることは同じではありません。
データ遅延を確認する
APIのレスポンス時刻と、最新データの時刻を比較します。タイムゾーンも確認してください。日本時間と米国東部時間を混同すると、データが古いと誤解する場合があります。
ポーリング間隔を短くしすぎない
REST APIを1秒ごとに呼ぶと、利用上限やアクセス制限に達する可能性があります。リアルタイム用途では、WebSocketの提供有無や推奨接続方法を確認します。
注文システムでは公式データを使う
学習用ライブラリの値をそのまま成行注文の判断へ使うのは危険です。注文連携では、証券会社が定める認証、レート制限、再接続、障害時処理、注文照合が必要です。
Webスクレイピングで株価を取得してよいか
技術的に取得できても、利用してよいとは限りません。サイトの利用規約、robots.txt、著作権、データベース権、アクセス頻度を確認します。
APIがある場合はAPIを優先する
画面のHTMLはデザイン変更で壊れます。APIは機械処理を前提とし、データ型やエラー形式が定義されているため、通常はAPIのほうが安定します。
ブラウザ表示とHTMLが異なる場合がある
JavaScriptで後から描画されるページでは、単純なHTTP取得だけでは価格が含まれない場合があります。ブラウザ自動操作を使うと処理が重くなり、メンテナンス箇所も増えます。
アクセス負荷を抑える
同じデータを何度も取得せず、CSVやデータベースへ保存します。再試行回数に上限を設け、失敗時は間隔を空けます。
取得データを同じ列名へ統一する
複数APIを切り替える場合、列名が異なると後続処理が複雑になります。内部では次の標準列へ揃えると管理しやすくなります。
STANDARD_COLUMNS = {
"1. open": "Open",
"2. high": "High",
"3. low": "Low",
"4. close": "Close",
"5. volume": "Volume",
}
data = data.rename(columns=STANDARD_COLUMNS)さらにSymbol、Market、Currency、Source、FetchedAtを保存すると、後からデータの由来を確認できます。
CSVへ安全に保存する
from datetime import datetime
from pathlib import Path
output_dir = Path("stock_data")
output_dir.mkdir(exist_ok=True)
stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
path = output_dir / f"7203_T_{stamp}.csv"
data.to_csv(path, encoding="utf-8-sig")
print(f"保存しました: {path}")同じファイルへ直接上書きすると、取得失敗時に正常なデータまで失う可能性があります。日時付きで保存し、検証後に最新版ファイルを更新する方式が安全です。
保存前の最低限チェック
required = {"Open", "High", "Low", "Close", "Volume"}
missing = required.difference(data.columns)
if missing:
raise ValueError(f"不足している列: {sorted(missing)}")
if data.empty:
raise ValueError("データが空です")
if not data.index.is_monotonic_increasing:
data = data.sort_index()株価チャートを表示する
取得結果が正しいか確認するため、終値をグラフ化します。
import matplotlib.pyplot as plt
data["Close"].plot(
figsize=(12, 6),
title="Stock Price",
)
plt.xlabel("Date")
plt.ylabel("Price")
plt.grid(True)
plt.tight_layout()
plt.show()異常な急騰・急落が見えたら、実際の値動きだけでなく、株式分割、通貨、欠損値、列の型を確認してください。
株価の自動取得を設計する
自動化では「取得できたら保存する」だけでは不十分です。
実行ログを残す
記録したい項目は、実行日時、データソース、銘柄、取得期間、行数、最新日時、保存先、エラー内容です。
APIキーを安全に管理する
.env.localや環境変数を利用し、Gitの管理対象から除外します。公開リポジトリへコミットしたキーは、削除するだけでなく無効化・再発行してください。
リトライと待機時間を設定する
ネットワーク障害時は数秒待って再試行します。ただし無限ループにせず、最大回数を決めます。認証エラーや契約上限は、再試行しても直らないため即時停止します。
ローカルPCとVPSを選ぶ
毎日決まった時間に実行するなら、電源を切らないVPSが便利です。一方、月1回の分析ならローカルPCで十分です。VPSを使う場合は、OS更新、SSH鍵、ファイアウォール、ログ、バックアップも管理します。
Pythonで株価を取得できないときの対処法
ティッカーが正しいか
市場を示す接尾辞、上場廃止、銘柄変更を確認します。同名企業やETFを取得していないか、通貨と市場も見ます。
データ型が数値か
APIのJSONは価格を文字列で返す場合があります。計算前にastype(float)やpd.to_numeric()で変換します。
APIのエラーメッセージを確認する
HTTP 200でも、JSONの中に利用上限や認証エラーが含まれる場合があります。期待する時系列キーの有無を必ず検査してください。
ライブラリを更新する
python -m pip install --upgrade yfinance pandas requests更新前後で動作が変わる可能性があるため、本番環境ではrequirements.txtなどでバージョンを固定します。
株価取得APIの選び方
次の順番で決めると整理しやすくなります。
- 対象市場は日本株か米国株か
- 過去データかリアルタイムか
- 日足か分足か
- 個人学習か商用利用か
- 配当・分割・財務データが必要か
- 月間の呼び出し回数は何回か
- 障害時のサポートが必要か
- データを第三者へ表示・再配信するか
学習段階ならyfinance、本格的な日本株分析ならJ-Quants、米国株APIの学習ならAlpha Vantageを比較し、注文連携では証券会社の公式仕様を確認する流れが現実的です。
複数APIの株価データを共通形式にそろえる
取得先を切り替えたときに困りやすいのが、列名と日時形式の違いです。あるAPIはclose、別のAPIはClose、さらに別のAPIは終値を文字列で返すことがあります。そのまま分析処理へ渡すと、APIごとにコードを書き直さなければなりません。
そこで、取得直後に次の共通形式へ変換する関数を用意します。
- インデックス:タイムゾーンを確認した日時
- 列名:
Open、High、Low、Close、Volume - 価格と出来高:計算可能な数値型
- 並び順:古い日時から新しい日時
- 重複:同じ日時は1行に統一
import pandas as pd
def normalize_ohlcv(df: pd.DataFrame) -> pd.DataFrame:
rename_map = {
"open": "Open",
"high": "High",
"low": "Low",
"close": "Close",
"volume": "Volume",
}
result = df.rename(columns=rename_map).copy()
required = ["Open", "High", "Low", "Close", "Volume"]
missing = [column for column in required if column not in result.columns]
if missing:
raise ValueError(f"必要な列がありません: {missing}")
result.index = pd.to_datetime(result.index, errors="coerce")
result = result.loc[~result.index.isna(), required]
result[required] = result[required].apply(pd.to_numeric, errors="coerce")
result = result.dropna(subset=["Close"])
result = result[~result.index.duplicated(keep="last")]
return result.sort_index()変換処理と分析処理を分離すれば、取得先を変更しても移動平均線やチャートのコードを再利用できます。保存時には、銘柄コード、取得元、取得日時、足種、調整済みかどうかもメタ情報として残すと、後からデータの由来を確認しやすくなります。
API制限や一時エラーに強い取得処理を作る
自動取得では、通信エラーや利用上限を「データが存在しない」と誤認しない設計が必要です。失敗時に空のCSVで正常ファイルを上書きすると、翌日の分析まで壊れてしまいます。
タイムアウトとステータスを検査する
requestsを使う場合はタイムアウトを明示し、raise_for_status()でHTTPエラーを検出します。無制限に待つ処理や、例外を握りつぶす処理は避けてください。
import time
import requests
def get_json_with_retry(url: str, params: dict, max_attempts: int = 3):
for attempt in range(1, max_attempts + 1):
try:
response = requests.get(url, params=params, timeout=20)
response.raise_for_status()
data = response.json()
if "Error Message" in data or "Information" in data:
raise RuntimeError(data.get("Error Message") or data.get("Information"))
return data
except (requests.RequestException, ValueError, RuntimeError):
if attempt == max_attempts:
raise
time.sleep(2 ** attempt)待ち時間を少しずつ延ばす方法は、一時的な混雑への対策になります。ただし、契約プランの呼び出し上限を回避する目的で短時間に再試行してはいけません。APIのレスポンスヘッダーや公式仕様を確認し、必要なら次回実行時刻まで待ちます。
保存前に品質チェックを行う
自動保存の直前に、最低限次の項目を検査します。
- 取得件数が0件ではないか
- 最新日が想定範囲に入っているか
- 終値が数値で、負の値になっていないか
- 高値が安値を下回っていないか
- 前回取得分と比べて件数が急減していないか
- 銘柄コードと市場が要求どおりか
異常時は既存ファイルを残し、ログへ理由を記録します。分析結果の再現性を高めるには、同じファイル名へ上書きするだけでなく、取得日を付けたスナップショットを一定期間保存する方法も有効です。
株価データ取得の運用コストを抑える方法
API料金だけでなく、呼び出し回数と保存量もコストに影響します。毎回全期間を取得せず、初回だけ過去データを保存し、2回目以降は前回の最終日以降を追加する「差分更新」にすると無駄を減らせます。
日足分析なら、取引時間中に何度も同じ日足を取得する必要は通常ありません。市場終了後に1回実行し、休日はスキップするだけでも呼び出し回数を抑えられます。複数ページで同じ株価を使う場合は、ページ表示のたびに外部APIへ接続せず、自分の保存データを読み込む構成にします。
一方、キャッシュ期間を長くしすぎると表示が古くなります。必要な更新頻度を「学習用の日足」「サイト掲載用の参考値」「売買判断用」に分け、目的ごとに取得元と更新間隔を決めてください。安さだけでリアルタイムAPIを選ぶのではなく、障害対応や利用許諾まで含めた総コストで判断することが大切です。
よくある質問
Pythonで株価を無料取得できますか?
無料で試せるライブラリやAPIはあります。ただし、取得回数、期間、更新頻度、データ種類に制限がある場合があります。無料であることと、商用利用や再配信が許可されることは別です。
yfinanceは公式APIですか?
Yahooが提携・承認した公式ライブラリではありません。研究・教育目的での利用案内とYahooの利用条件を確認してください。
日本株をリアルタイム取得できますか?
サービスと契約によります。「リアルタイム」と表示されていても遅延データの場合があります。注文用途では証券会社や正規データベンダーの配信条件を確認してください。
APIキーは記事に掲載してもよいですか?
掲載してはいけません。サンプルではYOUR_API_KEYなどのダミー値を使い、実際のキーは環境変数やシークレット管理機能へ保存します。
スクレイピングのほうが無料で簡単ですか?
短いコードで取得できる場合はありますが、規約、画面変更、アクセス制限への対応が必要です。公式APIがあるならAPIを優先します。
まとめ
Pythonの株価取得は、目的に合ったデータソースを選ぶことから始まります。学習用の過去データならyfinance、日本株の本格分析ならJ-Quants、米国株などのAPI学習ならAlpha Vantageが候補です。
取得後は、空データ、列、データ型、日時、調整済み価格を確認し、CSVへ保存して再利用します。リアルタイム性が必要な場合は、更新表示だけで判断せず、契約上の遅延時間と利用条件を確認してください。
株価の加工、騰落率、移動平均線を学びたい方は、Pythonで株価分析する方法も続けて確認してください。