INVESTMENT #01

yfinanceで株価データを取得する完全ガイド

Python経験者向けの投資分析シリーズ第1回。yfinance で日本株・米国株・ETF・指数のデータを取得する方法を、最小コードから取得できるデータの一覧・複数銘柄の一括取得・実務でハマる落とし穴まで実コードで解説します。この回で作る「価格取得」は、連載のゴールであるポートフォリオ管理アプリの土台になります。

🎯 対象: Python経験者・投資分析 📦 yfinance 1.4.1 / pandas 🧪 2026-08-11 に実行して確認 ⏱️ 読了: 約25分

1. この記事のゴールと連載の位置づけ

本記事は「Python経験者が、自分の投資ポートフォリオを管理・可視化するアプリを作る」連載の第1回です。最終的には保有銘柄の評価損益・資産配分・配当までを扱う Streamlit アプリを目指しますが、そのすべての土台が「株価データを取得する」こと。ここを最初に固めます。

株価取得の定番ライブラリが yfinance です。Yahoo! Finance のデータを pandas の DataFrame として手軽に取得でき、日本株・米国株・ETF・指数を同じインターフェースで扱えます。無料で API キーも不要なので、個人の分析用途には十分です。ライブラリ全体の位置づけはよく使うPythonライブラリ51選でも触れています。

なぜ yfinance なのか、という点も先に押さえておきましょう。株価取得には証券会社の公式 API や有料データサービスもありますが、口座開設や申請、利用料が必要で、個人の分析を始めるにはハードルが高めです。yfinance は導入が pip 一発で、株・ETF・為替・指数を同じ書き方で扱えるため、まず手を動かして分析の型を作るのに最適でしょう。

一方で非公式ライブラリゆえの限界もあります。yfinance は Yahoo! Finance が公開する API を利用したオープンソースツールで、Yahoo, Inc. とは無関係(非公式)・研究/教育目的・個人利用向けと公式に明記されています(yfinance 公式リポジトリ (GitHub))。具体的な限界は次の3点です。

  • データ元(Yahoo! Finance)の仕様変更で、ある日突然動かなくなることがある
  • 取得が一時的に不安定になることがある
  • リアルタイム性は保証されない(遅延があり得る)

この3点は前提として受け入れ、「壊れても自分で直せる薄い作り」にしておくのが、長く使うコツ。本記事の最後で示す取得関数も、その思想で書きます。

この回のゴールは、「任意の銘柄リストの最新価格と過去データを、エラーに強い形で取得する関数」を書けるようになることです。あわせて、株価以外に何が取得できるのかを一覧で把握し、連載の後半(配当・資産配分)で使う材料の在り処を先に押さえます。連載の全体像は投資×Python シリーズ一覧を参照してください。

🧪
この記事の検証環境

本文中のコードと出力は、Windows 11 / Python 3.12.10 / yfinance 1.4.1 / pandas の環境で 2026年8月11日に実際に実行して確認したものです。yfinance は Yahoo! Finance 側の仕様変更やバージョン更新で挙動が変わることがあるため、出力の数値や件数はあなたの実行時とは一致しません。「どんな形のデータが返るか」の目安としてお読みください。掲載している数値は返り値の形を示すための実行例の抜粋であり、市場データの提供・再配布を目的としたものではありません。

なお、執筆時点で公開されている最新版は 1.5.2(2026年7月23日リリース)で、本記事の検証環境 1.4.1 とは差があります。公開されている変更履歴を読むかぎり、本文で扱う既定値(auto_adjustmulti_level_index)に関わる変更は見当たりませんでしたが、1.5.2 での実際の挙動は未検証です。最新版を使う場合は、第5章の確認スクリプトで自分の環境の返り値を確かめてください。

⚠️
本連載は投資助言ではありません

本記事はPythonでの個人向けツール開発・学習の記録です。特定の銘柄や投資手法の推奨、売買タイミングの示唆ではありません。登場する銘柄コード(7203.T / AAPL / VOO など)は yfinance の書き方を示す技術的な例示であり、本文中の株価・配当・財務の数値は実行例の出力です。当サイトは投資助言業の登録を行っておりません。投資判断はご自身の責任で行ってください(詳細は免責事項をご覧ください)。

2. yfinanceとは何か(非公式ライブラリという前提)

yfinance は、Yahoo! Finance が配信している市場データを Python から取り出すためのオープンソースライブラリです。pip install yfinance で導入でき、ライセンスは Apache License 2.0(yfinance 公式ページ (PyPI))。株価だけでなく、企業情報・配当・財務諸表・アナリストの目標株価まで、同じ Ticker オブジェクトから取り出せます。

「yfinance API」「Yahoo Finance API」との関係(APIキーは不要)

検索では「yfinance API」「Yahoo Finance API」と呼ばれることも多いのですが、これは Yahoo! が公式に提供する API ではありません。公式リポジトリの README にも、Yahoo, Inc. とは提携関係になく、研究・教育目的での利用を想定していると明記されています。APIキーの発行もアカウント登録も不要で、pip install の直後からコードが書けます。日本株も同じ書き方(7203.T)で扱えるため、「Yahoo Finance API で日本株の株価を取りたい」という用途は、実質この yfinance が受け皿になります。この「非公式である」という一点が、以降のすべての注意点の出発点になります。

3つの利点と、引き換えに受け入れる制約

観点yfinance の実際読者にとっての意味
費用ライブラリは無料・オープンソースデータ費用ゼロで分析を始められる
認証APIキー・アカウント登録は不要pip install の直後にコードが書ける
対象市場日本株・米国株・ETF・為替・指数を同じ書き方で円建てと外貨建てを1つのコードで扱える
安定性データ元の仕様変更で動かなくなることがある業務システムの基盤には向かない
即時性リアルタイム配信を保証するものではない秒単位の判断には使わない前提で組む
データ利用取得したデータの扱いは Yahoo! の規約に従う個人の分析・学習が基本。再配布は要確認

つまり yfinance は「自分の手元で、自分のためにデータを触る」用途に向いた道具です。逆に、顧客に提供するサービスの心臓部に据える、取得したデータをそのまま再配布する、といった使い方は想定外。ここを最初に線引きしておくと、あとで設計をやり直さずに済みます。

yfinanceで「できないこと」(リアルタイム配信・板情報・TOPIX指数)

