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. 株価・取引データ
| 属性・メソッド | 属性和名 | 解説 | 日本株取得率 |
|---|---|---|---|
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日分のみ |
2m〜90m
|
過去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. 株式アクション(配当・分割)
| 属性 | 属性和名 | 解説 | 日本株取得率 |
|---|---|---|---|
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. 財務三表(年次・四半期)
損益計算書
| 属性 | 属性和名 | 解説 | 日本株取得率 |
|---|---|---|---|
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. アナリスト・評価情報
| 属性 | 属性和名 | 解説 | 日本株取得率 |
|---|---|---|---|
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. 株主情報
| 属性 | 属性和名 | 解説 | 日本株取得率 |
|---|---|---|---|
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. イベント・カレンダー
| 属性 | 属性和名 | 解説 | 日本株取得率 |
|---|---|---|---|
ticker.calendar |
イベントカレンダー | 決算発表日・Dividend(配当)支払日・Ex-Dividend Date(配当落ち日)などの予定 | 90.3% |
ticker.earnings_dates |
決算発表日一覧 | 過去・今後の Earnings Date(決算発表日)の一覧 | 0.0% |
8. ニュース
| 属性 | 属性和名 | 解説 | 日本株取得率 |
|---|---|---|---|
ticker.news |
関連ニュース一覧 | タイトル・URL・Publisher(出版社)・Ticker(関連銘柄)などを含む最新ニュース一覧 | 27.1% |
9. オプション取引
| 属性・メソッド | 属性和名 | 解説 | 日本株取得率 |
|---|---|---|---|
ticker.options |
満期日一覧 | 取引可能な Option(オプション)の Expiration Date(満期日)一覧 | 0.0% |
ticker.option_chain(date) |
オプションチェーン | 指定満期日の Calls(コール・買う権利)と Puts(プット・売る権利)の詳細データ | 調査対象外 |
⚠️ 主に米国株向け(日本株はオプションデータが取得できない場合あり)
10. その他
| 属性 | 属性和名 | 解説 | 日本株取得率 |
|---|---|---|---|
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でバージョン更新を試みる
複数銘柄の一括取得
import yfinance as yf
# 複数銘柄を一括ダウンロード
df = yf.download(["AAPL", "GOOGL", "MSFT"], period="1y")
調査方法
調査対象
JPX(日本取引所グループ)の全上場銘柄一覧から取得した東証上場銘柄(個別株・ETF・J-REIT等を含む全約4,000銘柄)。
調査手順
- JPX 公式 Excel を
requestsでダウンロードし、銘柄コードに.Tを付与して yfinance 用ティッカーリストを作成 - 各銘柄について全属性・財務三表の全フィールドを取得し、
None/ 空 DataFrame / 空辞書 / 空文字列 でなければ「取得できた」と判定 - 属性・フィールドごとに取得できた銘柄数 ÷ 全銘柄数 × 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 の強みです。
ぜひ分析に活用してみてください。