【入門】Pandasで株価データ分析!時系列データの操作とグラフ化を解説

  • URLをコピーしました!

「投資のデータを自分で分析してみたいけれど、Excelだと作業が追いつかない」と感じたことはありませんか?

銘柄数が増えたり、数年分のデータを詳しく追いかけようとしたりすると、手作業での管理には限界がやってきます。

そんな時に頼りになるのが、Pythonの「Pandas(パンダス)」というライブラリです。Pandasを使えば、数千行を超える株価データも一瞬で整理でき、移動平均線の計算やグラフ作成も驚くほどスムーズに進みます。この記事では、プログラミング初心者の方でも今日から実践できる、Pandasを使った株価分析の基本を分かりやすく解説します。

目次

Pandasと時系列データの基本

株価分析を効率化するなら、Pandasの習得は避けて通れません。Pandasは、大量のデータを「表形式」で扱うのが得意な道具です。株価のように、日付と価格がセットになった「時系列データ」を扱うための機能が最初から豊富に備わっているのが最大の特徴です。

まずは、Pandasでデータを扱う際の土台となる考え方を確認しておきましょう。

DataFrameは表計算ソフトのように使える

Pandasで最もよく使うのが「DataFrame(データフレーム)」という形式です。これは、Excelのシートのように縦の列と横の行で構成された表のことだと思ってください。

縦の列には「日付」「始値」「終値」といった項目が並び、横の行には各日のデータが並びます。Excelと違うのは、数百万行のデータがあっても動作が重くならず、命令文一つで中身を書き換えられる点です。

例えば、特定の条件に合う株価だけを抜き出すといった作業も、DataFrameなら一瞬で完了します。プログラミングに慣れていない方でも、「Excelの操作を言葉(コード)で指示しているだけ」と考えれば、ぐっと身近に感じられるはずです。

日付をインデックスにする重要性

株価データにおいて、最も重要な情報は「それがいつの価格か」という日付です。Pandasでは、この日付を「インデックス(索引)」という特別な場所に設定します。

日付をインデックスに設定すると、単なる文字列ではなく「時間の流れ」としてプログラムが認識してくれるようになります。これにより、特定の日を指定してデータを呼んだり、月ごとの平均を出したりする操作が劇的に楽になります。

インデックスを設定せずに分析を進めることもできますが、その場合は日付を探すたびに複雑な処理が必要になります。

「株価を扱うなら、まずは日付をインデックスにする」という手順を、最初のお作法として覚えておきましょう。

時系列データ専用の機能が豊富にある

Pandasが投資家に支持される理由は、時系列データに特化した便利な機能がたくさん詰まっているからです。

例えば、以下のような操作が標準機能として用意されています。

  • 特定の期間(2023年だけ、など)を簡単に切り出す
  • 過去数日間の平均(移動平均)を自動で計算する
  • 土日祝日のデータが抜けている部分を賢く埋める

これらを自力でプログラミングしようとすると大変ですが、Pandasなら専用の命令を呼び出すだけです。

分析の「本質」ではない計算の手間を極限まで減らしてくれるのが、Pandasを使う最大のメリットといえるでしょう。

分析に使う株価データを準備する

分析を始めるには、まず手元にデータを持ってくる必要があります。Pythonでは、パソコンに保存してあるCSVファイルを読み込むのはもちろん、インターネット上のサイトから直接最新の株価をダウンロードすることも可能です。

まずは、データの「入り口」となる準備作業を見ていきましょう。

CSVファイルからデータを読み込む

証券会社のサイトなどでダウンロードしたCSVファイルがある場合は、Pandasの読み込み機能を使います。

read_csv という命令を使うだけで、ファイルを一瞬でDataFrameに変換できます。

import pandas as pd

# CSVファイルを読み込む(日付をインデックスにする設定)
df = pd.read_csv('stock_data.csv', index_col='Date', parse_dates=True)

このとき、parse_dates=True と書くことで、読み込みと同時に日付を「日付データ」として正しく扱えるよう設定するのがコツです。

読み込みがうまくいけば、あとはPython上で自由自在に加工できます。

ファイルをいちいち開いて中身をコピーする必要はもうありません。

ライブラリを使って最新株価を取得する

もっと手軽にデータを集めたいなら、yfinance というライブラリを組み合わせて使うのがおすすめです。

これを使えば、Yahoo Financeから直接データを取ってくることができます。

import yfinance as yf

# トヨタ自動車のデータを取得する
df = yf.download('7203.T', start='2024-01-01')

これだけで、最新の株価がPandasの形式で手元に届きます。

特定のファイルを用意する手間すらないため、まずはこの方法で練習を始めるのが一番の近道です。

