Pythonとyfinanceで株価データを無料で自動取得・蓄積する方法

  • URLをコピーしました!

資産運用や投資の分析を始めるとき、一番のハードルになるのが「データの入手」です。証券会社のツールから手動でダウンロードするのは手間がかかりますし、かといって有料のデータ配信サービスを契約するのはコストが気になりますよね。

そこで活用したいのが、Pythonのライブラリ「yfinance」です。これを使えば、世界中の株価データを無料で、しかも数行のコードで取得できるようになります。一度仕組みを作ってしまえば、毎日寝ている間にデータが自動で蓄積されていく環境も夢ではありません。この記事では、初心者の方でも今日から実践できる「株価データの自動蓄積システム」の作り方を具体的に解説します。

目次

なぜ株価データの収集にyfinanceが選ばれるのか?

株価データを取得する方法はいくつかありますが、個人投資家がPythonで自作ツールを作るなら、yfinanceが最も手軽で強力な選択肢になります。その理由は、面倒な登録作業やコストを一切気にせず、すぐにプログラムを書き始められる圧倒的な「手軽さ」にあります。

この章では、他のデータ取得方法と比較しながら、yfinanceを使う具体的なメリットを3つのポイントで整理します。まずは、なぜ多くの投資家がこのツールを愛用しているのか、その全体像を把握しましょう。

APIキー不要で今日からすぐに始められる

一般的な金融データサービスを利用する場合、まず公式サイトでアカウントを作成し、APIキーと呼ばれる「認証用のパスワード」を発行してもらう必要があります。中には英語のサイトで手続きが必要なものもあり、初心者には少しハードルが高いのが現実です。

しかし、yfinanceはYahoo! Financeが公開している情報を取得する仕組みのため、こうした面倒な登録が一切不要です。ライブラリをインストールしたその瞬間から、世界中の銘柄データにアクセスできます。「思い立ったらすぐに試せる」というスピード感は、学習を始める上で大きな味方になるはずです。

Pandasとの相性が抜群でデータ加工がしやすい

Pythonでデータ分析を行う際、欠かせないのが「Pandas」というライブラリです。yfinanceで取得した株価データは、最初からこのPandasの「DataFrame」という形式で返ってきます。

これは表計算ソフトのシートのような形式なので、データの並び替えや計算、特定の期間だけの抜き出しが驚くほど簡単に行えます。例えば、「移動平均線を計算する」「前日比の騰落率を出す」といった処理も、わずか1行のコードを書き加えるだけで完結します。

個別銘柄から指数まで幅広いデータをカバーしている

yfinanceで取得できるのは、トヨタやAppleといった個別企業の株価だけではありません。日経平均株価やS&P500といった主要な指数、さらには為替(ドル円など)や仮想通貨の価格まで、Yahoo! Financeに掲載されている膨大な種類のデータを網羅しています。

以下の表に、yfinanceと他の主なデータ取得手段を比較しました。

項目yfinance有料API (例: Bloomberg)証券会社ツール
コスト無料月額数万円〜無料(口座が必要)
導入難易度とても低い高い中程度
自動化容易容易困難(手動操作が必要)
日本株対応対応(.Tが必要)対応対応

Pythonでyfinanceを使いこなすための準備

本格的にコードを書く前に、まずはPythonを動かすための環境を整えましょう。とはいえ、難しい設定は必要ありません。必要な道具(ライブラリ)を揃えて、正しく動くか確認するだけのシンプルなステップです。

この章では、yfinanceの導入方法と、最低限インポートしておくべきライブラリについて解説します。自分のPCでプログラムが動く状態を作ることで、これからの作業がぐっと具体的になります。

ライブラリをインストールしよう

まずはパソコンのターミナル(WindowsならコマンドプロンプトやPowerShell)を開き、以下のコマンドを入力してください。

pip install yfinance pandas

このコマンドで、株価取得用のyfinanceと、データ加工用のpandasが一度にインストールされます。エラーが出た場合は、Python自体が正しくインストールされているか、あるいはネットワーク環境に問題がないかを確認してみてください。最新版に更新しておかないと、データの取得に失敗することがあるため、すでにインストール済みの人も一度実行しておくと安心です。

必要なライブラリをインポートする

インストールが終わったら、Pythonのファイル(.py)を作成し、冒頭に以下の2行を記述します。これが「これからこれらの道具を使いますよ」という宣言になります。

import yfinance as yf
import pandas as pd

