MF-DFAで金融時系列のフラクタル解析をやってみた。
これはなに
金融時系列のフラクタル性についてMulti-Fractal Detrended Fluctuation Analysis(MF-DFA)を使ってちょっとした実験をしてみました。軽い結果の共有と実装結果を晒しています。
どうした?
最近休日はせこせこと金融時系列解析をしています。どうして急にそんなことを始めたのかといいますと、2点理由があります。一つは、いま会社で開発しているサービス改善のためです。僕自身、投資に関してはもともと大昔に一度デイトレに手を出してやけどした程度の知識しかなく、ユーザー視点・投資家視点としてサービスを評価する視点がどうにも希薄だなと感じていたこと。もう1つはもともと経済学部にいたこともあり金融・経済の動きを分析するというのはなんだかとても面白そうに感じだからです(雑。ということで密かにいくつか本を読んだりしつつ勉強していたのですが、さすがにそろそろ実際に手を、お金を動かして見るべきかなと思いたち、アルゴリズムの1つでも考案してみるかと言うことに至りました。今はそれに向けていろいろなインジケータや指標を評価しようと思っていて、今回のDetrended Fluctuation Analysisもその一貫になります。今回はこの分析手法を使ってHurst指数を計算してみました。
Hurst指数とは何かというと、時系列データの長期記憶性を示すものです。Hurst指数が1/2 < H < 1のときには長期記憶性を持ちが、過去の増分と未来の増分との間に正の相関関係があるので現在のトレンドが持続しやすい傾向にあります。H=0.5のときには単純なブラウン運動になります。一方でHurst指数が0 < H < 1/2の場合には短期記憶性を持ち、先程とは逆に過去の増分と未来の増分との間に負の相関関係があるので、現在のトレンドが反転し易い傾向にあることがわかります。もともとはナイル川流域の貯水量に関するモデルで活用されたのが始まりのようですが、現在では金融時系列での応用もいつくか研究事例があるようです。
時系列生成シミュレーションの結果は僕の実装ではなくこちらdokato/dfaのリポジトリから拝借したのですがこんな感じになります。一番上がH=0.1, 真ん中がH=0.5, 一番下がH=0.9のものです。H=0.1のものは判別が難しいですが、H=0.9のグラフに関しては明確に長期的なトレンドが生成されていることがわかりますね。
今回はMF-DFA, R/S Analysisの実験をpythonで行うにあたり、信頼するに足る良さそうな実装が見当たらなかったこともあり、実装してみることにしました。(先出していた実装はMulti-Fractalではないのですが、問題ない実装だったなと記憶しています。)実装したMF-DFAの実装はこちらgithub.com/yss44/mf-dfaにおいてあります。R/S Analysisの実装は公開していませんが需要があれば。何がしかの参考になれば幸いです。(パフォーマンスチューニングの余地があるので高速化したい。。
まだ、実装したばかりであまり実験できてはいないのですが、JPYUSDの5分足のcloseにたいして512足を1windowとしてx1000回Rolling Windowした結果がこちらです。見事に短期記憶性を示す方向に偏っていますね。この結果はランダムウォークに対して1000回ブートストラップした結果の95%信頼区間を12.4%の確率で外れるので有意に判別しているのではないかと思っています。(ブートストラップ法ってこういう使い方で合ってますよね?まだ統計を深く理解できてはいないのですが。
もうちょっと色々と遊んでみたいと思ってます。
終わりに
もともとはローソク足を使ってプライスのアップ/ダウンのバイナリ予測の学習を単純なDNNにさせていたのですが、全く精度が出なかったので面白そうな解決策を探していました。もっと単純にRSI/BBandとかのインジケータとかから始めようかなと思っていたのですが、興味の赴くままに調べていたらなぜかこんな事になっていました。なぜなのかはわかりませんが数式を解読して実装するのは楽しかったです。成果に結びつけばいいのですが...
金融時系列データをいじって一緒に遊ぶお友達がほしい今日このごろです。
参考文献
Multifractal detrended fluctuation analysis: Practical applications to financial time series Multifractal Detrended Fluctuation Analysis of Nonstationary Time Series Introduction to Multifractal Detrended Fluctuation Analysis in Matlab