ノイズのある系列を滑らかにしてリズムを見つける
フィルタは、各値を近隣の値と混ぜて、ある系列を別の系列に変えます。N 日の移動平均が最も簡単なフィルタで、出力は直近 N 個の入力の平均なので、ノイズは減りますが出力は遅れます。指数移動平均(EMA)は最近の日により大きな重みを与えます:yt=αxt+(1−α)yt−1、ここで α=2/(N+1) が平滑化の重みです。signal.lfilter(b, a, x) は過去と現在の値だけを使って、こうしたフィルタを系列に適用します。EMAの平均遅れは (1−α)/α 日、N 日移動平均の遅れは (N−1)/2 日なので、19日平均と α=0.1 のEMAはどちらも約9日遅れます。
2つ目の仕事は周期を見つけることです。signal.periodogram(x) は系列の分散を、1日あたりの周期数で測った周波数ごとに分けます。周波数 f のピークは、周期 1/f 日の繰り返しパターンを意味します。1日1回の観測では、0.5 周期/日(ナイキスト限界)までの周波数しか見えません。より速い周期はより遅い周期と区別できないからです。取引では非常に重要な注意があります。signal.filtfilt はフィルタを順方向、次に逆方向に通して遅れをなくしますが、そのとき各出力は未来の値を使います。filtfilt で作ったシグナルはバックテストでは完璧に見えますが、明日のデータは今日は手に入らないので取引できません。取引するものには lfilter のような因果的なフィルタだけを使ってください。
yt=αxt+(1−α)yt−1,α=N+12,lag=α1−α (moving average: 2N−1),period=f1(1) 3つの数と1つの周期系列
10,12,11 を
α=0.5 で扱い、EMAを最初の値から始めます。すると
y0=10、
y1=0.5⋅12+0.5⋅10=11、
y2=0.5⋅11+0.5⋅11=11 です。
10,12,11,13 の3日移動平均は
11、次に
12 です。19日の窓は
α=2/20=0.1 で、遅れは
(1−0.1)/0.1=9 日です。1日に
0.05 回繰り返す純粋な周期は周期
1/0.05=20 日で、ピリオドグラムはちょうどそこにピークを持ちます。実データでは、SPYの日次リターンのラグ1自己相関は
−0.10 しかありませんが、その2乗はラグ1で
0.27、ラグ5で
0.30 です。大きな日は大きな日に続き、これがボラティリティのクラスタリングです。重み
α=0.06(RiskMetricsの
λ=0.94)で2乗リターンのEMAを取ると、2026年8月21日は日
0.75%(年
11.9%)で、全期間の
1.20% をかなり下回りました。未来を見ずに、過去のゆっくりした平均が教えてくれることです。
- 平滑化には遅れが伴う:窓が長いほど、また α が小さいほど、ノイズは減るが信号は遅れる。
- ピークから周期を読む:周波数 f のピークは周期 1/f 日を意味し、上限は0.5周期/日。
- 取引には因果的フィルタだけ:
filtfilt は未来を使うので分析用で、実際のシグナルには使えない。
ラボ:採点される内容
- EMAの1歩10点
- 移動平均10点
- 窓に対応する重み10点
- 周波数から周期10点
- EMAの遅れ10点
- 各ルーチンの働き15点
- なぜfiltfiltは取引できないか35点