2023年10月以降の運用実績については「投資でニート生活」で更新しています。

Python データ分析 株式投資

【コード解説】Pythonで一目均衡表を計算してチャートで可視化する

2022年6月5日

【コード解説】Pythonで一目均衡表を計算してチャートで可視化する

こんにちは。TATです。

今日のテーマは「【コード解説】Pythonで一目均衡表を計算してチャートで可視化する」です。

 

一目均衡表をPythonで計算する方法について解説していきます。

さらに結果をチャートで可視化する方法についてもご紹介していきます。

 

Pythonを使うと比較的に短いコードで簡単に計算できてしまうので便利です。

 

【コード解説】Pythonで一目均衡表を計算してチャートで可視化する

【コード解説】Pythonで一目均衡表を計算してチャートで可視化する

一目均衡表について

まずは一目均衡表について簡単にご紹介していきます。

 

Ichimoku Cloudをとして知られる日本発祥のテクニカル分析手法

一目均衡表は、1936年細田悟一さんによって考案されたとされているテクニカル分析手法です。

細田悟一のペンネームが一目山人であったことから、一目均衡表と呼ばれるようになりました。

 

考案者である細田悟一さんは研究所を設立して、7年の年月をかけて2,000人の職員と共に一目均衡表を完成させたと言われています。

基本的には株価に基づいて考案されていますが、FXにも利用されます。

FXのアプリを使うと一目均衡表がデフォルトで利用できることが多いです。

 

海外ではIchimokuIchimoku Cloudとして知られており、世界中で利用者がいます。

まさに日本が誇るべき、日本発祥の分析手法です。

 

一目均衡表の特徴

一目均衡表は他のテクニカル分析手法とは異なります。

一番の特徴は、時間軸に注目している点です。

 

一目均衡表は「買い方と売り方の均衡が崩れた方向に相場が動く」という考えに基づいて作られている。また相場の変化の起こる時期を推測する意味でも「時間を重視する」「未来の動きも見る」点も特徴である。

