機械学習を用いたオレオレFXシステムトレーディングプログラムのロジック解説
のプログラムを久しぶりにいじっているのですが、トレードロジックも可能な範囲でモデルに取り込んだ方が賢くない?
って思ったので、今実装中の内容を書いてみます。
現在の最新のコードは以下です。
https://github.com/ryogrid/fx_systrade/blob/81c5e396e3032104289f3adaa8dda438651fd7bf/xgboost_trade_colab_gpu.py
少し前のコードですが、Google Colaboratoryですぐ試せるようにした Jupyter Notebook はこちら。
https://github.com/ryogrid/ryogridJupyterNotebooks/blob/master/run_xgboost_trade_best_score_plus_30p_saigen_not_use_gdrive_colab_cpu_4thread_specified_no_use_dumped_pickle.ipynb
実装中のプログラム
簡潔に書きます。
正直なところ全てをモデルに入れ込むのは難しい、というか思いつかないので、ひとまず、為替予測を行うのではなく、ある日にトレードをした場合に勝てる確率がどれだけあるか、を出力するモデルというのを考えて、実装しています。
以下ということです。
- ショートかロングかは既存の為替予測のモデルを用いて判断する
- 新しいモデルには既存プログラムに入力していたデータに加えて、各足の時点での既存モデルでの予測結果を加えます。
- メタ特徴量とか言う・・・やつだと思います。値の作り方とかはググって下さい。交差検証のようにK分割とかして作ります。
- 2値分類のモデル
- XGBoostを使う (それなりに使えるものがXGBoostしかない)
- 学習時のラベルデータ
- 本記事の先頭に貼った記事を読んでもらえば分かりますが、決済ルールは単純なものなので、データを作るのはちと面倒ですが、決済するタイミングと結果はある時点 T{n} を定めれば、唯一の結果として求まります。
- 既存のトレードロジックの他の条件は取り除く (チャートの形状、ボラティリティなどを考慮するといったもの)
- 損切りもひとまず行わないようにする
ってな感じです。
まあ、とどのつまり?、トレードロジックの方でも為替予測モデルに入力している情報を使って、売買のフィルタリング(見送る)とかをしているので、そこのパラメータもチューニングするのってなんかムダな感じするなあ、と思ったのがきっかけだったりします。
何かアイデア等あればコメント欄まで。
知恵をお借りできれば幸いです。
なんちゃってFXトレードロボコンテスト
記事のタイトルの+αについて書いておきます。
カブロボ(株)はかなり前からコンテストとか行われていますが、FXについてはあまり知らないなあということで、知人とどっちが賢いトレードプログラムを書けるか競争しています。
で、2人だけってのも寂しいので、興味のある方がいれば一緒にやりましょう。
私のコードを改良してみた、とかそんなんでもOKです!
参加表明はこの記事のコメント欄か、Twitter の id:ryo_grid の bio からたどれるメールアドレスにメールか、Twitterで ryo_grid まで ご連絡ください。
以下、レギュレーション的なもの。正直ガチンコではないので、普通に考えるとあり得ないものも含まれますがご理解下さい。
- 2001年から2008年まで + 2009年の初日のちょこっと、のドル円の5分足のデータを使います
- 学習等に用いてよいのは2001-2006のデータ(後述の例外っぽいものもあるので注意)
- 評価は2007-2008 + 2009の頭のちょびっとで行う
- 初期資産は100万円
- スプレッドは0.3銭 (上記の始値の+0.15銭が買い値、-0.15銭が売り値とします)
- トレードは一日一回を上限とし、資産の何割を投入するかは自由です。
- 取引手数料は無し (スプレッドが実質的な手数料ということになります)
- 決済したポジションは次の日からすぐに利用できるものとする (従って、複利で資産が変化します)
- 期限は5月末日。結果と、入力する上記のCSVから結果を再現可能な、作成したコード等は私の方で確認できる状態にしておいて下さい。
(別にロジックを盗もうとかそういうつもりはないので、public にして問題がないのであれば、githubにでも置いてください) - (これがかなりアレなのですが、) 作成するプログラムのパラメータチューニングにおいて、評価期間のデータを用いることはアリです。なぜなら、データが見えてしまっている以上防ぎようがないからです。
- 私もXGBoostのモデルとトレードロジックの中のパラメータを、評価期間のデータでバックテストした結果で評価値としてチューニングするとかアレなことをしています
- ただし、機械学習的な手法を用いる際に、評価期間のデータを入力データセットに含めるのはNGです。
- いろいろ曖昧なルールですが、まあ、よしなに判断して下さい
- レバレッジは1倍です
- 計算資源に縛りはありません
なんか書き忘れたことがありそうですが、曖昧な点があればコメント欄までお願いします。
ちなみに、参考までに、私のコードだと、ベストのパラメータで+50%が現時点で最高のリザルトです。
以上!