PythonでyfinanceのデータをPandasで整形・加工する方法【実践テクニック集】

Uncategorized

※本記事には広告・アフィリエイトリンクが含まれます。収益はサイト運営・検証費用に充てています。

結論から言うと:

  • yfinanceで取得したデータはそのままでは使いにくい部分があり、pandasの整形テクニックを覚えると分析の効率が大幅に上がる仕組みです
  • 欠損値処理・リサンプリング・前日比計算などの基本操作を押さえておくと、あとは応用するだけになる
  • 複数銘柄のMultiIndexは一手間必要だが、フラット化すれば普通のDataFrameと同じように扱える

yfinanceのデータ構造を理解する

yfinanceのdownload()が返すDataFrameは、Open・High・Low・Close・Volume・Dividends・Stock Splitsのカラムを持つ時系列データです。複数銘柄を取得するとMultiIndexになる仕組みです。

import yfinance as yf
import pandas as pd

# 単一銘柄
df = yf.download("7203.T", period="3mo")
print(df.columns)
print(df.shape)
print(df.dtypes)

# 複数銘柄(MultiIndex)
df_multi = yf.download(["7203.T", "9984.T"], period="3mo")
print(df_multi.columns)  # MultiIndex

欠損値の確認と処理

株式市場の休場日(土日・祝日)は自動的に除外されますが、データによっては欠損値(NaN)が含まれることがあります。

# 欠損値の確認
print(df.isnull().sum())

# 欠損値を削除
df_clean = df.dropna()

# 前日の値で補完(フォワードフィル)
df_ffill = df.fillna(method='ffill')

# 後日の値で補完(バックフィル)
df_bfill = df.fillna(method='bfill')

print(f"元のデータ: {len(df)}行")
print(f"欠損値削除後: {len(df_clean)}行")

週次・月次にリサンプリング

日次データを週次・月次に集計(リサンプリング)できます。

close = df['Close']

# 週次(各週の最終営業日の終値)
weekly = close.resample('W').last()
print("週次データ:")
print(weekly.tail(5))

# 月次(各月の最終営業日の終値)
monthly = close.resample('ME').last()
print("月次データ:")
print(monthly.tail(5))

# 月次OHLC
monthly_ohlc = close.resample('ME').ohlc()
print(monthly_ohlc.tail(3))

複数銘柄のマルチインデックスを扱う

複数銘柄のMultiIndexをフラット化して扱いやすくします。

df_multi = yf.download(["7203.T", "9984.T"], period="3mo")

# 終値だけ取り出す方法1
close = df_multi['Close']

# フラット化する方法
df_multi.columns = ['_'.join(col).strip() for col in df_multi.columns.values]
print(df_multi.columns)
# → ['Close_7203.T', 'Close_9984.T', 'High_7203.T', ...]

前日比・変化率を計算

close = df['Close']

# 前日比(変化率)
pct = close.pct_change()
print("前日比 (%):")
print((pct * 100).round(2).tail(5))

# 前日比(絶対値)
diff = close.diff()
print("前日比 (円):")
print(diff.tail(5))

# 累積リターン
cum_return = (1 + pct).cumprod()
print(f"累積リターン: {cum_return.iloc[-1]-1:.2%}")

指定期間でフィルタ

import pandas as pd

# 期間フィルタ(locで日付範囲指定)
start = '2024-01-01'
end = '2024-12-31'
df_filtered = df.loc[start:end]
print(f"フィルタ後: {len(df_filtered)}行")

# 特定の年だけ取り出す
df_2024 = df[df.index.year == 2024]

# 特定の月だけ取り出す
df_march = df[(df.index.year == 2024) & (df.index.month == 3)]
print(f"2024年3月のデータ: {len(df_march)}行")

筆者の検証メモ

yfinance 0.2.x以降、resample(‘M’)が非推奨になりresample(‘ME’)に変更された。古いコードで「FutureWarning: ‘M’ is deprecated」が出る場合はMEに書き換えると解消できる。pct_change()は最初の行がNaNになるため、cumsum()やcumprod()の前にdropna()を入れることを推奨します。また、fillna(method=’ffill’)もFutureWarning対象になっており、ffill()メソッドを直接呼ぶ書き方(df.ffill())が推奨されています。

おすすめ書籍まとめはこちら


【投資免責事項】本記事で紹介するコードおよび分析結果は情報提供を目的としたものであり、特定の銘柄への投資を推奨するものではありません。投資判断はご自身の責任で行ってください。

タイトルとURLをコピーしました