従来の株価チャートの複雑さに対し、この一目均衡表は

  • 直近の売買価格帯の相場水準(転換線基準線
  • 過去との価格比較(遅行スパン
  • 未来における、株保持者の購入価格帯層(先行スパン1, 先行スパン2)

の5本の補助線を利用して相場の動きをチャートに表示している。そして、そのチャートを見ることによって、現在および今後の相場のトレンド、今は買いシグナルか、売りシグナルか、をパッと一目で見ることができる。これは、一目均衡表の名称の通り、まさに「一目で相場の均衡状態を把握できる」ようにしている点が画期的である。

Wikipedia「一目均衡表」より抜粋

 

一目均衡表の計算方法

一目均衡表5本の補助線から構成されています。

それぞれの計算方法は次のとおりです。

 

ポイント

  • 基準線: (当日を含めた過去26日間の最高値 + 最安値) ÷ 2
  • 転換線: (当日を含めた過去9日間の最高値 + 最安値) ÷ 2
  • 先行スパン1: ((転換値+基準値) ÷ 2)を26日先行させたもの
  • 先行スパン2: ((当日を含めた過去52日間の最高値 + 最安値)÷2) を26日先行させたもの
  • 遅行スパン: 当日の終値を26日遅行させてたもの

 

それぞれの計算方法を見るとシンプルですね。

また、先行スパン1と先行スパン2で囲われた部分はと呼ばれ、相場の動向を見ることに役立ちます。

この雲の存在が、英語でIchimoku Cloudと呼ばれる所以です。

 

一目均衡表の売買シグナル

一目均衡表は、5本の補助線から構成されているため、売買シグナルがいろいろあります。

例を挙げておきます。

 

ポイント

  • 転換線と基準線のゴールデンクロスとデッドクロス
    • ゴールデンクロスが発生したら買い、さらに基準線が上向きだとより強力な買いシグナル
    • デッドクロスが発生したら売り、さらに基準線が下向きだとより強力な売りシグナル
  • 遅行線>ローソク足となったら買い、遅行線<ローソク足となったら売り
  • ローソク足>雲となったら買い、ローソク足<雲となったら売り
    • 特に雲が分厚いとより強力なシグナルになる
  • 最強シグナルである三役好転(三役逆転)
    下記の3つの条件を全て満たすと強力なシグナルとなる

    • 転換線>基準線(転換線<基準線)
    • ローソク足>雲(ローソク足<雲)
    • 遅行線>ローソク足(遅行線<ローソク足)

 

さらに雲は抵抗線支持線の役割を果たすことができ、ローソク足<雲ならば雲は上値抵抗線の役割を果たし、ローソク足>雲ならば雲は下値指示線の役割を果たします。

いろいろなシグナルがあるので、最初は混乱しがちですが、使いこなせるとかなり強力なツールになります。

 

Pythonによる一目均衡表の実装

一目均衡表の紹介が終わったところで、ここからはPythonによる一目均衡表の実装について解説していきます。

 

まずはチャートを披露

まずは本記事で紹介するコードで出来上がるチャートをご紹介しておきます。

例として日経平均を使いました。

 

Plotlyで可視化しています。

ここでは一目均衡表をPythonで計算して上記のチャートを完成することを目指します。

 

(おさらい)株価データの用意

まずは株価データの準備です。

今回は例として日経平均株価を用います。

 

yahoo_finance_api2を使ってさくっと取得します。

過去2年分のデータを取得しました。

 

import sys
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
import pandas as pd

my_share = share.Share('^N225')
symbol_data = None
 
try:
    symbol_data = my_share.get_historical(
        share.PERIOD_TYPE_YEAR, 2,
        share.FREQUENCY_TYPE_DAY, 1)
except YahooFinanceError as e:
    print(e.message)
    sys.exit(1)

df = pd.DataFrame(symbol_data)
df["datetime"] = pd.to_datetime(df.timestamp, unit="ms")

 

これで2年分の日経平均株価が取得できます。

 

参考
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する

続きを見る

 

一目均衡表の5本の補助線を計算する

株価データの準備ができたので、早速一目均衡表に必要な5本の補助線をそれぞれ計算していきます。

計算方法は前述したとおりです。もう一回のせておきます。

 

ポイント

  • 基準線: (当日を含めた過去26日間の最高値 + 最安値) ÷ 2
  • 転換線: (当日を含めた過去9日間の最高値 + 最安値) ÷ 2
  • 先行スパン1: ((転換値+基準値) ÷ 2)を26日先行させたもの
  • 先行スパン2: ((当日を含めた過去52日間の最高値 + 最安値)÷2) を26日先行させたもの
  • 遅行スパン: 当日の終値を26日遅行させてたもの

 

これらをPythonで実装していけばOKです。

 

# 基準線
high26 = df["high"].rolling(window=26).max()
low26 = df["low"].rolling(window=26).min()
df["base_line"] = (high26 + low26) / 2

# 転換線
high9 = df["high"].rolling(window=9).max()
low9 = df["low"].rolling(window=9).min()
df["conversion_line"] = (high9 + low9) / 2

# 先行スパン1
leading_span1 = (df["base_line"] + df["conversion_line"]) / 2
df["leading_span1"] = leading_span1.shift(25)

# 先行スパン2
high52 = df["high"].rolling(window=52).max()
low52 = df["low"].rolling(window=52).min()
leading_span2 = (high52 + low52) / 2
df["leading_span2"] = leading_span2.shift(25)

# 遅行スパン
df["lagging_span"] = df["close"].shift(-25)

 

rollingshiftを使うのがポイントです。

rollingは任意の期間における平均値や高値・安値を計算することができます。

shiftはデータを任意期間ずらすことができるので、先行スパン、遅行スパンを計算するときに重宝します。

 

これで一目均衡表に必要な5本の補助線が完成です。

ちょっとカラム数が増えすぎて全部収まっていませんが、きちんと計算できていることが確認できます。

 

Plotlyで可視化したら問題発生w

計算が完了したのでチャートで表示してみましょう。

今回はPlotlyを使います。

 

import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
 
# 非表示にする日付をリストアップ
d_all = pd.date_range(start=df['datetime'].iloc[0],end=df['datetime'].iloc[-1])
d_obs = [d.strftime("%Y-%m-%d") for d in df['datetime']]
d_breaks = [d for d in d_all.strftime("%Y-%m-%d").tolist() if not d in d_obs]
 
# figを定義
fig = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.05, row_width=[0.2, 0.7], x_title="Date")
 
# Candlestick 
fig.add_trace(
    go.Candlestick(x=df["datetime"], open=df["open"], high=df["high"], low=df["low"], close=df["close"], name="OHLC"),
    row=1, col=1
)
 
# Volume
fig.add_trace(
    go.Bar(x=df["datetime"], y=df["volume"], name="Volume"),
    row=2, col=1
)

# 一目均衡表
fig.add_trace(go.Scatter(x=df["datetime"], y=df["base_line"], name="基準線", mode="lines", line=dict(width=1)), row=1, col=1)
fig.add_trace(go.Scatter(x=df["datetime"], y=df["conversion_line"], name="転換線", mode="lines", line=dict(width=1)), row=1, col=1)
fig.add_trace(go.Scatter(x=df["datetime"], y=df["leading_span1"], name="先行スパン1", mode="lines", line=dict(width=1)), row=1, col=1)
fig.add_trace(go.Scatter(x=df["datetime"], y=df["leading_span2"], name="先行スパン2", mode="lines", line=dict(width=1)), row=1, col=1)
fig.add_trace(go.Scatter(x=df["datetime"], y=df["lagging_span"], name="遅行スパン", mode="lines", line=dict(width=1)), row=1, col=1)

fig.add_trace(go.Scatter(x=df["datetime"], y=df["leading_span1"], name="先行スパン1", mode="lines", fill=None, line=dict(width=0, color="gray"), showlegend=False), row=1, col=1)
fig.add_trace(go.Scatter(x=df["datetime"], y=df["leading_span2"], name="先行スパン2", mode="lines", fill='tonexty', line=dict(width=0, color="gray"), showlegend=False), row=1, col=1)

 
# Layout
fig.update_layout(
    title={
        "text": "日経平均の日足チャート",
        "y":0.9,
        "x":0.5,
    }
)
 
# y軸名を定義
fig.update_yaxes(title_text="株価", row=1, col=1)
fig.update_yaxes(title_text="出来高", row=2, col=1)
 
# 不要な日付を非表示にする
fig.update_xaxes(
    rangebreaks=[dict(values=d_breaks)]
)

fig.update(layout_xaxis_rangeslider_visible=False)
fig.show()

 

これで表示されるチャートがこちらです。

 

綺麗に表示できていますね。

5本の補助線はそのまま表示したらカオスになったので、line=dict(width=1))で線の太さを調整しました。

