一目均衡表(いちもくきんこうひょう、Ichimoku Kinko Hyo)は、日本で生まれたテクニカル指標で、5 本の線と「雲(クラウド)」によってトレンドと支持・抵抗をひと目で把握しようとするものです。本記事では、5 本の計算式・pandas 実装・雲の描画までを順に整理します。

目次

  1. 5 本の構成要素
  2. 計算式
  3. サンプルデータの準備
  4. 5 本を一括で計算する
  5. 雲を描画する
  6. 読み方のポイント
  7. 雲の上下を機械的に判定する

5 本の構成要素

一目均衡表は次の 5 本で構成されます。

名称別名役割
転換線(Tenkan)Conversion Line短期トレンド
基準線(Kijun)Base Line中期トレンド
先行スパン 1(Senkou Span A)Leading Span A雲の上端候補
先行スパン 2(Senkou Span B)Leading Span B雲の下端候補
遅行スパン(Chikou)Lagging Span過去との比較

慣例パラメータは (9, 26, 52) で、転換線が 9 日、基準線と遅行スパンの遡り幅が 26 日、先行スパン 2 が 52 日を見ます。

計算式

期間 NN の高値と安値の中点を「ミッドポイント」と呼びます。

MidN(t)=maxi=0..N1Hti+mini=0..N1Lti2\mathrm{Mid}_N(t) = \frac{\max_{i=0..N-1} H_{t-i} + \min_{i=0..N-1} L_{t-i}}{2}

これを使って、各線は次のように作ります。

Tenkant=Mid9(t)\text{Tenkan}_t = \mathrm{Mid}_9(t) Kijunt=Mid26(t)\text{Kijun}_t = \mathrm{Mid}_{26}(t) Senkou At=Tenkant+Kijunt2を 26 日先行表示\text{Senkou A}_t = \frac{\text{Tenkan}_t + \text{Kijun}_t}{2} \quad \text{を 26 日先行表示} Senkou Bt=Mid52(t)を 26 日先行表示\text{Senkou B}_t = \mathrm{Mid}_{52}(t) \quad \text{を 26 日先行表示} Chikout=Closetを 26 日遅行表示\text{Chikou}_t = \text{Close}_t \quad \text{を 26 日遅行表示}

「先行表示」「遅行表示」は、グラフ上で 未来側 / 過去側にずらして描く ことを意味します。pandas では shift(26) / shift(-26) を使います。

サンプルデータの準備

import numpy as np
import pandas as pd
rng = np.random.default_rng(seed=314)
n = 260
returns = rng.normal(loc=0.0006, scale=0.012, size=n)
close = 2200 * np.exp(np.cumsum(returns))
high = close * (1 + np.abs(rng.normal(scale=0.007, size=n)))
low = close * (1 - np.abs(rng.normal(scale=0.007, size=n)))
ohlc = pd.DataFrame(
{"H": high, "L": low, "C": close},
index=pd.date_range("2025-09-01", periods=n, freq="B"),
)

5 本を一括で計算する

def ichimoku(
df: pd.DataFrame,
n_short: int = 9,
n_mid: int = 26,
n_long: int = 52,
) -> pd.DataFrame:
"""一目均衡表の 5 本を返す。"""
high, low, close = df["H"], df["L"], df["C"]
def mid(window: int) -> pd.Series:
return (high.rolling(window).max() + low.rolling(window).min()) / 2
tenkan = mid(n_short)
kijun = mid(n_mid)
senkou_a = ((tenkan + kijun) / 2).shift(n_mid) # 26 日先行
senkou_b = mid(n_long).shift(n_mid) # 26 日先行
chikou = close.shift(-n_mid) # 26 日遅行
return pd.DataFrame({
"tenkan": tenkan,
"kijun": kijun,
"senkou_a": senkou_a,
"senkou_b": senkou_b,
"chikou": chikou,
})
ich = ichimoku(ohlc)
print(ich.tail())

shift(26) で「26 日後の位置に表示するデータ」を作っています。先行スパンは tail で見ると最新側に NaN がなく、未来日の値が並びます。

雲を描画する

雲は 先行スパン 1 と 2 の間を塗りつぶし、A > B なら緑系、A < B なら赤系の色にします。

