【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()
ディスカッション
コメント一覧
まだ、コメントがありません