「うちの売上は景気と連動してる?」「同業他社の株価と一緒に動いてる?」 ── 経営会議で時々出る話題ですが、いざ調べようとすると「日経平均の過去データってどこで取るんだ」で止まりがちです。実は と を使えば、 キーなしで世界中の株価・指数の長期ヒストリカルが 5 行で取得できます。
データソースの選択肢を整理する
「過去の株価データ」と一口に言っても、ソースによってカバレッジ・更新頻度・商用利用可否がまったく違います。最初に整理しておきます。
| ソース | コスト | カバレッジ | 履歴 | API キー | 商用利用 |
|---|---|---|---|---|---|
| yfinance | 無料 | 日米欧アジア全銘柄、指数、為替、先物 | 20年以上 | 不要 | ⚠️ 個人利用のみ(Yahoo の利用条件) |
| Stooq | 無料 | 日米欧、指数、為替、先物、商品 | 30年以上 | 不要 | ⚠️ Stooq とデータ元の利用条件を確認 |
| API / Pro | 個人API Free〜 / Proは契約 | 日本株中心 | プラン・契約による | 必要 | 個人APIは私的利用のみ / Proは契約条件を確認 |
| JPX 直配信 | 個別契約(高額) | 日本株フル | 全期間 | 必要 | 契約条件を確認 |
| Bloomberg / Refinitiv | 契約プランによる | 全市場 | 全期間 | 必要 | 契約条件を確認 |
まずは yfinance で動かす → うまく取れない銘柄や落ちた時のバックアップに Stooq → 商用ダッシュボードに組み込む段階で J-Quants へ移行、というステップが実用的。
1. yfinance で日経平均を取得する(30秒)
で pip install yfinance するだけ。コードは本当に 5 行で済みます。
動画の内容をテキストで読む
- 01yfinance で
^N225(日経平均)の過去 6 か月ぶんを取得する - 02取得できたのは 2026-03-02 〜 2026-09-02 の 125 営業日
- 03終値を折れ線で描く(橙の線)
- 0425 日移動平均を重ねる(黄の線)。トレンドの向きが読みやすくなる
- 05最終営業日の終値は 64,473 円
!pip install -q yfinanceimport yfinance as yf
# 日経225 のヒストリカル(過去5年)n225 = yf.Ticker("^N225").history(period="5y")print(n225.tail())print(f"\n期間: {n225.index.min().date()} 〜 {n225.index.max().date()}, {len(n225)} 営業日")Yahoo Finance の検索窓に銘柄名を入れて、上部に表示される ^N225 7203.T のような記号がティッカーです。日本株は <証券コード>.T(東証)、米国株はそのまま(例: AAPL, MSFT)。
2. 移動平均と出来高を可視化する
ヒストリカルデータが取れたら、次は 移動平均(MA: Moving Average) を引いてトレンドを見ます。25日 MA は短期、200日 MA は長期トレンドの定番。ゴールデンクロス(25日が200日を下から抜ける)は買いシグナル、デッドクロス(上から下に抜ける)は売りシグナルとして語られます。
import matplotlib.pyplot as pltimport japanize_matplotlib # noqa: F401
n225["MA25"] = n225["Close"].rolling(25).mean()n225["MA200"] = n225["Close"].rolling(200).mean()
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 7), sharex=True, gridspec_kw={"height_ratios": [3, 1]})ax1.plot(n225.index, n225["Close"], label="終値", linewidth=1.2, color="#1f77b4")ax1.plot(n225.index, n225["MA25"], label="25日 MA", color="#ff7f0e", linewidth=1)ax1.plot(n225.index, n225["MA200"], label="200日 MA", color="#d62728", linewidth=1.2)ax1.set_ylabel("価格(円)"); ax1.set_title("日経225 の終値と移動平均")ax1.legend(); ax1.grid(alpha=0.3)
ax2.bar(n225.index, n225["Volume"], color="#999", width=1.0)ax2.set_ylabel("出来高"); ax2.grid(alpha=0.3)plt.tight_layout(); plt.show()3. 個別銘柄を取って業界を比べる
次は個別企業を比較してみます。「自社が属する業界全体が伸びているのか、自社だけ伸びているのか」を判断する基本動作です。
import yfinance as yfimport pandas as pdimport matplotlib.pyplot as pltimport japanize_matplotlib # noqa: F401
tickers = {"7203.T": "トヨタ", "7201.T": "日産", "7267.T": "ホンダ"}df = yf.download(list(tickers.keys()), period="3y", auto_adjust=True)["Close"]
# 開始日=100 で正規化(リターン比較)norm = df / df.iloc[0] * 100
fig, ax = plt.subplots(figsize=(11, 5))for code, label in tickers.items(): ax.plot(norm.index, norm[code], label=label, linewidth=1.5)ax.set_title("自動車3社の株価推移(開始日=100で正規化)")ax.set_ylabel("正規化リターン"); ax.axhline(100, color="gray", linestyle="--", alpha=0.4)ax.legend(); ax.grid(alpha=0.3); plt.tight_layout(); plt.show()株価は銘柄ごとに桁が違うため(トヨタは数千円、日産は数百円)、そのまま重ねるとスケールが噛み合わず、トレンドが読めません。開始日を 100 に揃えることで「期間内の上昇率」を比較できます。これは投資レポートの常套手段。
4. Stooq でバックアップ取得(商品先物 / 為替も同じ流れ)
yfinance はたまに不安定(Yahoo の HTML が変わると壊れる)になります。そんな時のバックアップが Stooq。pandas-datareader 経由で同じインターフェースで使えます。
!pip install -q pandas-datareaderimport pandas_datareader.data as webimport datetime as dt
end = dt.date.today()start = end - dt.timedelta(days=365 * 5)
# Stooq のシンボル: 日経225 = ^nkx, 米ドル円 = jpyusd(逆数)n225 = web.DataReader("^nkx", "stooq", start, end).sort_index()usd = web.DataReader("usdjpy", "stooq", start, end).sort_index()
print("日経225:", n225.tail(3))print("\nUSD/JPY:", usd.tail(3))5. 自社売上 × 株価指数の相関を見る(実用例)
ここまでが「データの取り方」。本題は 自社データに重ねて使うところ。例えば BtoC 企業なら「TOPIX が上がると消費が増えるか?」、輸出企業なら「ドル円と売上の相関は?」が分かります。
# 自社売上(仮データ:実際は社内 DWH から取得)sales_monthly = pd.DataFrame({ "month": pd.date_range("2020-01", "2025-12", freq="MS"), "sales": [...], # 月次売上}).set_index("month")
# TOPIX 月次(^TPX は yfinance ではダメなので Stooq か日経のミラーを使う)topix = yf.Ticker("^TPX").history(period="6y")["Close"].resample("MS").last()
# 月次変化率df = pd.DataFrame({"sales": sales_monthly["sales"], "topix": topix})df_pct = df.pct_change().dropna()
fig, ax = plt.subplots(figsize=(7, 6))ax.scatter(df_pct["topix"]*100, df_pct["sales"]*100, alpha=0.6, s=50)ax.set_xlabel("TOPIX 月次変化率(%)"); ax.set_ylabel("売上 月次変化率(%)")corr = df_pct["topix"].corr(df_pct["sales"])ax.set_title(f"TOPIX × 自社売上の月次相関(r={corr:.2f})")ax.axhline(0, color="gray", linewidth=0.5); ax.axvline(0, color="gray", linewidth=0.5)ax.grid(alpha=0.3); plt.tight_layout(); plt.show()ローソク足チャートで描く(mplfinance)
「ローソク足」()は金融データの定番表現。mplfinance でデフォルト設定が綺麗です。
!pip install -q mplfinanceimport mplfinance as mpf
n225_6m = yf.Ticker("^N225").history(period="6mo")mpf.plot(n225_6m, type="candle", style="yahoo", volume=True, mav=(5, 25), title="日経225(直近6ヶ月)", figsize=(12, 7))留意点(重要)
yfinance は Yahoo Finance の公開APIを使う非公式ライブラリです。yfinance の公式READMEは、Yahoo Finance API は personal use only(個人利用のみ) とし、取得データの権利は Yahoo の利用条件で確認するよう案内しています。社内利用、再配布、顧客向けダッシュボードへの組み込みは、利用条件と自社の契約・法務確認を済ませてから進めてください。継続利用や外部提供が必要なら、J-Quants Pro やデータベンダーの利用条件も比較します。
- レート制限: yfinance は短時間に大量リクエストすると Yahoo に弾かれる。
time.sleep(0.1)を挟むか、まとめて取得(yf.download(list_of_tickers))する - Adjust 補正: 配当・株式分割の補正には
auto_adjust=Trueを使う。生の終値(Close)と補正済(Adj Close)は意味が異なる - 営業日カレンダー: 日本市場の祝日・年末年始は土日扱いではないため、月次集計時はカレンダーを意識する
- 通貨: 外国株はドル建て・現地通貨建てで返るため、JPY 換算が必要
- データの正確性は保証されない: yfinance / Stooq とも個人データ。重要な意思決定の根拠にする場合は JPX や Bloomberg の公式ソースで再確認する
ここで扱った公開相場データと、本人の残高・約定履歴を返す口座APIは別の用途です。後者を複数口座で集計する場合の認証、取得時刻、欠損の扱いは、証券・FX・暗号資産のAPI比較で確認できます。
ふくふくの進め方
BtoC や輸出比率の高い企業から「自社の売上と景気指標の関係を見える化したい」というご相談を頂きます。1〜2ヶ月で月次の相関ダッシュボード( / )、3〜6ヶ月で売上予測モデル( や を特徴量に組み込み)が現実的なロードマップ。社内 ( / )に金融データを定期取り込みする の設計も併せて承ります。
次回予告
EP.16 では、コモディティ・為替・先物データを使ったマクロ環境分析。 と為替、VIX(恐怖指数)から景気の風向きを読み、自社の在庫・調達計画にフィードバックする実践レシピを扱います。