Pythonで株価データをFFTしてローパス処理(波形スムーザ)

先日、Pythonで株価データ取得して関数フィッティングする記事を書きました。

波形スムージングされたようなデータが欲しければ、上記記事の通りresampleを使えば良いですが、信号処理的にローパスかける方法もあるので、

今回はデータにFFTかけて周波数カットして逆FFTしてスムージングするやり方を書きます。

簡単にできるだろうと思ったんですが、いろいろはまったところがあるのでそこを重点的に。

結論として、おとなしくresampleやった方が良いです。カットすべき周波数とか決めるのが面倒になる気がするので。

環境

・Python 3.5

使用したライブラリ

・pandas
・pandas-datareader
・numpy
・matplotlib
・scipy

株データにFFTをかける

株価データ取得方法は前の記事で書いてますが、参考になるサイトがたくさんありますので省略します。

FFT関数を使用するためのライブラリとして今回はscipyを使ってます。

numpyにも入っているようですが、scipyの方が高速らしいので、使った理由はそれだけです。
http://stackoverflow.com/questions/6363154/what-is-the-difference-between-numpy-fft-and-scipy-fftpack

ポイントとしては、

1.株価データはバイアス成分があって、そこからの振れ幅がそこまで大きくないと思うので(もちろん企業の業績によります)、最初に平均値を導出して、株価全体から引いておくことでバイアスを消す

2.FFT後にある周波数以降をカット

3.逆FFTして1で求めたバイアスを足しこむ

といった処理をしてます。

コードは以下の通りです。

バイアス導出は、

bias = Adj.mean()

FFT部分は、

Fadj = fftpack.fft((Adj-bias))/n
freq = fftpack.fftfreq(n, 1)

FFTが1行でかけるっていうのは何なんでしょう。便利すぎでしょ。

fftfreqで周波数のリストを作ってます。

逆FFT部分は、

Adjlp = fftpack.ifft(Fadj2)*n+bias

むしろ図を表示するコードのが長いっていう。

結果は以下のようになります。

まず、周波数軸です。見やすいようにx軸を0~0.2までにしてます。
右のグラフが周波数カットしたものです。

上記を逆FFTしてあげると、

うまくいっているようではありますが、最初に書いた通りresample使った方が良いですね。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です