Pythonで移動平均乖離率を計算・表示する方法【pandas】

Uncategorized

※本記事には広告・アフィリエイトリンクが含まれます。収益はサイト運営・検証費用に充てています。

結論から言うと:

  • 移動平均乖離率は「(終値 − 移動平均) ÷ 移動平均 × 100」で計算でき、pandasの2行で実装できる仕組みです
  • 乖離率が大きくマイナスになった(売られ過ぎ)タイミングを反発の目安として使う手法が代表的です
  • MACD・RSIと組み合わせることで、エントリータイミングの精度が向上する

乖離率とは(計算式)

移動平均乖離率とは、現在の株価が移動平均線からどれだけ離れているかをパーセントで表した指標です。計算式は次の通りです。

乖離率(%) = (終値 − 移動平均) ÷ 移動平均 × 100

乖離率がプラスの場合は移動平均より上(割高)、マイナスの場合は移動平均より下(割安・売られ過ぎ)という状態を示す仕組みです。

Pythonで計算するコード

import yfinance as yf
import pandas as pd

# データ取得
df = yf.download("7203.T", period="1y")
close = df['Close']

# 25日移動平均
df['MA25'] = close.rolling(window=25).mean()

# 乖離率
df['Deviation25'] = (close - df['MA25']) / df['MA25'] * 100

print(df[['Close', 'MA25', 'Deviation25']].tail(10))

チャートに重ねて表示

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 8), sharex=True)

# 上段:株価と移動平均
ax1.plot(df.index, df['Close'], label='終値', color='black', linewidth=1)
ax1.plot(df.index, df['MA25'], label='MA25', color='blue', linewidth=1.5)
ax1.set_title('株価と25日移動平均')
ax1.legend()
ax1.grid(True, alpha=0.3)

# 下段:乖離率(棒グラフ)
colors = ['red' if v >= 0 else 'blue' for v in df['Deviation25'].fillna(0)]
ax2.bar(df.index, df['Deviation25'], color=colors, alpha=0.6, label='乖離率(%)')
ax2.axhline(y=5, color='red', linestyle='--', alpha=0.7, label='+5%')
ax2.axhline(y=-5, color='blue', linestyle='--', alpha=0.7, label='-5%')
ax2.axhline(y=0, color='gray', linestyle='-', alpha=0.5)
ax2.set_title('25日移動平均乖離率(%)')
ax2.legend()
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('deviation.png')
print('保存: deviation.png')

閾値でシグナルを出す

乖離率に閾値を設けてシグナルを生成できます。

# -5%以下で買いシグナル、+5%以上で売りシグナル
df['Signal'] = 0
df.loc[df['Deviation25'] <= -5, 'Signal'] = 1   # 買い
df.loc[df['Deviation25'] >= 5, 'Signal'] = -1   # 売り

# シグナル発生日を抽出
buy_signals = df[df['Signal'] == 1]
sell_signals = df[df['Signal'] == -1]
print(f"買いシグナル回数: {len(buy_signals)}")
print(f"売りシグナル回数: {len(sell_signals)}")

MACD・RSIとの組み合わせ

乖離率単独では偽シグナルが発生しやすいため、RSIと組み合わせるのが実践的です。たとえば「乖離率が-5%以下かつRSIが30以下」という条件を組み合わせると、売られ過ぎの判定精度が向上する仕組みです。移動平均の期間は5日(短期)、25日(中期)、75日(長期)を使い分けることが多く、期間によって見えるサイクルが変わります。

筆者の検証メモ

乖離率のシグナルは相場の性質によって有効な閾値が異なる。ボラティリティが高い銘柄では±5%では頻繁にシグナルが出過ぎるため、±8〜10%に広げた方が精度が上がる傾向があった。また、乖離率は平均回帰性(mean reversion)を前提にした指標であるため、強いトレンドが続く銘柄では逆張りシグナルが機能しにくい点に注意が必要です。

データ取得比較記事はこちら


【投資免責事項】本記事で紹介するコードおよび分析結果は情報提供を目的としたものであり、特定の銘柄への投資を推奨するものではありません。投資判断はご自身の責任で行ってください。

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