【Pythonテクニカル分析】一目均衡表の算出と描画
相場のバランスを見ることができる一目均衡表をPythonで計算して描画していきます。
使用ライブラリ
株価データはpandas_datareaderを使用し、日経平均を取得しています。
また、ローソク足を描画するためにmplfinanceを使用しています。
環境
Windows11
python 3.9.13
工夫点
先行スパン(leading_span)を計算して26日後にプロットするために、あらかじめdate_rangeを使用して未来日付を作成してデータフレームに追加しています。ただし、これは翌日から単純に26日後を計算しているだけですので、市場が開いているかどうかまでは加味していません。
もう一つはキャンドルチャートを重ねて描画するためにmplfinanceを使用していますが、matplotlibとmplfinanceを両方重ねて表示することが難しかったため、すべての線をmplfinanceで描画しています。make_addplotを使用することでチャートを重ねて表示することができますが、先行スパン1,2を塗りつぶすためのfill_betweenはmpl.plotの中に入れないと思った通りに動かず、少し時間がかかりました。
コード
# ライブラリの読み込み
import pandas_datareader as pdr
import pandas as pd
from datetime import datetime, timedelta
import mplfinance as mpf
# データ取得期間設定
current_date = datetime.now()
two_years_ago = current_date - timedelta(days=365) # 1年前を設定
formatted_date = two_years_ago.strftime("%Y-%m-%d")
df = pdr.DataReader('^NKX', 'stooq',start=formatted_date) # データの取得
df.sort_values('Date', inplace=True) # 日付順にソート
# 期間指定
T1 = 9
T2 = 26
T3 = 52
# 未来日付追加
start_date = df.tail(1).index.to_list()[0] +timedelta(days=1)
future_date = pd.date_range(start=start_date.strftime("%Y-%m-%d"), periods=T2, freq='D')
df_future = pd.DataFrame([], columns=df.columns, index=future_date)
df_con = pd.concat([df, df_future])
# 一目均衡表の値計算
df_con['conversion'] = (df_con['High'].rolling(T1).max() + df_con['Low'].rolling(T1).min()) / 2
df_con['base_line'] = (df_con['High'].rolling(T2).max() + df_con['Low'].rolling(T2).min()) / 2
df_con['lagging_span'] = df_con['Close'].shift(-T2)
df_con['leading_span1'] = ((df_con['conversion'] + df_con['base_line']) / 2).shift(T2)
df_con['leading_span2'] = ((df_con['High'].rolling(T3).max() + df_con['Low'].rolling(T3).min()) / 2).shift(T2)
# mplfinanceでグラフ化
adds = [
mpf.make_addplot(df_con['conversion'], label='Conversion', color='g', width=1, alpha=0.5),
mpf.make_addplot(df_con['base_line'], label='Base Line', width=0.5),
mpf.make_addplot(df_con['lagging_span'], label='Lagging Span', width=0.5),
mpf.make_addplot(df_con['leading_span1'], label='Leading Span1', width=0.5),
mpf.make_addplot(df_con['leading_span2'], label='Leading Span2', width=0.5),
]
mpf.plot(df_con[df.columns], type='candle', volume=True, style='yahoo', figsize=(11,8), addplot=adds, fill_between=dict(y1=df_con['leading_span1'].values,y2=df_con['leading_span2'].values, color='gray', alpha=0.5))
mpf.show()
以上です。