「Pythonで株価を取得したい」——これはPythonで投資を始める人が最初にぶつかる壁です。この記事ではyfinance・pandas-datareader・Alpha Vantage・SBI証券API・スクレイピングの5つの方法を実際に動くコードとともに解説します。
方法1:yfinance(最もオススメ)
Yahoo Financeからデータを取得する非公式ライブラリです。無料・制限なし・使いやすさで初心者に最適です。
pip install yfinance
import yfinance as yf
import pandas as pd
# 日本株(トヨタ)
toyota = yf.download("7203.T", period="1y", progress=False)
print(toyota.tail())
# 米国株(アップル)
apple = yf.download("AAPL", period="1y", progress=False)
print(apple.tail())
# 複数銘柄を一度に取得
tickers = ["7203.T", "9984.T", "AAPL", "NVDA"]
data = yf.download(tickers, period="6mo", progress=False)
close_prices = data['Close']
print(close_prices.tail())
# 銘柄の詳細情報
ticker = yf.Ticker("7203.T")
info = ticker.info
print(f"銘柄名: {info.get('longName')}")
print(f"時価総額: {info.get('marketCap'):,}円")
print(f"PER: {info.get('trailingPE')}")
方法2:pandas-datareader
様々なデータソースに対応したライブラリです。Stooqを使えば日本株も取得できます。
pip install pandas-datareader
import pandas_datareader as pdr
from datetime import datetime
# Stooqから日本株を取得
start = datetime(2023, 1, 1)
end = datetime(2024, 12, 31)
# トヨタ(Stooq形式:銘柄コード.JP)
df = pdr.data.DataReader("7203.JP", "stooq", start, end)
df = df.sort_index() # Stooqは降順なので昇順にソート
print(df.tail())
# FRED(米国連邦準備銀行)から経済指標を取得
gdp = pdr.data.DataReader("GDP", "fred", start, end)
print(gdp.tail())
方法3:Alpha Vantage
無料APIキーで使えるファイナンシャルデータAPI。1分あたり5リクエスト、1日あたり500リクエストまで無料です。
pip install alpha-vantage
from alpha_vantage.timeseries import TimeSeries
import pandas as pd
API_KEY = "YOUR_API_KEY" # https://www.alphavantage.co/support/ で取得
ts = TimeSeries(key=API_KEY, output_format='pandas')
# 日次データ取得(米国株)
data, meta = ts.get_daily(symbol='AAPL', outputsize='full')
data.index = pd.to_datetime(data.index)
data = data.sort_index()
data.columns = ['Open', 'High', 'Low', 'Close', 'Volume']
print(data.tail())
# リアルタイムデータ(インデックス)
data_rt, meta_rt = ts.get_quote_endpoint(symbol='AAPL')
print(f"現在値: {data_rt['05. price'][0]}")
方法4:J-Quants API(日本株専用)
日本取引所グループが提供する公式データAPI。個人投資家向け無料プランあり。
pip install jquants-api-client
import jquantsapi
import pandas as pd
# J-Quants APIクライアント初期化
# 事前にhttps://jpx-jquants.comでアカウント登録が必要
cl = jquantsapi.Client(mail_address="your@email.com", password="your_password")
# 株価データ取得(トヨタ: 72030)
prices = cl.get_prices_daily_quotes(code="72030")
df = pd.DataFrame(prices)
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date').sort_index()
print(df[['Open', 'High', 'Low', 'Close', 'Volume']].tail())
# 財務情報も取得可能
statements = cl.get_statements(code="72030")
print(pd.DataFrame(statements).head())
方法5:Webスクレイピング(Yahoo!ファイナンス)
APIがない場合の最終手段。利用規約の確認が必須です。
pip install requests beautifulsoup4
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
def scrape_yahoo_finance_japan(code):
"""
Yahoo!ファイナンスから株価情報をスクレイピング
※利用規約を確認の上、適切なウェイトを設けて使用すること
"""
url = f"https://finance.yahoo.co.jp/quote/{code}.T"
headers = {'User-Agent': 'Mozilla/5.0'}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
# 現在値を取得(セレクターはサイト変更で無効になる場合あり)
price_elem = soup.find('span', {'class': '_3rXWJKZF'})
if price_elem:
return {'code': code, 'price': price_elem.text.replace(',', '')}
return {'code': code, 'price': 'N/A'}
# 使用例(1秒待機してサーバー負荷軽減)
for code in ["7203", "9984", "6758"]:
data = scrape_yahoo_finance_japan(code)
print(data)
time.sleep(1)
5つの方法まとめ比較
| 方法 | 難易度 | コスト | 日本株 | 米国株 | リアルタイム |
|---|---|---|---|---|---|
| yfinance | ★ | 無料 | ✅ | ✅ | △(15分遅延) |
| pandas-datareader | ★★ | 無料 | ✅ | ✅ | ❌ |
| Alpha Vantage | ★★ | 無料(制限あり) | ❌ | ✅ | ✅ |
| J-Quants | ★★★ | 無料/有料 | ✅ | ❌ | ✅(有料) |
| スクレイピング | ★★★ | 無料 | ✅ | ✅ | △ |
まとめ
初心者にはyfinance一択をオススメします。インストールが簡単で、日本株・米国株・ETFを問わず豊富なデータが取得できます。有料データが必要になったときにJ-QuantsやAlpha Vantageへ移行するのがスムーズです。

