ローソク足(candlestick)は、1 本で「ある期間の始値・高値・安値・終値」をまとめて表示できるテクニカル分析の基本図形です。本記事では、OHLC の意味、Python での描画方法、代表的な形状の読み方を順に整理します。

目次

  1. ローソク足が示す 4 つの値
  2. サンプルデータの準備
  3. mplfinance で描画する
  4. matplotlib だけで描く場合
  5. 代表的な形状
  6. 形状を機械的に判定する例

ローソク足が示す 4 つの値

ローソク足は OHLC(Open, High, Low, Close)を 1 つの図形で表します。

  • 始値(Open): その期間の最初に付いた価格
  • 高値(High): その期間の最高値
  • 安値(Low): その期間の最安値
  • 終値(Close): その期間の最後に付いた価格

太い箱状の部分を 実体(body)、上下の細い線を ヒゲ(shadow / wick) と呼びます。

  • 実体の上下端は始値と終値
  • 実体の上から伸びる線は高値、下から伸びる線は安値
  • 終値が始値より高ければ陽線(慣例的に白・赤など)
  • 終値が始値より低ければ陰線(慣例的に黒・青など)

色のルールはチャートツールごとに異なります。日本では「陽線=赤、陰線=青」が一般的、欧米では逆になることが多い点を覚えておくと混乱が減ります。

サンプルデータの準備

サンプルとして、ランダムウォークから OHLC を生成します。

import numpy as np
import 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 をベースにした、ローソク足専用の描画ライブラリです。

Terminal window
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),
)
mplfinance で描いた日足ローソク足と出来高の標準チャート
  • 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 plt
from 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 で描ける
  • 形状は単独では弱い手がかり。他の指標・出来高との組み合わせ で意味が増す