データの取得元によって項目の名前が少し違うこともありますが、Pandasなら後から簡単に名前を揃えることも可能です。

まずは自分の気になる銘柄のデータを、コード一行で取得してみる楽しさを体験してみてください。

データの先頭を表示して中身を確認する

データが読み込めたら、まずは「ちゃんと入っているかな?」と確認しましょう。

数万行あるデータをすべて表示すると画面が埋まってしまうため、最初の数行だけを見る head という命令を使います。

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

これを行うことで、項目名に間違いがないか、日付が正しく並んでいるかをチェックできます。

一見地味な作業ですが、ここでデータの形を把握しておくことが、後のエラーを防ぐための大事な守りになります。

確認が終われば、いよいよ本格的な操作の始まりです。

自分の思い通りにデータを操る感覚を、ここから掴んでいきましょう。

時系列データを自由自在に操作する

データが準備できたら、次は「必要な部分だけを抜き出す」作業に挑戦しましょう。株価分析では、「最近の3ヶ月分だけ見たい」「終値の動きだけを追いたい」といった場面がよくあります。Pandasなら、こうした絞り込みも非常に直感的に行えます。

ここでは、よく使う3つの操作方法を紹介します。

特定の期間を抜き出すスライシング

日付をインデックスに設定していると、期間の指定がとても簡単になります。

例えば「2024年の1月分だけ」や「2月1日から10日まで」といった抜き出し方が可能です。

# 2024年1月だけのデータを抜き出す
jan_data = df['2024-01']

# 特定の範囲を指定する
range_data = df['2024-02-01':'2024-02-10']

「○行目から○行目まで」と数える必要はなく、カレンダーを見るように日付で指定できるのがPandasの強みです。

特定のイベントがあった時期だけを詳しく調べたい時に、この操作は非常に役立ちます。

ただし、日付の形式(2024/01/01 か 2024-01-01 かなど)がデータの読み込み時にずれていると、うまく動かないことがあります。

エラーが出た時は、まず日付が正しく認識されているかを確認しましょう。

終値や出来高など特定の列のみ抽出する

株価データには「始値・高値・安値・終値・出来高」など多くの項目が含まれています。

分析の邪魔にならないよう、必要な列だけに絞って表示させる方法を覚えましょう。

# 終値(Close)だけを取り出す
close_prices = df['Close']

# 終値と出来高の2つを取り出す
sub_data = df[['Close', 'Volume']]

複数の列を取り出したい時は、カッコを二重 [[]] にするのがポイントです。

余計な情報を削ぎ落とすことで、計算のスピードも上がり、何より自分が見る時に迷わなくなります。

基本的には、投資判断の材料として最も使われる「Close(終値)」を中心に操作することが多くなるはずです。

まずは終値だけを抜き出して、その値動きに集中してみるのがおすすめです。

日付の形式を正しく変換する

CSVからデータを読み込んだ際、たまに日付がただの「文字」として認識されてしまうことがあります。

このままだと期間指定がうまくいかないため、Pandasの機能で「日付型」へと変換してあげましょう。

状態特徴できること
文字列型ただの文字の並び文字の検索のみ
日付型時間の概念がある年月日の抽出、期間指定、リサンプル

変換には pd.to_datetime という命令を使います。

# Date列を日付型に変換する
df['Date'] = pd.to_datetime(df['Date'])

この一工夫を加えるだけで、その後の分析の自由度が格段に上がります。

「日付なのに日付として動かないな」と思ったら、この変換を試してみてください。

株価のトレンドを計算する方法

生データの数字を追いかけるだけでは、相場の大きな流れは掴みづらいものです。そこで、投資の基本である「移動平均線」などの指標を計算してみましょう。Pandasなら、複雑な繰り返し計算を書く必要はありません。

ここからは、データのトレンドを数値化する具体的なテクニックを解説します。

rolling関数で移動平均線を計算する

移動平均とは、過去一定期間の価格を平均して、値動きを滑らかにする手法です。

Pandasでは rolling という便利な機能を使って計算します。

# 5日移動平均を計算する
df['MA5'] = df['Close'].rolling(window=5).mean()

このコードは、「5日間という窓(window)をスライドさせながら、その中の平均(mean)を出す」という意味です。

これにより、日々の小さなノイズに惑わされず、価格が上向きなのか下向きなのかがはっきり見えてきます。

「25日」や「75日」など、windowの数字を書き換えるだけで、中長期のトレンドもすぐに算出できます。

自分の投資スタイルに合わせて、期間を自由に入れ替えてみましょう。

窓関数(Window)の仕組みを理解する

rolling を使うと、最初の数行にデータが入らない「穴」ができることがあります。

例えば5日移動平均の場合、最初の4日間は「過去5日分のデータ」が揃っていないため、計算ができません。

