Pythonとyfinanceで使う日本銘柄コードと米国株ティッカーの違いと指定法

基礎知識・戦略

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

Pythonで株価データを取得しようとして、yfinanceに銘柄コードを入力したのにデータが返ってこない。そんな経験をしたことがあるのではないでしょうか。

📘 外部参考Python 公式サイト(ダウンロード)Python 公式ドキュメント(日本語)

原因の多くは、日本株と米国株で「銘柄の指定方法」がまったく異なることを知らないまま、コードを書いてしまっている点にあります。日本株の「7203」と米国株の「TM」は、どちらもトヨタ自動車を指しますが、成り立ちも記述ルールも別物です。

特にyfinanceでは、日本株に.Tというサフィックス(接尾辞)を付ける独自ルールがあります。このルールを知らなければ、正しい銘柄コードを入力しても永遠にデータを取得できません。

📘 外部参考yfinance 公式GitHubリポジトリPyPIページ

さらに厄介なのは、エラーメッセージが出ずに「空のDataFrame」が返るケースが多い点です。コードが間違っているのか、銘柄指定が間違っているのか、切り分けに時間を浪費してしまいます。

本記事では、日本の銘柄コードと米国株ティッカーシンボルの違いを体系的に整理し、yfinanceでの正しい指定方法をコード付きで解説します。主要な市場・アセットクラスごとの記述ルール一覧も提供します。

この記事を読めば、銘柄指定のミスによるデータ取得エラーとは無縁になります。手元に置いて辞書的に活用してください。

銘柄コードとティッカーシンボルの定義と構造

日本の銘柄コード(証券コード)の仕組み

日本の銘柄コード(Securities Code)は、証券コード協議会が管理する4桁の数字です。2024年以降は5桁コードへの移行も進んでいますが、現時点では4桁が主流です。

コードの先頭桁は業種を大まかに分類しています。例えば「7」は輸送用機器・自動車関連、「9」は通信・サービス業が多い傾向があります。ただし、この業種分類は厳密なルールではなく、例外も存在します。

先頭桁 主な業種例
1 水産・農林・鉱業
2 建設・食料品
3 繊維・パルプ・化学
6 機械・電気機器
7 輸送用機器・精密機器
8 銀行・証券・保険
9 通信・サービス

米国株ティッカーシンボルの仕組み

ティッカーシンボル(Ticker Symbol)は、アルファベット1〜5文字で構成される銘柄の略称です。NYSE(ニューヨーク証券取引所)では1〜3文字、NASDAQ(ナスダック)では4〜5文字が一般的です。

ティッカーは企業名や事業内容を連想しやすい文字列が割り当てられます。Apple(AAPL)、Microsoft(MSFT)、Google親会社のAlphabet(GOOGL)など、企業のブランドとして機能している側面もあります。

日本の銘柄コードが「無機質な数字」であるのに対し、米国のティッカーは「記憶しやすいアルファベット」という設計思想の違いがあります。

【コピペOK】yfinanceでの銘柄指定ルールと動作確認コード

まず、必要なライブラリをインストールしてください。


pip install yfinance pandas

以下が各市場の銘柄指定を一括検証するコードです。


from typing import Optional

import pandas as pd
import yfinance as yf

# ==============================
# 設定エリア
# ==============================
# yfinanceにおける銘柄指定ルール一覧
# 形式: (表示名, yfinanceティッカー, 説明)
TICKER_EXAMPLES: list[tuple[str, str, str]] = [
    # --- 日本株(東証) ---
    ("トヨタ自動車(東証)",     "7203.T",   "4桁コード + .T(東証サフィックス)"),
    ("ソフトバンクG(東証)",    "9984.T",   "4桁コード + .T"),
    ("ソニーG(東証)",          "6758.T",   "4桁コード + .T"),
    # --- 米国株 ---
    ("Apple(NASDAQ)",          "AAPL",     "ティッカーそのまま(サフィックス不要)"),
    ("Toyota(NYSE)",           "TM",       "米国ADRとしてのトヨタ"),
    ("Microsoft(NASDAQ)",      "MSFT",     "ティッカーそのまま"),
    # --- 指数 ---
    ("日経平均株価",             "^N225",    "先頭に ^ を付与"),
    ("S&P 500",                  "^GSPC",    "先頭に ^ を付与"),
    ("ダウ平均",                 "^DJI",     "先頭に ^ を付与"),
    # --- 為替 ---
    ("ドル円",                   "JPY=X",    "通貨ペア + =X"),
    ("ユーロドル",               "EURUSD=X", "通貨ペア + =X"),
    # --- ETF ---
    ("NEXT FUNDS 日経225(東証ETF)", "1321.T", "ETFも .T サフィックス"),
    ("SPDR S&P 500 ETF",        "SPY",      "米国ETFはティッカーそのまま"),
    # --- 暗号資産 ---
    ("ビットコイン/USD",         "BTC-USD",  "通貨ペアをハイフン区切り"),
]