as yfas pd と書くのは、コードの中で何度も使う名前を短く省略するためです。これから紹介するサンプルコードでも、この省略した名前を使っていきます。

動作確認用の簡単なコードを動かしてみる

環境が整ったか確認するために、最もシンプルなコードを動かしてみましょう。以下の数行を実行して、画面に数字が表示されれば準備完了です。

# トヨタ自動車のデータを1日分だけ取得
test_data = yf.download("7203.T", period="1d")
print(test_data)

画面に始値や終値が表示されましたか?もしエラーが出る場合は、ネット接続を確認するか、銘柄コードの「.T」を忘れていないかチェックしてください。この一歩が、自動蓄積システムへの大きな第一歩となります。

yfinanceで特定の銘柄データを取得する基本の手順

環境ができたら、次はいよいよ自分の欲しいデータを自由に取り出す方法を学びましょう。yfinanceでは、どの銘柄を、どのくらいの期間、どのくらいの細かさで取得するかを自由に指定できます。

この章では、データの取得条件を細かく設定する方法を解説します。基本をマスターすれば、自分の投資スタイルに合わせたデータセットを自由自在に作れるようになります。

銘柄コードを指定してインスタンスを作る

yfinanceには、特定の銘柄の情報を丸ごと管理するための「Ticker」という機能があります。

# Appleの情報を取得する準備
aapl = yf.Ticker("AAPL")

# 会社概要や現在の価格などを確認できる
print(aapl.info)

単に過去の価格を知るだけでなく、配当利回りや時価総額などの詳細なデータにアクセスしたい場合は、このTicker機能を使うのが便利です。一度このオブジェクト(情報の塊)を作っておけば、そこから必要な枝葉を伸ばすように情報を引き出すことができます。

期間を指定してヒストリカルデータを取得する

過去の価格推移(ヒストリカルデータ)を取得する際は、downloadメソッドを使うのが最も効率的です。

# 直近5年間のデータを取得
df = yf.download("7203.T", period="5y")

# 特定の期間(2023年1月から12月まで)を指定して取得
df_custom = yf.download("7203.T", start="2023-01-01", end="2023-12-31")

期間の指定には、1mo(1ヶ月)、1y(1年)、max(全期間)といったキーワードも使えます。長期間の分析をしたいなら period="max"、直近のトレンドだけ見たいなら period="1y" というように、用途に合わせて使い分けましょう。

1分足や5分足など取得する間隔を変更する

「デイトレードのために細かい値動きが知りたい」という場合は、データの時間軸(インターバル)を変更できます。

# 直近5日間の「5分足」データを取得
df_5min = yf.download("7203.T", period="5d", interval="5m")

指定できる間隔には 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 1wk, 1mo などがあります。ただし、1分足などの細かいデータは直近数日間分しか保存されていないことが多いため、注意が必要です。

取得したデータの中身を確認する方法

データが取得できたら、まずは中身を覗いてみましょう。Pandasの機能を使えば、膨大なデータもスッキリと確認できます。

# 最初の5行だけ表示
print(df.head())

# データの数や型を確認
print(df.info())

例えば、以下のリストにある項目が標準的に取得されます。

  • Open(始値):取引開始時の価格
  • High(高値):その期間の最高値
  • Low(安値):その期間の最安値
  • Close(終値):取引終了時の価格
  • Volume(出来高):取引された株数

複数の銘柄データを一括で効率よく集める方法

一つの銘柄だけを追いかけるのではなく、複数の銘柄を比較したり、ポートフォリオ全体を分析したりしたい場面は多いですよね。銘柄ごとに一つずつコードを書いていては時間がかかってしまいます。

この章では、複数の銘柄データを一気に、かつスマートに取得する方法を紹介します。大量のデータを扱う際に陥りやすいエラーを防ぐためのコツも併せて見ていきましょう。

リスト形式で銘柄をまとめて指定する

複数の銘柄を取得したいときは、銘柄コードをスペースで区切った文字列にするか、リストとして渡すだけでOKです。

# 複数の銘柄を一度にダウンロード
tickers = ["7203.T", "9984.T", "6758.T"]
df_multiple = yf.download(tickers, period="1y")

このように指定すると、各銘柄のデータが横に並んだ状態で取得されます。銘柄が10個、20個と増えてもこの一行で済むため、コードが非常にシンプルに保てます。

複数銘柄の終値だけを抽出して比較する

一括取得するとデータ量が膨大になり、表が見づらくなることがあります。分析によく使う「終値」だけに絞る方法を覚えておくと便利です。