このデータが入っていない状態を NaN(欠損値)と呼びます。

これはエラーではなく、計算に必要な材料が足りないために正しく処理されている証拠です。

データの開始直後に数字が入っていなくても、慌てる必要はありません。

十分に日数が経過したところから数値が現れ始めるので、そこから分析をスタートさせましょう。

指標を新しい列として追加する

Pandasの優れた点は、計算した結果を元の表(DataFrame)に新しい列としてすぐに追加できることです。

「元の株価」の横に「計算した移動平均」を並べることで、比較が非常にしやすくなります。

# 25日移動平均も追加してみる
df['MA25'] = df['Close'].rolling(window=25).mean()

こうして表をどんどん拡張していくことで、自分だけの多機能な分析シートが出来上がります。

後ほど解説する「グラフ化」の際にも、この列を追加しておく作業が非常に重要になります。

列が増えすぎると見づらくなりますが、必要な時に必要な指標をサッと作れるのは、プログラムならではの強みです。

まずは短期・中期の2本の線を引く準備をしてみましょう。

データの期間をまとめて集計する

株価は毎日動きますが、時には「週単位」や「月単位」で大きな流れを見たいこともあります。Pandasには、日次のデータを別の単位にまとめて集計し直す「リサンプル」という非常に強力な機能があります。

細かい動きに一喜一憂せず、大局を見るためのテクニックを学びましょう。

日次データを月次データに変換する

通常、株価データは1日単位(日次)で並んでいますが、これを月単位(月次)にまとめ直してみます。

resample という命令を使い、月の区切りを指定します。

# 月単位(M)にリサンプルし、その月の終値の平均をとる
monthly_df = df['Close'].resample('M').mean()

たったこれだけで、365日分のデータが12ヶ月分のデータに凝縮されます。

長期的な資産形成を考えているなら、こうした月次データの方がトレンドを把握しやすい場合もあります。

指定する文字(’M’や’W’)を変えるだけで、集計の単位は自由自在に変えられます。

主な指定方法は以下の通りです。

記号集計単位
D日次(Daily)
W週次(Weekly)
M月次(Monthly)
Q四半期(Quarterly)
Y年次(Yearly)

集計時のルール(平均や最大値)を指定する

データをまとめる際、「平均値」以外にも色々な集計方法が選べます。

例えば、その月で最も高かった価格(最大値)や、最も安かった価格(最小値)を出すことも可能です。

  • mean():期間内の平均を出す
  • max():期間内の最高値を出す
  • min():期間内の最安値を出す
  • last():期間内の最後の値(月末の終値など)を出す

目的に合わせてこれらの命令を使い分けましょう。

「今月は最大でどこまで上がったか」を知りたい時は max() を使うといった具合です。

一つのデータから多角的な視点を持てるようになるのが、リサンプルの素晴らしいところです。

自分の知りたい情報に合わせて、集計のルールを使い分けてみてください。

リサンプルによるデータの見た目の変化

リサンプルを行うと、データの行数が大幅に減るため、中身がスッキリと整理されます。

1年分のデータを日次で見ると約250行(営業日)ありますが、月次なら12行になります。

情報量が減るということは、それだけ「大事なポイント」が凝縮されているということです。

パッと見て今の相場が上昇局面なのか、停滞しているのかを判断しやすくなります。

もちろん、細かい値動きを見落とすという側面もあるため、日次データと月次データを使い分けるのが理想です。

まずは1年間の動きを月単位で振り返ることから始めて、大きな波を掴む練習をしてみましょう。

グラフを作成して値動きを可視化する

数字が並んだ表を確認するのも大切ですが、やはりパッと見て状況がわかる「グラフ」の力は絶大です。Pandasなら、特別な設定をあれこれいじる必要はありません。DataFrameから直接命令を出すだけで、きれいなチャートを描くことができます。

1行のコードで折れ線グラフを描く

まずは、最もシンプルな株価の推移を表示させてみましょう。

plot という命令を使うだけで、日付に合わせた折れ線グラフが表示されます。

# 終値のグラフを表示
df['Close'].plot()

これだけで、いつ株価が上がっていつ下がったのかが一目でわかります。

Excelでグラフの範囲を指定して、軸を設定して……という手間を考えると、この手軽さは感動的です。

プログラミング初心者の方は、まずはこの「グラフが出た!」という喜びを大切にしてください。

自分の手で描画したチャートには、ツールで見るのとは違った発見があるはずです。

株価と移動平均線を重ねて表示する

次に、先ほど計算した移動平均線を株価チャートに重ねてみましょう。

複数の列を選択して plot を実行するだけで、自動的に色分けされたグラフが描かれます。

