Pythonで株価分析する方法|yfinanceで取得・保存・グラフ化
Pythonで株価を取得する方法を初心者向けに解説します。yfinanceの導入、日本株の銘柄コード、期間指定、CSV保存、移動平均線の計算、グラフ化までサンプルコード付きで紹介します。
Pythonを使うと、株価データの取得からCSV保存、移動平均線の計算、グラフ化までを自動化できます。本記事では、無料で試しやすいyfinanceを利用し、初めての方でも実行できる形で手順を解説します。
最初に結論をまとめると、学習や個人的な分析で株価を扱うなら、yfinanceでデータを取得し、pandasで整理する方法が手軽です。ただし、取得データは売買注文に使うリアルタイム配信を保証するものではありません。実際の投資判断や自動売買に利用する場合は、証券会社が提供するデータやAPIの仕様も確認してください。
Pythonで株価を取得する前に準備するもの
必要なものは、Pythonが動くパソコンとインターネット接続です。Windowsでは、Python公式サイトからPythonをインストールするか、すでにPythonが入っている環境を利用します。
この記事では次のライブラリを使います。
yfinance:株価データを取得するpandas:表形式のデータを整理・保存するmatplotlib:株価をグラフ化する
VS Codeのターミナルを開き、次のコマンドを実行してください。
python -m pip install yfinance pandas matplotlibPowerShellでpythonが見つからない場合は、Windows環境によっては次のコマンドを使えます。
py -m pip install yfinance pandas matplotlibPythonで株価を取得する3つの方法
Pythonで株価データを扱う方法は、主に「yfinance」「公式API」「Webスクレイピング」の3つです。目的によって適した方法が異なります。
| 方法 | 始めやすさ | 向いている用途 | 注意点 |
|---|---|---|---|
| yfinance | 高い | 学習、個人分析、検証 | 非公式ライブラリ、利用条件の確認が必要 |
| 証券会社・データベンダーのAPI | 中程度 | 売買システム、業務利用 | 契約、認証、利用料、呼び出し上限 |
| Webスクレイピング | 低い | APIがない公開ページの調査 | 規約、著作権、画面変更、アクセス負荷 |
初心者の学習にはyfinanceが使いやすい
数行のコードでOHLCVデータを取得できるため、Pythonやpandasの学習を始める用途に適しています。OHLCVとは、始値・高値・安値・終値・出来高をまとめた呼び方です。APIキーを発行せず試せる点も、最初の動作確認では便利です。
本番運用では公式APIを検討する
自動売買、顧客向けサービス、業務レポートなど、データの継続性や正確性が重要な用途では、証券会社や正規データベンダーのAPIを検討します。料金だけでなく、更新頻度、遅延時間、再配信の可否、呼び出し上限、障害時のサポートを比較してください。
Webスクレイピングは最後の選択肢にする
Webページから価格を抽出する方法もありますが、HTML構造の変更で動かなくなりやすく、利用規約やアクセス負荷への配慮が必要です。公式にAPIやダウンロード機能が用意されている場合は、そちらを優先しましょう。
yfinanceとは?できることと注意点
yfinanceは、Yahoo Financeの公開情報へPythonからアクセスしやすくするオープンソースライブラリです。単一銘柄の履歴だけでなく、複数銘柄、配当、株式分割、企業情報などを扱うための機能があります。
yfinanceが向いている用途
- Pythonで株価データの扱い方を学ぶ
- pandasのDataFrame操作を練習する
- 移動平均や騰落率を検証する
- 少数銘柄の過去データを個人的に分析する
- グラフ作成や機械学習の前処理を試す
yfinanceが向いていない用途
- 約定判断に使うリアルタイム配信
- データの欠損が許されない業務システム
- 第三者へ株価を再配信するサービス
- 取得元の仕様変更に影響されない長期運用
学習用コードと本番システムを同じ条件で考えないことが大切です。まずyfinanceで分析内容を検証し、本番化するときにデータソースを再選定する方法もあります。
yfinanceで日本株の株価を取得する
まずはトヨタ自動車を例に、直近1か月の日足データを取得します。日本株は通常、証券コードの後ろに東京証券取引所を示す.Tを付けます。トヨタ自動車なら7203.Tです。
import yfinance as yf
ticker = yf.Ticker("7203.T")
data = ticker.history(period="1mo", interval="1d")
print(data.tail())実行結果には、主に次の列が表示されます。
| 列名 | 意味 |
|---|---|
| Open | 始値 |
| High | 高値 |
| Low | 安値 |
| Close | 終値 |
| Volume | 出来高 |
| Dividends | 配当 |
| Stock Splits | 株式分割 |
period="1mo"は取得期間、interval="1d"はデータ間隔を表します。公式ドキュメントでは、期間に1d、5d、1mo、1y、maxなど、間隔に1m、5m、1h、1d、1wkなどを指定できます。短い間隔のデータには取得可能期間の制約があるため、長期分析では日足や週足を使うのが分かりやすいでしょう。
ティッカーコードの調べ方
ティッカーコードは銘柄を識別する記号です。日本株では証券コードに.Tを付ける例が一般的ですが、すべての市場が同じ形式ではありません。米国株ではAppleがAAPL、MicrosoftがMSFTです。
銘柄名から推測して指定すると、別の金融商品を取得する可能性があります。Yahoo Financeの検索画面などで、会社名、市場、通貨、ティッカーが一致しているか確認してください。
取得したDataFrameの形を確認する
分析前に行数、列名、データ型を確認すると、後のエラーを減らせます。
print(data.shape)
print(data.columns)
print(data.dtypes)
print(data.index)shapeは行数と列数、columnsは列名、dtypesは各列の型を表示します。日付が通常の列ではなくインデックスになっている場合もあるため、CSV出力やデータ結合の前に確認しましょう。
開始日と終了日を指定して株価を取得する
分析期間を明確にしたい場合は、startとendを指定します。
import yfinance as yf
data = yf.download(
"7203.T",
start="2025-01-01",
end="2026-01-01",
interval="1d",
auto_adjust=True,
progress=False,
)
print(data.head())
print(data.tail())startの日付は対象期間に含まれますが、endの日付は含まれません。2025年12月31日まで取得したい場合、上の例のように終了日を2026年1月1日にします。
auto_adjust=Trueを指定すると、株式分割や配当を考慮して調整された価格を扱いやすくなります。未調整の終値が必要な分析では、目的に合わせて設定を見直してください。
periodで相対的な期間を指定する
毎回日付を書き換えず、実行日から直近の期間を取得したい場合はperiodを利用します。
data = yf.download(
"7203.T",
period="6mo",
interval="1d",
auto_adjust=True,
progress=False,
)定期実行では、startとendよりperiodのほうが簡単な場合があります。一方、分析結果を再現したい場合は、開始日と終了日を固定したほうが比較しやすくなります。
日足・週足・月足を変更する
intervalでデータの粒度を指定します。日々の値動きなら1d、中長期の傾向なら1wkや1moが候補です。分足には取得可能期間の制限があります。
daily = yf.download("7203.T", period="1y", interval="1d", progress=False)
weekly = yf.download("7203.T", period="5y", interval="1wk", progress=False)
monthly = yf.download("7203.T", period="10y", interval="1mo", progress=False)データ間隔を細かくすれば分析精度が自動的に上がるわけではありません。投資期間と分析目的に合う粒度を選びます。
複数銘柄の株価をまとめて取得する
複数の銘柄を比較したい場合は、ティッカーをリストで渡します。次の例では、日本株3銘柄の終値を取得します。
import yfinance as yf
symbols = ["7203.T", "6758.T", "9984.T"]
data = yf.download(
symbols,
period="6mo",
interval="1d",
auto_adjust=True,
progress=False,
)
close = data["Close"]
print(close.tail())7203.T:トヨタ自動車6758.T:ソニーグループ9984.T:ソフトバンクグループ
銘柄コードや上場市場は変更されることがあります。取得できない場合は、Yahoo Financeなどで現在のティッカーを確認してください。
取得した株価をCSVファイルに保存する
取得したデータは、pandasのto_csv()で保存できます。
import yfinance as yf
data = yf.download(
"7203.T",
period="1y",
interval="1d",
auto_adjust=True,
progress=False,
)
data.to_csv("toyota_stock.csv", encoding="utf-8-sig")
print("toyota_stock.csv に保存しました")encoding="utf-8-sig"を指定すると、Windows版Excelで開いたときに文字化けしにくくなります。実行したPythonファイルと同じフォルダにCSVが作られます。
保存したCSVをPythonで読み込む
一度保存したデータは、次回から再取得せずに読み込めます。
import pandas as pd
data = pd.read_csv(
"toyota_stock.csv",
index_col=0,
parse_dates=True,
)
print(data.tail())過去データを毎回ダウンロードしないため、処理時間と取得元へのアクセスを減らせます。ファイル名に銘柄と取得日を含めると管理しやすくなります。
株価データを分析前に整える
取得できたデータをそのまま計算へ使う前に、日付、欠損値、重複を確認します。特に複数の市場や銘柄を組み合わせると、休場日の違いによって欠損が発生します。
欠損値と重複を確認する
print(data.isna().sum())
print("重複日付:", data.index.duplicated().sum())
data = data[~data.index.duplicated(keep="last")]
data = data.sort_index()欠損値をすべてゼロに置き換えると、株価が0円だったものとして計算される危険があります。削除、直前値で補完、計算対象外のどれが適切かを分析目的ごとに決めてください。
日次騰落率を計算する
終値の変化率はpct_change()で計算できます。
data["Daily_Return"] = data["Close"].pct_change()
data["Daily_Return_Pct"] = data["Daily_Return"] * 100
print(data[["Close", "Daily_Return_Pct"]].tail())単純な価格差では、株価水準が異なる銘柄を比較しにくくなります。騰落率へ変換すると、値段の違う銘柄同士を同じ単位で比較しやすくなります。ただし、為替、配当、分割、取引時間などの条件も揃える必要があります。
複数銘柄を基準日100で比較する
normalized = close.div(close.iloc[0]).mul(100)
normalized.plot(figsize=(12, 6), title="Performance Comparison")
plt.ylabel("Start = 100")
plt.grid(True)
plt.tight_layout()
plt.show()最初の日を100として指数化すると、各銘柄が期間中にどの程度上昇・下落したか比較できます。開始日に欠損がある銘柄は先に除外または補完してください。
Pythonで株価チャートを表示する
matplotlibを使うと、終値の推移を折れ線グラフで確認できます。
import yfinance as yf
import matplotlib.pyplot as plt
data = yf.download(
"7203.T",
period="1y",
interval="1d",
auto_adjust=True,
progress=False,
)
data["Close"].plot(figsize=(12, 6), title="Toyota Stock Price")
plt.xlabel("Date")
plt.ylabel("Price (JPY)")
plt.grid(True)
plt.tight_layout()
plt.show()日本語のタイトルを使う場合は、環境に日本語フォントを設定する必要があります。まずは英語表記で動作を確認すると、フォント由来のエラーを切り分けやすくなります。
移動平均線を計算してグラフに重ねる
株価分析の練習として、25日移動平均線と75日移動平均線を追加します。移動平均線は、一定期間の終値の平均を連続して計算したものです。
import yfinance as yf
import matplotlib.pyplot as plt
data = yf.download(
"7203.T",
period="2y",
interval="1d",
auto_adjust=True,
progress=False,
)
close = data["Close"].copy()
data["MA25"] = close.rolling(window=25).mean()
data["MA75"] = close.rolling(window=75).mean()
data[["Close", "MA25", "MA75"]].plot(
figsize=(12, 6),
title="Stock Price and Moving Averages",
)
plt.xlabel("Date")
plt.ylabel("Price (JPY)")
plt.grid(True)
plt.tight_layout()
plt.show()移動平均線だけで将来の値動きを予測できるわけではありません。期間の選び方で見え方が変わるため、売買の正解を示す指標ではなく、時系列データを理解する練習として利用してください。
Pythonで株価取得を自動化する方法
毎日同じ操作をする場合は、取得コードをPythonファイルとして保存し、WindowsのタスクスケジューラやVPSのcronで定期実行できます。
保存先とファイル名を自動生成する
from datetime import datetime
from pathlib import Path
import yfinance as yf
output_dir = Path("stock_data")
output_dir.mkdir(exist_ok=True)
symbol = "7203.T"
today = datetime.now().strftime("%Y-%m-%d")
data = yf.download(
symbol,
period="1y",
interval="1d",
auto_adjust=True,
progress=False,
)
if data.empty:
raise RuntimeError("株価データを取得できませんでした")
output_path = output_dir / f"{symbol}_{today}.csv"
data.to_csv(output_path, encoding="utf-8-sig")
print(f"保存先: {output_path}")自動実行ではログと失敗通知を用意する
自動化では、正常時のCSVだけでなく、実行日時、対象銘柄、取得行数、エラー内容をログへ残します。取得できなかった状態で空のCSVを上書きしない設計も重要です。
ローカルPCは電源が切れていると実行できません。毎日決まった時間に動かす場合はVPSも選択肢ですが、サーバー料金、セキュリティ更新、認証情報の管理が必要です。VPSとは何かと安いVPSの比較も参考にしてください。
株価を取得できないときの確認ポイント
銘柄コードが正しいか確認する
日本株で.Tを付け忘れると、意図した銘柄を取得できない場合があります。たとえばトヨタ自動車は7203ではなく7203.Tを指定します。
空のデータか確認する
取得後にデータが空でないか確認すると、後続処理のエラーを防ぎやすくなります。
if data.empty:
print("株価データを取得できませんでした")
else:
print(data.tail())ライブラリを更新する
取得元の仕様変更により、古いバージョンでは動かない場合があります。
python -m pip install --upgrade yfinance短時間に大量アクセスしない
多数の銘柄を細かい間隔で繰り返し取得すると、アクセスが制限される可能性があります。必要なデータをCSVへ保存し、同じ期間を何度も取得しない設計にすると負荷を抑えられます。
yfinanceを利用するときの注意点
yfinanceはYahoo Financeと提携・承認された公式ライブラリではありません。公式ドキュメントでは、公開APIを利用するオープンソースツールであり、研究・教育目的を想定していること、取得データの利用条件をYahooの規約で確認することが案内されています。
また、表示される株価に遅延、欠損、訂正が含まれる可能性があります。次の用途では、証券会社や正規データベンダーが提供するAPIを検討してください。
- 実際の売買注文に直結するシステム
- 秒単位のリアルタイム監視
- 商用サービスでのデータ再配信
- 損失につながる可能性がある自動売買
本記事はPython学習を目的とした情報であり、特定銘柄の購入や売却を推奨するものではありません。
よくある質問
Pythonで株価を無料取得できますか?
学習や個人分析では、yfinanceを使って無料で試せます。ただし、取得元の利用規約、データの正確性、用途の制限を確認してください。
リアルタイム株価を取得できますか?
yfinanceのデータを、注文用のリアルタイム配信として扱うのは適切ではありません。リアルタイム性が必要な場合は、利用中の証券会社やデータベンダーの公式APIを確認してください。
日本株と米国株で指定方法は違いますか?
日本株は一般に7203.Tのように市場を示す接尾辞を付けます。米国株はAAPLやMSFTのようなティッカーを指定します。
株価予測にも使えますか?
取得したデータを機械学習の入力にできますが、過去データだけで将来の価格を正確に予測できるわけではありません。まずは欠損値、株式分割、配当、学習期間、過学習を理解する必要があります。
まとめ
Pythonで株価を扱う基本手順は、yfinanceで取得し、pandasで整理・CSV保存し、matplotlibで可視化する流れです。
最初は1銘柄・日足・1年分程度のデータから始めましょう。コードが動いたら、複数銘柄の比較、騰落率の計算、移動平均線の追加へ進むと理解しやすくなります。常時実行や定期取得が必要になった段階では、VPSとは何かも確認し、ローカルPCとの運用方法の違いを比較してください。