# データ取得テスト期間
TEST_START: str = "2025-01-01"
TEST_END: str = "2025-01-31"


# ==============================
# 単一ティッカーの取得テスト
# ==============================
def test_single_ticker(
    ticker: str,
    start: str,
    end: str,
) -> dict:
    'ティッカーのデータ取得を試行し結果を辞書で返す'
    try:
        df: pd.DataFrame = yf.download(
            ticker,
            start=start,
            end=end,
            auto_adjust=True,
            progress=False,
        )
        if df.empty:
            return {"ticker": ticker, "status": "空データ", "rows": 0}
        return {"ticker": ticker, "status": "成功", "rows": len(df)}
    except Exception as e:
        return {"ticker": ticker, "status": f"エラー: {e}", "rows": 0}


# ==============================
# 全ティッカーの一括テスト
# ==============================
def run_all_tests(
    examples: list[tuple[str, str, str]],
    start: str,
    end: str,
) -> pd.DataFrame:
    '全ティッカーをテストし結果をDataFrameで返す'
    records: list[dict] = []
    for display_name, ticker, rule in examples:
        result: dict = test_single_ticker(ticker, start, end)
        records.append({
            "銘柄名": display_name,
            "yfinance指定": ticker,
            "記述ルール": rule,
            "取得結果": result["status"],
            "行数": result["rows"],
        })
    return pd.DataFrame(records)


# ==============================
# メイン処理
# ==============================
if __name__ == "__main__":
    print("=" * 60)
    print("yfinance ティッカー指定ルール 動作確認テスト")
    print("=" * 60)

    results: pd.DataFrame = run_all_tests(
        TICKER_EXAMPLES, TEST_START, TEST_END,
    )
    print(results.to_string(index=False))

    # 失敗した銘柄の警告
    failed: pd.DataFrame = results[results["取得結果"] != "成功"]
    if not failed.empty:
        print("n⚠ 以下の銘柄でデータ取得に失敗しました:")
        for _, row in failed.iterrows():
            print(f"  {row['yfinance指定']}: {row['取得結果']}")

コードの処理フロー解説

上記のコードは、以下の4ステップで構成されています。

* ステップ1 ティッカー一覧定義:日本株・米国株・指数・為替・ETF・暗号資産の代表的な銘柄と、それぞれのyfinance記述ルールをリストで定義する

* ステップ2 個別テストyf.download()で各ティッカーのデータ取得を試行し、成功・空データ・エラーの3パターンで結果を返す

* ステップ3 一括実行:全ティッカーをループ処理し、結果をDataFrameにまとめる

* ステップ4 結果出力:一覧テーブルをコンソールに表示し、失敗した銘柄を個別に警告する

TICKER_EXAMPLESに自分が取引する銘柄を追加すれば、一括でデータ取得の可否を確認できます。

yfinanceサフィックス一覧と市場別の記述パターン

主要市場のサフィックス対応表

yfinanceでは、米国以外の市場の銘柄にサフィックスを付与するルールがあります。以下の表を辞書として活用してください。

市場 サフィックス 記述例 備考
東京証券取引所 .T 7203.T 日本株・国内ETF共通
札幌証券取引所 .S 上場銘柄数が少ない
福岡証券取引所 .F 上場銘柄数が少ない
香港証券取引所 .HK 0700.HK テンセント等
ロンドン証券取引所 .L SHEL.L シェル等
NYSE / NASDAQ なし AAPL サフィックス不要
指数 ^(先頭) ^N225 サフィックスではなくプレフィックス
為替 =X(末尾) JPY=X 対米ドルの通貨ペア
暗号資産 -USD BTC-USD ハイフン区切り

.Tサフィックスが必要な理由

yfinanceのバックエンドであるYahoo Financeは、グローバルに複数の取引所をカバーしています。同じ数字コードが異なる市場に存在する可能性があるため、市場を特定するサフィックスが必要です。

米国市場のみサフィックスが不要なのは、Yahoo Financeが米国発のサービスであり、デフォルトの市場が米国に設定されているためです。日本株の7203をサフィックスなしで指定すると、米国市場で検索されて「該当なし」となります。

【コピペOK】銘柄コードからyfinance形式に自動変換するユーティリティ


from typing import Optional

import pandas as pd
import yfinance as yf

# ==============================
# 設定エリア
# ==============================
# 日本株の銘柄コードリスト(4桁数字のみ入力)
JP_CODES: list[str] = ["7203", "9984", "6758", "8306", "6501"]

# 米国株のティッカーリスト
US_TICKERS: list[str] = ["AAPL", "MSFT", "GOOGL", "AMZN"]

SUFFIX_JP: str = ".T"
TEST_START: str = "2025-01-01"
TEST_END: str = "2025-01-31"


# ==============================
# 日本株コードをyfinance形式に変換
# ==============================
def convert_jp_code(code: str, suffix: str = ".T") -> str:
    '4桁の銘柄コードにサフィックスを付与して返す'
    code = code.strip()
    if not code.endswith(suffix):
        return code + suffix
    return code


