【初心者向け】移動平均線の統計的な意味とPythonでの実装方法

※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。

移動平均線は「統計的フィルター」である

チャートでよく見る移動平均線は、単なるテクニカル指標ではありません。統計学的にはノイズを除去して本質的なトレンドを浮かび上がらせるフィルターです。

株価は日々細かく上下しますが、その「ノイズ(ランダムな変動)」を平滑化することで、中長期的なトレンドが見えてきます。

3種類の移動平均の違い

種類 計算方法 特徴 向いているシーン
SMA(単純移動平均) 過去N日の終値の平均 シンプルで理解しやすい 中長期トレンド確認
EMA(指数移動平均) 直近の価格に高いウェイト 直近の動きに敏感 短期・デイトレード
WMA(加重移動平均) 時系列に比例したウェイト EMAとSMAの中間 バランス重視

EMAはSMAと比べて最新の価格を重視するため、トレンドの転換を早く検知できますが、ダマシも多くなります。

Pythonで3種類を計算・比較する

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

matplotlib.rcParams['font.family'] = 'Meiryo'

# ==============================
# 設定エリア
# ==============================
SYMBOL  = "7203.T"   # トヨタ自動車
PERIOD  = "6mo"      # 過去6ヶ月
SHORT_N = 25         # 短期移動平均の日数
LONG_N  = 75         # 長期移動平均の日数

# ==============================
# データ取得
# ==============================
df = yf.Ticker(SYMBOL).history(period=PERIOD)
close = df["Close"]

# ==============================
# 各移動平均の計算
# ==============================
# SMA(単純移動平均)
sma_short = close.rolling(window=SHORT_N).mean()
sma_long  = close.rolling(window=LONG_N).mean()

# EMA(指数移動平均)※ span=日数でSMAとほぼ同じウィンドウ感
ema_short = close.ewm(span=SHORT_N, adjust=False).mean()
ema_long  = close.ewm(span=LONG_N,  adjust=False).mean()

# WMA(加重移動平均)
def wma(series, n):
    weights = np.arange(1, n + 1)  # 1, 2, 3, ... n のウェイト
    return series.rolling(n).apply(lambda x: np.dot(x, weights) / weights.sum(), raw=True)

wma_short = wma(close, SHORT_N)
wma_long  = wma(close, LONG_N)

# ==============================
# グラフ描画
# ==============================
fig, axes = plt.subplots(3, 1, figsize=(12, 12), sharex=True)

for ax, short, long, label in zip(
    axes,
    [sma_short, ema_short, wma_short],
    [sma_long,  ema_long,  wma_long],
    ["SMA(単純移動平均)", "EMA(指数移動平均)", "WMA(加重移動平均)"]
):
    ax.plot(close, color='gray', linewidth=0.8, alpha=0.7, label='終値')
    ax.plot(short, color='blue',  linewidth=1.5, label=f'{label} {SHORT_N}日')
    ax.plot(long,  color='red',   linewidth=1.5, label=f'{label} {LONG_N}日')
    ax.set_title(label)
    ax.legend(loc='upper left', fontsize=8)
    ax.grid(True, alpha=0.3)

plt.suptitle(f"{SYMBOL} 移動平均線比較", fontsize=14)
plt.tight_layout()
plt.savefig("moving_averages.png", dpi=150)
plt.show()
print("グラフを保存しました: moving_averages.png")

ゴールデンクロス・デッドクロスの検出

短期移動平均が長期移動平均を上抜けしたときをゴールデンクロス(買いシグナル)、下抜けしたときをデッドクロス(売りシグナル)と呼びます。統計的には「短期の平均が長期の平均を上回る=直近の勢いが平均を超えた」という意味です。

まとめ

  • 移動平均線は株価のノイズを除去するための統計的フィルター
  • SMAはシンプル、EMAは最新価格重視、WMAはその中間
  • 短期と長期を組み合わせることでトレンドの転換点を検出できる
  • Pythonのrolling()とewm()で簡単に計算できる
タイトルとURLをコピーしました