局所回帰
これまで紹介した移動平均は、あくまで「過去データの平均」を追いかける手法でした。そのため、どうしても値に「遅れ」が生じたり、ピーク(頂点)が低く見積もられたりする傾向があります。
これに対し、より柔軟にデータの形状を捉えられる手法が「局所回帰(LOESS)」です。局所回帰は、各点の計算ごとに「その点の周辺にあるデータ」だけを取り出し、その範囲で最も当てはまりのよい直線を都度引き直す方法です。こうして得られた近似値をつなぐことで、データを滑らかに平滑化します。
以下は、その簡易的な実装例です(重み付けを行わない局所線形回帰の例)。
// (省略)
// dataは[{ x : 1, y: 20 },...] のような連続した元データセット
loess(data, bandwidth) {
// (1) bandwidth: 周囲何%のデータを使用するか (0.1〜0.3が一般的)
return data.map((d, i, arr) => {
// (2) 周囲のデータを取得
const span = Math.floor(arr.length * bandwidth);
const start = Math.max(0, i - span);
const end = Math.min(arr.length, i + span);
const subset = arr.slice(start, end);
// (3) その範囲での「傾き」と「切片」を計算(最小二乗法)
const n = subset.length;
let sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;
subset.forEach(p => {
sumX += p.x;
sumY += p.y;
sumXY += p.x * p.y;
sumX2 += p.x * p.x;
});
// (4) 傾き (m) と 切片 (b) を求める公式
const m = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
const b = (sumY - m * sumX) / n;
// (5) その点における近似値を返す
return {
x: d.x,
y: m * d.x + b
};
});
}
// (省略)
(1)bandwidthとは
bandwidthは「どの範囲までを近傍とみなすか」を決める値です。全体データのうち、計算対象の前後何%を参照するかを指定します(0.1〜0.3程度が一般的です)。値が小さいほど細かい変化を追いやすくなり、大きいほど滑らかな曲線になります。
(2)周辺データの取得
ここでは、対象点を中心に前後のデータを切り出しています。移動平均との大きな違いは、「過去のみ」ではなく「前後の観測値」を用いる点にあります。これにより、データの形状を対称的に捉えることができます。
(3)(4)局所線形回帰の計算
切り出したデータに対し、最小二乗法を用いて
y = mx + b
という直線を求めます。
このときの傾きmは、その地点付近の局所的な傾向(増減の方向と強さ)を示します。これは理論的な「真の微分値」ではありませんが、ノイズを平均化したうえでの実用的な変化率の近似と考えることができます。
(5)近似値の算出
求めた直線に対象点のxを代入し、その点における近似値を返します。これを全点で繰り返すことで、滑らかな曲線が得られます。
以上の関数を使ってデータを変換すると、図4のようになります。
グレーが元データ、赤線(bandwidth=0.1)、青線(bandwidth=0.3)が局所回帰による平滑化結果です。bandwidthが小さいほど細かな変動を追い、大きいほどなだらかな曲線になります。
移動平均(SMA/EMA)と比較した際、局所回帰には圧倒的なメリットが存在します。というのも、移動平均は過去データを中心に計算するため、変化点が右側へずれやすい(位相遅れが発生しやすい)特徴があります。
一方、局所回帰は前後の観測値を対称的に利用するため、理論上はピークや谷の位置ずれが小さくなります。ただしリアルタイムで未来データを使えない場合はこの限りではありません。
また、局所的な傾きを考慮するため、急激な変化に対しても単純な移動平均より形状を保ちやすいという特徴があります。
一点ごとに「その場で最も当てはまる直線」を引き直すことで得られる局所回帰の曲線は、非常に自然で滑らかです。人間が直感的に線を引いたかのような形状を、統計的手法によって再現できる――それが局所回帰の魅力と言えるでしょう。
トレンドの変化点を探す
ある程度データを「なめらかにする」手法を手に入れたら、いよいよ本題です。
データ分析の重要な目的のひとつは、「いつ変化が起きたのか?」というトレンドの転換点(ブレイクポイント)を見つけることです。
株式などのトレードであれば、それは「いつ買い、いつ売るか」という判断に直結します。ただし実際には、変化点は必ずしも一意に定まるわけではなく、手法や期間設定によって見え方が変わる点に注意が必要です。
傾きの反転を見る
トレンドの変化は「傾き」の動きに表れます。局所回帰では計算過程で傾き(m)を求めているため、その符号(プラスかマイナスか)に注目することで、変化の兆しを捉えることができます。傾きがプラスからマイナスへ、あるいはマイナスからプラスへと転じた地点は、山や谷の有力な候補となります。
もっとも、実データではノイズの影響で傾きが頻繁に反転することもあります。そのため、単発の符号変化ではなく、一定期間の持続や大きさをあわせて確認することが重要です。
基準期間の違いから把握する
局所回帰は、対象点の前後のデータを参照して計算します。そのため、過去データを振り返る分析では、ピークや谷の位置ずれが比較的小さくなります。
一方、株価のように「未来のデータがまだ存在しない」リアルタイム環境では、対称的な計算はできません。そこで広く使われているのが、「短期」と「長期」の2本の移動平均線の交差(クロス)を見る方法です。
短期の平均線(SMAやEMA)が長期の平均線を下から上へ突き抜ける現象は、ゴールデンクロスと呼ばれます。これは「直近の勢いが過去の平均的な流れを上回った」ことを示すシグナルとして知られています。これは株価で言えば「買いのサイン」となります。
反対に、短期線が長期線を上から下へ抜ける現象はデッドクロスと呼ばれ、勢いの鈍化を示すシグナルと解釈されます。こちらは「売りのサイン」と言えるでしょう。
このように、個別の点における「傾き」そのものを算出せずとも、期間設定の異なる2本の線を比較し、その交差点(クロス)を観測することで、トレンドの転換を直感的に捉えることができるのです(※)。
※ただし、これらは遅行指標であるため、売買サインが出たときにはすでに価格が反転しているなどトレンドの逆行が発生することもあります。
最後に
本記事では、数学で学ぶ「微分」をそのまま適用するのではなく、時間軸を広げてデータを一度なめらかにし、その傾向を見るという分析の考え方を紹介しました。ただし、平滑化には常にトレードオフが存在します。
- タイムラグ(反応の遅れ)
- 情報の損失(細かな変動の消失)
- パラメーター依存性(期間やbandwidthによる差)
- 過剰適合のリスク
実務では、リアルタイム性を重視するのか、過去を精密に振り返りたいのかという目的に応じて、手法を選択する必要があります。
次回は、これらの変化を「積み上げる(積分する)」ことで、どのような新しい視点が得られるのかを紹介します。
