スポンサーリンク
Pythonstreamlit

📈 Streamlitで株価チャートを描くならPlotlyが断然おすすめ!

Python
この記事は約9分で読めます。

最近、Streamlitで株価チャートを表示しようとネットのサンプルコードを見ていると、Plotlyを使った例が急増していることに気づきました。以前はmatplotlibが主流でしたが、今ではPlotlyが圧倒的に支持されている印象です。

この記事では、Plotlyが選ばれる理由を、従来のmatplotlibとの違いを交えながら解説し、実際にStreamlitで株価チャートを表示する方法を紹介します。

🔍 なぜPlotlyが選ばれるのか?

Plotlyが注目されている最大の理由は、インタラクティブなグラフが簡単に作れることです。

🤔 インタラクティブって何?

「インタラクティブ」とは、ユーザーの操作に応じて画面や動作が変化する仕組みのことです。グラフにおいては、以下のような特徴があります:

  • ズーム:見たい範囲を拡大できる
  • ホバー:マウスを当てると詳細データが表示される
  • リアルタイム更新:スライダーや選択肢でグラフが即座に変化
  • 操作性:ユーザーが自由に動かせるグラフ

Plotlyはこのインタラクティブ性を標準で備えており、Streamlitと組み合わせることで、誰でも簡単にプロっぽいグラフ体験ができます。

🧪 実際に作ってみよう:Plotlyで株価チャート

import streamlit as st
import yfinance as yf
import pandas as pd
import plotly.graph_objects as go


# --- Streamlit アプリの基本設定 ---
st.set_page_config(
    page_title="Apple (AAPL) 株価チャート",
    page_icon="🍎",
    layout="wide"
)


# --- 固定する銘柄コードと期間 ---
TICKER_SYMBOL = "AAPL"
PERIOD = "1y" # 1y = 1年間, 6mo = 6ヶ月, ytd = 年初来


# --- タイトル ---
st.title(f"Apple Inc. ({TICKER_SYMBOL}) 株価チャート 🍎")
st.markdown(f"直近1年間 (`{PERIOD}`) のデータを表示しています。")
st.markdown("---") # 区切り線


# --- 株価データの取得 ---
try:
    # yfinanceを使って直近1年間のデータをダウンロード
    df = yf.download(TICKER_SYMBOL, period=PERIOD)


    # 対策①:マルチインデックス対策
    if isinstance(df.columns, pd.MultiIndex):
        df.columns = df.columns.get_level_values(0)


    # 対策②:カラム名の大文字/小文字 統一
    df.columns = [col.title() for col in df.columns]


    if df.empty:
        st.error("株価データを取得できませんでした。")
    else:
        # --- ローソク足チャートの描画 ---
        fig = go.Figure(
            data=[
                go.Candlestick(
                    x=df.index,
                    open=df['Open'],
                    high=df['High'],
                    low=df['Low'],
                    close=df['Close'],
                    increasing_line_color='green', # 値上がりを「緑」に
                    decreasing_line_color='red'    # 値下がりを「赤」に
                )
            ]
        )
        # チャートのレイアウト設定
        fig.update_layout(
            yaxis_title='株価 (USD)',
            xaxis_rangeslider_visible=False # チャート下のスライダーを非表示に
        )
       
        # Streamlitにチャートを表示
        st.plotly_chart(fig, use_container_width=True)


except Exception as e:
    st.error(f"処理中にエラーが発生しました: {e}")
インタラクティブなグラフ

🧱 matplotlib版との比較

import streamlit as st
import yfinance as yf
import pandas as pd
import mplfinance as mpf
import matplotlib.pyplot as plt


# --- Streamlit アプリの基本設定 ---
st.set_page_config(
    page_title="Apple (AAPL) 株価チャート (Matplotlib)",
    page_icon="🍎",
    layout="wide"
)


# --- 固定する銘柄コードと期間 ---
TICKER_SYMBOL = "AAPL"
PERIOD = "1y" # 1y = 1年間, 6mo = 6ヶ月, ytd = 年初来


# --- タイトル ---
st.title(f"Apple Inc. ({TICKER_SYMBOL}) 株価チャート 🍎")
st.markdown(f"**Matplotlib** を使用して、直近1年間 (`{PERIOD}`) のデータを表示しています。")
st.markdown("---") # 区切り線


# --- 株価データの取得 ---
try:
    # yfinanceを使って直近1年間のデータをダウンロード
    df = yf.download(TICKER_SYMBOL, period=PERIOD)


    # 対策①:マルチインデックス対策
    if isinstance(df.columns, pd.MultiIndex):
        df.columns = df.columns.get_level_values(0)


    # 対策②:カラム名の大文字/小文字 統一
    df.columns = [col.title() for col in df.columns]


    if df.empty:
        st.error("株価データを取得できませんでした。")
    else:
        # --- Matplotlib (mplfinance) でローソ-足チャートを描画 ---
       
        # グラフのスタイルと設定
        mc = mpf.make_marketcolors(up='green', down='red', inherit=True)
        s  = mpf.make_mpf_style(
            marketcolors=mc,
            gridaxis='both',
            gridstyle='--'
        )


        # 描画オブジェクトの作成
        fig, ax = mpf.plot(
            df,
            type='candle',
            style=s,
            volume=False,
            figsize=(8, 4), # <-- ここでグラフのサイズをさらに小さく指定 (横, 縦)
            returnfig=True
        )
       
        # StreamlitにMatplotlibのグラフを表示
        st.pyplot(fig)


except Exception as e:
    st.error(f"処理中にエラーが発生しました: {e}")

📊 比較まとめ

比較項目Plotlymatplotlib(+mplfinance)
インタラクティブ性✅ ズーム・ホバー・操作可能❌ 静的で操作不可
見た目の美しさ✅ モダンで洗練⚠️ スタイル指定が必要
コードの簡潔さ✅ 1ライブラリで完結⚠️ mplfinanceが必要
Streamlitとの統合st.plotly_chart()で即表示st.pyplot()で表示可能
拡張性✅ DashでWeb化可能⚠️ Web連携は難しい
細かい調整⚠️ 一部可能だが制限あり✅ 軸・凡例・色・余白など自由自在

🧭 使い分けの補足

Plotlyとmatplotlibはどちらも優れたライブラリですが、目的に応じて使い分けるのがベストです。

  • Plotlyを使うべき場面
    • Webアプリやダッシュボードで操作可能なグラフを表示したいとき
    • 見た目やユーザー体験を重視したいとき
    • ズームやホバーなどのインタラクティブ性が必要なとき
  • matplotlibを使うべき場面
    • 論文や資料向けに静的で高精度なグラフを作りたいとき
    • 軸や凡例、色、余白などを細かく調整したいとき
    • 軽量で素早くグラフを描きたいとき

👉 つまり、手軽さ・操作性を求めるならPlotly、細部までこだわるならmatplotlibです。

✨ まとめ

Streamlitで株価チャートを描くなら、Plotlyが圧倒的におすすめです。インタラクティブ性、見た目、使いやすさのすべてにおいて、matplotlibを凌駕しています。

もちろん、matplotlibにも静的な分析や論文向けの用途では強みがあります。目的に応じて使い分けることで、より効果的な可視化が可能になります。

コメント

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