一目均衡表をPythonで実装して日本株に使う【製造メーカー株でも試した】

Python実装・コード

先日、保有している製造メーカー株がじわじわ下がっていて「あれ、これ下げトレンドに入ったのかな?」と思いながらも判断できず、結局何もできなかった。。。そのとき先輩トレーダーのブログで「一目均衡表で雲を割れたらアウト」という一文を見て、ちゃんと勉強しようと思い立った。日本発の指標なのに僕は全然使えていなかった。

一目均衡表って何?(復習がてら)

一目均衡表は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だけで全計算できる。三役好転/逆転の自動検出もコード化すれば、毎朝の銘柄チェックが楽になる。次は実際にスクリーニングリストに組み込んで、複数銘柄を一括チェックできるようにしたい。雲の厚みで相場のレンジ度合いも判定できそうなので、そのロジックも試してみるつもりだ。

タイトルとURLをコピーしました