見出し画像

仮想通貨で右肩上がりの結果を得る機械学習(アルゴリズム公開)

1章 この記事を読むと何ができるようになるか

機械学習でトレード結果を予測をさせてみたいとは思いませんか。過去のチャートから特徴を見つけ出して将来の結果を予測するということが機械学習ならできる期待感があります。

ところが過去の価格を特徴量にして将来の価格を機械学習で予測させてみると利益を表すグラフは下のような結果になることが良くあると思います。

機械学習でトレードした時のバックテストとフォワードテストの例
(青が訓練データでの利益率でオレンジがテストデータでの利益率)


というか大概の場合はこうなります。青が訓練データでオレンジがテストデータです。縦軸は累積利益率を示しています。1年間で30倍の利益が見込める、と思ったのになぜか実際にはそのようにはならない、という例です。

あるいは検証した時は訓練データもテストデータも同じような結果が出ていたのに、フォワードテストをしてみるとなぜか上のグラフのようになってしまい、実トレードでは利益が増えていかないというケースもあると思います。

この記事を読むと以下のような結果を得ることできるようになります。


訓練データとテストデータが同じ傾向となるような結果を得ることができます。この傾向はフォワードテストに対しても有効です。つまり、将来的にも同じ予測精度を維持できるような学習モデルを作ることができるのです。

何ができるようになるかはここまでシリーズでいくつか記事を書いてきています。そちらの方を読んでいただくのも良いと思います。

AIに予測させてその結果に従って自動トレードし、資産が着実に増えていく、というのが目指すところです。

2章 なぜ普通は良い結果にならないか

適当に過去の価格を学習させただけではいくらハイパーパラメータをこねくり回しても良い結果に辿り着くわけがありません。そんなことをやっているうちに過学習が発生してしまいます。訓練データは精度が良いがテストデータでは良くない、あるいはテストデータも偶然よくなったがフォワードでの評価に耐えられない、ということが実に良く起こり得ます。私自身、今回紹介する手法にたどり着く前にはこのような状態でした。何をどういじくり回そうが利益が出ると思えるモデルにはどうしてもたどり着けなったのです。

適当なデータで機械学習を使うだけで特徴を抽出できるほど機械学習は良くできていません。例えば画像認識の機械学習は優秀ですが、生の画像をデータとして与えるだけで良い結果が出てくるわけではありません。フィルタリングなどの様々な処理を必要とするものです。

多くの機械学習をトレードに応用したサンプルが web 上に公開されていますが、その中には訓練データとテストデータが同じように良い結果を示しているものも見かけます。ただし、そのような結果は私が見た限り 100 %の確率で検証方法に間違いが含まれていました。そういう記事を見つけるとつい実際に試してみなくはいられない性分なのでソースコードがあれば読んでみるし、再現性のある手順が記載されていればその通りプログラムを書いて試してみるのですが本当に良い結果になったものは一つもありませんでした。フォワードテストをするとテストデータのような良い結果にはならずに、ランダムに勝ったり負けたりが半々の結果になります。中には論文にも間違いがあったケースもありましたし、何万円もして購入した記事に同じ間違いがあってそのことを指摘すると記事は削除され、お金も戻ってこずで悲しい思いをしたものです。この有料記事ではこのような間違いを犯さない方法も説明します。

チャートの機械学習では、ただ闇雲にデータをいじくりまわしてトライアンドエラーを繰り返しても良い結果に辿り着くのは難しいです。きちんとした考え方でモデルを作成していかないと良い結果にはたどり着けない。これが私自身の経験による結論でした。画像であれば正解はそれなりにはっきりしています。犬なら犬だし、猫なら猫というのは人間が判断できます。人間が判断できるものを機械に判断させているのです。ところがチャートの場合はそもそも人間が見ても判断が難しいわけです。それは機械にとっても難しいのです。

証券会社などは機械学習を導入してトレード予測をしていると聞きますが、きちんとした統計処理をしていると思います。この記事ではある程度の統計処理のようなことをして良い結果に辿り着く方法を記事にしています。ただし、そこまで難しい知識は要求されません。機械学習のプログラムを書いたことがある、あるいは、これから書いてみようというモチベーションがある方なら普通に理解できる程度の内容です。

3章 なぜフォワードで良い結果が出るのか

この記事では学習モデルでの予測精度と同じ精度を将来に対しても継続される方法を示します。それが実現できる理由の 1 つは 2 章で書いた間違いを犯していないことです。世の中で公開されているチャートを用いた機械学習モデルにはミスが多いですが、そのようなありがちなミスは排除しています。ただし、これは最低限のレベルな話で、良い結果が出る根拠の本質ではありません。単に必要条件に過ぎないことであって、基本的なミスなく機械学習を行えば、良い予測結果が得られるかというとそんな甘いものではありません。

