Pythonで株価分析はできるようになったけど、グラフの見方がいまいち分からない…
そんな方に向けて、この記事ではmatplotlibを使った株価チャートの描画方法を解説します。
株価分析では「トレンド(移動平均線)」、「過熱感(RSI)」などを“視覚的に確認すること”がとても重要です。
この記事では
- 株価チャートの基本的な描画方法
- 移動平均線の重ね方
- RSIを別グラフで表示する方法
までを、わかりやすく解説します。
matplotlibとは
matplotlibは、Pythonでグラフを描画するためのライブラリです。
株価分析では主に以下の用途で使います。
- 株価の推移(折れ線グラフ)
- テクニカル指標の表示
- 複数指標の比較
グラフ表示
実際にコードを書いて説明していきます。
今回もトヨタ自動車(7203.T)の株価を使用して確認してみます。
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
# Wilder方式版
def calculate_rsi_wilder(df, period=14):
delta = df["Close"].diff()
gain = delta.clip(lower=0)
loss = -delta.clip(upper=0)
avg_gain = gain.ewm(alpha=1/period, adjust=False).mean()
avg_loss = loss.ewm(alpha=1/period, adjust=False).mean()
rs = avg_gain / avg_loss
return 100 - (100 / (1 + rs))
if __name__ == "__main__":
# トヨタ自動車の証券コード+「.T」
ticker = "7203.T"
# Tickerオブジェクトを作成
df = yf.Ticker(ticker).history(period="6mo")
# 25日・75日移動平均線の計算
df["ma25"] = df["Close"].rolling(25).mean()
df["ma75"] = df["Close"].rolling(75).mean()
# RSI
df["rsi"] = calculate_rsi_wilder(df)
# 計算できない行を削除する
df = df.dropna()
# グラフ表示
plt.figure(figsize=(12,8))
# 上:株価
plt.subplot(2,1,1)
plt.plot(df["Close"], label="Close")
plt.plot(df["ma25"], label="MA25")
plt.plot(df["ma75"], label="MA75")
plt.legend()
plt.grid(True)
# 下:RSI
plt.subplot(2,1,2)
plt.plot(df["rsi"], label="RSI")
plt.axhline(70, linestyle="--")
plt.axhline(30, linestyle="--")
plt.ylim(0, 100)
plt.legend()
plt.title("RSI")
plt.grid(True)
plt.tight_layout()
plt.show()実行結果:

コード解説
ライブラリのインポート
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt株価データの取得や分析、グラフ表示に必要なライブラリを読み込んでいます。下の3つで「取得・加工・可視化」ができるようになります。
- yfinance:株価データを取得するためのライブラリ(Yahoo Financeから取得)
- pandas:データを表形式(DataFrame)で扱うためのライブラリ
- matplotlib.pyplot:グラフを描画するためのライブラリ
RSI計算の関数化
def calculate_rsi_wilder(df, period=14):
delta = df["Close"].diff()
gain = delta.clip(lower=0)
loss = -delta.clip(upper=0)
avg_gain = gain.ewm(alpha=1/period, adjust=False).mean()
avg_loss = loss.ewm(alpha=1/period, adjust=False).mean()
rs = avg_gain / avg_loss
return 100 - (100 / (1 + rs))RSIの計算を関数化したものになります。
RSIの詳細な計算方法の説明は下の記事を参考にしてください。

株価データ取得
ticker = "7203.T"
df = yf.Ticker(ticker).history(period="6mo")ここでは、例にトヨタ自動車(7203.T)の株価データを取得しています。
- “7203.T”:日本株の場合は「証券コード + .T」を指定
- yf.Ticker():銘柄情報を扱うオブジェクトを作成
- history(period=’6mo’):過去6ヶ月分の株価データを取得
株価データ取得の詳細については下の記事に記載しているので参考にしてください。

移動平均線の計算・RSIの計算(関数呼び出し)
df["ma25"] = df["Close"].rolling(25).mean()
df["ma75"] = df["Close"].rolling(75).mean()
df["rsi"] = calculate_rsi_wilder(df)移動平均線の計算とRSIの計算(関数呼び出し)を行っています。
移動平均線の計算とRSIの計算の詳細は下の記事を参考にしてください。


グラフ表示
plt.figure(figsize=(12,8))
plt.subplot(2,1,1)
plt.plot(df["Close"], label="Close")
plt.plot(df["ma25"], label="MA25")
plt.plot(df["ma75"], label="MA75")
plt.legend()
plt.grid(True)
plt.subplot(2,1,2)
plt.plot(df["rsi"], label="RSI")
plt.axhline(70, linestyle="--")
plt.axhline(30, linestyle="--")
plt.ylim(0, 100)
plt.legend()
plt.title("RSI")
plt.grid(True)
plt.tight_layout()
plt.show()1つの画面に株価+移動平均線(上部)、RSI(下部)を表示しています。
- plt.figure(figsize=(12,8)):
横12インチ、縦8インチのサイズでグラフ全体の領域を確保します。 - plt.subplot(2,1,1):
画面分割(上段)の設定です。「2行1列の1番目」という意味で、これ以降の描画命令は上のグラフに対して行われます。 - plt.plot(df[“Close”], …):
折れ線グラフの描画です。終値や移動平均線を重ねて描画します[label]は凡例に使われます。 - plt.legend():
凡例の表示です。plot で設定した label を元に、どの線が何かを枠内に表示します。 - plt.grid(True):
グリッドを表示します。 - plt.subplot(2,1,2):
画面分割(下段)の設定です。「2行1列の2番目」にターゲットを切り替えます。 - plt.plot(df[“rsi”], label=”RSI”):
RSIを描画します。 - plt.axhline(70, …):
水平線の描画です。RSIのしきい値(70と30)に点線(–)を引き、視認性を高めます。
※ 線の種類 [-]:実践 [–]:破線 [:]:点線 - plt.ylim(0, 100):
範囲を指定します。 - plt.tight_layout():
レイアウトを調整します。 - plt.show():
グラフを画面に表示します。
まとめ
今回は、matplotlib を使って株価チャートを描画する方法を解説しました。
Pythonでは株価データを取得するだけでなく、グラフとして可視化することで「相場の流れ」や「指標の変化」を直感的に理解できるようになります。
特に今回紹介した、
- plot() を使った株価表示
- subplot() による複数チャート表示
- axhline() を使ったRSI基準線
- 移動平均線との組み合わせ
は、株価分析ツールを作る上で非常によく使う基本テクニックです。
まずは今回のコードを動かしながら、「どのようにグラフが描画されるのか」「どのタイミングで指標が反応しているのか」を確認してみてください。
【投資に関する免責事項】
本ブログで紹介している株価解析ツールによるスコアリングおよび銘柄分析は、あくまで個人の学習・研究および技術検証を目的としたものであり、特定の銘柄の売買を推奨するものではありません。
ツールの算出結果や掲載情報の正確性については万全を期しておりますが、その内容を保証するものではありません。投資の最終決定は、必ずご自身の判断と責任において行っていただきますようお願いいたします。
万一、本ブログの情報に基づいて被ったいかなる損害についても、当サイトおよび運営者は一切の責任を負いかねますのであらかじめご了承ください。

