一目均衡表(いちもくきんこうひょう、Ichimoku Kinko Hyo)は、日本で生まれたテクニカル指標で、5 本の線と「雲(クラウド)」によってトレンドと支持・抵抗をひと目で把握しようとするものです。本記事では、5 本の計算式・pandas 実装・雲の描画までを順に整理します。
目次
- 5 本の構成要素
- 計算式
- サンプルデータの準備
- 5 本を一括で計算する
- 雲を描画する
- 読み方のポイント
- 雲の上下を機械的に判定する
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 日を見ます。
計算式
期間 の高値と安値の中点を「ミッドポイント」と呼びます。
これを使って、各線は次のように作ります。
「先行表示」「遅行表示」は、グラフ上で 未来側 / 過去側にずらして描く ことを意味します。pandas では shift(26) / shift(-26) を使います。
サンプルデータの準備
import numpy as npimport pandas as pd
rng = np.random.default_rng(seed=314)n = 260returns = 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_between の where 引数で、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_betweenのwhere引数で行う - 単独で機械的売買に使うより、補助指標として全体感を掴む用途が現実的