Streamlitで株価監視ダッシュボードを10分で作る【Python初心者向け】

Python実装・コード

子供が生まれてから、パソコンの前に座れる時間が激減した。日中は抱っこしながらスマホでちらっと株価を確認するくらいしかできない。「せめて監視している銘柄をまとめて見られるシンプルな画面があれば…」と思ってStreamlitを試したら、Webの知識ゼロでもあっさりダッシュボードが作れてしまって正直驚いた。

なぜStreamlitを選んだのか

PythonでWebアプリを作ろうとするとFlaskやDjangoを学ぶ必要があり、HTML・CSS・JavaScriptの知識も要る。僕みたいにプログラミング素人には敷居が高すぎる。。。そこで聞いたのがStreamlit。「Pythonだけ書けばWebアプリが動く」という触れ込みで、データサイエンス系で人気のフレームワークだ。実際に試してみたら本当にPythonだけで動いた。

特に投資系のダッシュボードとの相性が抜群で、グラフ表示・テーブル表示・フィルター操作あたりが驚くほど簡単に実装できる。ローカルで動かせばサーバー代もゼロだし、LAN内であればスマホのブラウザからもアクセスできる(これが一番うれしかった)。

インストールと起動方法

# インストール
pip install streamlit yfinance pandas plotly

# アプリを起動(ファイル名はapp.pyとする)
streamlit run app.py

# スマホからアクセスする場合は --server.address 0.0.0.0 を付ける
streamlit run app.py --server.address 0.0.0.0 --server.port 8501
# → 同じWifi内のスマホから http://PCのIPアドレス:8501 でアクセス可能

基本的な株価ダッシュボードを作る

まずは「監視銘柄の現在値と変動率を一覧表示する」シンプルなダッシュボードから始める。これだけでも毎朝ログを確認するのが格段にラクになった。

import streamlit as st
import yfinance as yf
import pandas as pd
import plotly.graph_objects as go
from datetime import datetime, timedelta

# ページ設定
st.set_page_config(
    page_title="株価監視ダッシュボード",
    page_icon="📈",
    layout="wide"
)

# 監視銘柄リスト(日本株のティッカーは末尾に.T)
WATCHLIST = {
    "トヨタ自動車": "7203.T",
    "デンソー": "6902.T",
    "ホンダ": "7267.T",
    "三菱電機": "6503.T",
    "ファナック": "6954.T",
    "ドル円": "JPY=X",
}

st.title("📈 株価監視ダッシュボード")
st.caption(f"最終更新: {datetime.now().strftime('%Y-%m-%d %H:%M')}")

# データ取得(キャッシュで高速化)
@st.cache_data(ttl=300)  # 5分キャッシュ
def fetch_prices(tickers):
    results = []
    for name, ticker in tickers.items():
        try:
            stock = yf.Ticker(ticker)
            hist = stock.history(period="5d")
            if len(hist) < 2:
                continue
            current = hist["Close"].iloc[-1]
            prev = hist["Close"].iloc[-2]
            change = current - prev
            change_pct = (change / prev) * 100
            results.append({
                "銘柄名": name,
                "ティッカー": ticker,
                "現在値": round(current, 2),
                "前日比": round(change, 2),
                "前日比(%)": round(change_pct, 2),
            })
        except Exception as e:
            st.warning(f"{name} の取得失敗: {e}")
    return pd.DataFrame(results)

# 価格テーブル表示
with st.spinner("データ取得中..."):
    df = fetch_prices(WATCHLIST)

# 色付きで表示
def color_change(val):
    if isinstance(val, (int, float)):
        color = "red" if val > 0 else ("blue" if val < 0 else "gray")
        return f"color: {color}"
    return ""

st.subheader("監視銘柄一覧")
styled_df = df.style.applymap(color_change, subset=["前日比", "前日比(%)"])
st.dataframe(styled_df, use_container_width=True)

個別銘柄のチャートを追加する

一覧表示の下に、選択した銘柄のローソク足チャートも表示できるようにする。Plotlyを使えばインタラクティブなチャートを数行で実装できる。

# 個別チャート表示セクション(上のコードの続き)
st.subheader("個別チャート")

col1, col2 = st.columns([2, 1])

with col1:
    selected_name = st.selectbox("銘柄を選択", list(WATCHLIST.keys()))
    period = st.radio("期間", ["1mo", "3mo", "6mo", "1y"], horizontal=True)

@st.cache_data(ttl=300)
def fetch_chart_data(ticker, period):
    stock = yf.Ticker(ticker)
    return stock.history(period=period)

selected_ticker = WATCHLIST[selected_name]
hist = fetch_chart_data(selected_ticker, period)

# ローソク足チャート
fig = go.Figure(data=[
    go.Candlestick(
        x=hist.index,
        open=hist["Open"],
        high=hist["High"],
        low=hist["Low"],
        close=hist["Close"],
        name=selected_name,
    )
])

# 移動平均線を追加
for window, color in [(25, "orange"), (75, "blue")]:
    ma = hist["Close"].rolling(window=window).mean()
    fig.add_trace(go.Scatter(
        x=hist.index, y=ma,
        name=f"MA{window}",
        line=dict(color=color, width=1.5)
    ))

fig.update_layout(
    title=f"{selected_name} ローソク足チャート",
    xaxis_title="日付",
    yaxis_title="価格",
    height=450,
    xaxis_rangeslider_visible=False,
)

st.plotly_chart(fig, use_container_width=True)

自動更新機能を付ける

スマホから見るときに「手動でリロードするのが面倒」という問題があった。Streamlitには`st.rerun()`と`time.sleep()`を組み合わせた自動更新機能がある。ただし使いすぎるとAPIのレート制限に引っかかるので注意。

import time

# サイドバーに設定を置く
with st.sidebar:
    st.header("⚙️ 設定")
    auto_refresh = st.toggle("自動更新", value=False)
    refresh_interval = st.slider("更新間隔(秒)", 30, 300, 60)

    if auto_refresh:
        st.info(f"{refresh_interval}秒ごとに自動更新")

# メインコンテンツ表示後...
# (上のコードでdf取得・表示が終わったあとに追加)

if auto_refresh:
    time.sleep(refresh_interval)
    st.rerun()

完成形のイメージとスマホからのアクセス

これだけのコードで「監視銘柄の一覧表示 → 個別チャート確認 → 自動更新」という機能が揃った。PCのターミナルで起動したまま、スマホブラウザから`http://192.168.x.x:8501`にアクセスすれば使える。

ポイントとして、yfinanceの日本株は`.T`サフィックスをつけること(例:トヨタなら`7203.T`)、`@st.cache_data(ttl=300)`でAPIコールを減らすこと、そして`st.columns()`でレイアウトを調整してスマホ表示を整えることを意識すると使いやすくなる。

まとめ

Streamlitは「WebもHTMLも分からないけど、Pythonはちょっと書ける」という人にとって最高のツールだと思う。インストールから動作確認まで本当に10分もかからなかった。

個人的には、このダッシュボードにアラート機能(特定の変動率を超えたらDiscordに通知)を組み込んで、完全に「ながら監視」できる仕組みにするのが次の目標。子育て中の個人投資家こそ、こういうツールで省力化するのが大事だと思ってる。

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