ローソク足(candlestick)は、1 本で「ある期間の始値・高値・安値・終値」をまとめて表示できるテクニカル分析の基本図形です。本記事では、OHLC の意味、Python での描画方法、代表的な形状の読み方を順に整理します。
目次
- ローソク足が示す 4 つの値
- サンプルデータの準備
- mplfinance で描画する
- matplotlib だけで描く場合
- 代表的な形状
- 形状を機械的に判定する例
ローソク足が示す 4 つの値
ローソク足は OHLC(Open, High, Low, Close)を 1 つの図形で表します。
- 始値(Open): その期間の最初に付いた価格
- 高値(High): その期間の最高値
- 安値(Low): その期間の最安値
- 終値(Close): その期間の最後に付いた価格
太い箱状の部分を 実体(body)、上下の細い線を ヒゲ(shadow / wick) と呼びます。
- 実体の上下端は始値と終値
- 実体の上から伸びる線は高値、下から伸びる線は安値
- 終値が始値より高ければ陽線(慣例的に白・赤など)
- 終値が始値より低ければ陰線(慣例的に黒・青など)
色のルールはチャートツールごとに異なります。日本では「陽線=赤、陰線=青」が一般的、欧米では逆になることが多い点を覚えておくと混乱が減ります。
サンプルデータの準備
サンプルとして、ランダムウォークから OHLC を生成します。
import numpy as npimport pandas as pd
rng = np.random.default_rng(seed=7)n = 60# 日中の値動きを 4 本足っぽく組み立てるreturns = rng.normal(loc=0.0005, scale=0.012, size=n)close = 1000 * np.exp(np.cumsum(returns))open_ = np.concatenate([[1000.0], close[:-1]]) # 翌営業日の始値は前日終値近辺intraday = rng.normal(scale=0.008, size=(n, 2))high = np.maximum(open_, close) * (1 + np.abs(intraday[:, 0]))low = np.minimum(open_, close) * (1 - np.abs(intraday[:, 1]))volume = rng.integers(100_000, 500_000, size=n)
ohlc = pd.DataFrame( {"O": open_, "H": high, "L": low, "C": close, "Vo": volume}, index=pd.date_range("2026-02-02", periods=n, freq="B"),)print(ohlc.head())mplfinance は列名 Open / High / Low / Close / Volume を要求します。J-Quants V2 の O/H/L/C/Vo から変換した DataFrame を渡します。
mplfinance で描画する
mplfinance は matplotlib をベースにした、ローソク足専用の描画ライブラリです。
pip install mplfinance最小コードは次の通りです。mplfinance 用に列名を変換してから渡します。
import mplfinance as mpf
# mplfinance は Open/High/Low/Close/Volume を要求するため変換するohlc_mpf = ohlc.rename( columns={"O": "Open", "H": "High", "L": "Low", "C": "Close", "Vo": "Volume"})
mpf.plot( ohlc_mpf, type="candle", style="yahoo", volume=True, title="Sample Candlestick", figratio=(12, 6), savefig=dict(fname="candlestick.png", dpi=120),)
type="candle"でローソク足volume=Trueで下段に出来高style="yahoo"は陽線が緑、陰線が赤の配色。charlesなどほかの style も選べるsavefigで画像出力
「日本式の赤=陽線、青=陰線」にしたい場合は、marketcolors を上書きしたカスタム style を作ります。
mc = mpf.make_marketcolors(up="red", down="blue", edge="inherit", wick="inherit", volume="gray")jp_style = mpf.make_mpf_style(base_mpf_style="yahoo", marketcolors=mc)
mpf.plot(ohlc_mpf, type="candle", style=jp_style, volume=True, savefig="candle_jp.png")matplotlib だけで描く場合
外部ライブラリを増やしたくない場合、matplotlib.patches.Rectangle で実体を、vlines でヒゲを描く方法もあります。
import matplotlib.pyplot as pltfrom matplotlib.patches import Rectangle
fig, ax = plt.subplots(figsize=(10, 5))for i, (idx, row) in enumerate(ohlc.iterrows()): color = "red" if row["C"] >= row["O"] else "blue" # ヒゲ ax.vlines(i, row["L"], row["H"], color=color, linewidth=1) # 実体 bottom = min(row["O"], row["C"]) height = abs(row["C"] - row["O"]) ax.add_patch(Rectangle((i - 0.3, bottom), 0.6, height, color=color))
ax.set_xlim(-1, len(ohlc))ax.set_xticks(range(0, len(ohlc), 5))ax.set_xticklabels([d.strftime("%m-%d") for d in ohlc.index[::5]], rotation=45)ax.set_title("Candlestick (matplotlib only)")ax.grid(alpha=0.3)plt.tight_layout()plt.savefig("candlestick_raw.png", dpi=120)plt.close(fig)ライブラリ依存を抑えたいプロジェクトでは、この方法がメンテしやすくなります。
代表的な形状
| 名称 | 形 | 一般的な解釈 |
|---|---|---|
| 大陽線 | 長い実体・短いヒゲ(陽) | 強い買い圧 |
| 大陰線 | 長い実体・短いヒゲ(陰) | 強い売り圧 |
| 十字線(同時線) | 実体がほぼ無い | 均衡・転換の兆し |
| カラカサ | 下ヒゲが長い小さな実体 | 安値圏で出ると反発の示唆 |
| トウバ | 上ヒゲが長い小さな実体 | 高値圏で出ると反落の示唆 |
形状の解釈は 単独で使うものではない 点が重要です。出来高・前後の流れ・他指標と合わせて読みます。
形状を機械的に判定する例
「実体が小さい」「上下ヒゲが長い」を数値で判定する単純な関数を書きます。
def classify(row: pd.Series, body_ratio: float = 0.1) -> str: rng = row["H"] - row["L"] if rng == 0: return "flat" body = abs(row["C"] - row["O"]) upper = row["H"] - max(row["O"], row["C"]) lower = min(row["O"], row["C"]) - row["L"]
if body / rng < body_ratio: return "doji" if lower / rng > 0.6 and body / rng < 0.3: return "hammer" if upper / rng > 0.6 and body / rng < 0.3: return "shooting_star" return "normal"
ohlc["pattern"] = ohlc.apply(classify, axis=1)print(ohlc["pattern"].value_counts())
「形が当てはまる」ことと「実際にトレンドが転換する」ことは別問題で、判定はあくまで観察の補助だと割り切ります。
注意点
- ローソク足はあくまで要約: 1 本に圧縮した時点で、日中の細かい動きは失われている
- 時間軸の混同: 日足・週足・分足で見える形は変わる。同じ「カラカサ」でも日足と分足では意味が違う
- 特定の形 = 売買シグナル ではない: 過去データに対する後付け解釈になりがちで、実運用ではシグナル化に慎重さが必要
生成AI へのプロンプト例
J-Quants 由来の DataFrame をそのまま mplfinance に流し込むラッパーを作る例です。
入力 DataFrame は次の構造です:- columns: Date (datetime64), O, H, L, C, Vo- 1 行 1 営業日
mplfinance を使って次の関数を作ってください。
def plot_candle(df, title: str, out_path: str) -> None: - 日付昇順に並び替え - O/H/L/C/Vo を Open/High/Low/Close/Volume に変換(mplfinance 要件) - Date を index にしてから mpf.plot を呼ぶ - style は「陽線=赤・陰線=青」の日本式カスタム - 下段に出来高を表示 - PNG として out_path に保存
要件:- pandas 2.2 / mplfinance 最新- 例外: 列が欠けていれば ValueError- import を含む 1 ファイルで完結まとめ
- ローソク足は 1 本で OHLC をまとめて表す
- 描画は
mplfinanceが手軽。配色をローカライズする場合はmake_marketcolorsを使う - matplotlib だけでも
Rectangle + vlinesで描ける - 形状は単独では弱い手がかり。他の指標・出来高との組み合わせ で意味が増す