さらにfill='tonexty'を使うと、直近に描いた線との間を塗りつぶしてくれます。

この際は線の太さをゼロにして、色を統一(ここではGray)していくと綺麗になります。

 

ただ、こちらのチャートには1つだけ致命的なミスがあります。

見た瞬間気づいた方はとても鋭いです。

はい、未来の先行スパンが表示されていません。

先行スパン26日先のデータを示しているので、未来26日分(当日を含むので実際には25日分)のデータも表示されるべきです。

しかしながら、このチャートではそれが表示されていません。

 

原因は先行スパン計算時にshift(25)を行った際に未来分のデータが消えてしまっているためです。

最後の5行分のデータを見てみます。

 

最後のデータの日付は2022年5月6日になっているので、これ以降のデータがありません。

この状態でshift関数を使うと、データからはみ出してしまうものは消えてしまいます。

 

これを回避するには未来分のデータを追加してあげる必要があります。

つまり、shiftしても消えないように格納場所を作ってあげるということです。

 

未来の先行スパンを表示するために日付データを追加する

未来分の日付データを加えるのは結構あっさりと実行できます。

ここでshift(25)に必要なデータを格納するために25日分の未来の日付リストを作ってデータを加えます。

 

import datetime

additional_dates = pd.date_range(
    start=df["datetime"].max()+datetime.timedelta(days=1),
    end=df["datetime"].max()+datetime.timedelta(days=25),
)