# 終値(Close)だけを取り出す
close_prices = df_multiple['Close']
print(close_prices.head())

これだけで、日付を縦軸、銘柄を横軸にしたきれいな終値一覧表が手に入ります。銘柄同士の相関関係を調べたり、グラフにプロットして比較したりする際には、この「特定の列だけを抜き出す」作業が基本になります。

大量に取得する際にエラーで止まらないようにする

銘柄数が100を超えてくると、稀に特定の銘柄でデータの取得に失敗し、プログラム全体が止まってしまうことがあります。これを防ぐために、あえて一つずつループ処理で取得し、エラーをスキップする書き方もあります。

import time

results = {}
for t in tickers:
    try:
        data = yf.download(t, period="1mo")
        if not data.empty:
            results[t] = data
        time.sleep(1) # サーバーに負荷をかけないための休憩
    except Exception as e:
        print(f"エラー発生: {t} - {e}")

急いで大量のデータをリクエストすると、Yahoo! Finance側からアクセス制限を受けるリスクがあります。time.sleep(1) を入れて1秒ずつ間隔を空けるのは、長期的に安定してデータを集めるための大切なマナーです。

取得した株価データをCSVファイルに自動保存する

プログラムを動かすたびに全てのデータをダウンロードするのは効率が悪いですし、将来的にYahoo! Financeからデータが消えてしまうリスクもゼロではありません。手元にCSVファイルとして保存しておくことで、自分だけの資産データ基地を作ることができます。

この章では、取得したデータをファイルとして書き出す方法と、後で見返しやすいように整理するコツを解説します。

ファイル名に日付を付けて保存する

保存する際、ファイル名に「いつ取得したデータか」を含めておくと管理が楽になります。

import datetime

# 今日の日付を取得
today = datetime.date.today().strftime("%Y%m%d")
filename = f"stock_data_{today}.csv"

# CSVとして保存
df.to_csv(filename)

こうすることで、フォルダの中に「stock_data_20231027.csv」といったファイルが溜まっていき、後から特定の日の状態を振り返るのが簡単になります。

銘柄ごとにフォルダを自動生成して整理する

たくさんの銘柄を扱う場合は、一つのフォルダにファイルを詰め込むのではなく、銘柄ごとのフォルダに分けて保存するのがおすすめです。

import os

ticker_symbol = "7203.T"
# フォルダがなければ作成
os.makedirs(f"data/{ticker_symbol}", exist_ok=True)

# フォルダの中に保存
df.to_csv(f"data/{ticker_symbol}/daily_data.csv")

このように構造化しておくことで、将来的に「トヨタの過去データだけを読み込んで分析する」といった処理を書く際、プログラムからデータを参照しやすくなります。

既存のファイルに新しいデータだけを追記する

毎日データを蓄積していくなら、古いファイルを上書きするのではなく、新しい日のデータだけを末尾に「追記」していくのが理想です。

  1. 保存済みのCSVを読み込む
  2. 新しく取得したデータと結合する
  3. 重複した日付を削除して保存し直す

この3ステップを自動化することで、ファイルは常に最新かつ完全な状態に保たれます。

【コピペOK】毎日自動でデータを蓄積する実行コード

これまでに学んだ要素を全て詰め込んだ、実践的なスクリプトを紹介します。このコードは、指定した銘柄のデータを取得し、銘柄別のCSVファイルに自動で追記していくものです。

まずはこのコードをコピーして、自分の環境で動かしてみてください。その後、自分の追跡したい銘柄に合わせてリストを書き換えるだけで、あなた専用のデータ収集機が完成します。

import yfinance as yf
import pandas as pd
import os
from datetime import datetime

# --- 設定エリア ---
# 取得したい銘柄のリスト
TICKERS = ["7203.T", "9984.T", "AAPL", "TSLA"]
# データを保存するディレクトリ
SAVE_DIR = "stock_database"

def update_stock_data():
    os.makedirs(SAVE_DIR, exist_ok=True)
    
    for symbol in TICKERS:
        print(f"更新中: {symbol}")
        file_path = f"{SAVE_DIR}/{symbol}.csv"
        
        # 既存データがあれば読み込む。なければ新規作成
        if os.path.exists(file_path):
            existing_df = pd.read_csv(file_path, index_col=0, parse_dates=True)
            # 最終日の翌日から今日までのデータを取得
            last_date = existing_df.index[-1]
            new_df = yf.download(symbol, start=last_date)
            
            # データを結合して重複を排除
            combined_df = pd.concat([existing_df, new_df])
            combined_df = combined_df[~combined_df.index.duplicated(keep='last')]
        else:
            # 初回は過去1年分のデータを取得
            combined_df = yf.download(symbol, period="1y")
            
        # 保存
        combined_df.to_csv(file_path)
        print(f"{symbol} の更新完了。現在のデータ数: {len(combined_df)}")