# ==============================
# 銘柄情報の取得
# ==============================
def fetch_ticker_info(ticker: str) -> dict:
    'ティッカーの基本情報を辞書で返す'
    try:
        info: dict = yf.Ticker(ticker).info
        return {
            "ticker": ticker,
            "名称": info.get("shortName", "不明"),
            "市場": info.get("exchange", "不明"),
            "通貨": info.get("currency", "不明"),
            "取得": "成功",
        }
    except Exception:
        return {
            "ticker": ticker,
            "名称": "—",
            "市場": "—",
            "通貨": "—",
            "取得": "失敗",
        }


# ==============================
# メイン処理
# ==============================
if __name__ == "__main__":
    records: list[dict] = []

    # 日本株の変換と情報取得
    print("【日本株】銘柄コード → yfinance形式")
    print("-" * 40)
    for code in JP_CODES:
        yf_ticker: str = convert_jp_code(code, SUFFIX_JP)
        info: dict = fetch_ticker_info(yf_ticker)
        print(f"  {code} → {yf_ticker}  ({info['名称']})")
        records.append(info)

    # 米国株の情報取得(変換不要)
    print("n【米国株】ティッカー(変換不要)")
    print("-" * 40)
    for ticker in US_TICKERS:
        info = fetch_ticker_info(ticker)
        print(f"  {ticker}  ({info['名称']})")
        records.append(info)

    # 一覧テーブル出力
    print("n【一覧テーブル】")
    result_df: pd.DataFrame = pd.DataFrame(records)
    print(result_df.to_string(index=False))

コードの処理フロー解説

上記のコードは、以下の3ステップで構成されています。

* ステップ1 日本株変換:4桁の銘柄コードに.Tサフィックスを自動付与し、yf.Ticker().infoで銘柄名・市場・通貨を取得する

* ステップ2 米国株確認:ティッカーをそのまま使用し、同様に基本情報を取得する。変換処理が不要であることを明示する

* ステップ3 一覧出力:日本株・米国株の銘柄情報を統合したDataFrameをコンソールに表示する

JP_CODESリストに自分が監視している銘柄コードを追加すれば、一括で正しいyfinance形式に変換できます。

よくあるエラーと対処法

サフィックスなしで日本株を指定して空データが返る

最も多いミスです。yf.download("7203", ...)と指定すると、米国市場で「7203」を検索するため該当なしとなります。エラーは発生せず、空のDataFrameが返る点が厄介です。

以下を試してください。

* 日本株には必ず.Tを付与する("7203.T"

* df.emptyチェックを必ずコードに組み込み、空データ時に明示的なエラーを発生させる

* 本記事の動作確認コードを使い、事前にティッカーの有効性をテストする

JSONDecodeErrorやHTTPErrorが発生する

Yahoo FinanceのAPI側の一時的な障害、またはリクエスト過多によるレート制限が原因です。短時間に大量の銘柄を取得しようとすると発生しやすくなります。

以下を試してください。

* import timetime.sleep(1)を各リクエスト間に挿入し、1秒以上の間隔を空ける

* yfinanceを最新版に更新する(pip install --upgrade yfinance

* 数分待ってから再実行する

同じ企業なのに日本株と米国ADRで株価が異なる

これはエラーではなく正常な動作です。トヨタの場合、7203.Tは東証での円建て株価、TMはNYSEでのドル建てADR(American Depositary Receipt:米国預託証券)の価格です。

ADRは現地株式を裏付けとした証券であり、為替レートや取引時間帯の違いにより価格が一致しません。日本株の分析には必ず.T付きのティッカーを使用してください。ADRの価格で日本株の分析を行うのは誤りです。

まとめ

この記事では、日本の銘柄コードと米国株ティッカーシンボルの違い、およびyfinanceにおける正しい銘柄指定方法を解説しました。

要点を整理します。

* 日本株は4桁数字の銘柄コード、米国株は1〜5文字のアルファベットのティッカーシンボルを使用する

* yfinanceで日本株を取得するには.Tサフィックスが必須である(例:7203.T

* 指数は^プレフィックス(^N225)、為替は=Xサフィックス(JPY=X)、暗号資産はハイフン区切り(BTC-USD)で指定する

* サフィックスを付け忘れてもエラーにならず空データが返るため、df.emptyチェックを必ず実装する

* 同一企業でも東証株とADRでは価格が異なるため、分析対象の市場に合ったティッカーを選択する

次のステップとして、本記事のサフィックス一覧表をもとに、自分が監視する全銘柄のティッカーリストを作成してください。動作確認コードで一括テストを行い、データ取得が確実にできることを確認したうえで、バックテストやリアルタイム分析のパイプラインに組み込むことを推奨します。

📘 外部参考Backtesting.py(公式ドキュメント)Backtrader 公式

🔗 関連記事

Pythonで株価を取得する方法【yfinanceで日本株も対応】

🔗 関連記事

yfinanceで日本株を取得できない時の原因と対処法【エラー別】

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