0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

yfinanceで取得できるデータ項目まとめ【日本株4,000銘柄の実測データ付き】

0
Last updated at Posted at 2026-04-17

Pythonの株価データ取得ライブラリ「yfinance」で取得できるデータ項目を網羅的にまとめました。
財務分析・アルゴリズムトレード・データサイエンスに活用する際のリファレンスとしてご活用ください。

本記事では属性・フィールドごとに、東証上場の全銘柄(約4,000銘柄)を対象とした実測調査にもとづく「日本株での取得可否率(%)」を掲載しています。日本株での取得可否についての詳細は「日本株での取得可否について」セクションをご参照ください。

本記事は AI の支援を受けて執筆しています。ただし、掲載する情報の選定・構成・内容の確認はすべて筆者自身の判断と方針のもとで行っています。情報の正確性については最善を尽くしていますが、ご利用の際はご自身でもご確認いただくようお願いします。


この記事を書いた背景

yfinance のドキュメントや関連記事には取得できる属性・メソッドの一覧が紹介されています。しかし、実際に日本株で取得してみると、銘柄によって値が入っていたり入っていなかったり、属性によって取得できるデータがまったく異なることに気づきました。

「属性は存在するのに、取得してみたらほぼ空だった」というケースも少なくなく、使えると思っていたデータが実際には使えない、という状況が発生しました。特に yfinance は米国株を前提に設計されているため、米国株では問題なく取得できる属性が、日本株では空になるケースが多々あります。

こうした確認作業は、プログラムを書いて全銘柄分の取得処理を走らせる必要があり、それなりの時間がかかります。毎回ゼロから調べ直すのは非効率なため、一度まとめて調査を実施し、実測値にもとづく「使えるデータ・使えないデータ」の一覧を手元に持っておきたいと考えたのがこの記事の出発点です。

yfinanceとは

Yahoo! Finance のデータを Python から無料で取得できるライブラリです。
株価・財務諸表・アナリスト情報など、幅広いデータをコード数行で取得できます。

import yfinance as yf

ticker = yf.Ticker("AAPL")   # 米国株
ticker = yf.Ticker("7203.T") # 日本株(トヨタ)

日本株での取得可否について

本記事の各テーブルには「日本株取得率」列を設けており、東証上場の全銘柄(約4,000銘柄)を対象とした実測調査にもとづく取得可否率(%)を掲載しています。

取得不可の判断基準

