USDJPY予測プログラムをPythonで作ってみた話



以前から興味のあった「FXの値動きをデータから予測する」という取り組みを 実際にPythonでプログラムを組んでみた。この記事では開発の目的や これまでの経緯、そして今後の運用方針についてまとめておきたいと思う。

開発の目的

一番の目的はシンプルで、USDJPYの値動きを予測し、将来的にはその予測をもとに 実際に売買して利益を出すこと。ただし、いきなり実弾(実際の資金)を投じるのは リスクが高すぎるので段階を踏んで進めることにする。

  • まずは予測プログラムを作り精度を検証
  • しばらくは売買せず様子見し、予測がどれくらい当たるのかを見極める
  • ある程度精度に納得できてから実際の取引に進む

「作ったから即トレード」ではなく、「本当に使えるものなのか」を先に確認する、という当たり前ではあるが大事なステップを踏もうと思う。

プログラムの構成

開発したプログラムは、役割ごとに3つのスクリプトに分けている。

スクリプト役割
feature_engineering.py生の四本値(Open, High, Low, Close)データから、移動平均・RSI・MACD・ADXなどのテクニカル指標を計算し、機械学習で使える特徴量に変換する
train_model.py特徴量データを使ってモデルを学習させる(事前に1回、または定期的に実行)
predict.py学習済みモデルと直近の値動きデータから、実際に予測を出力する(運用時に都度実行)

学習と予測を分離しているのがポイントで、学習は重い処理なので事前にまとめて済ませておき予測は直近データを渡すだけで済むように設計した。

予測する内容

単純に「上がるか下がるか」の2択だけではなく、以下の3点をセットで出すようにした。

  • 向こう1週間の予想上限値・下限値(4時間足30本先までの値幅)
  • 上昇・下降どちらが優勢か
  • その優勢さの強度(0〜100のスコア)

方向を当てるだけの二値予測だと「際どく当たった」のか「はっきり優勢だった」のかが 区別できない。強度スコアを添えることで日々の値をながめながら 「今回は自信度が高そうだから注視する」「今回は弱いので参考程度に」といった 判断がしやすくなるはず。

現状の精度:正直、まだ発展途上

実際の20年分弱(2009年〜2026年)のUSDJPY 4時間足データで学習・検証してみたところ 現時点の結果はこちら。

指標モデル単純な比較対象(ベースライン)
上限値予測の誤差0.618%0.602%
下限値予測の誤差0.748%0.728%
方向の的中率47.1%53.8%(常に「上がる」と予想した場合)

正直なところ、まだ単純な比較対象を上回れていない。「過去のOHLCデータだけから1週間先の方向を当てる」というタスクは学術的にも実務的にも精度50〜55%程度が現実的な上限とされることが多く、今回の結果もその範囲に収まっている。為替が効率的市場に近いことを考えると、ある意味では想定内の結果とも言える。

今後は検証期間を複数に分けて評価する(ウォークフォワード検証)、予測対象期間を短くしてみる、モデルの種類を変えてみる、といった改善を少しずつ試していく予定だ。

今後の運用方針

というわけで、しばらくは以下の方針で進めようと思う。

  • 実際の売買はまだしない。まずは精度の見極めが最優先
  • 週1回、このブログで予測値を公開する。予想上限値・下限値・優勢方向・強度スコアをセットで載せる
  • 週末に、その週の結果を振り返って報告する。予測がどれだけ当たったか/外れたかを包み隠さず記録していく

派手な成果を最初から謳うのではなく、地道に精度を検証しながら、「本当に使えるレベルになったら」実際の取引に進むという慎重なスタンスで続けていこうと思う。

次回の更新では最初の予測値を公開する予定。