大事なことはフォワードでも結果が良くなるような条件を考慮しながら訓練しつつモデルを作成するということです。テストデータは最後に 1 回に結果を確認するだけです。テストデータが悪ければモデルのパラメータを調整するという方法は機械学習の世界では一般的だと思いますし、間違えているとは思いません。一般にはパラメータの最適化はしないよりした方が良いです。ただ、やり過ぎるとそのモデルの結果とフォワードの結果のずれが大きくなっていきます。

ここで紹介する手法はモデルのパラメータの最適化はしません。テストデータを評価するのは 1 回きりです。ダメならそのモデルは捨てます。フォワードが良くなるようにモデルを作り込んでいるので、テストデータでの結果を確認せずともその前に大体結果はわかっています。最後のフェーズではもうやるべきことはほぼ済んでいて、一応念のための確認作業としてテストデータを評価しているということです。テストデータを最適化するようなことはしていないので、テストデータの結果はさらにその先の将来のデータに対しも同じ精度での的中率が継続するのです。相場自体の特徴が大きく変わってしまえばもちろん結果は変わってくるでしょう。モデルの有効性は永遠に保証されるようなものではもちろん無いと思っています。ただ、長持ちはするでしょう。賞味期限が長いということです。

正確性を期すために書いておくと、実際にはソースコード上では機械学習のライブラリが持っているデフォルトのパラメータ探索機能は使っています。ただし、それ自体が結果の改善に寄与している割合は微々たるものです。なくてもいいけど、念の為に使っているという程度のことです。機械学習ライブラリのパラメータ探索機能は使わなくてもほぼ同様の結果になります。

4章 どのようなスキルが必要か

この方法を使うためには機械学習のプログラムを書けるということが必要になります。有料記事では python のサンプルソースを提供します。

機械学習のプログラムの書き方は簡単ですので、これまでに書いたことが無いという方でもネットを見ればすぐに書けるようなものです。機械学習のライブラリが世に登場した当時は評価関数をプログラム上で書かないといけないケースもありましたので、数学が嫌いな人はそれだけで嫌になることもあったのかもしれません。今のライブラリは数式を一切必要とせずに書くことができます。機械学習は極めてシンプルに使えるようになっていますので、難しくてできないという心配はありません。

また、有料記事の python のサンプルソースで使うモジュールは基本的なものばかりです。必須となるものを書いておくと numpy, pandas, sklearn, lightgbm など機械学習の基本となるものばかりです。それ以外もありますが、万が一環境依存で使えないという場合でも代替できるモジュールです。例えば証券会社から過去の価格データを引っ張ってくるサンプルがありますが、特定の証券会社でなければいけないということはありませんので。なお、証券会社に登録していなくてもデータは取得できますのででその点もご安心ください。

ですので、機械学習の基礎や環境構築の仕方はサポート不要なので自己解決してください、と言いたい気持ちもありますが、できるだけサポートします。自己解決できない場合には遠慮なくご相談ください。

トレードで勝つのはきちんと何かを学ぶということだと考えています。何かを学ぶには師匠が必要だったり、それなりの月謝を払ってスクールに通うことです。トレードに限らず何かを身に付けたければ1万円の月謝を払って何年もスクールに通うのだと思います。もちろん独学でトライする人もいるでしょうが、早く道に辿り着くためにスクールに通うということだと思います。

この記事はそれなりに高額な価格を設定しますが、要は学ぶということを想定した価格設定です。ただこの通りやれば儲かる、という情報提供とは違います。提供したいのはスキルです。だから、うまくできないという人にはできるようになるまでサポートします。

5章 改めて何ができるようになるか

何ができるかは 1 章に書いた通りですが、もう少し詳しく書いておきます。機械学習での訓練データの結果がテストデータでも再現できるようにモデルを作成できるようになることです。つまりはフォワードテストでも通用する機械学習の方法を学ぶことができます。テストデータも含めて最適化するようなインチキなことはしません。重要なのは訓練のやり方です。汎化性能があるように注意して訓練をするので同じ傾向が将来のデータにも受け継がれるようにします。

サンプルソースで学習に使うデータとしては価格データのみです。価格データを用いて将来の価格変化率を機械学習で予測させます。その他のファンダメンタルな情報やニュースのような情報は使用しません。もちろんそういったデータを付け加えることはできますが、そういったものを必須とせず価格だけを扱い以下のような右肩上がりのグラフの結果を導出することを示します。

