Less is Best

rubyが好き。技術の話とスタートアップに興味があります。

為替の予測モデルが利益を出すにはどれくらいの精度が必要なの?

最近は、為替の予測モデルの構築をプライベートでちょこちょこと行っていたわけですが、進捗駄目です。全然いいモデルを構築できず正月を過ごしてしまいました。ふと、どのくらいの予測精度を目標にすべきかということについて、全く考えていなかったなということに気が付きEURUSD, USDJPYでどれくらいの精度を目指すべきか、各タイムフレーム毎に検証してみることにしました。

仮説

取引頻度が高いほど、1取引あたりに対するスプレッドの割合が大きくなるはずなので、必要な精度は高くなるはず。

検証方法

S=スプレッド, E=期待Pips, P=精度(正解率) とすると、

PE - (1-P)  E - S > 0

の方程式が成り立つときに利益を出せるようになるはずなので、このPの値を求めてみました。もっと厳密に計算するにはスリッページのことを考慮しなければいけませんが(特に短いタイムフレームでは)、今回は正規分布にでもなっていると仮定して、無視できることとしておきます。

データについてはhistdata.comからダウンロードした2006-2016年の10年間のデータを利用しています。

結果

単位はpipsです。EURUSDの1Minは期待損益よりもスプレッドの方が大きいため、除外しています。USDJPY, EURUSDともに1Min後の必要精度は高すぎてモデルの構築は現実的では無い感じがしますね。

EURUSD

予測対象 必要精度 期待損益
1Min - 1.45
5Min 80.2 3.15
10Min 71.5 4.43
15Min 67.6 5.4
30Min 62.5 7.6
45Min 60.3 9.22
1H 58.8 10.8
3H 55.2 18.4
6H 53.6 26.4
12H 52.4 38.9
1D 51.8 53.3
3D 51.1 88.4
7D 50.7 142
  • スプレッド = 1.9 pipsにて計算

USDJPY

予測対象 必要精度 期待損益
1Min 99.0 1.22
5Min 73.0 2.61
10Min 66.3 3.68
15Min 63.4 4.48
30Min 59.5 6.31
45Min 57.9 7.64
1H 56.7 8.96
3H 53.9 15.4
6H 52.7 22.0
12H 51.9 31.7
1D 51.4 43.0
3D 50.8 72.3
7D 50.5 112
  • スプレッド = 1.2 pipsにて計算

雑感

  • 基本的にUSDJPYの方がスプレッドが小さいため、必要な精度が低いので、USDJPYをターゲットに最初はモデル構築したほうがやりやすそうですね。
  • 今回は全期間を対象に必要正解率を算出しましたが、期待損益が大きいほど必要正解率は下がるため、ボラティリティの高い相場のみをフィルタリングすれば、必要予測精度を下げることはできそうです。
  • スプレッドも今回は大きいものを使用しているので、こちらも低いスプレッド環境で取引できれば。
  • 今回計算した数式は僕の頭のなかから出てきたものなので、偉い人の考えたちゃんとした計算方法があれば知りたいですね。あとで探して見ます。

以上。

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のグラフに関しては明確に長期的なトレンドが生成されていることがわかりますね。

f:id:yss44:20161211142306p:plain

今回は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%の確率で外れるので有意に判別しているのではないかと思っています。(ブートストラップ法ってこういう使い方で合ってますよね?まだ統計を深く理解できてはいないのですが。

f:id:yss44:20161211143236p:plain

もうちょっと色々と遊んでみたいと思ってます。

終わりに

もともとはローソク足を使ってプライスのアップ/ダウンのバイナリ予測の学習を単純な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