if __name__ == "__main__":
    update_stock_data()
    print("全銘柄の処理が終了しました。")

実行環境に合わせてパスを書き換える

上記のコードでは stock_database というフォルダに保存されるようになっています。自分のGoogleドライブに保存したい場合や、特定の外付けHDDに保存したい場合は、SAVE_DIR の部分を適切なパスに書き換えてください。

正常に保存されたかログを出力して確認する

「いつ、どの銘柄の更新に成功したか」を画面に表示(またはテキストファイルに記録)するようにしておくと、後でトラブルがあった時に原因を特定しやすくなります。サンプルコードでは print を使って状況を表示していますが、これを応用してエラーログを書き出す仕組みに発展させることも可能です。

自分のPCを起動せずに全自動で動かす2つの方法

せっかく自動蓄積コードを書いても、毎日自分で実行ボタンを押すのでは「自動化」とは言えません。究極の目標は、あなたがPCを閉じて寝ている間も、あるいは旅行に行っている間も、休まずデータが集まり続ける仕組みを作ることです。

この章では、PCをつけっぱなしにする必要がない「クラウド実行」の方法を2つ紹介します。どちらも基本的には無料で利用できる、非常に強力な手段です。

GitHub Actionsを使ってクラウド上で実行する

エンジニアに人気の方法が、GitHubの「Actions」という機能を使うことです。これは、GitHub上にプログラムを置いておくと、指定した時間にクラウド上のサーバーが勝手にプログラムを動かしてくれる仕組みです。

  • 毎日午前0時に実行、といったスケジュール設定が可能
  • 実行後のCSVファイルをそのままGitHubのリポジトリに保存できる
  • 完全無料で、自分のPCを電源OFFにしていても動く

設定には少しコツが要りますが、「株価データ 自動蓄積 GitHub Actions」と検索すれば、多くの先人たちが設定ファイルを公開しています。

Google Colaboratoryとドライブを連携させる

プログラミング初心者にとって最も馴染みやすいのが、Google Colaboratory(Colab)を使う方法です。Colabで書いたコードをGoogleドライブに接続すれば、保存先をクラウドストレージにできます。

標準では定時実行機能はありませんが、ブラウザのアドオンや、Google Apps Script(GAS)と組み合わせることで、擬似的に自動化することが可能です。

【参考】自宅のPCでタスクスケジューラを使う場合

もし古いノートPCなどが余っていて、常に電源をオンにできる環境なら、Windowsの「タスクスケジューラ」やMacの「cron」を使うのが最もシンプルです。指定した時間にPythonスクリプトを起動するように設定するだけで、手軽にローカルサーバーが出来上がります。

日本株を扱う際に注意すべきティッカー記号のルール

yfinanceで日本株を扱うとき、多くの初心者が最初につまずくのが「銘柄コード(ティッカー)の指定方法」です。日本の証券コードをそのまま入れても、データは見つかりません。

この章では、日本株特有のルールと、よく使う指数の取得方法についてまとめました。ここさえ押さえておけば、「データが取れない!」と頭を抱える時間をゼロにできます。

証券コードの後ろに「.T」を付ける理由

Yahoo! Financeは世界中の市場を扱っているため、日本の東京証券取引所の銘柄であることを示すために、4桁の証券コードの末尾に .T を付ける必要があります。

  • トヨタ自動車:7203.T
  • ソフトバンクグループ:9984.T
  • ソニーグループ:6758.T

もし名古屋証券取引所などの銘柄を指定したい場合は、その市場に応じたサフィックス(.NG など)が必要になりますが、基本的には .T でほとんどの主要銘柄をカバーできます。

指数(日経平均やTOPIX)を取得するための記号

個別の株価だけでなく、市場全体の動きを示す「指数」も分析には欠かせません。これらには特殊な記号が割り当てられています。

指数名記号
日経平均株価^N225
TOPIX (東証株価指数)^TPX
S&P 500^GSPC
NYダウ^DJI
ドル円為替JPY=X

投資信託やETFのデータは取得できる?