できることの一覧は第5章にまとめますが、期待して探すと時間を溶かす「できないこと」を先に挙げておきます。いずれも本記事の検証環境で実際に確認した内容です。

  • 非上場の投資信託の基準価額: 市場で値が付かないため対象外。上場ETFで代替する
  • 板情報(気配値)・約定履歴: 取得対象に含まれない
  • TOPIX という指数そのもの: 実行時点では空のデータが返った(詳細と代替案は第7章
  • 日本株のオプション情報: options が空のタプルで返る(米国株では満期日の一覧が返る)
  • リアルタイム性の保証: 遅延の有無や幅は取引所によって異なり、一律の保証はない

「取れないものは取れない」と早めに確定させ、代替手段に切り替える。これが分析を前に進める一番の近道です。なお、Yahoo! Finance の画面を直接スクレイピングして補おうとする前に、規約と robots.txt の確認が必要です。この論点は株価スクレイピングの前に|規約とrobots.txtの確認で単独記事にまとめています。

3. インストールと最小コード

インストールは pip で一発です(Python環境がまだの方はPythonのインストールから)。複数銘柄の一括取得やバックテストまで見据えて投資分析用の環境を新しく整えたいなら、メモリに余裕のあるマシンだと快適です(選び方はPython学習・分析におすすめのPCにまとめています)。

pip install yfinance pandas

入ったバージョンは必ず控えておきましょう。yfinance は更新が活発で、バージョンによって既定の挙動や返り値の形が変わることがあります。記事やQ&Aサイトのコードが動かない原因の多くはここです。

python -c "import yfinance; print(yfinance.__version__)"

まずは1銘柄の最新価格を取得する最小コードです。トヨタ自動車(証券コード 7203)を例にします。

import yfinance as yf

# 日本株は証券コードに「.T」を付ける
ticker = yf.Ticker("7203.T")

# 直近の終値を1行で取得
hist = ticker.history(period="5d")
print(hist["Close"].iloc[-1])  # 直近の終値

yf.Ticker(...) で銘柄オブジェクトを作り、history() で時系列データ(pandas DataFrame)を取得します。列は Open / High / Low / Close / Volume(OHLCV)に、配当と分割の2列が加わった構成。「直近の終値」は Close 列の末尾(iloc[-1])です。

返ってきた DataFrame の形を確認しておくと、以降の作業がスムーズです。

print(hist.columns.tolist())
print(hist.index.tz)
['Open', 'High', 'Low', 'Close', 'Volume', 'Dividends', 'Stock Splits']
Asia/Tokyo

ポイントはインデックスがタイムゾーン付きの日時になっていること。日本株なら Asia/Tokyo、米国株なら America/New_York が付きます。この違いは複数国の銘柄を横に並べるときに効いてくるので、頭の隅に置いておいてください(対処は第9章)。

4. 日本株・米国株・ETFのティッカー指定

yfinance で最初に迷うのがティッカー(銘柄記号)の書き方です。市場ごとにルールが違います。

対象書き方
日本株証券コード + .Tトヨタ → 7203.T
米国株ティッカーそのままアップル → AAPL
国内ETF証券コード + .TTOPIX連動 → 1306.T
米国ETFティッカーそのままS&P500 → VOO
為替通貨ペア + =Xドル円 → USDJPY=X
株価指数先頭に ^日経平均 → ^N225

米国株を保有している場合、評価額を円換算するために為替が必要です。ドル円も同じ history() で取得できます。

usdjpy = yf.Ticker("USDJPY=X").history(period="5d")["Close"].iloc[-1]
print(f"1ドル = {usdjpy:.2f}円")

ティッカーが分からないときは検索する

海外ETFや馴染みのない銘柄では、そもそもティッカーが分かりません。yfinance には検索機能があるので、コードから引けます。

import yfinance as yf

result = yf.Search("toyota", max_results=5)
for q in result.quotes:
    print(q.get("symbol"), "|", q.get("shortname"), "|", q.get("exchange"))
TM | Toyota Motor Corporation | NYQ
7203.T | TOYOTA MOTOR CORP | JPX
9TO.F | TOYOTA TSUSHO CORP.           R | FRA
TMCO34.SA | TOYOTAMO    DRN | SAO
TOYOTA80.BK | TOYOTA80_DR TOYOTA#KTB | SET

同じ会社でも上場市場ごとに別のティッカーが割り当てられていることが、この出力からよく分かります。東証の株価が欲しいなら exchangeJPX の行、つまり 7203.T を選ぶ、という読み方です。

💡
検索キーワードは英語・ローマ字で

検証環境で yf.Search("トヨタ") を実行したところ、結果は0件でした。一方 yf.Search("toyota") では上記のとおり複数ヒットします。日本語の社名では引けないことがあるため、ローマ字か英語表記で検索するのが確実です。証券コードが分かっているなら、そもそも検索は不要で 7203.T と直接書けば済みます。

ティッカーを間違えても例外は出ない

ここは初見でほぼ全員がつまずきます。.T を付け忘れた場合や、存在しないティッカーを渡した場合、yfinance は例外を投げず、空の DataFrame を返します(コンソールには警告メッセージが出ます)。

df = yf.Ticker("7203").history(period="5d")   # .T を忘れた
print(df.empty)   # True

df = yf.Ticker("ZZZZZZ").history(period="5d") # 存在しないティッカー
print(df.empty)   # True

つまり try / except だけでは取りこぼしを検知できません。取得直後に df.empty を確認するのが、yfinance を使うコードの基本作法です。この考え方は第10章の取得関数に組み込みます。

⚠️
投資信託(非上場)は取得できない

yfinance が扱えるのは市場で値が付く銘柄(株・ETF・為替・指数など)です。日本の非上場の投資信託(基準価額)は対象外のことがほとんど。本連載では投信は手入力で割り切る方針にします(自動取得はETFに寄せる)。「全部自動化」にこだわると沼にハマるので、ここは早めに割り切るのが正解です。

5. yfinanceで取得できるデータ一覧

yfinance を「株価を取るライブラリ」と思っていると、使える範囲を大きく取りこぼします。Ticker オブジェクトは株価・企業情報・配当・財務三表・アナリスト情報・ニュースまでを属性としてぶら下げており、必要なものを名前で呼ぶだけで取り出せます。まず全体像を1枚の図で押さえましょう。

yfinanceのデータ取得の全体像。Yahoo! Financeのデータをyf.Tickerやyf.downloadで受け取り、pandasのDataFrameやdictに変換して自分のアプリへ渡す流れと、Tickerから取れる6カテゴリ(株価history、企業情報info・fast_info、配当と分割dividends・splits・actions、財務三表income_stmt・balance_sheet・cashflow、アナリスト情報recommendations・analyst_price_targets、ニュースと決算予定news・calendar・earnings_dates)のマップ
▲ 取得の流れと、Ticker から取れるデータのカテゴリ

以下の表は、検証環境で 7203.T(トヨタ/日本株)と AAPL(アップル/米国株)に対して実際に呼び出した結果をもとにまとめたものです。「日本株での様子」の列には、そのとき返ってきた実際の形を記録しています。

株価と基本情報

属性・メソッド返る型中身日本株での様子(7203.T)
history()DataFrameOHLCV+配当・分割の時系列取得できた。インデックスは Asia/Tokyo
history_metadatadict通貨・取引所・タイムゾーン等JPY / JPX / JST が返った
infodict社名・業種・時価総額・PER など168キー。企業概要は英文
fast_info辞書ライク現在値・出来高・52週高安など約20項目取得できた。info より軽い
calendardict次回決算日・配当落ち日・売上予想取得できた(8項目)
isinstr国際証券識別番号東証銘柄の JP… とは異なる値が返った。使わない方が安全

info は情報量が多い代わりに取得が重く、必要なのが現在値と出来高だけなら fast_info で足ります。ポートフォリオの評価額を毎回計算するようなループでは、軽い方を選ぶだけで体感速度が変わります

配当・株式分割・財務

属性・メソッド返る型中身日本株での様子(7203.T)
dividendsSeries1株あたり配当の履歴54件。日付は権利落ち日ベース
splitsSeries株式分割の比率と実施日2件
actionsDataFrame配当と分割をまとめたもの55行×2列
capital_gainsSeriesファンドの譲渡益分配空(個別株では通常空)
income_stmtDataFrame年次の損益計算書45行×5列。列は3月決算に対応
balance_sheetDataFrame年次の貸借対照表91行×5列
cashflowDataFrame年次のキャッシュフロー計算書54行×4列
quarterly_income_stmt ほかDataFrame上記の四半期版43行×5列
earnings_estimate / revenue_estimateDataFrameアナリストによる予想値4行×7列

財務三表が日本株でも返ってくるのは、意外に知られていない点です。列が決算期(2026-03-312025-03-31…)になっているため、日本の3月決算もそのまま扱えます。ただし古い期は欠損(NaN)になることがあるので、集計前に確認が必要です。

アナリスト情報・保有者・その他

属性・メソッド返る型中身実行時の様子
recommendationsDataFrame格付け(買い・中立など)の件数推移7203.T・AAPL とも 4行×6列
analyst_price_targetsdict目標株価の現在値・高値・安値・平均・中央値両銘柄とも5キー
major_holders / institutional_holdersDataFrame大株主・機関投資家の保有状況取得できたが、日本株は行数が少なめ
insider_transactionsDataFrame内部者の売買7203.T は10行、AAPL は75行
newslist関連ニュース(10件)銘柄と関係の薄い記事が混ざることがあった
earnings_datesDataFrame決算日・EPS予想・実績・サプライズ率別ライブラリ lxml が必要。未導入だと ImportError、導入済みの環境では25行×3列(index=決算日)が返った
options / option_chain()tuple / オブジェクトオプションの満期日と建玉7203.T は0件、AAPL は22件
funds_dataオブジェクトETF・ファンドの構成銘柄などETF(1306.T)で構成上位が取得できた
sustainabilityDataFrameESG関連スコア両銘柄とも空だった

自分の環境で「何が取れるか」を確かめるコード

ここまでの表は執筆時点の記録です。yfinance は更新が速いので、取れる・取れないは自分の環境で確かめるのが確実。属性を順に呼んで、型と件数だけを表示する小さな確認スクリプトを1本持っておくと、バージョンを上げたときの差分がすぐ分かります。

import pandas as pd
import yfinance as yf

ATTRS = ["info", "fast_info", "dividends", "splits", "actions",
         "income_stmt", "balance_sheet", "cashflow",
         "recommendations", "analyst_price_targets", "news", "options"]

def describe(symbol: str):
    t = yf.Ticker(symbol)
    print("=" * 10, symbol)
    for name in ATTRS:
        try:
            v = getattr(t, name)
            if isinstance(v, pd.DataFrame):
                s = f"DataFrame shape={v.shape}" + ("  <- 空" if v.empty else "")
            elif isinstance(v, pd.Series):
                s = f"Series len={len(v)}" + ("  <- 空" if v.empty else "")
            elif isinstance(v, dict):
                s = f"dict keys={len(v)}"
            elif isinstance(v, (list, tuple)):
                s = f"{type(v).__name__} len={len(v)}"
            else:
                s = type(v).__name__
            print(f"  {name:22s} {s}")
        except Exception as e:
            print(f"  {name:22s} 取得できず: {type(e).__name__}")

describe("7203.T")

実行結果(検証環境・2026年8月11日)は次のとおりでした。

========== 7203.T
  info                   dict keys=168
  fast_info              FastInfo
  dividends              Series len=54
  splits                 Series len=2
  actions                DataFrame shape=(55, 2)
  income_stmt            DataFrame shape=(45, 5)
  balance_sheet          DataFrame shape=(91, 5)
  cashflow               DataFrame shape=(54, 4)
  recommendations        DataFrame shape=(4, 6)
  analyst_price_targets  dict keys=5
  news                   list len=10
  options                tuple len=0

この1本があれば、「この属性は自分の環境で使えるのか」を毎回30秒で判定できます。銘柄を AAPL1306.T に差し替えれば、個別株・米国株・ETF で何が違うのかも一目で比較できます。実際、ETF の info は88キーしか返らず、業種や時価総額のキーは存在しませんでした。

なお sector / industry はETFではキー自体が存在せず KeyError になります。分類体系の違い(GICSではありません)やETFの中身を比率で取る方法は、番外編yfinanceでセクター情報を取得するにまとめました。

日本株で注意しておきたい点

検証の範囲で気づいた、日本株ならではの注意点をまとめます。いずれも「使えない」ではなく「そのまま信じない」というレベルの話です。

  • 企業情報は英語: longBusinessSummarysector は英文・英語表記で返る。日本語の業種名が必要なら自前で対応表を持つ
  • ニュースは精度に幅がある: 7203.T の news に、銘柄と直接関係のない米国銘柄の記事が含まれていた。表示用途なら中身の確認を挟む
  • isin は信用しない: 7203.T で日本の証券識別番号(JP…)とは異なる値が返った。銘柄の一意キーには自分で決めたティッカー文字列を使う
  • オプション関連は空: options が0件。日本株のデリバティブ分析には使えない
  • ETFは項目が減る: 業種・時価総額・企業概要などが欠ける。ETF は funds_data 側を見る

この「取れるが、鵜呑みにはしない」という距離感が、非公式データを扱うときの現実的な構えです。数字を人に見せる場面では、必ず一次情報(企業の決算短信や取引所の公表値)で裏を取る。分析の速さは yfinance で、正しさの担保は一次情報で、と役割を分けましょう。

6. OHLCVと期間・間隔の指定(history)

history()period(期間)と interval(間隔)で取得範囲を制御します。ポートフォリオの資産推移を描くなら日足、日中の値動きを見たいなら分足、と用途で変えます。

# 過去1年の日足
df = yf.Ticker("AAPL").history(period="1y", interval="1d")

# 期間を日付で明示することもできる
df = yf.Ticker("AAPL").history(start="2025-01-01", end="2025-12-31")

print(df.tail())          # 末尾5行
print(df.columns.tolist()) # ['Open','High','Low','Close','Volume','Dividends','Stock Splits']

period1d / 5d / 1mo / 3mo / 6mo / 1y / 5y / max など、interval1m / 2m / 5m / 1h / 1d / 1wk / 1mo / 3mo などが指定できます。

periodとintervalの組み合わせには制限がある

ここが history() 最大のつまずきどころです。細かい間隔ほど、さかのぼれる期間が短くなります。しかも上限を超えると例外ではなく空の DataFrame が返るため、原因に気づきにくい。検証環境で AAPL に対して実際に試した結果が次の表です。

intervalperiod結果(実行して確認)
1m5d1,950行 取得できた
1m7d2,730行 取得できた
1m1mo0行(空)。1リクエストで取れる1分足は8日ぶんまで、という主旨のエラーが表示された
5m60d4,680行 取得できた
5m3mo0行(空)。直近60日以内の範囲に収めるよう求めるエラーが表示された
1h2y3,471行 取得できた
1dmax11,506行(1980年12月から)
1wkmax2,384行

覚え方はシンプルです。1分足は「直近30日」、2分足は検証環境の実測で「約46日(31取引日)」、5分・15分・30分・90分足は「直近60日」、時間足は「直近730日=ちょうど2年」、日足以上は「上場来」。時間足を「数年」と覚えると事故ります。検証環境で 1hperiod="3y""5y" を指定すると、いずれも0行で「直近730日以内に収めるよう求めるメッセージ」が表示されました。上の表の 1h × 2y(3,471行・2024年8月12日から)が、ちょうど上限いっぱいということです。

1分足には、さらに独立した2つの制限がかかります。①1リクエストで取れるのは8日ぶんまで②そもそも直近30日以内のデータしか提供されない。検証環境で33日前を起点に8日幅で指定したところ、The requested range must be within the last 30 days. というメッセージとともに0行が返りました(8日前・20日前の起点では約1,950行が取得できます)。つまり期間を8日ずつに区切って複数回に分けて連結しても、集められるのは最大でおよそ30日ぶんで、数か月ぶんの1分足は原理的に取得できません。なお30日の壁は1分足だけの制限で、5分・15分・30分・90分の各分足は直近60日ぶんまでさかのぼれます。ただし2分足だけは例外で、仕様上は60日とされているものの、検証環境では約46日(31取引日)ぶんしか返りませんでした。49日前を起点に指定すると、範囲エラーではなく単に0行が返ります(48日前なら取得できます)。エラーメッセージが出ないぶん「自分のコードのバグ」と誤解しやすいので、長めにさかのぼりたいときは2分足を避けて5分足を使うのが安全です。

それより長い期間を分単位で分析したいなら、日足に落とすか、毎日取得して SQLite などに自分で蓄積していく設計へ切り替えてください。長期のバックテストをしたいのに1分足を指定して空が返ってきたら、まずこの制限を疑うこと。なお分割して取得する場合はリクエスト数が増えるので、各リクエストの間に time.sleep() を入れ、データ元に負荷をかけない間隔で回してください(レート制限は第10章で扱います)。

取得後は普通の pandas として扱えます。たとえば月次リターンは次の通りです。

monthly = df["Close"].resample("ME").last()
returns = monthly.pct_change().dropna()
print(returns)

調整後終値(auto_adjust)に注意

リターンや資産推移を正しく分析するうえで必ず知っておくべきのが「調整後終値」です。配当の支払いや株式分割があると、その前後で株価は不連続に動きます。たとえば1株を2株に分割すれば、株価は理論上半分に。素の Close をそのまま使うと、この「見かけの下落」をリターンと誤認してしまう点に注意しましょう。

検証環境の yfinance 1.4.1 では、history() の既定値は auto_adjust=True(分割・配当を調整した連続的な価格)でした。実際に AAPL の過去1年で比べると、最新日の終値は両者で一致し、1年前の終値だけがずれます。調整は過去側にさかのぼって効くからです。

t = yf.Ticker("AAPL")
adj = t.history(period="1y")["Close"]                    # 既定: 調整後
raw = t.history(period="1y", auto_adjust=False)["Close"] # 生の終値

print(round(adj.iloc[0], 2), round(raw.iloc[0], 2))   # 1年前 → 値がずれる
print(round(adj.iloc[-1], 2), round(raw.iloc[-1], 2)) # 直近 → 一致する

もうひとつ、auto_adjust=False にすると列が1つ増えて Adj Close が現れます。列名を決め打ちで参照しているコードは、この切り替えで壊れることがあるので注意してください。

print(t.history(period="5d").columns.tolist())
print(t.history(period="5d", auto_adjust=False).columns.tolist())
['Open', 'High', 'Low', 'Close', 'Volume', 'Dividends', 'Stock Splits']
['Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume', 'Dividends', 'Stock Splits']

なお、auto_adjust の既定値は yfinance の歴史の中で変更されたことがあります。ネット上の古いコードをそのまま持ってくると、調整の有無が意図と食い違う可能性があるということ。分析の再現性を保つなら、既定値に頼らず auto_adjust=True / False を明示的に書くのが安全です。

ポートフォリオの「現在の評価額」を出すだけなら直近価格でよいので差は出ませんが、「過去からの値上がり率」や「資産推移グラフ」を描くときは調整後を使う、と覚えておきましょう。ここを取り違えると、後の分析がすべて狂います。

7. 日経平均・TOPIXなど指数の取得

個別銘柄の値動きを評価するには、比較対象となる指数(インデックス)が要ります。「自分のポートフォリオは市場全体と比べてどうだったのか」を並べて描くだけで、資産推移グラフの説得力は大きく変わるからです。yfinance では、指数のティッカーは先頭に ^ を付けるのが基本ルールです。

日経平均は取得できる

日経平均株価は ^N225 で取得できました。しかも period="max" で、かなり長い期間がさかのぼれます。

import yfinance as yf

n225 = yf.Ticker("^N225").history(period="max")
print(len(n225), "行")
print(n225.index[0].date(), "〜", n225.index[-1].date())

検証環境では 15,143行・1965年1月5日からのデータが返りました。長期の相場環境を眺める用途には十分な深さです。

TOPIXそのものは取得できなかった

一方、TOPIX(東証株価指数)は事情が違います。よく候補に挙がる書き方をひととおり試しましたが、いずれも空の DataFrame が返りました

試したティッカー意図結果(実行して確認)
^N225日経平均株価✅ 取得できた(1965年から)
^TPXTOPIX❌ 空の DataFrame
^TOPXTOPIX(別表記)❌ 空の DataFrame
998405.TTOPIX(コード指定)❌ 空の DataFrame(銘柄が見つからない旨のエラー)
^GSPCS&P500✅ 取得できた
^DJIダウ工業株30種平均✅ 取得できた
^IXICナスダック総合指数✅ 取得できた
^VIXVIX指数✅ 取得できた

「yfinance で TOPIX が取れない」と検索してたどり着いた方は、ここで探すのをやめて代替に切り替えるのが時間の節約になります。指数データの提供可否は Yahoo! Finance 側の都合で決まるため、こちらのコードでは解決できません。

代替案: TOPIX連動ETFで代用する

実務的な代替は、TOPIXに連動する上場ETFの株価を指数の代わりに使う方法です。連動対象が同じなので、値動きの形はおおむね追随します。検証環境では、TOPIX連動ETF 3本(1306.T / 1475.T / 2557.T)がいずれも取得できました。次の表は、比較用に日経平均連動の 1321.T を加えた4本の実測結果です。

ティッカー連動対象取得できた期間の開始(period="max"
1306.TTOPIX2009年1月5日から 4,322行
1475.TTOPIX2015年10月20日から 2,659行
2557.TTOPIX2019年12月12日から 1,624行
1321.T日経平均2009年1月5日から 4,321行
import yfinance as yf
import time

for sym, label in [("^N225", "日経平均"), ("^TPX", "TOPIX(指数)"), ("1306.T", "TOPIX連動ETF")]:
    df = yf.Ticker(sym).history(period="5d")
    if df.empty:
        print(f"{label:14s} {sym:8s} 取得できず(空のDataFrame)")
    else:
        print(f"{label:14s} {sym:8s} 直近終値 {df['Close'].iloc[-1]:,.2f}({df.index[-1].date()})")
    time.sleep(1)
日経平均           ^N225    直近終値 66,970.22(2026-08-10)
TOPIX(指数)      ^TPX     取得できず(空のDataFrame)
TOPIX連動ETF     1306.T   直近終値 427.60(2026-08-10)
⚠️
ETFは指数そのものではない

ETFの価格は指数の値とイコールではありません。信託報酬の控除、分配金の支払い、市場での需給による乖離があるためです。「市場全体の動きと自分の資産を見比べる」目的なら実用上ほぼ問題ありませんが、指数の正確な値そのものを扱いたい場合は、取引所や指数算出会社が公表する一次情報を参照してください。分析結果を人に見せるときは、「TOPIX」ではなく「TOPIX連動ETFの株価」と正しく表記することも大切です。

ETFの中身(構成銘柄)も取れる

ETFを扱うなら、funds_data から構成上位銘柄が取り出せます。自分の保有銘柄とETFの中身が重複していないか(=知らないうちに同じ銘柄に集中していないか)を確認する材料になります。

fd = yf.Ticker("1306.T").funds_data
print(fd.top_holdings.head())
                                       Name  Holding Percent
Symbol
8306.T   Mitsubishi UFJ Financial Group Inc         0.035711
8035.T                   Tokyo Electron Ltd         0.029041
7203.T                    Toyota Motor Corp         0.025962
8316.T  Sumitomo Mitsui Financial Group Inc         0.024418
9984.T                  SoftBank Group Corp         0.020544

返ってくる Symbol がそのまま yfinance のティッカーになっているのが便利なところ。構成銘柄の一覧をそのまま yf.download() に渡して、個別の値動きを取りに行くといった連携がすぐ組めます。

8. 配当と財務データを取得する

ポートフォリオ管理では、値上がり益だけでなく配当も資産の一部です。yfinance は配当の履歴を dividends として持っているので、受取実績の集計が自前でできます。

配当履歴から利回りを自分で計算する

import pandas as pd
import yfinance as yf

t = yf.Ticker("7203.T")
div = t.dividends                       # 1株あたり配当の履歴(Series)
last12 = div[div.index >= div.index.max() - pd.Timedelta(days=365)].sum()
price = t.history(period="5d")["Close"].iloc[-1]

print(f"直近1年の配当合計: {last12:.1f} 円")
print(f"株価: {price:,.1f} 円")
print(f"配当利回り(自前計算): {last12 / price * 100:.2f} %")
print(f"info['dividendYield']  : {t.info.get('dividendYield')}")
print(f"info['trailingAnnualDividendYield']: {t.info.get('trailingAnnualDividendYield')}")
直近1年の配当合計: 95.0 円
株価: 2,981.0 円
配当利回り(自前計算): 3.19 %
info['dividendYield']  : 3.35
info['trailingAnnualDividendYield']: 0.031879194
🔍
同じ「利回り」でも単位が違う

上の出力をよく見てください。dividendYield3.35(=パーセント表記)なのに、trailingAnnualDividendYield0.0319(=比率表記)です。これを取り違えると、表示が100倍ずれます。yfinance のバージョンによってこの単位が変わった経緯もあるため、使う前に必ず実際の値を print() して桁を確認するのが確実。自分で計算した値(3.19%)とも完全には一致しませんが、これは集計期間や配当の定義(予想か実績か)が違うためで、どちらかが誤りというわけではありません。

この「複数の情報源で数字が微妙に食い違う」状況は、金融データでは日常茶飯事です。アプリに表示する数値は、どの定義で計算したのかを自分で説明できる形にしておく——これが、後から自分を助けます。この dividendYieldtrailingPE を条件にして銘柄を機械的に絞り込む側は、第10回の配当利回りスクリーナーを作るで、単位を100倍取り違えると1件も残らない実例つきで扱っています。

財務三表から時系列を取り出す

売上高や純利益の推移も、数行で取れます。income_stmt行が勘定科目・列が決算期DataFrame なので、loc で科目名を指定して1行を抜き出す形になります。

fin = yf.Ticker("7203.T").income_stmt

for period_end, value in fin.loc["Total Revenue"].items():
    print(f"{period_end.date()}  売上高 {value / 1e12:.2f} 兆円")
2026-03-31  売上高 50.68 兆円
2025-03-31  売上高 48.04 兆円
2024-03-31  売上高 45.10 兆円
2023-03-31  売上高 37.15 兆円
2022-03-31  売上高 nan 兆円

注目したいのは最古の期が nan(欠損)になっている点です。データの端は欠けることがある、という前提で dropna() やゼロ埋めの方針を決めておきましょう。また、勘定科目名は英語(Total Revenue / Net Income など)で、銘柄によって存在する科目が異なります。決め打ちで書く前に fin.index.tolist() で科目名の一覧を確認するのが安全です。

なお、財務データは企業が公表する決算資料が一次情報です。yfinance の値は加工を経て配信されているため、桁や会計基準の違いが生じることがあります。分析の下ごしらえには十分ですが、数字を根拠として扱う場面では決算短信や有価証券報告書で確認してください。取得したデータの整形や集計に不安があるなら、pandas を体系的に押さえておくと作業速度が変わります(pandas 開発者本人が書いたPythonによるデータ分析入門 第3版が定番です)。なお、リンク先は当サイトの書籍紹介ページで、アフィリエイト広告を含みますのでご了承ください。

9. 複数銘柄を一括取得する

ポートフォリオは複数銘柄の集合なので、1銘柄ずつ Ticker を回すより一括取得が効率的です。yf.download() に銘柄をリストで渡します。

import yfinance as yf

tickers = ["7203.T", "6758.T", "AAPL", "VOO"]
data = yf.download(tickers, period="6mo", interval="1d", group_by="ticker")

# 銘柄ごとの終値だけ取り出す
closes = {t: data[t]["Close"] for t in tickers}

ここで列が銘柄×項目の MultiIndex(階層列)になるのが最初の関門です。group_by="ticker" を付けると data["AAPL"]["Close"] のように銘柄起点でアクセスできて扱いやすくなります。逆に項目起点でまとめたいなら、終値だけを横並びにする書き方が便利です。

yf.download の MultiIndex 列構造の図解 group_by="ticker" を付けると、上段に銘柄(7203.T, AAPL, VOO)、下段にOHLCV項目(Open, High, Low, Close, Volume)が並ぶ2階層の列構造になる。data["AAPL"]["Close"] は上段AAPL・下段Closeを指す。 yf.download(..., group_by="ticker") の列構造 Level 0(銘柄) 7203.T AAPL VOO Level 1(項目) O H L C V O H L C V O H L C V O/H/L/C/V = OHLCV アクセス: data["AAPL"]["Close"] → 緑のセル1列 group_by="ticker" なし+ ["Close"] だけ取り出すと、列=銘柄名の平坦なDataFrameになる
図: yf.download の MultiIndex(階層列)。上段=銘柄・下段=OHLCV項目の2階層になり、data["AAPL"]["Close"] で緑のセル列にアクセスする。
# 全銘柄の終値を1枚のDataFrameに(列=銘柄)
close_df = yf.download(tickers, period="6mo")["Close"]
print(close_df.tail(2))
Ticker      6758.T  7203.T        AAPL         VOO
Date
2026-08-07  3721.0  2980.0  313.059998  710.710022
2026-08-10  3764.0  2981.0  308.260010  710.650024

日本株と米国株が同じ日付の行に並んでいる点に注目してください。市場ごとに営業日も取引時間も違うのに、日付だけで揃えられているということです。休場日や時差の影響で、ある銘柄だけ値が入らない行も生まれます。厳密な比較をするなら dropna() で両方に値がある日だけを残す、といった前処理が必要になります。

単一銘柄でも列がMultiIndexになる

検証環境で見つかった、地味に時間を溶かす挙動です。銘柄を1つだけ渡した場合でも、yf.download() の列は MultiIndex になりました

d = yf.download("AAPL", period="5d")
print(d.columns.tolist())
# [('Close', 'AAPL'), ('High', 'AAPL'), ('Low', 'AAPL'), ('Open', 'AAPL'), ('Volume', 'AAPL')]

この状態で d["Close"] を取ると、Series ではなく1列だけの DataFrame が返ります。「なぜか .iloc[-1] が値ではなく行になる」という混乱の正体はこれです。1銘柄のときは multi_level_index=False を付けて平坦にできます。

d = yf.download("AAPL", period="5d", multi_level_index=False)
print(d.columns.tolist())      # ['Close', 'High', 'Low', 'Open', 'Volume']
print(type(d["Close"]))        # <class 'pandas.Series'>

downloadとhistoryの細かな違い

同じ株価でも、2つの取得口では返り方が微妙に違います。混ぜて使うときに効いてくるので、表で押さえておきましょう(いずれも検証環境で確認)。

観点Ticker.history()yf.download()
対象1銘柄1〜複数銘柄
インデックスタイムゾーン付き(例: Asia/Tokyo)タイムゾーンなしの日付
配当・分割の列既定で含まれる既定では含まれない(actions=True で追加)
列の形単層既定で MultiIndex
調整既定 auto_adjust=True既定 auto_adjust=True

とくにタイムゾーンの有無は要注意です。片方で取った系列ともう片方で取った系列を concatjoin で結合しようとすると、インデックスの型が合わずに揃わないことがあります。アプリの中では取得口をどちらかに統一するのが、いちばん簡単な予防策です。

10. 実務でハマる落とし穴と対策

yfinance は手軽な反面、非公式ライブラリゆえの癖があります。アプリに組み込む前に知っておくべき落とし穴をまとめます。

症状原因対策
空の DataFrame が返るティッカー誤り(.T 付け忘れ等)if df.empty: で都度分岐してスキップ。まずティッカーを疑う(自動リトライでは直らない)。ティッカーが正しいと確認できた銘柄だけ、時間を置いて手動で再実行する
取得中に例外で落ちる通信エラー・一時的な取得失敗try / except で捕捉し、待ち時間を伸ばしながら数回リトライする(後述の取得関数)
期間を長くしたら空になったinterval と period の組み合わせ制限1分足は直近30日、2分足は実測で約46日、その他の分足は直近60日、時間足は730日以内に収める(第6章の表)
YFRateLimitError 等で落ちる短時間に大量リクエスト(レート制限)銘柄数を絞る・取得間隔を空ける・結果をキャッシュ
列が MultiIndex で扱いにくい複数銘柄取得時の仕様(1銘柄でも同様)group_by="ticker" / ["Close"] / multi_level_index=False
過去データに欠損・ばらつき休場日・上場前・データソース都合dropna() / 取得後に件数を検証
ImportError が出る属性がある一部の機能が別ライブラリに依存(earnings_dateslxmlメッセージに出たパッケージを追加インストール
結合したら日付が揃わないタイムゾーン有無の違い(history と download)取得口を統一する/tz_localize(None) で揃える

例外を細かく捕まえたい場合、yfinance は専用の例外クラスを用意しています。レート制限だけを別扱いにして待ち時間を入れる、といった制御が書けます。

from yfinance.exceptions import YFRateLimitError, YFPricesMissingError

これらを踏まえ、「失敗しても全体が止まらない」取得関数にまとめます。アプリに組み込む実用形はこの形です。

import time
import yfinance as yf

def fetch_latest_price(ticker: str, retries: int = 2):
    """最新終値を返す。取得できなければ None。"""
    for attempt in range(retries + 1):
        try:
            df = yf.Ticker(ticker).history(period="5d")
            if not df.empty:
                return float(df["Close"].iloc[-1])
            print(f"[warn] {ticker}: 空のデータ(ティッカーを確認)")
            return None
        except Exception as e:
            print(f"[warn] {ticker}: {type(e).__name__} {e}")
            if attempt < retries:
                time.sleep(2 ** attempt)   # 1秒 → 2秒と待ち時間を伸ばす
    return None

prices = {t: fetch_latest_price(t) for t in ["7203.T", "AAPL", "VOO"]}
print(prices)  # 取得失敗した銘柄は None

ポイントは3つあります。①空データと例外を分けて扱う(空が返るのはティッカーの誤りが疑われるケースで、同じリクエストを繰り返しても結果は変わらないため自動リトライの対象から外す。リトライが効くのは通信エラーなど例外が飛んだときだけ)、②例外を握りつぶさずログに残す③戻り値は None に揃える。こうしておくと、1銘柄の取得失敗でアプリ全体がクラッシュするのを防げます。

レート制限については、「何回まで」という公表された基準は確認できていません。確実なのは「短時間に大量のリクエストを投げると失敗しやすくなる」という事実だけです。したがって対策も、回数を推測して調整するのではなくそもそも取りに行く回数を減らす方向で考えます。

  • 一括取得を使う: 銘柄ごとにループするより yf.download() の方がリクエスト数を抑えられる
  • 結果をキャッシュする: 取得した終値を SQLite に保存し、「当日ぶんは再取得しない」設計にする(保存設計は連載の後半で扱います)
  • 軽い属性を選ぶ: 現在値だけなら info ではなく fast_info
  • 間隔を空ける: ループ内に time.sleep() を1行入れるだけでも失敗率は下がる

エラーメッセージの読み方そのものに不安がある場合は、Pythonのエラーメッセージの読み方と対処法もあわせてどうぞ。「どの行で・何の型が・どうなったか」を読めるようになると、非公式ライブラリの不具合も自力で切り分けられます

11. ポートフォリオ管理アプリへの接続

ここまでで「銘柄リスト → 最新価格の辞書」を、エラーに強い形で得られるようになりました。これがポートフォリオ管理アプリの心臓部です。次の式が成り立てば、評価額が出せます。

# 保有: 銘柄, 数量, 取得単価(実際はCSV取込や手入力で用意)
holdings = [
    {"ticker": "7203.T", "qty": 100, "avg_cost": 2500},
    {"ticker": "AAPL",   "qty": 10,  "avg_cost": 180},  # ドル建て
]

usdjpy = fetch_latest_price("USDJPY=X") or 150.0
for h in holdings:
    price = fetch_latest_price(h["ticker"])
    if price is None:
        continue
    # 米国株は円換算(簡易判定: .T が付かない=ドル建てとみなす例)
    rate = 1 if h["ticker"].endswith(".T") else usdjpy
    value_jpy = price * h["qty"] * rate
    cost_jpy = h["avg_cost"] * h["qty"] * rate
    print(f'{h["ticker"]}: 評価額 {value_jpy:,.0f}円 / 損益 {value_jpy - cost_jpy:+,.0f}円')

上の rate 判定は「.T が付かない=ドル建て」という割り切った簡易版である点に注意してください。将来ロンドン上場(.L)や香港上場(.HK)など他市場の銘柄を扱うと、この判定は破綻します。実運用では銘柄ごとに通貨を明示的に持たせ、通貨別のレートを引く設計に差し替えるのが安全です。Ticker.history_metadata["currency"]fast_info["currency"] から通貨コードを取れるので、そこを起点にするのが素直でしょう。まずは日本株+米国株に絞って動かし、対象が広がった時点で拡張する——というのが現実的な進め方です。

この「評価額・評価損益の計算」を表とグラフにすれば、もう立派なポートフォリオ管理の最小版です。次回以降で、保有データの持ち方(証券会社のCSVをpandasで取り込む)、損益計算の整備(平均取得単価・含み損益・実現損益をpandasで求める)、資産配分の可視化…と部品を足していきます。損益計算の回で扱うのは、ここで取得した現在値と自分の取引履歴を突き合わせて、含み損益と実現損益を出すところまでです。なお、株価を自分で取りに行く前に押さえておきたい「スクレイピングの可否・利用規約とrobots.txtの確認」は株価スクレイピングの前に|規約とrobots.txtの確認でまとめています。Pythonで何が作れるかの全体像はPythonで作れるもの一覧、作りたいものが決まっていない段階ならポートフォリオ用の題材アイデアも参考にどうぞ。

12. よくある質問(FAQ)

yfinanceでの株価取得でよくいただく質問をまとめました。

Q. yfinanceでは株価以外にどんなデータが取得できますか?

株価の時系列(history)に加えて、企業情報(info・fast_info)、配当と株式分割(dividends・splits・actions)、財務三表(income_stmt・balance_sheet・cashflow とその四半期版)、アナリスト情報(recommendations・analyst_price_targets)、大株主・内部者売買、ニュース、決算予定(calendar・earnings_dates)、ETFの構成銘柄(funds_data)などが取得できます。ただし銘柄の種類や市場によって空で返る項目があるため、属性ごとの一覧と実測結果を本文の「yfinanceで取得できるデータ一覧」にまとめました。

Q. yfinanceでTOPIXは取得できますか?

検証した範囲では、TOPIXという指数そのものは取得できませんでした。^TPX・^TOPX・998405.T のいずれを指定しても空のDataFrameが返ります。一方、日経平均株価は ^N225 で取得できました。TOPIXの値動きを扱いたい場合は、TOPIXに連動する上場ETF(1306.T・1475.T・2557.T の3本を検証環境で取得できました)の株価で代用するのが現実的です。ETFの価格は信託報酬や需給の影響で指数と完全には一致しないため、正確な指数値が必要なときは取引所などの公表値を参照してください。

Q. yfinanceはAPIですか?APIキーは必要ですか?

APIキーやアカウント登録は不要で、pip install の直後から使えます。ただし「yfinance API」という呼び方は正確ではありません。yfinance は Yahoo! Finance が公開しているデータを利用する非公式のオープンソースライブラリであり、Yahoo, Inc. が提供する公式APIではないためです。認証が不要な代わりに、データ元の仕様変更で動作が変わる可能性がある点は理解しておいてください。

Q. yfinanceは無料ですか?商用利用できますか?

ライブラリ自体は無料・オープンソース(Apache License 2.0)です(yfinance 公式ページ (PyPI))。ただしデータ元は Yahoo! Finance であり、ダウンロードした実データの利用は Yahoo! の利用規約に従います。公式リポジトリでも「研究・教育目的」「Yahoo! Finance の API は個人利用を想定」と明記されているため、個人の分析・学習用途が基本。再配布や商用サービスへの組み込みは、Yahoo! の利用規約(Yahoo Terms of Service)をご自身で確認してください。本連載は「自分の資産を自分で管理する」ローカル用途を想定しています。

Q. 日本株が取得できません。

証券コードに .T を付けているか確認してください(トヨタなら 7203.T)。付け忘れると例外ではなく空の DataFrame が返るため、エラーに見えないまま先に進んでしまいがちです。取得直後に df.empty を確認する習慣をつけてください。空が返るときはまずティッカーを疑うのが先で、同じリクエストを自動でリトライしても結果は変わりません。ティッカーが正しいと確認できたうえで取れない場合は、一時的な取得失敗の可能性があるので時間を置いて手動で再実行してください(コード側で自動リトライを回すと、ティッカー誤りのときに無駄なリクエストを繰り返すことになります)。

Q. 分足を長期間まとめて取得できません。

interval と period の組み合わせには制限があります。検証環境では、1分足は period="7d" では取得できましたが period="1mo" では空になり、1リクエストあたり8日ぶんまでという主旨のメッセージが表示されました。さらに1分足には「直近30日以内しか提供されない」というルックバックの上限もあり、33日前を起点に指定すると "The requested range must be within the last 30 days." というメッセージとともに0行が返ります。したがって8日ずつに区切って連結しても集められるのは約30日ぶんまでで、数か月ぶんの1分足は取得できません。30日という上限は1分足だけのもので、5分足・15分足・30分足・90分足は直近60日以内、1時間足は直近730日以内が上限でした。2分足は仕様上60日ですが、検証環境では約46日(31取引日)ぶんしか返らず、それより前を指定するとエラーではなく空になりました。これより長い期間の分析は、日足に落とすか、毎日取得して自分のデータベースに蓄積していく設計にしてください。

Q. 単一銘柄なのに列がMultiIndexになります。

検証環境の yfinance では、yf.download() に1銘柄だけ渡した場合も列が MultiIndex(('Close', 'AAPL') のような形)になりました。この状態で ["Close"] を取ると Series ではなく1列のDataFrameが返ります。multi_level_index=False を指定すると単層の列になり、["Close"] が Series で返るようになります。yf.Ticker(...).history() を使う場合は最初から単層です。

Q. earnings_dates で ImportError が出ます。

yfinance の一部機能は別のパッケージに依存しています。earnings_dates は内部で pandas の read_html() を使うため lxml を必要とし、未導入の環境では「Import lxml failed」という主旨の ImportError になりました。pip install lxml を実行したあとは、決算日をインデックスに EPS予想・実績・サプライズ率の3列を持つ DataFrame(検証環境では25行×3列)が取得できました。同様に、機能によっては追加のパッケージが求められることがあるので、エラーメッセージに出たパッケージ名をそのままインストールしてください。

Q. 投資信託の基準価額は取得できますか?

非上場の投資信託は基本的に取得できません。yfinanceが扱えるのは市場で値が付く株・ETF・為替・指数などです。本連載では投信は手入力、自動取得は上場ETFに寄せる方針です。

Q. 大量の銘柄を取得するとエラーになります。

短時間の大量リクエストでレート制限に当たることがあります。上限の具体的な回数は公表された基準を確認できていないため、回数を調整するのではなく、そもそも取りに行く回数を減らす方向で対処します。銘柄ごとにループせず yf.download() で一括取得する、取得間隔を空ける、取得結果をキャッシュ(SQLite等)する、現在値だけなら軽い fast_info を使う、といった工夫が有効です。アプリ化するときは「当日ぶんは再取得しない」設計が安定します。

Q. リアルタイムの株価ですか?

リアルタイム配信を保証するものではなく、遅延がある前提で扱ってください。遅延の有無や幅は取引所・銘柄によって異なり、一律の値は確認できていません。長期の資産管理・分析用途には十分ですが、秒単位の取引判断に使う設計は避けるべきです。本連載の目的(保有資産の評価・可視化)には問題ありません。

本記事は、生成AIを活用して下書きし、運営者が内容を確認・編集したうえで公開しています。本文中のコードと出力は2026年8月11日に yfinance 1.4.1 で実行して確認したものですが、データ元の仕様変更やバージョン更新により挙動が変わることがあります。本記事は情報提供を目的としたもので、特定の銘柄の売買や投資手法を推奨するものではありません。投資判断はご自身の責任で行ってください。AIの利用方針は免責事項をご覧ください。