移動平均線(Moving Average, MA)
移動平均線は、価格ノイズを平滑化してトレンドの方向、強さ、転換を捉える最も基本的なテクニカル指標です。単体で使うより、上位足の方向確認、動的サポート/レジスタンス、他指標のフィルタとして使うのが実践的です。

架空データによるイメージ図(実際の相場データではありません)。短期線(SMA 20)が長期線(SMA 50)を下から上抜けるゴールデンクロスの例。
定義
SMA(Simple Moving Average, 単純移動平均)
過去 本の終値を単純平均します。
- 実装は素直だが、全期間を等しく扱うため反応が遅い
- 大口プレーヤーの意識線として使われやすい(200SMA など)
EMA(Exponential Moving Average, 指数平滑移動平均)
新しい価格ほど重みが大きくなるように再帰的に平滑化します。
- SMA より反応が速いがダマシも多い
- MACD などの派生指標の内部でも使われる
WMA(Weighted Moving Average, 加重移動平均)
期間内で線形に重みをつけます(直近ほど重い)。
- EMA と SMA の中間的な特性
- 短期のブレイクを拾いやすい
代表的な期間
| 期間 | 呼称 | 主な用途 |
|---|---|---|
| 5 / 10 | 短期線 | 直近の勢い、スキャルの意識線 |
| 20 / 25 | 中期線 | 日中トレンド、ボリンジャーバンドの中央線 |
| 50 / 75 | 中長期線 | スイングのトレンド判定 |
| 100 | 中長期線 | 日足での押し目/戻り目 |
| 200 | 長期線 | 相場の大局判定。海外勢が強く意識する |
USD/JPY は 200SMA(日足)と 89 / 200EMA(4H)が特に機能する傾向があります。
シグナル
クロス
- ゴールデンクロス:短期 MA が長期 MA を上抜け → 買いシグナル
- デッドクロス:短期 MA が長期 MA を下抜け → 売りシグナル
- 単発では遅行性が強く、レンジでは連続してダマされる
パーフェクトオーダー
短期 > 中期 > 長期(or 逆)の順に整列した状態。トレンドの強さを示します。順張り戦略のエントリー条件として使うと勝率が上がりやすくなります。
グランビルの法則
MA と価格の位置関係から8つのシグナルを定義する古典。要約すると次のとおりです。
買いパターン
- MA 上向き + 価格が MA を下から上抜け
- MA 上向き + 価格が一時的に MA を割るが再度上抜け
- MA 上向き + 価格が MA 上で反発
- MA 下向きだが価格が MA から大きく乖離 → 自律反発狙い
売りパターンは 1–4 の反転。
動的サポート/レジスタンス
トレンド中の押し目、戻り目で MA が反発点になります。上位足の MA ほど強く効きます。USD/JPY 日足 200SMA タッチは節目として意識されます。
USD/JPY での使いどころ
- 日足 200SMA:年間のトレンド判定。上抜け/下抜けは長期方針の転換
- 4H 89EMA:スイング押し目候補。フィボナッチ 61.8% と重なると強い
- 1H 20SMA + 75SMA:デイトレの短期トレンド確認と押し目
- 東京 → ロンドン移行時(JST 16:00 前後) で MA を跨ぐブレイクは伸びやすいが、東京仲値(JST 09:55)前後は反転しやすいので注意
落とし穴
- レンジではノイズ製造機:MA の傾きがフラット(例: 20本前と現在の差が 20 pips 未満)のときはクロスを無視する
- ラグ:SMA(200) は約100本前の情報が中心。転換点では常に遅れる
- 最適化過剰:バックテストで期間を細かくグリッドサーチすると簡単にオーバーフィットする。整数刻み(10, 20, 50, 200 等)の「意識される値」を優先する
- 時間足を混在させない:上位足 MA を下位足に重ねる場合、必ず「上位足の値を静的に固定して描画」すること。下位足で再計算すると別物になる
- ゴールデンクロス単体でエントリーしない:上位足の方向 + 価格構造(高値/安値切り上げ)と組み合わせる
Python 実装スケッチ
import pandas as pd
def sma(series: pd.Series, n: int) -> pd.Series: return series.rolling(window=n, min_periods=n).mean()
def ema(series: pd.Series, n: int) -> pd.Series: return series.ewm(span=n, adjust=False, min_periods=n).mean()
def wma(series: pd.Series, n: int) -> pd.Series: weights = pd.Series(range(1, n + 1)) return series.rolling(window=n).apply( lambda x: (x * weights.values).sum() / weights.sum(), raw=True )min_periods=n を指定して、期間を満たさない先頭区間で NaN を返すのが安全です(バックテストで先読みバグを避ける)。
参考
- John J. Murphy, Technical Analysis of the Financial Markets, ch. 9 (Moving Averages)
- Joseph Granville, Granville’s New Strategy of Daily Stock Market Timing
- Investopedia — “Moving Average (MA)”
- 陳満咲杜『FXチャート実践帳』(移動平均の運用例)