【検証】線形回帰モデルの自動売買でもFxで儲けられるのか?【論文実装編】
目次
線形回帰でFxの自動取引BOTを作ってみた
今回は、基本的な統計学の知識でわかる線形回帰を少し応用したものを使って、Fxの自動取引システムを作成しようと思います。
はじめに
そもそもの線形回帰ってなんだ?っていうのは、本記事とは趣旨がズレますので気になるかたは個人でお調べください。良い記事も多いので。
今回行うものは、とある機会に読んだとある論文に載っていたモデルです。論文のタイトルを見ると『Deep Direct Reinforcement Learning』つまり深層強化学習と書かれていますが、内容的にはよく知られている深層強化学習とはかけ離れていますので、読む際は注意してください。
この論文では、株の先物取引を対象に深層学習と強化学習を組み合わせた取引モデルを紹介すると書かれていますが、実際のところ実は強化学習についても疑問符が残る内容になっています。
英語が得意な方は読んでいただけるとわかるかと思いますが、この論文で言われている強化学習とは少し違うくて、根本的な部分は線形回帰だと思っています。ですので今回はこのような記事の題名にさせていただきました。
また、本コードは論文を実装してみたものなので、背景・理論はさわりの部分だけ説明するにとどめ、また内容はnoteにて有料で提供する形式をとりますのでご了承ください。(不満に思う方は、論文のリンクも上げてますので、ご自身で実装願います。)
しかし、勉強の一環として僕も実装を行なっており、コードに不備がある可能性がないこともないので、そのような観点から、価格は一般的なシステムトレードの販売価格の10%以下の価格(2,000円ぐらい)で提供していますので、皆さんの勉強の助けになることを願っています。ぜひお買い求めください。
今回のモデルで行うこと
主に学習パートと取引モデルのパートの二つあります。基本的な機械学習と同様な流れです。
そして、本モデルでの根幹となる数理的な処理の部分は以下の通りです。
\begin{eqnarray}
U_T&=&\sum_{t=1}^{T} R_t \\
R_t&=&z_t\delta_{t-1} – c|\delta_t – \delta_{t-1}| \\
\delta_{t}&=&\tanh ( \vec{W}\cdot\vec{x} + b + u\delta_{t-1} )
\end{eqnarray}
数式を見ると頭が痛くなる方は、この辺の説明は飛ばしていただけると良いのですが、コードの中身をよく知りたいという方に向けて説明します。
まず、第一式は全体の収益を表しており、つまり期間\(t=1, \cdots ,T\)までの間でどれだけ儲けたかを表しています。
そのため、\(R_t\)というのは第t時点での報酬を表しています。具体的な\(R_t\)の中身の式が第二式になっており、これは\(\delta_t\)が時点tでのポジション(ロング、なし、ショート)を表しており、\(z_t\)はt時点での価格の変動幅、つまり、時点tでの価格変動がプラスに動いていて、時点t-1でのポジションがロングであれば、報酬はプラスになりますよね。それを表しています。なので、\(z_t\)は時点tでの価格を\(P_t\)と表すと$$z_t = P_t – P_{t-1}$$と表現され、\(\delta_t\)の取りうる値は、$$\delta_t \in [-1, 1]$$となります。
※実際の取引では、\(\delta_t\)は連続値ではなく[-1, 0, 1]の離散値を必ずとるので、\(\delta_t\)をこの三つの値に分類するような境界線を決めてあげる必要があります。その辺は、実際にnoteを購入されてから確認してください。
また、第二式の第二項目は、取引コストを表しておりOANDAの場合、デモ口座でしか確認していないのですが、スプレッドの他に1000通貨で5.5円の手数料がかかってます。ですので学習の際はスプレッドとこの手数料を含めた取引コストを考慮しないといけません。
$$\overbrace{- c|\delta_t – \delta_{t-1}|}^{この部分で、\delta_t と\delta_{t-1} の値が変わるとその分だけのコストcを引くことになる}$$
つまり、これが時点tでの報酬\(R_t\)ということになります。取引コストをも考慮した形になっているので、かなり高度な解析になっています。
そして最後の第三式は、ポジションを表しておりハイパボリックタンジェント(\(\tanh\))という関数を使います。この関数は定義域が実数全体に対して、取り得る範囲が-1から1の値をとるため今回のモデルにとっては大変都合の良いものになっていることが分かるかと思います。
そして、tanhの中身についての説明ですが、最初にこのモデルは線形回帰の応用だと言いました。その部分がここに当たります。
つまり、線形回帰の肝である重み\(\vec{W}\)とバイアス\(b\)の推定です。それが今回のモデルで取引を行う時の重要な役割を果たします。この時、重み\(\vec{W}\)との内積をとるベクトル\(\vec{x}\)がありますが、これは特徴ベクトルまたは説明変数と呼ばれているもので、つまり、学習データの入力値、訓練データに当たる部分となります。なので、この特徴ベクトル\(\vec{x}\)を重み\(\vec{W}\)とバイアス\(b\)を用いた線形結合で表し、その値を\(\tanh\)をかましてポジションの分類をしようというのがアイディアとなっています。
また、最後の項に\(u\delta_{t-1}\)とありますが、これは簡単にいうと前回のポジションも考慮しようという為のものです。つまり、過度なポジション切替による取引コストを少なくしようという処理で、\(u\)は重みとバイアスと同様に推定する対象になります。
よって、まとめると入力データ\(\vec{x}\)を元にポジションの取得、それを使い報酬\(R_t\)の計算、最終的な収益\(U_T\)の算出といった流れになります。なので、学習では最終的な収益\(U_T\)を最大化させるように、第三式の\(\delta_t\)の重みとバイアスの値を最適化させる形になります。
これを最適化数理における記述で表すと
\begin{eqnarray}
\max_{\Theta} U_T\ \ \ \ s.t.\ \ &&R_t = z_t\delta_{t-1} – c|\delta_t – \delta_{t-1}| \\
&&\delta_{t} = \tanh ( \vec{W}\cdot\vec{x} + b + u\delta_{t-1} )
\end{eqnarray}
となります。\(\Theta\)はパラメータ集合で\(\Theta = \{\vec{W}, b, u\}\)を表しています。
つまり、s.t.という制限付きで、パラメータ\(\Theta\)を動かして関数\(U_T\)を最大化させるという表現になります。
以上が、今回のモデルの数理的な部分になります。長々とすみませんでした。
コードの中身(フローチャート)
頭が痛くなる内容は終わり、ここからは実際にコードで行う処理を紹介します。
行動フローは、学習パートと取引モデルのパートの二つです。
詳しい内容は、すべてnoteに記しますので、ここではコード全体の概要を記します。なお今回はみんな大好き危険通貨、ポンド円の10分足を用います。
データの取得に関しては、この記事を参照してください。
【V20版】PythonでOANDA APIを使って、指定した期間の過去レートを取得する方法
実際のコードの流れは以下の通りになります。
学習パート
取引モデルのパート
学習パラメタの更新に関しては、実際の論文を参照してください。
テスト結果の紹介
実際にこのモデルを用いて、パラメータの学習をしテストデータでの結果を以下に示します。
二段組になっていますが、上の段が実際の収益(単位:円)、下の段が価格データになっています。
直近での学習結果が以下のようになっています。
こちらが、30分足によるテストデータの結果です。見方ですが、単純な値幅のみの累積の収益となっています。なので、このグラフは1ヶ月半ぐらいで6円近く、pipsでいうとおよそ600pips稼げていることがわかります。
次に、10分足による結果を示します。
この結果を見ると、7月ごろから8月頭ぐらいまでにおよそ3.3円つまり330pipsほど稼いでいることがわかります。かなり好調ですね。
ですが、一応損が出ている結果も載せておきます。
1時間足と15分足による結果を以下に載せます。
1時間足
15分足
この結果を見ると、このモデルはそれなりに相場が荒れている時に利益を出し、全体的にトレンドの発生しているような相場では負けるというものになっています。
ですので、個人的にオススメなのは、なるべく短い時間足で値動きの激しい通貨を対象にするといいと思います。ですので今回はポンド円の10分足ぐらいで試すのが良いだろうということです。
他の時間足は、実際にnoteを購入するか、ご自身で実装してご確認ください。
参考論文
Deep Direct Reinforcement Learning for Financial Signal Representation and Trading
※追記
2019/08/09
先ほど特徴ベクトルの内容を変更した際に、幾分良い結果を得られたため、共有しておきます。
・10分足
・30分足
・15分足
・5分足
このような結果になっています。これより、ポンド円の10分足および30分足で取引を行う方が良い可能性が高いことがわかります。
実際には、ご自身で実装して他の期間に関してもお試しください。
なお、今後は最新の運用報告は下記の学習パート+取引モデルパートの統合したnoteにて更新していきますので、確認よろしくお願いします。
本コードはこちら
上記にあるように今回は学習パートと取引モデルの2パートになっています。
片方だけでいいよって方もいらっしゃるかと思うので、別々に分けようと思いますが、どっちも作れない!という方のために、二つを1セットにした記事も公開します。
もちろん、二つ別々で買うより少し割引しておきます。
以下が今回のコードの中身になります。
・【論文実装編】線形回帰モデルのFx自動売買ー学習パート
・【論文実装編】線形回帰モデルのFx自動売買ー取引モデルのパート
・【論文実装編】線形回帰モデルのFx自動売買ー学習パート+取引モデルのパート統合
過去のモデル紹介
また、他に自分が開発したコードもご紹介しておきます。
[OANDA V20]ボリンジャーバンドの改良版自動売買モデル(¥500)
FxでOANDA使ってる方、Pythonで作ったこの自動売買BOTを試して欲しいです。(OANDA V20対応)(¥1,000)
ディスカッション
コメント一覧
まだ、コメントがありません