# 終値、5日移動平均、25日移動平均をまとめて描画
df[['Close', 'MA5', 'MA25']].plot()

こうすることで、実際の価格が平均線に対して上にあるのか下にあるのかが視覚的にわかります。

投資のタイミングを考える際、多くの人が見ている「形」を自分でも再現できるようになります。

複数の線が重なると少し見にくくなることもありますが、Pandasなら期間を絞って表示するのも簡単です。

「直近3ヶ月のクロスを見たい」といった細かな調整も、スライシングと組み合わせれば自由自在です。

グラフのサイズやタイトルを整える

デフォルトのままでも十分使えますが、少し設定を加えるだけでぐっと「見やすいチャート」になります。

グラフを大きくしたり、何についてのデータかタイトルをつけたりしてみましょう。

# サイズを大きくして、タイトルと網目を追加
df['Close'].plot(figsize=(12, 6), title='Toyota Stock Price', grid=True)

サイズを横長にすると、時間の流れがよりスムーズに見えるようになります。

また、grid=True で背景に網目を入れると、価格の目盛りが読み取りやすくなるのでおすすめです。

これだけで、ブログや資料にそのまま載せられるようなクオリティになります。

自分が分析した成果をきれいに残しておくことで、投資の記録としての価値も高まります。

欠損値を処理して分析の精度を高める

株価データには、土日や祝日、あるいは取引が成立しなかった日などの理由で、数字が抜けていることがあります。これを「欠損値(NaN)」と呼びます。穴が開いたまま分析を進めると計算が狂ってしまうため、Pandasの機能を使って適切に処理しましょう。

データが抜けている箇所を見つける

まずは、どこにどれくらい穴があるのかを把握します。

isnull().sum() という命令を使うと、項目ごとの欠損値の数をカウントしてくれます。

# どこに穴があるか確認
print(df.isnull().sum())

例えば、移動平均線を計算した直後は、先ほど説明した通り最初の数行が必ず欠損値になります。

それ以外に、予期せぬ場所で数字が抜けていないかをチェックしておくのが、正しい分析の第一歩です。

穴が数カ所なら問題ありませんが、あまりに多い場合は取得元のデータに不備があるかもしれません。

計算を始める前の「検品」として、このチェックを習慣にしましょう。

欠損値を削除してデータを詰める

最も簡単な処理方法は、データが抜けている行をまるごと削除してしまうことです。

dropna という命令を使えば、穴がある行を飛ばして、データが揃っている日だけを繋げることができます。

# 穴がある行を削除する
clean_df = df.dropna()

ただし、あまりに多くの行を消してしまうと、時間の連続性が失われてしまうデメリットもあります。

移動平均の開始部分など、明らかに不要な穴を消したい時に有効な手段です。

削除する前に、どれくらいのデータが消えてしまうのかを確認しておくのを忘れないようにしましょう。

貴重なデータまで一緒に捨ててしまわないよう、慎重に行うのがコツです。

前日の値で穴埋めして補完する

株価分析でよく使われるのが、「前日の価格で穴を埋める」という方法です。

取引がなかった日でも、価格を前日のまま据え置くことで、グラフが途切れるのを防ぐことができます。

# 前日の値で穴を埋める(前方補完)
filled_df = df.fillna(method='ffill')

これを行うと、土日のデータがない場所に金曜日の終値をコピーしてくれます。

時間の流れを一定に保ったまま計算を進められるため、多くの分析現場で使われている手法です。

もちろん「存在しない価格」を作っていることになるので、その点は頭の片隅に置いておく必要があります。

とはいえ、エラーで止まることを防ぎ、スムーズに可視化を進めるためには非常に便利なテクニックです。

まとめ:Pandasを使いこなして株価分析を効率化しよう

この記事では、Pandasを使った株価データ分析の基礎について解説してきました。

一見難しそうに見えるプログラミングも、Pandasという強力な道具を使えば、初心者の方でもこれだけのことができるようになります。

最後に、今回学んだ重要なポイントを振り返りましょう。

  • DataFrame は、大量の株価データを管理する「最強の表計算シート」
  • 日付インデックス を設定することで、期間の絞り込みが驚くほど簡単になる
  • rolling や resample を使えば、移動平均や月次集計も一瞬で終わる
  • plot 命令を使えば、数行のコードでプロ並みのチャートを描ける
  • 欠損値処理 を丁寧に行うことが、正確な分析への近道

まずは自分の好きな銘柄を一つ選んで、そのデータを読み込み、5日移動平均線を引いたグラフを出してみることから始めてみてください。

その小さな一歩が、感覚に頼らない「データに基づいた投資判断」への大きな入り口となるはずです。

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

この記事を書いた人

目次