単純移動平均(SMA)
「データから離れて全体を見る」ための最も基本的かつ強力な手法の一つが、単純移動平均(Simple Moving Average:SMA)です。
SMAは、ある一定の期間を定め、その期間内のデータの平均値を「その時点の代表値」として採用する方法です。これにより、データのノイズを減らし、トレンドを把握しやすくなります。以下に、単純移動平均を計算するJavaScriptの関数例を示します。
// (省略)
// dataは[{ x : 1, y: 20 },...] のような連続した元データセット
sma(data, n){
return data.map((d, i, arr) => {
// (1) 最初はデータが十分にない事に対する考慮
const start = Math.max(0, i - n + 1);
// (2) nで指定された数だけ過去のデータを参考にする
const subset = arr.slice(start, i + 1);
// (3) 平均を求める
const average = d3.mean(subset,d => d.y);
return { x: d.x, y: average };
});
}
// (省略)
この関数では、(2)で元データの過去n個分のデータを切り出し(3)でその平均を算出します。この処理がSMAの基本的な動作です。また、データ系列の先頭部分でまだn個分のデータが揃っていない場合は、(1)のように利用可能なすべてのデータを対象として平均を取る工夫が必要です。
そして、この関数を使ってオリジナルのデータを変換した折れ線グラフが図2です。灰色が元のデータ、赤、青、緑がそれぞれ過去7、14、30個のデータを移動平均したものです。
nの値を「7(赤線)」「14(青線)」「30(緑線)」のように大きくしていくと、描かれる線がよりなめらかになっていくことが視覚的にわかります。
このnの値(移動平均期間)は、分析したいトレンドの周期に合わせて設定できます。例えば、n=7なら約1週間、n=14なら2週間単位、n=30なら約1か月単位といった、季節性などの大きな傾向を捉えるのに役立ちます。
一方で、SMAの主要な問題点は「データの変化が遅れて現れる」ことです。
SMAの計算は過去n個のデータの平均値であるため、最新のデータの急激な変化やトレンドの転換に対して、どうしても反応が鈍くなってしまいます。これは、最新値が全体の平均に与える影響が、過去n-1個のデータの影響よりも相対的に小さいためです。
指数平滑移動平均(EMA)
単純移動平均(SMA)の課題は「過去のデータすべてを平等に扱う」点にありました。この課題を解決するため、過去に遡るほど影響が小さくなるように重み付けを工夫したのが「指数平滑移動平均(Exponential Moving Average:EMA)」です。
EMAは「新しいデータほど重要である」という考え方に基づき、それ以前のデータよりも直近のデータに大きな重みを与えて平均を算出します。
EMAは、以下の関数例のようにして計算できます。
// (省略)
// dataは[{ x : 1, y: 20 },...] のような連続した元データセット
ema(data, n){
// (1) 平滑化係数 α (アルファ) の計算
const alpha = 2 / (n + 1);
// (2) 初期値は最初のデータを使用
let previousEMA = data[0].y;
return data.map((d, i) => {
if (i === 0) {
return { ...d, ema: previousEMA };
}
// (3) EMAの公式: 今日のEMA = 前日のEMA + α * (今日の値 - 前日のEMA)
const currentEMA = previousEMA + alpha * (d.y - previousEMA);
previousEMA = currentEMA;
return {
x : d.x,
y: currentEMA,
};
});
};
// (省略)
(1)平滑化係数(α)の算出
「alpha = 2 / (n + 1)」という式で、平滑化係数α(アルファ)を算出します。このαは「新しいデータをどれくらい重視するか」を決定する値です。ここでは、引数nをSMAの「期間n」と同じ感覚で扱えるように変換しています。
例えば、nを「7」に設定すれば、SMAのn=7に近い滑らかさを保ちつつ、より最新の変化に鋭敏な線を描くことが可能になります。
(2)初期値の設定
EMAは「一歩前の結果」をベースに次の値を積み上げていく計算手法であるため、基準となる初期値が必要です。この例では、最初のEMAの値として、データセットの1点目(data.y)をそのまま採用しています。
(3)EMAの計算式
EMAの計算式は今日のEMA=前日のEMA+α*(今日の値-前日のEMA)です。これは一見複雑に見えますが、「前回のEMAから、今回起きた変化(前回のEMAと今日の値の差分)に対して、αの歩幅で一歩近づく」という処理を表しています。つまり、前回の値から今回の値に歩み寄るための「勢い」を作り出すイメージです。
このEMA関数を使ってデータを変換すると、図3のようになります。
図中のグレーの線が元のデータであり、黒線は比較用の単純移動平均(n=7)です。そして、赤線(n=7)、青線(n=14)、緑線(n=30)が指数平滑移動平均です。
単純移動平均と比較した場合、EMAには以下の特徴があります。
- トレンドへの追従性の速さ:EMAは最新のデータに重きを置くため、データの急激な変化やトレンドの転換に対して、SMAよりも素早く反応します。これは、SMAのデメリットであった「タイムラグ」を解消するための重要な利点です。
- 計算の効率性:EMAの計算アルゴリズムは非常にシンプルです。SMAのように毎回過去n個のデータを保持して再計算する必要がなく、直前のEMAの値さえあれば現在のEMAを計算できます。そのため、データ量が増えても計算負荷が上がりにくく、非常に効率的な手法です。
