
【Python】移動平均線からの乖離率を算出
乖離率は、移動平均線とローソク足の終値がどれくらい離れているかを割合(%)で表したものです。株価は移動平均線から離れすぎないという平均回帰の性質を利用して判断するものです。銘柄によってばらつきがありますが、一般に株価が移動平均から5~10%離れると、移動平均線寄りに株価が戻るといわれているようです。
ここでは単純移動平均線(SMA:Simple Moving Average)からの乖離率を算出します。
単純移動平均線からの乖離率の計算式$${\\}$$
乖離率(%) = ( 終値 / 平均値 ) × 100
なお、最低限のポイントのみの説明にするため、Pythonライブラリ、モジュール等のインストール方法については割愛させて頂きます。お使いのPC環境等に合わせてインストールしてもらえればと思います。
1.株価データを取得する
単純移動平均線からの乖離率を算出するには、pandasのDataFrameオブジェクトにデータを用意する必要があります。ここでは、下記を参考にOHLCV(始値 / 高値 / 安値 / 終値 / 出来高)形式の日経平均株価(^NKX)データを取得します。データの取得期間は、2023年3月1日から現在の日付までです。
import pandas_datareader.data as web
import datetime
start = '2023-03-01'
end = datetime.date.today()
df = web.DataReader('^NKX', 'stooq', start, end)
2.単純移動平均線と乖離率を計算する
単純移動平均からの乖離率は、終値と平均値の差がどれくらいの割合かを計算することで求めることができます。下記は5日移動平均と5日移動平均からの乖離率を算出してデータフレームに乖離率を追加しています。
import talib as ta
# 移動平均
df['ma5'] = ta.SMA(df['Close'], 5)
# 乖離率
df['ma5_deviation_rate'] = (df['Close'] - df['ma5']) / df['ma5'] * 100

3.移動平均線チャートに乖離率を追加する
次のコードでは5日と25日の移動平均線をローソク足チャートに加えて、更に5日と25日の移動平均線からの乖離率をチャートに追加しています。
移動平均線とそこからの乖離率を計算して、addplotで追加しています。addplotの中には、リスト形式で表示したいデータを指定します。
import mplfinance as mpf
import talib as ta
# 移動平均
df['ma5'] = ta.SMA(df['Close'], 5)
df['ma25'] = ta.SMA(df['Close'], 25)
# 乖離率
df['ma5_deviation_rate'] = (df['Close'] - df['ma5']) / df['ma5'] * 100
df['ma25_deviation_rate'] = (df['Close'] - df['ma25']) / df['ma25'] * 100
apd = [
# 移動平均線
mpf.make_addplot(df['ma5'], color='blue', panel=0, width=0.7),
mpf.make_addplot(df['ma25'], color='green', panel=0, width=0.7),
# 5日移動平均乖離率
mpf.make_addplot(df['ma5_deviation_rate'], color='blue', width=0.9, panel=1),
# 25日移動平均乖離率
mpf.make_addplot(df['ma25_deviation_rate'], color='green', width=0.9, panel=2),
]
# ラベルをつけてチャートを表示
fig, axes = mpf.plot(df, type='candle', addplot=apd, returnfig=True)
# ラベルを追加
axes[0].legend(['MA5', 'MA25'])
axes[2].legend(['MA5_deviation_rate'])
axes[4].legend(['MA25_deviation_rate'])
# チャートを表示
fig.show()

単純移動平均線の描画は下記を参考
これで、Pythonを使用して単純移動平均線(SMA)とそこからの乖離率を描くことができました。