※当サイトはPRを含みます

【Python株価分析:第4回】米国株を使って時間軸を切り替えられるローソク足チャートを作成する

連載第1回はこちら

はじめに

Pythonのplotly を使って、1分足 / 5分足 / 日足ドロップダウンで切り替えられるローソク足チャートを作成しました。

これは、異なる時間観点で値動きを比較したり、短期の注目のトレンドをとらえるのに有効です。

具体的には以下のような機能を実装しました!

・グラフの右上にメニューを配置

・Plotlyを使ったインタラクティブなローソク足チャートを表示

日足 / 5分足 / 1分足プルダウンメニューで切り替え

そもそもローソク足って?

ローソク足チャート(Candle Stick Chart)は、株価や為替などの価格の変動を視覚的に表現するチャート形式で、日本発祥の技術です。1本の「ローソク足(キャンドル)」が一定期間の価格の動きを表し、トレーダーや投資家が値動きの傾向やパターンを把握するためによく使われます。

ローソク足の構成要素

1本のローソク足は、以下の 4つの価格情報 から成ります:

用語説明
始値(Open)その期間の最初の取引価格
高値(High)その期間の最も高い取引価格
安値(Low)その期間の最も安い取引価格
終値(Close)その期間の最後の取引価格

見た目の構造

   高値
     │
  ┌──┐ ← ヒゲ(上ヒゲ)
  │  │ ← 実体:始値と終値の差
  └──┘
     │
   安値 ← ヒゲ(下ヒゲ)
  • 実体(Body):始値と終値の差を長方形で表します。
    • 終値が始値より高い(=上昇)場合 → 陽線(通常は白や緑)
    • 終値が始値より低い(=下落)場合 → 陰線(通常は黒や赤)
  • ヒゲ(Shadow / Wick):高値と安値を示す線で、上下に伸びます。

ローソク足チャートの活用

ローソク足チャートは、単なる価格の視覚化にとどまらず、次のような分析に使われます:

✅ トレンドの把握

  • 連続して陽線が出る → 上昇トレンド
  • 連続して陰線が出る → 下降トレンド

✅ パターン分析(チャートパターン)

  • 大陽線:強い上昇サイン
  • 大陰線:強い下落サイン
  • 十字線(十字足):迷い、転換の可能性
  • 包み足はらみ足ピンバーなど、転換のシグナルを示す複数のパターンあり

1本のローソクが「1日」の値動きを表す「日足チャート」が基本形です。他にも以下の種類があります:

  • 分足(1分足・5分足など)
  • 時間足(1時間足・4時間足など)
  • 週足・月足

ローソク足チャートを作成(複数銘柄・時間軸切り替え対応)

実装している機能と特徴

1. 複数銘柄に対応(例:AAPL、MSFT、NVDA、TSLA)

  • リストで指定した複数のティッカー(株式銘柄)に対して、株価データを自動取得します。
  • 各銘柄ごとに、ローソク足チャートを描画可能。

2. 複数の時間軸(1分足、5分足、日足)に対応

  • yfinance を用いて、以下3種類の時間軸の株価データを取得:
    • 日足(1日単位)
    • 5分足(5分単位、短期トレードに向く)
    • 1分足(1分単位、超短期分析に向く)
  • ドロップダウンから自由に切り替えて表示。

3. Plotlyでインタラクティブなローソク足チャートを作成

  • Candlestick を使って株価の始値・高値・安値・終値を可視化。
  • ホバー時に詳細な価格情報を確認可能。
  • ズームやパン操作も可能なリッチなUX。

4. 銘柄と時間軸を切り替える2つのドロップダウンUI

  • グラフ右上に以下2つのプルダウンを配置:
    • 銘柄切り替え(MSFTなど)
    • 時間軸切り替え(日足、5分足、1分足)

※yfinanceの日本株は5分足など(日足以外)の取得は不可能です。

Pythonコード

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

# --- 銘柄リストと時間足 ---
tickers = ["AAPL", "MSFT", "NVDA", "TSLA"]
timeframes = {
    "日足": {"period": "1mo", "interval": "1d"},
    "5分足": {"period": "5d", "interval": "5m"},
    "1分足": {"period": "1d", "interval": "1m"}
}

# --- データ格納 ---
data = {}
for ticker in tickers:
    data[ticker] = {}
    for tf_label, tf_args in timeframes.items():
        df = yf.download(ticker, **tf_args)
        if isinstance(df.columns, pd.MultiIndex):
            df.columns = df.columns.droplevel(1)
        data[ticker][tf_label] = df

# --- Plotly チャート構築 ---
fig = go.Figure()
trace_visibility = []

# 全銘柄・時間足分トレース作成
for ticker in tickers:
    for tf_label in timeframes:
        df = data[ticker][tf_label]
        visible = (ticker == tickers[0] and tf_label == "日足")
        fig.add_trace(go.Candlestick(
            x=df.index,
            open=df['Open'],
            high=df['High'],
            low=df['Low'],
            close=df['Close'],
            name=f"{ticker} {tf_label}",
            visible=visible
        ))
        trace_visibility.append((ticker, tf_label))

# --- ドロップダウン作成 ---
ticker_buttons = []
tf_buttons = []

for selected_ticker in tickers:
    visible = [(t == selected_ticker and tf == "日足") for t, tf in trace_visibility]
    ticker_buttons.append(dict(
        label=selected_ticker,
        method="update",
        args=[
            {"visible": visible},
            {"title": f"{selected_ticker} 日足 ローソク足チャート"}
        ]
    ))

for selected_tf in timeframes:
    visible = [(t == tickers[0] and tf == selected_tf) for t, tf in trace_visibility]
    tf_buttons.append(dict(
        label=selected_tf,
        method="update",
        args=[
            {"visible": visible},
            {"title": f"{tickers[0]} {selected_tf} ローソク足チャート"}
        ]
    ))

# --- レイアウト設定 ---
fig.update_layout(
    title=f"{tickers[0]} 日足 ローソク足チャート",
    xaxis_title="時間",
    yaxis_title="価格 (USD)",
    xaxis_rangeslider_visible=False,
    hovermode="x unified",
    updatemenus=[
        dict(buttons=ticker_buttons, direction="down", showactive=True, x=1.0, xanchor="right", y=1.0, yanchor="top"),
        dict(buttons=tf_buttons, direction="down", showactive=True, x=0.9, xanchor="right", y=1.0, yanchor="top")
    ],
    width=1000,
    height=600
)

fig.show()