国内のETF(上場投資信託)も、個別株と同様に .T を付ければ取得可能です。ただし、非上場の一般的な投資信託(ひふみ投信など)はyfinanceでは取得できないことが多いため、注意が必要です。その場合は投資信託協会のデータなど、別の取得源を探す必要があります。

yfinanceを使うときに知っておきたい制限とエラー対策

yfinanceは非常に便利なツールですが、万能ではありません。非公式な仕組みを使っているからこその弱点や、突然データが取れなくなるケースが存在します。

この章では、運用の際に直面する可能性が高いトラブルと、その解決策について解説します。これを知っておくことで、いざという時も慌てずに対応できるようになります。

大量リクエストによるIPブロックを避けるコツ

短時間に数千銘柄のデータを何度も取得しようとすると、Yahoo! Finance側から「攻撃的なアクセス」とみなされ、一時的に接続を遮断(IPブロック)されることがあります。

これを避けるためには、先ほど紹介した time.sleep() を入れるほか、一度に取得する銘柄数を100〜200件程度に抑え、時間を置いて実行するなどの工夫が必要です。個人で数銘柄〜数十銘柄を追う程度であれば、それほど神経質になる必要はありません。

データが取得できないときの「yfinanceの更新」

昨日まで動いていたコードが突然エラーを出すようになったら、それはYahoo! Finance側の仕様が変わったサインかもしれません。yfinanceの開発者は非常に迅速に対応してくれるため、ライブラリを最新版に更新するだけで直ることが多いです。

pip install --upgrade yfinance

何かおかしいな、と思ったらまずはこのコマンドを試すのが鉄則です。

欠損値やデータ不備が含まれていた時の対処法

無料データである以上、稀に「特定の日のデータだけが抜けている(欠損)」「異常に高い数値が入っている」といった不備が混じることがあります。

# 欠損値(NaN)が含まれる行を削除する
df_clean = df.dropna()

# 前の日の値で埋める
df_filled = df.fillna(method='ffill')

こうしたPandasのクリーニング機能をセットで覚えておくと、分析の精度を安定させることができます。

蓄積した株価データを投資分析に活かす次のステップ

データが自動で集まるようになったら、いよいよそれを使って投資のヒントを見つけるステージです。単なる数字の羅列だったCSVファイルが、あなたの知恵次第で強力な武器に変わります。

最後に、集めたデータをどのように活用していけばいいのか、代表的な3つのステップを紹介します。

グラフ化して視覚的にトレンドを把握する

まずはデータを可視化してみましょう。Pythonの matplotlibplotly というライブラリを使えば、プロ顔負けのチャートを簡単に描画できます。

ローソク足チャートに移動平均線を重ねるだけでも、数字だけを見ている時には気づかなかった「押し目」や「トレンドの転換点」が見えてくるはずです。

テクニカル指標を自動で計算して追加する

「RSIが30を下回ったら通知」「ゴールデンクロスが発生したらメールを送る」といった仕組みも、蓄積したデータがあれば自由自在です。

# 25日移動平均線を計算して追加
df['MA25'] = df['Close'].rolling(window=25).mean()

このように、自分の得意な手法を数式にしてしまえば、毎日何百銘柄ものチャートを目でチェックする苦労から解放されます。

独自のスクリーニングツールを自作してみる

「時価総額が一定以下で、配当利回りが3%以上、かつ直近で出来高が増えている銘柄」といった、証券会社のツールでは難しい細かい条件での銘柄探しも、自作ツールなら可能です。

自分だけの「お宝銘柄発見器」をアップデートし続けていく過程は、投資家としても、プログラマーとしても非常に刺激的な体験になるでしょう。

まとめ:自分だけのデータ資産を育てよう

この記事では、Pythonとyfinanceを使って、株価データを無料で自動蓄積する方法をステップバイステップで解説しました。APIキー不要で始められる手軽さから、クラウドを使った完全自動化まで、その可能性は無限大です。

  1. yfinanceをインストールして環境を作る
  2. 銘柄コードに .T を付けてデータを取得する
  3. CSVファイルに保存・追記する仕組みを書く
  4. 定期実行を設定して、自動でデータを貯める

投資において、過去のデータは未来を予測するための貴重な「地図」になります。今日からデータ蓄積を始めれば、1年後には誰にも真似できない、あなただけの強力な分析基盤が出来上がっているはずです。まずは気になる1銘柄から、自動化の一歩を踏み出してみましょう。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

目次