※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。
Pythonで株価データを取得し、チャートを描画するところまではできるようになった。しかし、スクリプトを毎回全体実行するワークフローに不便さを感じていないでしょうか。
Jupyter Notebook(ジュピター・ノートブック)は、コードを「セル」単位で分割し、1行ずつ対話的に実行できる開発環境です。データの取得・加工・可視化を段階的に確認できるため、株価分析との相性が極めて高いツールです。
実際には「インストールしたものの初期設定がわからない」「グラフが表示されない」「セルの実行順序でエラーが出る」といった壁にぶつかる人が多くいます。
これらの原因の多くは、Notebook特有のマジックコマンドやカーネルの仕組みを理解しないまま使い始めることにあります。
本記事では、Jupyter Notebookの導入から株価データの取得・可視化・テクニカル指標の算出までを、コピペで動くコード付きで解説します。セルの実行順序やグラフ表示の設定など、初中級者がつまずきやすいポイントも網羅しています。
コードはすべてそのままコピペで動作するように設計しています。自分の分析対象に合わせてパラメータを変更し、すぐに実践へ移してください。
Jupyter Notebookと株価分析の基礎知識
Jupyter Notebookが株価分析に向いている理由
Jupyter Notebookは、ブラウザ上でPythonコードを「セル」という単位で実行できるツールです。通常の.pyスクリプトと異なり、コードの一部だけを繰り返し実行できます。
株価分析では「データ取得→前処理→指標計算→可視化」という工程を何度も試行錯誤します。セル単位で実行と確認を繰り返せるNotebookは、この反復作業に最適です。
さらに、グラフやデータフレームがセルの直下にインライン表示されるため、結果を即座に確認できます。分析の思考プロセスをそのまま記録できる点も大きな利点です。
カーネルとセルの実行順序を理解する
カーネル(Kernel)は、Notebookの裏側で動作するPython実行エンジンです。すべてのセルは同一のカーネル上でメモリを共有します。
重要なのは、セルの実行順序はノートブック上の並び順とは限らないという点です。セル番号[3]の後に[1]を再実行すると、変数の状態が上書きされます。
分析中に意図しない結果が出た場合は、メニューの「Kernel → Restart & Run All」で上から順に再実行してください。これでカーネルの状態がリセットされ、再現性を確保できます。
【コピペOK】環境構築と初期設定
以下のコマンドで必要なライブラリをすべてインストールしてください。
pip install notebook yfinance pandas matplotlib mplfinance japanize-matplotlib
インストール完了後、ターミナルで以下のコマンドを実行するとブラウザが自動で開きます。
jupyter notebook
ブラウザが開いたら、右上の「New → Python 3」を選択して新しいノートブックを作成してください。
最初のセルには、以下の初期設定コードを貼り付けて実行します。
# ==============================
# セル1: 初期設定(ライブラリ読み込み+表示設定)
# ==============================
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import mplfinance as mpf
import japanize_matplotlib # 日本語フォント対応
# --- Notebook用マジックコマンド ---
# グラフをセル直下にインライン表示する設定
%matplotlib inline
# --- 表示設定 ---
pd.set_option("display.max_rows", 20)
pd.set_option("display.max_columns", 15)
pd.set_option("display.float_format", "{:.2f}".format)
plt.rcParams["figure.figsize"] = (12, 6)
plt.rcParams["figure.dpi"] = 100
print("初期設定完了")
初期設定コードの処理フロー解説
上記のコードは、以下の4ステップで構成されています。
* yfinance・pandas・matplotlib・mplfinanceの4つの主要ライブラリを読み込む
* japanize_matplotlibをインポートし、グラフの日本語表示を有効化する
* %matplotlib inlineマジックコマンドで、グラフをセル直下に描画する設定を行う
* pd.set_optionとplt.rcParamsで、データフレームとグラフの表示書式を統一する
この初期設定セルは、ノートブックを開くたびに最初に実行してください。
【コピペOK】株価データの取得とローソク足チャート描画
2番目以降のセルに、以下のコードを貼り付けて実行してください。
# ==============================
# セル2: 株価データ取得
# ==============================
# --- 設定エリア ---
TICKER: str = "7203.T" # 銘柄コード(トヨタ自動車)
PERIOD: str = "6mo" # 取得期間(6ヶ月)
INTERVAL: str = "1d" # 足の種類(日足)
SMA_SHORT: int = 5 # 短期移動平均の期間
SMA_MEDIUM: int = 25 # 中期移動平均の期間
SMA_LONG: int = 75 # 長期移動平均の期間
# ==============================
# 関数定義: データ取得
# ==============================
def fetch_stock_data(ticker: str, period: str, interval: str) -> pd.DataFrame:
'データを取得しDataFrameで返す'
df: pd.DataFrame = yf.download(ticker, period=period, interval=interval)
if df.empty:
raise ValueError(f"データを取得できませんでした: {ticker}")
# マルチカラムの場合はフラット化
if isinstance(df.columns, pd.MultiIndex):
df.columns = df.columns.get_level_values(0)
return df
# ==============================
# 関数定義: 移動平均線の追加
# ==============================
def add_sma(df: pd.DataFrame, short: int, medium: int, long: int) -> pd.DataFrame:
'単純移動平均線(SMA)を追加する'
df[f"SMA_{short}"] = df["Close"].rolling(window=short).mean()
df[f"SMA_{medium}"] = df["Close"].rolling(window=medium).mean()
df[f"SMA_{long}"] = df["Close"].rolling(window=long).mean()
return df
# ==============================
# 関数定義: 基本統計情報の表示
# ==============================
def show_summary(df: pd.DataFrame, ticker: str) -> None:
'基本的な統計情報を表示する'
print(f"銘柄: {ticker}")
print(f"期間: {df.index[0].strftime('%Y-%m-%d')} 〜 {df.index[-1].strftime('%Y-%m-%d')}")
print(f"データ件数: {len(df)}件")
print(f"終値レンジ: {df['Close'].min():.2f} 〜 {df['Close'].max():.2f}")
print(f"平均出来高: {df['Volume'].mean():,.0f}")
# ==============================
# メイン処理
# ==============================
df: pd.DataFrame = fetch_stock_data(TICKER, PERIOD, INTERVAL)
df = add_sma(df, SMA_SHORT, SMA_MEDIUM, SMA_LONG)
show_summary(df, TICKER)
df.tail(10)
# ==============================
# セル3: ローソク足チャート描画
# ==============================
def plot_candlestick(df: pd.DataFrame, ticker: str, short: int, medium: int, long: int) -> None:
'ローソク足チャートと移動平均線を描画する'
add_plots: list = [
mpf.make_addplot(df[f"SMA_{short}"], color="blue", width=1.0, label=f"SMA{short}"),
mpf.make_addplot(df[f"SMA_{medium}"], color="orange", width=1.2, label=f"SMA{medium}"),
mpf.make_addplot(df[f"SMA_{long}"], color="red", width=1.5, label=f"SMA{long}"),
]
mpf.plot(
df,
type="candle",
style="yahoo",
title=f"{ticker} ローソク足チャート",
volume=True,
addplot=add_plots,
figsize=(14, 8),
datetime_format="%Y-%m-%d",
)
plot_candlestick(df, TICKER, SMA_SHORT, SMA_MEDIUM, SMA_LONG)
コードの処理フロー解説
上記のコードは、以下の5ステップで構成されています。
* 設定エリアで銘柄コード・取得期間・移動平均の期間を定数として定義する
* fetch_stock_data関数でyfinance経由の株価データを取得し、マルチカラムをフラット化する
* add_sma関数で短期・中期・長期の単純移動平均線(SMA: Simple Moving Average)をDataFrameに追加する
* show_summary関数でデータの概要(期間・件数・終値レンジ・平均出来高)をテキスト出力する
* plot_candlestick関数でmplfinanceを使い、出来高付きのローソク足チャートを描画する
TICKERの値を"9984.T"(ソフトバンクグループ)や"AAPL"(Apple)に変更するだけで、別銘柄の分析に切り替えられます。
分析結果の読み解き方と活用ポイント
ローソク足と移動平均線の見方
ローソク足チャートでは、始値・高値・安値・終値を一目で確認できます。陽線(終値>始値)が連続する箇所は買い圧力が強い局面です。
移動平均線は、短期線が中期線を下から上に抜ける「ゴールデンクロス(Golden Cross)」が代表的な買いシグナルとされています。ただし、単一のシグナルだけで売買判断を行うのは危険です。必ず出来高や他の指標と組み合わせてください。
Notebookの分析ワークフロー
Notebookでは以下の順序でセルを整理すると、再現性の高い分析が実現できます。
| セル番号 | 内容 | 実行頻度 |
|---|---|---|
| セル1 | 初期設定(ライブラリ読み込み) | 最初に1回 |
| セル2 | データ取得+前処理 | 銘柄変更時 |
| セル3 | チャート描画 | パラメータ変更時 |
| セル4以降 | テクニカル指標の追加分析 | 随時 |
セルの並び順と実行順を一致させることが、エラー防止の鉄則です。分析が完了したら「File → Download as → .html」でレポートとして保存してください。
【コピペOK】RSI算出とヒートマップによる複数銘柄比較
# ==============================
# セル4: RSI算出 + 複数銘柄比較ヒートマップ
# ==============================
# --- 設定エリア ---
TICKER_LIST: list[str] = ["7203.T", "9984.T", "6758.T", "8306.T", "9432.T"]
COMPARE_PERIOD: str = "6mo"
RSI_WINDOW: int = 14 # RSI算出期間(一般的に14日)
# ==============================
# 関数定義: RSI算出
# ==============================
def calc_rsi(series: pd.Series, window: int = 14) -> pd.Series:
'RSI(Relative Strength Index)を算出する'
delta: pd.Series = series.diff()
gain: pd.Series = delta.where(delta > 0, 0.0).rolling(window=window).mean()
loss: pd.Series = (-delta.where(delta < 0, 0.0)).rolling(window=window).mean()
rs: pd.Series = gain / loss
rsi: pd.Series = 100 - (100 / (1 + rs))
return rsi
# ==============================
# 関数定義: 複数銘柄の終値・RSI取得
# ==============================
def fetch_multi_stock(tickers: list[str], period: str, rsi_window: int) -> dict:
'複数銘柄の終値とRSIをまとめて取得する'
result: dict = {}
for ticker in tickers:
df: pd.DataFrame = yf.download(ticker, period=period, interval="1d", progress=False)
if df.empty:
print(f"スキップ: {ticker}")
continue
if isinstance(df.columns, pd.MultiIndex):
df.columns = df.columns.get_level_values(0)
df["RSI"] = calc_rsi(df["Close"], window=rsi_window)
result[ticker] = df
return result
# ==============================
# 関数定義: 月次リターンヒートマップ
# ==============================
def plot_monthly_return_heatmap(stock_data: dict) -> None:
'複数銘柄の月次リターンをヒートマップで表示する'
monthly_returns: dict = {}
for ticker, df in stock_data.items():
monthly: pd.Series = df["Close"].resample("ME").last().pct_change() * 100
monthly_returns[ticker] = monthly
mr_df: pd.DataFrame = pd.DataFrame(monthly_returns).dropna()
mr_df.index = mr_df.index.strftime("%Y-%m")
fig, ax = plt.subplots(figsize=(12, len(mr_df) * 0.6 + 2))
im = ax.imshow(mr_df.values, cmap="RdYlGn", aspect="auto")
ax.set_xticks(range(len(mr_df.columns)))
ax.set_xticklabels(mr_df.columns, rotation=45, ha="right")
ax.set_yticks(range(len(mr_df.index)))
ax.set_yticklabels(mr_df.index)
ax.set_title("月次リターン(%)ヒートマップ")
for i in range(len(mr_df.index)):
for j in range(len(mr_df.columns)):
ax.text(j, i, f"{mr_df.values[i, j]:.1f}", ha="center", va="center", fontsize=9)
fig.colorbar(im, ax=ax, label="リターン(%)")
plt.tight_layout()
plt.show()
# ==============================
# 関数定義: RSI一覧表示
# ==============================
def show_rsi_summary(stock_data: dict) -> pd.DataFrame:
'各銘柄の最新RSIを一覧表示する'
rows: list[dict] = []
for ticker, df in stock_data.items():
latest_rsi: float = df["RSI"].dropna().iloc[-1]
signal: str = "買われすぎ" if latest_rsi > 70 else ("売られすぎ" if latest_rsi < 30 else "中立")
rows.append({"銘柄": ticker, "最新RSI": round(latest_rsi, 2), "判定": signal})
return pd.DataFrame(rows)
# ==============================
# メイン処理
# ==============================
stock_data: dict = fetch_multi_stock(TICKER_LIST, COMPARE_PERIOD, RSI_WINDOW)
rsi_df: pd.DataFrame = show_rsi_summary(stock_data)
print(rsi_df.to_string(index=False))
plot_monthly_return_heatmap(stock_data)
コードの処理フロー解説
上記のコードは、以下の4ステップで構成されています。
* calc_rsi関数でRSI(Relative Strength Index:相対力指数)を14日間ベースで算出する。70以上は「買われすぎ」、30以下は「売られすぎ」の目安となる
* fetch_multi_stock関数で5銘柄のデータを一括取得し、各銘柄にRSI列を追加する
* show_rsi_summary関数で各銘柄の最新RSIと判定結果(買われすぎ・売られすぎ・中立)を一覧表示する
* plot_monthly_return_heatmap関数で月次リターンをヒートマップとして可視化し、銘柄間のパフォーマンスを比較する
TICKER_LISTに自分が監視したい銘柄コードを追加すれば、ウォッチリストとして活用できます。
よくあるエラーと対処法
ModuleNotFoundError: No module named 'yfinance'
Jupyter Notebookが使用しているPython環境に、ライブラリがインストールされていないことが原因です。ターミナルでpip installしたPythonと、Notebookのカーネルが異なるPython環境を参照しているケースが多く発生します。
以下を試してください。
* Notebookのセルで!pip install yfinanceを実行し、カーネルと同じ環境に直接インストールする
* !which python(Mac/Linux)または!where python(Windows)でNotebookが参照するPythonパスを確認する
* Anacondaを使っている場合はconda install -c conda-forge yfinanceを使用する
グラフが表示されずにとだけ出力される
%matplotlib inlineマジックコマンドが実行されていないことが主な原因です。このコマンドはカーネル起動後に1回実行する必要があります。
以下を試してください。
* セル1の初期設定コードを再実行し、%matplotlib inlineが確実に適用されていることを確認する
* plt.show()がコードの末尾に記述されているか確認する
* カーネルを再起動して、セル1から順番に実行し直す
NameError: name 'df' is not defined
セル2(データ取得)を実行せずにセル3(チャート描画)を実行した場合に発生します。Notebookのセルは上から順に実行される保証がなく、カーネル再起動後に特定のセルだけ実行するとこのエラーが起きます。
以下を試してください。
* メニューの「Kernel → Restart & Run All」で全セルを上から順に再実行する
* セルの左側に表示される実行番号[1] [2]が昇順になっていることを確認する
* 変数の状態が不明な場合はprint(dir())で現在定義されている変数一覧を確認する
まとめ
この記事では、Jupyter Notebookの初期設定から株価データの取得・ローソク足チャート描画・RSI算出・複数銘柄比較までの一連の分析フローを解説しました。
要点を整理します。
* Jupyter Notebookはセル単位でコードを実行でき、株価分析の試行錯誤に最適な環境である
* 初期設定セルで%matplotlib inlineを必ず実行し、グラフのインライン表示を有効化する
* セルの実行順序とカーネルの状態管理が、Notebook特有のエラーを防ぐ最重要ポイントである
* mplfinanceを使えば、数行のコードで出来高付きローソク足チャートと移動平均線を描画できる
* RSIや月次リターンヒートマップで複数銘柄を横断的に比較し、分析の幅を広げられる
次のステップとして、MACD(Moving Average Convergence Divergence)やボリンジャーバンド(Bollinger Bands)などのテクニカル指標を追加する関数を自作してみてください。Notebookのセルに1つずつ追加すれば、自分専用の分析ダッシュボードが完成します。
さらに、nbconvertコマンドを使えば、NotebookをそのままHTML形式のレポートに変換できます。定期的にデータを更新して分析結果を蓄積することで、銘柄選定の精度を高めていってください。