以下のいずれかに該当する場合を「取得不可」と判定しています。

  • 戻り値が None
  • 空の DataFrame(行数がゼロ)
  • 空の辞書({}
  • 空のリスト・タプル
  • 空文字列または "None" という文字列

上記以外の場合を「取得可」と判定し、取得できた銘柄数 ÷ 全銘柄数 × 100 を取得可否率として算出しています。

注意点:取得可でも有効な値とは限らない

「取得可」と判定されても、実際に取得した値が有効かどうかは別問題です。
たとえば、DataFrame が返ってきても全フィールドが 0 やゼロ埋めである場合、財務上の意味がない可能性があります。
取得可否率はあくまで「データが存在するかどうか」の目安としてご活用ください。実際に利用する際は、取得した値の内容も合わせて確認することをお勧めします。

「調査対象外」について

一部の属性は調査対象から除外しており、表中に「調査対象外」と記載しています。

属性 除外理由
ticker.actions ticker.dividends(配当履歴)と ticker.splits(株式分割履歴)の合算値であるため、個別調査で代替可能
ticker.option_chain(date) 取得に満期日(date)を引数として渡す必要があり、全銘柄を一律に調査できないため

調査方法の詳細は末尾の「調査方法」をご参照ください。


データ項目一覧

1. 株価・取引データ

出典: yfinance Ticker API リファレンス

属性・メソッド 属性和名 解説 日本株取得率
ticker.history(period="1y") 株価履歴取得 Open(始値)・High(高値)・Low(安値)・Close(終値)・Volume(出来高)を Period(期間)・Interval(間隔)指定で取得 99.9%
ticker.history_metadata 履歴メタデータ 通貨・取引所・タイムゾーンなど履歴データの付帯情報 99.4%
ticker.fast_info 高速基本情報 現在値・MarketCap(時価総額)などをキャッシュ経由で高速取得 99.9%

history() の主なパラメータ

  • period: 1d / 5d / 1mo / 3mo / 6mo / 1y / 2y / 5y / 10y / ytd / max
  • interval: 1m / 5m / 15m / 30m / 1h / 1d / 1wk / 1mo

取得できるカラム: Open(始値)/ High(高値)/ Low(安値)/ Close(終値)/ Volume(出来高)

⚠️ interval による取得可能期間の制限

interval 取得可能な最大期間
1m 過去7日分のみ
2m90m 過去60日分のみ
1h 過去730日分のみ
1d 以上 制限なし(max 指定可)

2. 企業基本情報

出典: yfinance Ticker API リファレンス / yfinanceで取得できる企業データ一覧 - Qiita

属性 属性和名 解説 日本株取得率
ticker.info 企業情報辞書 企業の基本情報を Dict(辞書)形式で返す。時価総額・PER・配当利回りなど100項目以上を含む 100.0%
ticker.isin ISIN コード ISIN(International Securities Identification Number・国際証券識別番号)。銘柄の国際的な識別コード 99.8%

ticker.info の主なキー

キー 属性和名 解説
shortName / longName 企業名(短縮・正式) 銘柄の短縮名と正式名称
sector セクター GICS(Global Industry Classification Standard・世界産業分類基準)によるセクター分類
industry 業種 セクター配下の業種分類
country 本社所在国
website 公式サイト 企業の公式 Web サイト URL
fullTimeEmployees 従業員数 Full-time(正規雇用)の従業員数
longBusinessSummary 事業概要 事業内容・製品・サービスの説明文
marketCap 時価総額 Market Capitalization(時価総額)= 株価 × 発行済株式数
trailingPE 実績PER Trailing P/E(株価収益率)。直近12か月の実績 EPS(1株当たり利益)に基づく PER
forwardPE 予想PER Forward P/E。アナリスト予想 EPS に基づく PER
priceToBook PBR Price-to-Book Ratio(株価純資産倍率)= 株価 ÷ 1株当たり純資産
dividendYield 配当利回り Dividend Yield(配当利回り)= 年間配当金 ÷ 株価
beta ベータ値 Beta(ベータ)。市場全体に対する株価の感応度。1.0 が市場と同じ動き
52WeekChange 52週リターン 過去52週(約1年)の株価変化率
financialCurrency 財務報告通貨 財務諸表で使用されている通貨(例: USD・JPY)

3. 株式アクション(配当・分割)

出典: yfinanceの凄さを伝えたい - Qiita

属性 属性和名 解説 日本株取得率
ticker.actions 全アクション履歴 Dividend(配当)・Split(株式分割)の全履歴を一括取得 調査対象外
ticker.dividends 配当履歴 過去の Dividend(配当)支払日と金額の一覧 87.7%
ticker.splits 株式分割履歴 過去の Stock Split(株式分割)比率と日付の一覧 56.0%
ticker.capital_gains キャピタルゲイン履歴 Capital Gains(キャピタルゲイン)分配履歴。主に Mutual Fund(投資信託)向け 0.0%

4. 財務三表(年次・四半期)

出典: yfinanceの凄さを伝えたい - Qiita

損益計算書

属性 属性和名 解説 日本株取得率
ticker.income_stmt 年次損益計算書 直近4期分の年次 Income Statement(損益計算書)。売上・費用・利益の全体像を把握できる 91.6%
ticker.quarterly_income_stmt 四半期損益計算書 直近4四半期分。直近の業績トレンド確認に使う 49.3%

全項目数: 100件超(出典: yfinance const.py - GitHub

主要項目

フィールド名 フィールド和名 解説 日本株取得率
TotalRevenue 売上高 商品・サービスの販売で得た総収益 0.0%
OperatingRevenue 営業収益 本業からの収益。銀行・保険など業種により TotalRevenue(売上高)と異なる場合あり 0.0%
CostOfRevenue 売上原価 売上に直接対応する製造・仕入コスト 0.0%
GrossProfit 売上総利益 売上高 − 売上原価。粗利とも呼ばれる 0.0%
SellingGeneralAndAdministration 販売費及び一般管理費 営業・マーケティング・管理部門のコスト 0.0%
ResearchAndDevelopment 研究開発費 R&D(Research and Development・研究開発)に投じたコスト 0.0%
OperatingExpense 営業費用 販管費・研究開発費などの合計 0.0%
OperatingIncome 営業利益 本業の利益。売上総利益 − 営業費用 0.0%
EBIT 利払・税引前利益 EBIT(Earnings Before Interest and Tax・利払税引前利益)。金利・税制の影響を除いた収益力 89.3%
EBITDA 利払・税引・償却前利益 EBITDA(Earnings Before Interest, Tax, Depreciation and Amortization)。キャッシュ創出力の指標 89.1%
InterestExpense 支払利息 Bond(社債)・借入に対して支払う利息 0.0%
InterestIncome 受取利息 保有現金・貸付金から得た利息収入 0.0%
PretaxIncome 税引前利益 Corporate Tax(法人税)を引く前の利益 0.0%
TaxProvision 法人税等 計上された法人税・住民税・事業税 0.0%
NetIncome 純利益 最終利益。税引後・Minority Interest(少数株主持分)控除後 0.0%
NetIncomeCommonStockholders 普通株主帰属純利益 Preferred Dividend(優先配当)等を控除した普通株主に帰属する純利益 0.0%
BasicEPS 基本EPS EPS(Earnings Per Share・1株当たり利益)。発行済株式数ベースで算出 0.0%
DilutedEPS 希薄化後EPS Stock Option(ストックオプション)等の潜在株式を加味した1株当たり利益 0.0%
BasicAverageShares 基本加重平均株式数 Basic EPS(基本EPS)算出に使う加重平均発行済株式数 0.0%
DilutedAverageShares 希薄化後加重平均株式数 Diluted EPS(希薄化後EPS)算出に使う潜在株式込みの加重平均株式数 0.0%
ReconciledDepreciation 減価償却費 Fixed Assets(固定資産)の取得コストを耐用年数にわたって費用配分した金額 0.0%
DividendPerShare 1株当たり配当金 Common Stock(普通株)1株に対して支払われた配当金額 0.0%
TotalExpenses 総費用 CostOfRevenue(売上原価)・OperatingExpense(営業費用)を含むすべての費用合計 0.0%

⚠️ 日本株の損益計算書は、個別フィールドのほとんどが取得不可。例外として EBIT(89.3%)・EBITDA(89.1%) は高い取得率を示す。

貸借対照表

属性 属性和名 解説 日本株取得率
ticker.balance_sheet 年次貸借対照表 直近4期分の年次 Balance Sheet(貸借対照表)。資産・負債・純資産の構造を把握できる 91.6%
ticker.quarterly_balance_sheet 四半期貸借対照表 直近4四半期分 91.5%

全項目数: 150件超(出典: yfinance const.py - GitHub

主要項目

フィールド名 フィールド和名 解説 日本株取得率
TotalAssets 総資産 企業が保有するすべての Assets(資産)の合計 0.0%
CurrentAssets 流動資産 1年以内に現金化できる Current Assets(流動資産) 0.0%
CashAndCashEquivalents 現金・現金同等物 Cash(現金)および3か月以内に換金可能な短期資産 0.0%
CashCashEquivalentsAndShortTermInvestments 現金・短期投資合計 現金・現金同等物に Short-term Investments(短期投資)を加えた合計 0.0%
AccountsReceivable 売掛金 Accounts Receivable(売掛金)。商品・サービス販売後の未回収債権 0.0%
Inventory 棚卸資産 Inventory(在庫)。原材料・仕掛品・製品の合計 82.2%
NetPPE 有形固定資産(純額) PP&E(Property, Plant & Equipment・有形固定資産)から累積減価償却を控除した純額 0.0%
GrossPPE 有形固定資産(総額) PP&E(有形固定資産)の取得原価合計 0.0%
Goodwill のれん Goodwill(のれん)。M&A(合併・買収)時に支払った超過買収額 43.2%
GoodwillAndOtherIntangibleAssets のれん・無形資産合計 Goodwill(のれん)と Intangible Assets(無形資産)の合計 0.0%
TotalLiabilitiesNetMinorityInterest 総負債 Minority Interest(少数株主持分)を除く総 Liabilities(負債) 0.0%
CurrentLiabilities 流動負債 1年以内に支払い義務のある Current Liabilities(流動負債) 0.0%
AccountsPayable 買掛金 Accounts Payable(買掛金)。仕入・サービス購入後の未払債務 0.0%
CurrentDebt 短期有利子負債 1年以内に返済期限が来る Current Debt(短期借入・短期社債等) 0.0%
LongTermDebt 長期負債 返済期限1年超の Long-term Debt(長期借入・長期社債等) 0.0%
TotalDebt 総有利子負債 短期・長期を合わせた Total Debt(総有利子負債) 0.0%
NetDebt 純有利子負債 Net Debt(純有利子負債)= 総有利子負債 − 現金・現金同等物 0.0%
StockholdersEquity 株主資本 Stockholders' Equity(株主資本)= 総資産 − 総負債 0.0%
CommonStockEquity 普通株主資本 Common Stock Equity(普通株主資本)。Preferred Stock(優先株)分を除いた株主資本 0.0%
RetainedEarnings 利益剰余金 Retained Earnings(利益剰余金)。過去からの累積純利益の留保分 0.0%
TreasuryStock 自己株式 Treasury Stock(自己株式)。市場から買い戻した自社株(株主資本のマイナス) 0.0%
WorkingCapital 運転資本 Working Capital(運転資本)= 流動資産 − 流動負債。短期の支払い余力 0.0%
TangibleBookValue 有形純資産 Tangible Book Value(有形純資産)= 株主資本 − 無形資産・のれん 0.0%
InvestedCapital 投下資本 Invested Capital(投下資本)= 有利子負債 + 株主資本。事業に投下された資本合計 0.0%

⚠️ 日本株の貸借対照表は、個別フィールドのほとんどが取得不可。例外として Inventory(棚卸資産)82.2%・Goodwill(のれん)43.2% は取得できる場合がある。

キャッシュフロー計算書

属性 属性和名 解説 日本株取得率
ticker.cashflow 年次キャッシュフロー 直近4期分の年次 Cash Flow Statement(キャッシュフロー計算書)。現金の動きを3区分で把握 91.6%
ticker.quarterly_cashflow 四半期キャッシュフロー 直近4四半期分 1.2%

全項目数: 100件超(出典: yfinance const.py - GitHub

主要項目

フィールド名 フィールド和名 解説 日本株取得率
OperatingCashFlow 営業活動CF Operating Cash Flow(営業活動キャッシュフロー)。本業で生み出した現金 0.0%
InvestingCashFlow 投資活動CF Investing Cash Flow(投資活動キャッシュフロー)。設備投資・M&A 等の現金 0.0%
FinancingCashFlow 財務活動CF Financing Cash Flow(財務活動キャッシュフロー)。借入・配当・自社株買い等の現金 0.0%
FreeCashFlow フリーCF Free Cash Flow(フリーキャッシュフロー)= 営業CF − CAPEX(設備投資)。企業の自由裁量現金 0.0%
CapitalExpenditure 設備投資 CAPEX(Capital Expenditure・設備投資)。固定資産の取得・更新に使った現金 0.0%
Depreciation 減価償却費 Depreciation(減価償却費)。現金流出を伴わない費用として営業CF に加算 91.2%
DepreciationAndAmortization 減価償却・償却費合計 Depreciation(減価償却)+ Amortization(無形資産償却)の合計 0.0%
StockBasedCompensation 株式報酬 Stock-Based Compensation(株式報酬)。現金流出なしの非現金費用 0.0%
ChangeInWorkingCapital 運転資本変動 Working Capital(運転資本)の増減。売掛金・棚卸資産・買掛金などの変動 0.0%
ChangeInReceivables 売掛金増減 Receivables(売掛金)の期中増減 0.0%
ChangeInInventory 棚卸資産増減 Inventory(棚卸資産)の期中増減 0.0%
ChangeInAccountPayable 買掛金増減 Accounts Payable(買掛金)の期中増減 0.0%
DeferredIncomeTax 繰延税金 Deferred Tax(繰延税金)。税務上の費用と会計上の費用の時間差による調整 0.0%
CommonStockDividendPaid 普通配当金支払 Common Stock Dividend(普通配当金)として支払った現金 0.0%
RepurchaseOfCapitalStock 自社株買い Share Buyback(自社株買い)に使った現金(マイナス表示) 0.0%
LongTermDebtIssuance 長期借入実行 Long-term Debt(長期借入・社債)の新規調達額 0.0%
LongTermDebtPayments 長期借入返済 Long-term Debt(長期借入・社債)の返済額(マイナス表示) 0.0%
ChangesInCash 現金増減額 当期の現金・現金同等物の増減合計 0.0%
BeginningCashPosition 期首現金残高 期首時点の Cash Position(現金残高) 0.0%
EndCashPosition 期末現金残高 期末時点の Cash Position(現金残高) 0.0%

⚠️ 日本株のCFフィールドは、Depreciation(減価償却費)91.2% のみ取得可能。OperatingCashFlow・FreeCashFlow など主要CFフィールドはすべて取得不可。また quarterly_cashflow(四半期CF)はほぼ取得不可(1.2%)。


5. アナリスト・評価情報

出典: yfinance Ticker API リファレンス

属性 属性和名 解説 日本株取得率
ticker.recommendations アナリスト推奨履歴 各証券会社アナリストによる Buy(買い)・Hold(中立)・Sell(売り)等の推奨履歴 34.9%
ticker.recommendations_summary 推奨サマリー 直近の推奨件数を Buy・Hold・Sell 等に集計したサマリー 34.9%
ticker.upgrades_downgrades 格上げ・格下げ履歴 Upgrade(格上げ)・Downgrade(格下げ)の履歴と対象アナリスト 0.1%
ticker.analyst_price_targets アナリスト目標株価 アナリストの Price Target(目標株価)の最高・平均・最低値 90.3%
ticker.earnings_estimate 収益予想 アナリストのコンセンサスによる Earnings(収益)予想 35.4%
ticker.eps_trend EPSトレンド EPS(Earnings Per Share・1株当たり利益)予想の直近トレンド 35.4%
ticker.eps_revisions EPS修正履歴 EPS 予想の上方・下方 Revision(修正)履歴 35.4%
ticker.growth_estimates 成長率予想 売上高・EPS の Growth Rate(成長率)予想 90.3%
ticker.earnings_history 過去の決算実績 過去の Earnings(決算)における予想と実績の比較 88.2%

⚠️ 日本株はデータが少ない・取得できない場合あり(米国株中心のデータソースのため)


6. 株主情報

出典: yfinanceの凄さを伝えたい - Qiita

属性 属性和名 解説 日本株取得率
ticker.major_holders 主要株主 個人・機関投資家等の保有割合の内訳 90.3%
ticker.institutional_holders 機関投資家保有状況 Institutional Investor(機関投資家)別の保有株数・保有比率 24.1%
ticker.mutualfund_holders 投資信託保有状況 Mutual Fund(投資信託)別の保有株数・保有比率 6.2%
ticker.insider_transactions インサイダー取引履歴 Insider(役員・大株主等の内部者)による売買の履歴 0.0%
ticker.insider_purchases インサイダー買収履歴 Insider(内部者)による買い取引の履歴 90.3%
ticker.insider_roster_holders インサイダー登録保有者 Insider として登録された保有者の一覧 0.0%

⚠️ 日本株はインサイダー情報が空になることが多い(主に米国株向け)


7. イベント・カレンダー

出典: yfinance Ticker API リファレンス

属性 属性和名 解説 日本株取得率
ticker.calendar イベントカレンダー 決算発表日・Dividend(配当)支払日・Ex-Dividend Date(配当落ち日)などの予定 90.3%
ticker.earnings_dates 決算発表日一覧 過去・今後の Earnings Date(決算発表日)の一覧 0.0%

8. ニュース

出典: yfinanceの凄さを伝えたい - Qiita

属性 属性和名 解説 日本株取得率
ticker.news 関連ニュース一覧 タイトル・URL・Publisher(出版社)・Ticker(関連銘柄)などを含む最新ニュース一覧 27.1%

9. オプション取引

出典: yfinance API リファレンス インデックス

属性・メソッド 属性和名 解説 日本株取得率
ticker.options 満期日一覧 取引可能な Option(オプション)の Expiration Date(満期日)一覧 0.0%
ticker.option_chain(date) オプションチェーン 指定満期日の Calls(コール・買う権利)と Puts(プット・売る権利)の詳細データ 調査対象外

⚠️ 主に米国株向け(日本株はオプションデータが取得できない場合あり)


10. その他

出典: yfinance API リファレンス インデックス

属性 属性和名 解説 日本株取得率
ticker.sec_filings SEC提出書類 SEC(Securities and Exchange Commission・米国証券取引委員会)への提出書類一覧(米国株のみ) 0.3%
ticker.sustainability ESGスコア ESG(Environment・Social・Governance)に関するサステナビリティスコア 0.0%
ticker.funds_data ファンド情報 ETF(Exchange Traded Fund・上場投資信託)・Mutual Fund(投資信託)向けの保有銘柄・運用情報 100.0%

⚠️ sec_filings は米国株のみ(日本株は取得不可)
⚠️ sustainability は対応銘柄のみ(未対応銘柄では空になる)


⚠️ 注意事項:レートリミットについて

yfinanceはYahoo Financeの非公式スクレイピングライブラリです。公式APIではないため、以下の点に注意が必要です。

レートリミット(429エラー)

大量・高速リクエストを行うと YFRateLimitError: Too Many Requests が発生します。
2025年2月・5月には大規模な障害(突然データ取得不可)も報告されています。

対策

import time

for symbol in symbols:
    ticker = yf.Ticker(symbol)
    data = ticker.history(period="1y")
    time.sleep(1)  # リクエスト間に待機を入れる
  • 複数銘柄は yf.Ticker() を個別に呼ぶより yf.download() で一括取得する方が安全
  • エラーが続く場合は pip install --upgrade yfinance でバージョン更新を試みる

出典: yfinanceがエラーを吐く原因と対処法まとめ / GitHub Issues #2422


複数銘柄の一括取得

import yfinance as yf

# 複数銘柄を一括ダウンロード
df = yf.download(["AAPL", "GOOGL", "MSFT"], period="1y")

調査方法

調査対象
JPX(日本取引所グループ)の全上場銘柄一覧から取得した東証上場銘柄(個別株・ETF・J-REIT等を含む全約4,000銘柄)。

調査手順

  1. JPX 公式 Excel を requests でダウンロードし、銘柄コードに .T を付与して yfinance 用ティッカーリストを作成
  2. 各銘柄について全属性・財務三表の全フィールドを取得し、None / 空 DataFrame / 空辞書 / 空文字列 でなければ「取得できた」と判定
  3. 属性・フィールドごとに取得できた銘柄数 ÷ 全銘柄数 × 100 を取得可否率(%)として算出

調査環境

  • yfinance: 1.2.2
  • 調査日: 2026年4月
  • レートリミット対策: ティッカー間に 2.5〜3.5 秒のスリープを挿入

ステップ1: 銘柄リスト取得(fetch_tickers.py)

"""
fetch_tickers.py
JPX(日本取引所グループ)公式の全上場銘柄CSVをダウンロードし、
yfinance 用ティッカーコード(例: 7203.T)のリストを output/tickers.csv に保存する。
"""

import os
import requests
import pandas as pd

# JPX 全上場銘柄一覧(Excel形式)
JPX_URL = "https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls"
OUTPUT_DIR = "output"
OUTPUT_PATH = os.path.join(OUTPUT_DIR, "tickers.csv")
XLS_PATH = os.path.join(OUTPUT_DIR, "data_j.xls")


def main():
    os.makedirs(OUTPUT_DIR, exist_ok=True)

    print("JPX から銘柄一覧をダウンロード中...")
    headers = {"User-Agent": "Mozilla/5.0"}
    resp = requests.get(JPX_URL, headers=headers, timeout=30)
    resp.raise_for_status()

    with open(XLS_PATH, "wb") as f:
        f.write(resp.content)
    print(f"保存: {XLS_PATH}")

    df = pd.read_excel(XLS_PATH, dtype=str)

    # "コード" を含む列を自動検出(4桁数字のもの)
    code_col = next((c for c in df.columns if "コード" in c and df[c].str.match(r"^\d{4}$", na=False).any()), None)
    if code_col is None:
        raise ValueError(f"銘柄コード列が見つかりません。列名を確認してください: {df.columns.tolist()}")

    # "銘柄名" を含む列を自動検出
    name_col = next((c for c in df.columns if "銘柄名" in c), None)
    if name_col is None:
        raise ValueError(f"銘柄名列が見つかりません。列名を確認してください: {df.columns.tolist()}")

    # "市場・商品区分" を含む列を自動検出
    type_col = next((c for c in df.columns if "市場" in c and "区分" in c), None)
    if type_col is None:
        raise ValueError(f"市場・商品区分列が見つかりません。列名を確認してください: {df.columns.tolist()}")

    cols = [code_col, name_col, type_col]
    result = df[cols].copy()
    result = result[result[code_col].str.match(r"^\d{4}$", na=False)]
    result["ticker"] = result[code_col].str.strip() + ".T"
    result = result[["ticker", name_col, type_col]].rename(columns={name_col: "name", type_col: "type"})
    result = result.drop_duplicates(subset="ticker")

    result.to_csv(OUTPUT_PATH, index=False)
    print(f"完了: {len(result)} 銘柄 → {OUTPUT_PATH}")
    print(result["type"].value_counts().to_string())


if __name__ == "__main__":
    main()

ステップ2: 属性チェック(check_attributes.py)

"""
check_attributes.py
東証全上場銘柄について yfinance の各属性・フィールドが取得できるか調査し、
output/results.csv に 0/1 で記録する。

実行前に fetch_tickers.py を実行して output/tickers.csv を用意すること。
中断した場合は再実行すると output/checkpoint.txt をもとに途中から再開する。
"""

import csv
import logging
import os
import random
import time

import pandas as pd
import yfinance as yf

# yfinance の内部ログ(404エラー等)を抑制する
logging.getLogger("yfinance").setLevel(logging.CRITICAL)
logging.getLogger("urllib3").setLevel(logging.CRITICAL)

# ---- 設定 ----
SLEEP_SEC = 2.5          # ティッカー間スリープ(秒)
SLEEP_JITTER = 1.0       # ランダム追加スリープの上限(秒)
SLEEP_ON_RATE_LIMIT = 90 # 429 エラー時の待機時間(秒)
MAX_RETRY = 3            # 属性取得リトライ回数
OUTPUT_DIR = "output"
RESULT_CSV = os.path.join(OUTPUT_DIR, "results.csv")
CHECKPOINT_FILE = os.path.join(OUTPUT_DIR, "checkpoint.txt")

# ---- 属性定義 ----
# (列名, 取得ラムダ, 財務三表フィールドチェック対象か)
ATTRIBUTES = [
    # セクション 1: 株価・取引データ
    ("history",                 lambda t: t.history(period="1mo"),          False),
    ("fast_info",               lambda t: dict(t.fast_info),                False),
    # セクション 2: 企業基本情報
    ("info",                    lambda t: t.info,                           False),
    ("isin",                    lambda t: t.isin,                           False),
    # セクション 3: 株式アクション
    ("dividends",               lambda t: t.dividends,                      False),
    ("splits",                  lambda t: t.splits,                         False),
    ("capital_gains",           lambda t: t.capital_gains,                  False),
    # セクション 4: 財務三表
    ("income_stmt",             lambda t: t.income_stmt,                    True),
    ("quarterly_income_stmt",   lambda t: t.quarterly_income_stmt,          True),
    ("balance_sheet",           lambda t: t.balance_sheet,                  True),
    ("quarterly_balance_sheet", lambda t: t.quarterly_balance_sheet,        True),
    ("cashflow",                lambda t: t.cashflow,                       True),
    ("quarterly_cashflow",      lambda t: t.quarterly_cashflow,             True),
    # セクション 5: アナリスト情報
    ("recommendations",         lambda t: t.recommendations,                False),
    ("analyst_price_targets",   lambda t: t.analyst_price_targets,          False),
    ("earnings_estimate",       lambda t: t.earnings_estimate,              False),
    ("eps_trend",               lambda t: t.eps_trend,                      False),
    ("eps_revisions",           lambda t: t.eps_revisions,                  False),
    ("growth_estimates",        lambda t: t.growth_estimates,               False),
    ("earnings_history",        lambda t: t.earnings_history,               False),
    # セクション 6: 株主情報
    ("major_holders",           lambda t: t.major_holders,                  False),
    ("institutional_holders",   lambda t: t.institutional_holders,          False),
    ("mutualfund_holders",      lambda t: t.mutualfund_holders,             False),
    ("insider_transactions",    lambda t: t.insider_transactions,           False),
    ("insider_purchases",       lambda t: t.insider_purchases,              False),
    ("insider_roster_holders",  lambda t: t.insider_roster_holders,         False),
    # セクション 7: イベント・カレンダー
    ("calendar",                lambda t: t.calendar,                       False),
    ("earnings_dates",          lambda t: t.earnings_dates,                 False),
    # セクション 8: ニュース
    ("news",                    lambda t: t.news,                           False),
    # セクション 9: オプション
    ("options",                 lambda t: t.options,                        False),
    # セクション 10: その他
    ("sec_filings",             lambda t: t.sec_filings,                    False),
    ("sustainability",          lambda t: t.sustainability,                 False),
    ("funds_data",              lambda t: t.funds_data,                     False),
]

# ---- 財務三表フィールド定義 ----
STMT_FIELDS = {
    "income_stmt": [
        "TotalRevenue", "OperatingRevenue", "CostOfRevenue", "GrossProfit",
        "SellingGeneralAndAdministration", "ResearchAndDevelopment",
        "OperatingExpense", "OperatingIncome", "EBIT", "EBITDA",
        "InterestExpense", "InterestIncome", "PretaxIncome", "TaxProvision",
        "NetIncome", "NetIncomeCommonStockholders", "BasicEPS", "DilutedEPS",
        "BasicAverageShares", "DilutedAverageShares", "ReconciledDepreciation",
        "DividendPerShare", "TotalExpenses",
    ],
    "balance_sheet": [
        "TotalAssets", "CurrentAssets", "CashAndCashEquivalents",
        "CashCashEquivalentsAndShortTermInvestments", "AccountsReceivable",
        "Inventory", "NetPPE", "GrossPPE", "Goodwill",
        "GoodwillAndOtherIntangibleAssets", "TotalLiabilitiesNetMinorityInterest",
        "CurrentLiabilities", "AccountsPayable", "CurrentDebt", "LongTermDebt",
        "TotalDebt", "NetDebt", "StockholdersEquity", "CommonStockEquity",
        "RetainedEarnings", "TreasuryStock", "WorkingCapital",
        "TangibleBookValue", "InvestedCapital",
    ],
    "cashflow": [
        "OperatingCashFlow", "InvestingCashFlow", "FinancingCashFlow",
        "FreeCashFlow", "CapitalExpenditure", "Depreciation",
        "DepreciationAndAmortization", "StockBasedCompensation",
        "ChangeInWorkingCapital", "ChangeInReceivables", "ChangeInInventory",
        "ChangeInAccountPayable", "DeferredIncomeTax", "CommonStockDividendPaid",
        "RepurchaseOfCapitalStock", "LongTermDebtIssuance", "LongTermDebtPayments",
        "ChangesInCash", "BeginningCashPosition", "EndCashPosition",
    ],
}


def is_empty(value) -> bool:
    """取得結果が空かどうかを判定する。"""
    if value is None:
        return True
    if isinstance(value, pd.DataFrame):
        return value.empty
    if isinstance(value, dict):
        return len(value) == 0
    if isinstance(value, (list, tuple)):
        return len(value) == 0
    if isinstance(value, str):
        return value.strip() == "" or value.strip() == "None"
    return False


def fetch_with_retry(fn, ticker_code: str, attr_name: str):
    """属性を取得する。429 エラー時はリトライする。"""
    for attempt in range(MAX_RETRY):
        try:
            return fn()
        except Exception as e:
            err_str = str(e).lower()
            if "429" in err_str or "too many requests" in err_str:
                wait = SLEEP_ON_RATE_LIMIT * (attempt + 1)
                print(f"\n⚠️  429 ({ticker_code}/{attr_name}) → {wait}秒待機 (試行{attempt + 1}/{MAX_RETRY})")
                time.sleep(wait)
            else:
                return None
    return None


def check_ticker(ticker_code: str) -> dict:
    """1銘柄の全属性・フィールドをチェックし、{列名: 0/1} を返す。"""
    t = yf.Ticker(ticker_code)
    row = {"ticker": ticker_code}

    for attr_name, fn, has_fields in ATTRIBUTES:
        value = fetch_with_retry(lambda fn=fn: fn(t), ticker_code, attr_name)
        row[attr_name] = 0 if is_empty(value) else 1

        # 財務三表はフィールド単位でも記録
        if has_fields and attr_name in STMT_FIELDS:
            fields = STMT_FIELDS[attr_name]
            if isinstance(value, pd.DataFrame) and not value.empty:
                for field in fields:
                    col_key = f"{attr_name}__{field}"
                    if field in value.index:
                        row[col_key] = 0 if value.loc[field].isna().all() else 1
                    else:
                        row[col_key] = 0
            else:
                for field in fields:
                    row[f"{attr_name}__{field}"] = 0

    return row


def build_fieldnames() -> list[str]:
    """CSV のヘッダー列名リストを生成する。"""
    names = ["ticker"]
    for attr_name, _, has_fields in ATTRIBUTES:
        names.append(attr_name)
        if has_fields and attr_name in STMT_FIELDS:
            for field in STMT_FIELDS[attr_name]:
                names.append(f"{attr_name}__{field}")
    return names


def load_checkpoint() -> set[str]:
    if os.path.exists(CHECKPOINT_FILE):
        with open(CHECKPOINT_FILE) as f:
            return {line.strip() for line in f if line.strip()}
    return set()


def save_checkpoint(ticker_code: str) -> None:
    with open(CHECKPOINT_FILE, "a") as f:
        f.write(ticker_code + "\n")


def main():
    os.makedirs(OUTPUT_DIR, exist_ok=True)

    tickers_path = os.path.join(OUTPUT_DIR, "tickers.csv")
    if not os.path.exists(tickers_path):
        print(f"エラー: {tickers_path} が見つかりません。先に fetch_tickers.py を実行してください。")
        return

    df_tickers = pd.read_csv(tickers_path, dtype=str)
    ticker_name_map = dict(zip(df_tickers["ticker"], df_tickers.get("name", df_tickers["ticker"])))
    all_tickers = df_tickers["ticker"].tolist()

    done = load_checkpoint()
    remaining = [t for t in all_tickers if t not in done]
    total = len(all_tickers)
    print(f"対象: {total} 銘柄 / 済み: {len(done)} / 残り: {len(remaining)}")
    print(f"推定所要時間: 約 {len(remaining) * (SLEEP_SEC + SLEEP_JITTER / 2) / 3600:.1f} 時間")

    fieldnames = build_fieldnames()
    write_header = not os.path.exists(RESULT_CSV)

    with open(RESULT_CSV, "a", newline="", encoding="utf-8") as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames, extrasaction="ignore")
        if write_header:
            writer.writeheader()

        for i, ticker_code in enumerate(remaining, start=len(done) + 1):
            name = ticker_name_map.get(ticker_code, "")
            ts = time.strftime("%H:%M:%S")
            print(f"{ts} [{i}/{total}] {ticker_code}  {name}")
            row = check_ticker(ticker_code)
            writer.writerow(row)
            csvfile.flush()
            save_checkpoint(ticker_code)

            # レートリミット対策スリープ
            time.sleep(SLEEP_SEC + random.uniform(0, SLEEP_JITTER))

    print(f"\n完了 → {RESULT_CSV}")


if __name__ == "__main__":
    main()

補足:調査漏れ属性の追加調査

当初の調査スクリプト(check_attributes.py)では、以下の3属性が調査対象から漏れていました。

  • history_metadata(履歴メタデータ)
  • recommendations_summary(推奨サマリー)
  • upgrades_downgrades(格上げ・格下げ履歴)

これらを対象とした追加調査スクリプト check_missing_attributes.py を別途作成し、同じ4,065銘柄に対して調査を実施しました。対象属性が異なるだけでプログラムの構造は check_attributes.py と同一のため、ソースの掲載は割愛します。


まとめ

yfinance で取得できる主なデータは以下の10カテゴリです。

カテゴリ 主な用途 日本株での活用度
株価・取引データ テクニカル分析・バックテスト ◎(99.9%)
企業基本情報 スクリーニング・基本調査 ◎(100.0%)
財務三表 ファンダメンタルズ分析 △(年次は91%取得可・個別フィールドはほぼ不可)
アナリスト情報 コンセンサス予想との比較 △(目標株価・成長率予想は90%・推奨は35%)
株主情報 機関投資家の動向把握 △(主要株主90%・機関投資家24%・投信6%)
イベント・カレンダー 決算スケジュール管理 ○(カレンダー90%・決算日一覧は不可)
ニュース センチメント分析 △(27%)
オプション取引 オプション戦略分析 ✗(日本株は取得不可)
SEC提出書類 詳細開示情報 ✗(米国株のみ)
ESG情報 サステナブル投資 ✗(日本株は取得不可)

無料・コード数行でここまで取得できるのが yfinance の強みです。
ぜひ分析に活用してみてください。


参考・出典

0
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?