2011年1月24日月曜日

フーリエ解析でトレンドを分析

フーリエ解析によるトレンド曲線
フーリエ解析によってトレンド曲線を作成するカスタムインジケータを作成した。
左の図は、USD JPYの、1分足チャートからフーリエ解析を使って、トレンド曲線を作成したものである。水色と赤の線がそれぞれ、フーリエ解析によってノイズを取り去ったトレンド曲線を示している。
オレンジ色の線は比較のために表示した普通の移動平均(25SMA)である。
ほとんどをLinux上のC++(MinGW)で作成し、dllとしてリンクしている。MQLで書いたのは、ほぼ表示に関連する部分だけだ。ソースファイルなどの詳細は、もう少しスッキリしたコードに書き直してから、後日このブログで報告しようと思うが、ここではフーリエ解析を使ってトレンド分析を行う意味を、移動平均と比較しながらまとめておこうと思う。
移動平均とは、もともと小さい高周波ノイズを取り去るためのローパスフィルタの役目をするものだ。小さな値動きを消し去って、もう少し大きな流れを概観する、つまりトレンドを見るために使うものだ。
しかし、移動平均は必ず遅れを生じる。この遅れのために、どうしても少し前の状態を見ることになる。大きな流れを見ようと思えば思うほど、どんどん遅れが大きくなる。従って、移動平均を使うときには必ず、25SMAと5SMAというように、大局を概観するものと遅れの少ないものを組み合わせて使わなくてはならない。それらのクロスポイントなどにさまざまな意味を持たせて、遅れがあるデメリットを相殺しようとしているが、本来見たいものが見えていないという事実は残ったままだ。
これはシステムトレードを行う上で、大きなデメリットである。テクニカル分析を行ったつもりでも、結局は、今が上昇トレンドなのか、下降トレンドなのか、コンピュータに理解させることができない。わかるのは、少し前までは上昇トレンドだったとか、もう少し前までは下降トレンドだったとか、あまり重要でない過去のトレンドである。
そこで、フーリエ解析を使う。フーリエ解析によって得られた波形は論理的な遅れがない。
価格の変動を波と捉え、個々の価格を連続した変化を離散的に観測したデータとして扱って、デジタルフーリエ変換を適用する。フーリエ変換によって、その波形を形成している周波数スペクトルから、強く影響を与えているもののみを選び出し、波形形成にあまり重要でない周波数を選択的に切り捨てた後に、フーリエ逆変換によって波形を再合成すると、小さな変動を切り捨てた値動きのトレンドを表す曲線が書ける。これに従えば、今のトレンドを把握することができるというわけだ。
また、フーリエ変換によって得られた曲線には、移動平均によって得られた曲線とは明確に違う部分がある。図を見てほしい。オレンジ色の移動平均の曲線に比べて、フーリエ解析で作成した水色や赤の曲線のほうが滑らかなのがわかるだろうか。赤は価格の変動波形を形成している周波数の中で重要なものから60%を取り出し、残りの40%を切り捨てたもの、水色は同じようにして30%を取り出し残りの70%を切り捨てたものだ。
赤い波形の方が、より小さな値動きを反映しているので、細かく振れているがそれでも十分滑らかな曲線になっている。フーリエ逆変換ではフーリエ変換の結果を元に、sin波とcos波を合成して波形を作る。したがって、高周波成分を捨ててやると滑らかな曲線が現れる。
これは、実はコンピューター上にトレーディングシステムを作る上で極めて都合がいい。
曲線で構成されるということは、あらゆる点で微分可能ということになる。したがって、微分係数が0になるときを探してトレンドの変化点を見つけることができるわけだ。
また、積分は過去の状態、微分は未来の状態を表すとも言われる。今のポイントでの微分係数を求めることで将来の価格の予測が出来るかもしれない。
ともかく、価格の変動に対して論理的にトレンドを求める手法に一歩近づいたことになる。

2 件のコメント:

  1. フーリエ解析の記事興味深く拝読いたしました。
    公開楽しみにしております。

    返信削除
  2. 興味深く拝見しました。
    EAでベタな移動平均線では過去データを参照しますので、対応が一歩遅れるのが悩みの種で。
    平均偏差を考えていたところでした。

    返信削除