【対話型】Jupyter Notebookで株価データ分析を効率化する初期設定

準備・環境構築

※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。

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ステップで構成されています。

* yfinancepandasmatplotlibmplfinanceの4つの主要ライブラリを読み込む

* japanize_matplotlibをインポートし、グラフの日本語表示を有効化する

* %matplotlib inlineマジックコマンドで、グラフをセル直下に描画する設定を行う

* pd.set_optionplt.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形式のレポートに変換できます。定期的にデータを更新して分析結果を蓄積することで、銘柄選定の精度を高めていってください。

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