import matplotlib.pyplot as plt
df = ohlc.join(ich)
# 雲は未来 26 日まで延びるため、index を拡張する
future = pd.DataFrame(
index=pd.date_range(df.index[-1] + pd.Timedelta(days=1), periods=26, freq="B")
)
df = pd.concat([df, future])
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(df.index, df["C"], color="black", linewidth=0.8, label="C")
ax.plot(df.index, df["tenkan"], color="tab:red", linewidth=0.8, label="Tenkan(9)")
ax.plot(df.index, df["kijun"], color="tab:blue", linewidth=0.8, label="Kijun(26)")
ax.plot(df.index, df["senkou_a"], color="tab:green", linewidth=0.6, label="Senkou A")
ax.plot(df.index, df["senkou_b"], color="tab:orange", linewidth=0.6, label="Senkou B")
ax.plot(df.index, df["chikou"], color="tab:purple", linewidth=0.6, label="Chikou (lag 26)")
# 雲(クラウド)
ax.fill_between(df.index, df["senkou_a"], df["senkou_b"],
where=df["senkou_a"] >= df["senkou_b"], color="tab:green", alpha=0.15)
ax.fill_between(df.index, df["senkou_a"], df["senkou_b"],
where=df["senkou_a"] < df["senkou_b"], color="tab:red", alpha=0.15)
ax.set_title("Ichimoku Kinko Hyo (9, 26, 52)")
ax.set_xlabel("Date")
ax.set_ylabel("Price")
ax.legend(loc="upper left", fontsize=9)
ax.grid(alpha=0.3)
plt.tight_layout()
plt.savefig("ichimoku.png", dpi=120)
plt.close(fig)
転換線・基準線・先行スパンと雲を重ねた一目均衡表のチャート

fill_betweenwhere 引数で、A > B と A < B の領域を別の色で塗り分けるのが定番です。

読み方のポイント

観察ポイント一般的な解釈
価格 > 雲上昇基調(雲がサポートに)
価格 < 雲下落基調(雲がレジスタンスに)
価格が雲を上抜け上昇トレンド転換の兆し
価格が雲を下抜け下落トレンド転換の兆し
転換 > 基準短期の勢いが中期を上回る
雲の厚み厚いほどサポート・レジスタンスが強いとされる
Chikou が当時の価格を上回る過去より強い状態

「3 つの好転」「3 つの逆転」のように複数条件を組み合わせて見るのが原典の流派です。本記事では、機械的にすべて再現する深掘りには立ち入らず、5 本の構造を押さえるところで留めます。

雲の上下を機械的に判定する

価格が雲の上にあるか・下にあるか・中にあるかをラベル化します。

def cloud_position(row: pd.Series) -> str:
a, b, c = row["senkou_a"], row["senkou_b"], row["C"]
if pd.isna(a) or pd.isna(b) or pd.isna(c):
return "na"
upper = max(a, b)
lower = min(a, b)
if c > upper:
return "above"
if c < lower:
return "below"
return "inside"
df["cloud_pos"] = df.apply(cloud_position, axis=1)
print(df["cloud_pos"].value_counts())

「inside」が長く続く区間は、トレンドの方向感が無い時期と読みます。

注意点

  • 遅行性: Mid 計算が中心のため、急変動には追随が遅れる
  • 先行スパンは未来日に描画される: 26 日前のデータで作っているので、「今日の雲」と「26 日先の雲」を混同しない
  • 慣行パラメータは日本市場の営業日(過去の慣例)に基づく: 今は週 5 日制が定着しているが、原典は週 6 日制時代に作られた点を踏まえると、別パラメータを試す価値もある
  • 単独売買シグナルとしての強さ: 単一指標としての検定結果は banner ほど強くない、と複数の研究が指摘している

生成AI へのプロンプト例

ロング形式の DataFrame に対し、Code ごとの一目均衡表を計算する関数を依頼します。

入力 DataFrame:
- columns: Date, Code, H, L, C
Code ごとに一目均衡表(9, 26, 52) を計算し、
- tenkan, kijun, senkou_a, senkou_b, chikou
の 5 列を追加した DataFrame を返す関数 add_ichimoku(df) を書いてください。
要件:
- pandas 2.2 系
- Code 内で日付昇順に整列
- senkou_a / senkou_b は 26 日先行(shift(26))
- chikou は 26 日遅行(shift(-26))
- 末尾に動作確認サンプルを付ける

まとめ

  • 一目均衡表は 5 本の線と「雲」で構成される日本発のテクニカル指標
  • 5 本の核は 高値と安値の中点(midpoint) の長さ違い
  • 先行スパン・遅行スパンは shift(26) / shift(-26) で表現する
  • 雲の塗り分けは fill_betweenwhere 引数で行う
  • 単独で機械的売買に使うより、補助指標として全体感を掴む用途が現実的