df = pd.concat([
    df,
    pd.DataFrame(additional_dates, columns=["datetime"])
], ignore_index=True)

 

pandasのdate_rangeを使って、最終日の翌日から25日先までの日付リストを作ります。

それを株価データの末端にくっつけてあげればOKです。

これにはpandasconcat関数を使いました。

 

concat関数を使うとカラムが一致しているデータをがっちゃんこしてくれます。

datetimeで結合されるよう、追加で作成した日付データのカラム名をdatetimeとすればうまく結合されます。

 

ご覧の通り、きちんと未来分の日付データが加えられていることが確認できます。

 

最終日だけ時間が00:00:00ではなく06:15:02となっているので未来のデータも同じ時間になってしまっています。

表示する際には影響ないのでこのままでも問題ないのですが、気になる方は時間を00:00:00に指定するか、そもそもdatetimeではなくdateだけあれば十分なのでdate型に変換してしまうのもいいかと思います。

 

僕は気にせずこのままいきますw

 

(リベンジ)Plotlyで可視化

上記のように未来の日付データを追加した状態で一目均衡表を計算すると、未来分の先行スパンもきちんと居場所があるので失われずにすみます。

 

これを改めて可視化するときちんと未来分のデータも表示することができます。

最初にご紹介したチャートと同じものが出来上がります。

 

未来の先行スパンと雲もきちんと表示できていることが確認できますね。

これで完成です。

 

データの分析・可視化にはPythonが最適!

本記事で紹介したコードは、全てPythonを使って書いています。

 

Pythonデータの分析や可視化を得意とするプログラミング言語で、さらにAI関連のライブラリーも豊富で昨今のAIブームで需要が急拡大しています。

【いますぐ始められます】データ分析をするならPythonが最適です。

 

また、Python比較的学びやすい言語でもあります。

実際、僕は社会人になってからPythonを独学で習得して転職にも成功し、Python独学をきっかけに人生が大きく変わりました。

【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。 

 

Python学習方法についてはいろいろな方法があります。

僕はUdemyを選びましたが、書籍プログラミングスクールも選択肢になります。

【決定版】Python独学ロードマップ【完全初心者からでもOKです】

【まとめ】Pythonが学べるおすすめプログラミングスクール

プログラミングの独学にUdemyをおすすめする理由!【僕はUdemyでPythonを独学しました!】

 

\30日返金保証/

Udemyを詳しく見る

セール中なら90%オフとかで購入可能です!

 

まとめ

いかがでしたでしょうか。

ここでは「【コード解説】Pythonで一目均衡表を計算してチャートで可視化する」というテーマで、Pythonで一目均衡表を計算してPlotlyで可視化する方法について解説しました。

 

日本発祥である一目均衡表は、時間軸を重視する、他の分析手法とは異なるものです。

売買シグナルはもちろん、トレンドの方向や転換を見極めたり、上値抵抗線下値支持線をみたり、1つの指標でたくさんの用途に使うことができます。

 

5本の線から構成されるので最初は混乱しがちですが、うまく使いこなすことができれば強力なツールになります。

Pythonを使うと簡単に計算ができて、綺麗に可視化することができるので、是非とも活用してみてはいかがでしょうか。

 

今後は、一目均衡表における最強シグナルとされている三役好転や三役逆転の判定方法についても解説していければと思います。

今回は、一目均衡表の計算と可視化の解説に留めます。

 

ここまで読んでくださり、ありがとうございました。

 

おすすめPython学習法

Udemy:セール中なら90%オフで購入可能。豊富なコースから選べる!

データミックス:Pythonとビジネスについて学べる!起業したい方にもおすすめ!

SAMURAI TERAKOYA:月額2,980円〜利用できるコスパ最強スクール!

 

-Python, データ分析, 株式投資
-, , , ,

© 2023 気ままなブログ