先日、保有している製造メーカー株がじわじわ下がっていて「あれ、これ下げトレンドに入ったのかな?」と思いながらも判断できず、結局何もできなかった。。。そのとき先輩トレーダーのブログで「一目均衡表で雲を割れたらアウト」という一文を見て、ちゃんと勉強しようと思い立った。日本発の指標なのに僕は全然使えていなかった。
一目均衡表って何?(復習がてら)
一目均衡表は1936年に細田悟一氏が考案したテクニカル指標で、5本の線と「雲(くも)」と呼ばれる帯で構成されている。ローソク足チャートの上に重ねると、トレンドの方向・勢い・サポート・レジスタンスが「一目」でわかる、という触れ込みの指標だ。海外でも「Ichimoku Cloud」として普及していて、FXトレーダーにも人気がある。
5つの要素はこちら:
転換線(9日間の高値+安値)÷2
基準線(26日間の高値+安値)÷2
先行スパン1(転換線+基準線)÷2 → 26日先にプロット
先行スパン2(52日間の高値+安値)÷2 → 26日先にプロット
遅行スパン 終値を26日前にプロット
先行スパン1と2に挟まれた領域が「雲」。価格が雲の上にあれば上昇トレンド、下にあれば下降トレンドと判断する。シンプルな理屈なのだが、計算は意外と面倒くさい→ だからPythonで自動化したい。
Pythonで一目均衡表を計算する
まずはyfinanceでデータ取得して、pandasだけで全計算する。ライブラリの追加インストールは不要だ。
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
# トヨタ自動車(7203.T)を例に使う
ticker = "7203.T"
df = yf.download(ticker, start="2024-01-01", end="2026-06-24", auto_adjust=True)
df = df[["Open", "High", "Low", "Close"]]
def calc_ichimoku(df, n1=9, n2=26, n3=52):
"""一目均衡表の5本線を計算する"""
high = df["High"]
low = df["Low"]
close = df["Close"]
# 転換線
tenkan = (high.rolling(n1).max() + low.rolling(n1).min()) / 2
# 基準線
kijun = (high.rolling(n2).max() + low.rolling(n2).min()) / 2
# 先行スパン1(26日先にシフト)
senkou_a = ((tenkan + kijun) / 2).shift(n2)
# 先行スパン2(26日先にシフト)
senkou_b = ((high.rolling(n3).max() + low.rolling(n3).min()) / 2).shift(n2)
# 遅行スパン(26日前にシフト)
chikou = close.shift(-n2)
return tenkan, kijun, senkou_a, senkou_b, chikou
tenkan, kijun, senkou_a, senkou_b, chikou = calc_ichimoku(df)
print("転換線(直近):", tenkan.iloc[-1])
print("基準線(直近):", kijun.iloc[-1])
print("先行スパン1:", senkou_a.iloc[-1])
print("先行スパン2:", senkou_b.iloc[-1])
rolling().max()とrolling().min()を組み合わせるだけ。移動平均とは計算方法が違う(高値と安値の中値)ところが一目均衡表のポイントだ。
チャートに描画してみる
matplotlibで可視化する。雲の部分は fill_between() で塗りつぶす。
fig, ax = plt.subplots(figsize=(14, 7))
# ローソク足の代わりに終値だけ
ax.plot(df.index, df["Close"], color="#e6edf3", linewidth=1.2, label="終値")
# 5本線
ax.plot(df.index, tenkan, color="#f87171", linewidth=1.0, label="転換線")
ax.plot(df.index, kijun, color="#38bdf8", linewidth=1.0, label="基準線")
ax.plot(df.index, senkou_a, color="#34d399", linewidth=0.8, linestyle="--", label="先行スパン1")
ax.plot(df.index, senkou_b, color="#fb923c", linewidth=0.8, linestyle="--", label="先行スパン2")
ax.plot(df.index, chikou, color="#a78bfa", linewidth=0.8, alpha=0.7, label="遅行スパン")
# 雲を塗りつぶす
ax.fill_between(df.index, senkou_a, senkou_b,
where=(senkou_a >= senkou_b), alpha=0.2, color="#34d399", label="雲(上昇)")
ax.fill_between(df.index, senkou_a, senkou_b,
where=(senkou_a < senkou_b), alpha=0.2, color="#f87171", label="雲(下降)")
ax.set_facecolor("#0d1117")
fig.patch.set_facecolor("#0d1117")
ax.tick_params(colors="#8b949e")
ax.spines[:].set_color("#30363d")
ax.legend(loc="upper left", fontsize=8, facecolor="#161b22", labelcolor="#e6edf3")
ax.set_title(f"一目均衡表 - {ticker}", color="#f0f6fc", fontsize=14)
plt.tight_layout()
plt.savefig("ichimoku_7203.png", dpi=150, facecolor="#0d1117")
plt.show()
三役好転・三役逆転でシグナルを自動検出する
一目均衡表には「三役好転」という強い買いシグナルがある。3つの条件が同時に成立したとき、強いトレンドの始まりと判断する。
① 転換線が基準線を上抜け(好転)
② 価格が雲の上にある
③ 遅行スパンが価格を上抜け
これをコードで自動判定する:
def detect_sanryu(df, tenkan, kijun, senkou_a, senkou_b, chikou):
"""三役好転・三役逆転を検出する"""
close = df["Close"]
# 前日と本日の比較で「クロス」を検出
tenkan_kijun_cross_up = (tenkan.shift(1) <= kijun.shift(1)) & (tenkan > kijun)
tenkan_kijun_cross_dn = (tenkan.shift(1) >= kijun.shift(1)) & (tenkan < kijun)
# 価格と雲の位置関係
above_cloud = (close > senkou_a) & (close > senkou_b)
below_cloud = (close < senkou_a) & (close < senkou_b)
# 遅行スパンの位置(26日前の価格と比較)
chikou_above = chikou > close.shift(-26)
chikou_below = chikou < close.shift(-26)
# 三役好転
sanryu_kaiten = tenkan_kijun_cross_up & above_cloud & chikou_above
# 三役逆転
sanryu_gyakuten = tenkan_kijun_cross_dn & below_cloud & chikou_below
return sanryu_kaiten, sanryu_gyakuten
kaiten, gyakuten = detect_sanryu(df, tenkan, kijun, senkou_a, senkou_b, chikou)
print("三役好転の発生日:")
print(df[kaiten].index.strftime("%Y-%m-%d").tolist())
print("三役逆転の発生日:")
print(df[gyakuten].index.strftime("%Y-%m-%d").tolist())
製造メーカー株で実際に試した結果
トヨタ(7203)、デンソー(6902)、ファナック(6954)の3銘柄で三役好転シグナルを出してみた。面白かったのは、ファナックが直近で三役好転を示していたこと。ただし「シグナルが出た」=「即買い」ではなく、出来高や決算の状況もあわせて確認しないと厳禁だ。一目均衡表はあくまで方向性を見るツール、と自分に言い聞かせている。
過去データでの勝率は銘柄によってまちまちで、特にレンジ相場ではダマシが多い。。。三役好転が出たのに翌日すぐ反落、というのを何度か経験した。相場環境(トレンド/レンジの判定)とセットで使うのが正解っぽい。
まとめ
一目均衡表はrolling().max()/min()とshift()を組み合わせるだけで、pandasだけで全計算できる。三役好転/逆転の自動検出もコード化すれば、毎朝の銘柄チェックが楽になる。次は実際にスクリーニングリストに組み込んで、複数銘柄を一括チェックできるようにしたい。雲の厚みで相場のレンジ度合いも判定できそうなので、そのロジックも試してみるつもりだ。