予測があたれば価格変化率が利益に、外れれば損失とした値を累積で形状したグラフです。青が訓練データに対し、オレンジのテストデータでも利益率の累積は順調に増えています。汎用性の高い方法なので、特に証券会社を特定する必要はないですし、通貨に依存するやり方でもありません。時期によって相場は変わるので一度導き出した結果がずっと使い続けられるわけではありません。しかし、その時はまた予測モデルを再構築すれば良いでしょう。相場に特徴がある限りは、それをエッジとして見つけることができるでしょう。エッジが無くなれば何も見つからないかもしれませんが、その場合はまた他の通貨で探せば良いでしょう。

さらにいえば、この手法は作成したモデルの予測がフォワードでも良い傾向を維持することを目指して作成しています。目標が達成できているかどうか訓練データとテストデータを 2:8 にして試してみたのが以下のグラフです。

データとして使ったのは 2022 年の 1 年間のデータです。2〜3 ヶ月の期間で作成したモデルがその後の 8〜9 ヶ月の期間でも有効に機能することを確認しています。作成したモデルは長い期間に渡って有効です。

また、この方法は草の根を分けるようなパラメータ探しを必要としないのが大きな特徴です。トライアンドエラーはないとは言いませんが、砂金を掬うような地道な作業ではありません。どうすれば正しい結果を得ることができるかの道筋を示すものです。サンプルソースでは実際に上に表示したグラフの学習結果を得ることができます。ただし、このサンプルソースをそのまま使って利益が出ることを保証するというような記事の内容ではありません。相場というのは常に変わっていきます。大事なことは良い予測ができる方法を学んでトレードに活かせるように応用ができる、改良ができる、ということです。将来にわたって使える手法を学ぶことがこの記事の目的です。

以上が有料記事を読めばできるようになることです。

6章 注意事項

  1. 有料記事の内容は汎用的な手法であり、対象を限定しないので内容を公開することにしました。ただし、トレード手法というのは有名になって広まってしまうと通用しなくなってしまうものです。優秀な占い師は未来を正しく言い当てると、悪い結果を回避するように行動するため、占いが当たらなくなってしまう、という話を聞いたことがありますが、それと同じようなものです。ですので情報の拡散を限定する意味で有料記事といたします。汎用的な手法とはいえ、内容を広めないようにお願いします。広まってしまうとトレードで使えなくなってしまいます。販売本数も限定するつもりです。情報の拡散を防ぎたいということもありますが、きちんとサポートできる範囲にしたいという意味もあります。数が多すぎてサポートが難しくなる前にこの記事は非公開にします。

  2. 私はモジュール化が好きなのでクラスを使って書くことが多いです。オブジェクト指向というわけではないですが、何の処理をするのかある程度の機能をカテゴライズするのにクラスが便利なので使っています。グローバル変数がたくさん出てこないようにというのも利点の一つです。web を見ているとクラスを使って書いているケースは少ないのを少しだけ心配します。クラスのソースコードだから読むのが難しいということはないとは思うのですが、念のため事前にお伝えしておきます。

  3. python の基本的なプログラミング方法やインストール方法、ライブラリのインストール方法、機械学習の基本的な使い方やコーディングの仕方などネットを検索すれば記載されているようなこともお困りであればサポートします。

  4. この記事の目的は機械学習モデルの性能がフォワードでも継続される手法の紹介に重きを置いています。その内容についての質問にはお答えします。実トレードの利益を保証するものではありませんし、また、実トレードに直結するご質問やご相談にはお受けできないことがあります。例えばサンプルソースそのままのパラメータでは不十分なのでもっと利益が出るようにするにはどう調整したら良いかといったご質問にはお答えできません。私自身のトレード方法と具体的な条件が一致してくるほどお互いの利益が競合する状況が出てきます。そのため、細かい条件を提示することに繋がると判断したり、お互いのトレードに不利益につながると判断した場合は質問の回答を差し控えさせていただくことがあります。

  5. 無事にトレードスタイルが決まったところで自動トレードのコードの書き方がわからないという方もいるかもしれません。それについてはサポートの対象とは致しません。

注意事項は以上です。これらにご了承いただけない場合は記事をご購入されないようにお願いします。

ではこの先は有料記事となります。この記事の内容があなたのトレードライフにお役に立てることを願っています。

ここから先は

43,475字 / 8画像

¥ 50,000

この記事が気に入ったらサポートをしてみませんか?