株式市場を深層学習する

コードはこっち https://github.com/talolard/MarketVectors/blob/master/preparedata.ipynb

ここ数ヶ月、私は “ディープラーニング"、特に言語とテキストへのそのアプリケーションに魅了されました。私は大部分の経歴を金融技術に費やしました。主にアルゴリズム取引や代替データサービスでした。これがどこにあるのかを見ることができます。 私はこれを書いて私の考えを真っ直ぐにしました。私は「ディープ・ラーニング」の愛好家になっていますが、頭がおかしいほどの栄光の中でアイデアを脳ダンプする機会はあまりありません。私は、明確な考え方の適切な表示は、現場からではなく人々にそれを明言する能力であると私は思う。私はそれを行うことに成功したことを願っています。私の表現は楽しいものです。

NLPが株式予測に関係する理由

多くのNLP問題では、シーケンスをとり、それを単一の固定サイズ表現にエンコードし、その表現を別のシーケンスにデコードします。たとえば、テキスト内のエンティティにタグを付けたり、英語からフランス語に翻訳したり、オーディオの頻度をテキストに変換することができます。これらの分野では激しい作業が行われており、多くの結果が最先端のパフォーマンスを達成しています。 私の考えでは、NLPと財務分析の最大の違いは、言語に構造の保証があることです。構造の規則があいまいであることだけです。一方、市場は学習可能な構造の約束を持っておらず、そのような構造は、このプロジェクトが証明または反証されることを前提としています(その構造を見つけることができれば、 その構造が存在すると仮定すると、パラグラフのセマンティクスをエンコードするのと同じ方法で市場の現在の状態を要約するという考えは私にとっては妥当であると思われます。まだそれが理にかなっていない場合は、読んでください。そうなる。

あなたはそれが保持している会社の言葉を知っているはずです(Firth、J. R. 1957:11) 単語の埋め込みに関する文献はたくさんあります。 Richard Socherの講義は素晴らしいスタート地点です。 一言で言えば、我々はすべての言葉の幾何学を私たちの言語で作ることができ、その幾何学は言葉の意味とそれらの間の関係を捕らえる。 あなたは “キングマン+女性=クイーン"のような例を見たことがあります。

f:id:miyamotok0105:20170305023942j:plain

埋込みは凝縮された形で情報を表現できるので、すばらしいです。 単語を表現する古い方法は、私たちが知っている単語の数と同じ長さのベクトル(数字の大きいリスト)を保持し、それが現在の単語であれば特定の場所に1を設定していました。 これは効率的なアプローチではなく、意味を捉えません。 埋め込みを使用すると、固定された数のディメンション内のすべての単語を表現することができます(300は十分であるように見える、50はうまくいく)。 下の図は例を示しています。 埋め込みはインターネット全体で多かれ少なかれ訓練されました。 集中的な計算の数日後に、各単語はいくつかの高次元空間に埋め込まれていました。 この「空間」にはジオメトリや距離などの概念があり、どの単語が近いかを尋ねることができます。 その方法の著者/発明者が例を挙げた。 カエルに最も近い言葉があります。

f:id:miyamotok0105:20170305024023p:plain

しかし、我々は単なる言葉以上のものを組み込むことができます。 我々は、例えば、株式市場埋め込みを行うことができます。

Market2Vec

私が聞いた最初の単語埋め込みアルゴリズムはword2vecでした。 別のアルゴリズムを使用していますが、私は市場で同じ効果を得たいと思います。 私の入力データはcsvで、最初の列は日付で、1,000株のHigh Low Open Closingの価格に対応する4 * 1000の列があります。 それは私の入力ベクトルが大きすぎる4000次元です。 だから私がやるべきことの最初のことは、私が映画が好きだったので、それをより低い次元の空間、例えば300に埋め込むことです。

4000次元で何かを撮り、それを300次元空間に詰め込むのは私の音ですが、実際には簡単です。 行列を乗算するだけでいいです。 マトリックスは、すべてのセルに数値を持ち、フォーマットに問題がない、優れたExcelスプレッドシートです。 4000列と300行のExcelテーブルを想像してみましょう。そして、基本的にベクトルに対してそれを打つと、サイズ300の新しいベクトルが出てきます。それが大学でどのように説明したのかと思います。

ここでは、マトリックスの数値をランダムに設定するので、ここでは始まります。「深層学習」の一部は、スプレッドシートが変わるように数値を更新することです。結局、この行列スプレッドシート(​​私は今からマトリックスに固執するでしょう)には、元の4000次元のベクトルをそれ自身の簡潔な300次元の要約に叩き込む数が入ります。 私たちはここでちょっと気晴らしをして、活性化機能と呼ばれるものを適用します。我々は関数を取り、それをベクトルの各番号に個別に適用して、それらがすべて0と1の間で終わるようにします(または、0と無限大、それは依存します)。どうして ?これは私たちのベクトルをより特別なものにし、学習プロセスがより複雑なものを理解できるようにします。どうやって? だから何?私が見いだしたいことは、市場価格(ベクトル)を小さなスペースに新たに埋め込むことは、他のものに時間を浪費することなく、手元にあるタスクのすべての重要な情報をキャプチャすることです。だから、私は彼らが他の株式との相関関係を捉えると期待しています。おそらく、あるセクターが衰退しているときや市場が非常に暑いときに気付くでしょう。私はそれがどのような特徴を見つけるのか分からないが、彼らは役に立つと思う。

それで

私たちの市場ベクタを脇に置き、言語モデルについて話してください。 Andrej Karpathyは、叙事詩「リカレントニューラルネットワークの不合理な有効性」を書きました。私が最もリベラルな方法で要約すれば、ポストは

  • 私たちがシェイクスピアの作品を見てキャラクターごとに登場すれば、「深層学習」を使って言語モデルを学ぶことができます。
  • 言語モデル(この場合)は魔法の箱です。あなたは最初の数文字を入れて、次の文字が何になるかを教えてくれます。
  • 言語モデルが予測した特性を取り入れ、それを元に戻すと、私たちは永遠に続くことができます。

そして、パンチラインとして、彼はシェイクスピアのようなテキストの束を生成しました。そして、彼はLinuxソースコードでそれをやり直しました。それから再び代数幾何学に関する教科書で。

だから、私はそのマジックボックスのメカニックに戻ってきますが、前のものに基づいて次の言葉を予測したように、過去の市場を予測したいと思います。 Karpathyが文字を使用する場所では、マーケットベクトルを使用して魔法のブラックボックスに入力します。 私たちはまだ予測したいものを決めていませんが、それは大丈夫です。

より深く進む

私は、深層学習の深い部分に取り掛かるところがここにあることを指摘したいと思います。 これまでのところ、市場を凝縮させるスプレッドシートを凌駕する学習の単層があります。 ここで、いくつかのレイヤーを追加して積み重ねて、「深い」ものを作ります。 それは深層学習の深いところです。 だからKarpathyは、Linuxソースコードからのサンプル出力を示しています。これは、ブラックボックスが書いたものです。

static void action_new_function(struct s_stat_info *wb)
{
  unsigned long flags;
  int lel_idx_bit = e->edd, *sys & ~((unsigned long) *FIRST_COMPAT);
  buf[0] = 0xFFFFFFFF & (bit << 4);
  min(inc, slist->bytes);
  printk(KERN_WARNING "Memory allocated %02x/%02x, "
    "original MLL instead\n"),
    min(min(multi_run - s->len, max) * num_data_in),
    frame_pos, sz + first_seg);
  div_u64_w(val, inb_p);
  spin_unlock(&disk->queue_lock);
  mutex_unlock(&s->sock->mutex);
  mutex_unlock(&func->mutex);
  return disassemble(info->pending_bh);
}

かっこを開いたり閉じたりする方法を知っており、インデントの規則を尊重していることに注意してください。関数の内容は適切にインデントされており、複数行のprintkステートメントは内側の字下げを持っています。これは、このマジックボックスが長距離依存性を理解していることを意味します。 print文の中にインデントされているときは、それがprint文にあることを知っていますし、関数内にあることも記憶しています(少なくともインデントされた他のスコープも)。それはナッツです。それを光栄にするのは簡単ですが、長期依存性を捕捉して記憶する能力を持つアルゴリズムは非常に有用です。なぜなら、我々は市場で長期依存性を探したいからです。

魔法のブラックボックスの中に

この魔法のブラックボックスの中身は何ですか?これは、LSTMと呼ばれるリカレントニューラルネットワーク(RNN)の一種です。 RNNは、シーケンス(文字列のような)に作用する深層学習アルゴリズムです。すべてのステップで、次のキャラクタの表現(前に述べた埋め込みのように)を取り、前に見たようにマトリックスで表現します。問題は、RNNに何らかの形の内部メモリがあるため、以前に見たものを記憶していることです。そのメモリを使用して、次の入力でどのくらい正確に動作するかを決定します。そのメモリを使用して、RNNは意図したスコープの内側にあることを「覚えている」ことができます。これは、適切にネストされた出力テキストを取得する方法です。

f:id:miyamotok0105:20170305024405p:plain

RNNの華麗なバージョンをLong Short Term Memory(LSTM)といいます。 LSTMは巧みに設計されたメモリで、 - それが覚えているものを選択的に選択する - 忘れることを決める - どのくらいのメモリを出力するかを選択します。

f:id:miyamotok0105:20170305024535p:plain

だから、LSTMは “{"を見て "それを覚えておくことが大事です"と言うと、それがネストされた範囲にあることを本質的に覚えています。対応する ”}“が見えると、元の開きブレースを忘れて、それがネストされたスコープにあることを忘れることができます。 私たちは、LSTMにいくつかを重ねることでより抽象的な概念を学ばせることができます。それによって、私たちは再び「深く」なります。以前のLSTMの各出力は、次のLSTMの入力となり、入力されるデータの抽象度を上げることができます。上の例では(これは単なる推論です)、LSTMの最初の層はスペースで区切られた文字は「単語」です。次のレイヤーは、(static void action_new_function)のような単語タイプを学習するかもしれません。次のレイヤーは、関数とその引数の概念などを学ぶかもしれません。 Karpathyのブログは、どのようにして正確にそれを可視化したのか、本当に素晴らしい例がありますが、各レイヤーが何をしているのかを正確に伝えるのは難しいです。

Market2VecとLSTMの接続

熟練した読者は、Karpathyが埋め込みではなく文字を入力として使用していることに気付くだろう(技術的には文字のワンホットエンコーディング)。しかし、Lars Eidnesは実際には、リカレントニューラルネットワークを使用してClickbaitを自動生成するときに単語埋め込みを使用しました

上記の図は、彼が使用したネットワークを示しています。 SoftMaxの部分は無視してください(後で説明します)。今は、一番下の単語の並びとそれぞれの単語の並びの中に、どのように底を置いているのかをチェックしてください。 (「単語ベクトル」は、この記事の冒頭で見たように、数字の束の形の単語の表現であることを忘れないでください)。 Larsは一連の単語ベクトルとそれらのそれぞれを入力します: - 最初のLSTMに影響する - LSTMを上のLSTMに何か出力する - LSTMを次の単語のためにLSTMに何か出力させる 1つの違いで同じことをやろうとします。単語ベクトルではなく、 “MarketVectors"を入力します。要約すると、MarketVectorsには、特定の時点における市場で起こっていることの概要が含まれている必要があります。それらのシーケンスをLSTMに挿入することで、市場で起こっている長期的な動向を把握したいと考えています。 LSTMのいくつかのレイヤーを積み重ねることで、私はマーケットの振る舞いのより高いレベルの抽象を捕捉したいと考えています。

何が出てくるのか

これまでのところ、アルゴリズムが実際に何かを学ぶ方法については一切言及していませんでしたが、私たちはデータで行う巧妙な変換について話しました。その会話をいくつかの段落に延期しますが、他のすべてのものを価値のあるものにするパンチラインのために、この部分を覚えておいてください。 Karpathyの例では、LSTMの出力は、ある抽象表現の次の文字を表すベクトルです。 Eidnesの例では、LSTMの出力は、次の単語が何らかの抽象空間内にあることを表すベクトルです。両方の場合の次のステップは、抽象的な表現を確率ベクトルに変更することです。確率ベクトルは、それぞれの文字または単語がそれぞれ次にどのように表示される可能性が高いかを示すリストです。これがSoftMax機能の仕事です。尤度のリストを取得したら、次に表示される可能性の高い文字または単語を選択します。 「市場を予測する」という我々のケースでは、予測するために市場に出たいと思っているものは何かを自問する必要があります。私が考えていたオプションのいくつかは:

1、1000株のそれぞれの次の価格を予測する 2、次のn分にあるインデックス(S&P、VIXなど)の値を予測します。 3、次のn分で株式のどれがx%以上上昇するかを予測する 4、(私の個人的な好み)次のn分に2倍の割合でどの株が上下するかを予測し、その間にx%以上下がることはありません。 5、(この記事の残りの部分ではこれから説明する予定です)。 VIXが次のn分で2倍の割合で上/下に移動し、その間にx%以上下降しないと予測します。

1と2は回帰の問題で、特定のイベント(文字nの出現や市場の上昇のような)の可能性ではなく、実際の数を予測する必要があります。 それらは大丈夫ですが、私がしたいことではありません。 3と4はかなり似ていますが、どちらもイベントを予測するように求められます(技術用語ではクラスラベル)。 イベントは、次に表示される文字nとすることもできますし、過去10分間に3%以上ダウンしないで5%を上げることもできます。 3と4との間のトレードオフは、3がはるかに一般的であることから学ぶことがより簡単であり、4は利益の指標であるだけでなくリスクにいくつかの制約があるため、価値が高いということです。 5は、3と4に似ているが、従うのが簡単な仕組みを持っているので、この記事では引き続き説明します。 VIXはFear Indexと呼ばれることもあり、S&P500の株式がどれほど変動するかを表します。 これは、指数内の各株式に関する特定のオプションのインプライド・ボラティリティを観察することによって導出されます。

Sidenote - なぜVIXを予測するのか

VIXを興味深いターゲットにするのは、 1000年代の株式ではなく、1つの数字だけです。これにより、概念的に従うのがより簡単になり、計算コストが削減されます。 それは多くの株式の要約なので、入力のすべてではないにしてもほとんどが関連している 入力の線形結合ではありません。インプライドボラティリティは、複雑で非線形のフォーミュラ在庫から在庫によって抽出されます。 VIXは、その上に複雑な数式から派生しています。私たちがそれを予測できるなら、それはかなりクールです。 それはトレード可能なので、実際にこれが動作すれば使用できます。

私たちのLSTM出力とSoftMaxに戻る

将来VIXの変更を予測するために、以前に見た公式をどのように使用すればよいでしょうか?データセットの各ポイントについては、5分後にVIXに何が起こったかを見ていきます。その時間に0.5%以上下がることなく1%以上上がった場合は、1を出力し、それ以外の場合は0を出力します。次に、次のようなシーケンスが得られます。

0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,0 …。

私たちは、LSTMが出力したベクトルを取り込み、シーケンスの次のアイテムの確率が1になるようにスカイシングしたいと思っています。スケーリングは、上の図のSoftMaxの部分で行われます。 (技術的には、現在1クラスしかないので、シグモイドを使用しています)。

だから私たちがこのことを学ぶ前に、今まで何をしてきたのかを見直そう 我々は1000株の価格データのシーケンスを入力として取る 順序の各時点は市場のスナップショットです。私たちの入力は4000の数字のリストです。埋め込みレイヤーを使用して、300の数字で重要な情報を表現します。 今我々は市場の埋め込みのシーケンスを持っている。それらをLSTMのスタックに入れます。タイムステップごとにタイムステップを進めます。 LSTMは前のステップからの事柄を覚えており、それは現在のプロセスをどのように処理するかに影響します。 LSTMの最初の層の出力を別の層に渡します。これらの人たちはまた覚えて、私たちが入れた情報のより高いレベルの抽象を学ぶ。 最後に、すべてのLSTMからの出力を取り込み、市場情報のシーケンスが一連の確率になるように「スキッシュ」します。問題の確率は、「VIXが0.5%下がることなく次の5分で1%上昇する可能性がある」 このことはどうやって学ぶのですか? 今楽しい部分。今まで私たちがやったことは全て順路と呼ばれていましたが、私たちはアルゴリズムを訓練する間に、またそれらを生産に使用するときに、すべてのステップを実行します。ここでは、逆方向パスについて説明します。私たちのアルゴリズムを学習させる訓練中に行う部分だけです。 そのため、トレーニング中に過去数年間の歴史的データを準備しただけでなく、データの各観測後にVIXが希望の方法に移動したかどうかを示す0と1のリストも作成しました。 学習するには、市場データをネットワークに送り、その出力を計算したものと比較します。私たちの場合を比較すると、簡単な減算になります。つまり、モデルの誤差は次のようになります。 ERROR =(((事前計算) - (予測確率))²)^(1/2) または英語では、実際に起こったことと私たちが予測したことの差の平方根平方根です。

ここに美しさがあります。これは微分関数です。つまり、予測が少し変わった場合、誤差がどのくらい変化したかを知ることができます。我々の予測は、微分可能な関数の結果である。SoftMax softmaxへの入力であり、LSTMはすべて微分可能な数学関数である。これらの関数はすべてパラメータでいっぱいですが、私が以前に話したような大きなスプレッドシートです。ですから、この段階では、私たちがモデルで持っているすべてのExcelスプレッドシートの何百万というパラメータのすべてについて、エラーの派生を取ります。これを実行すると、各パラメータを変更したときにエラーがどのように変化するかを見ることができるので、エラーを減らす方法で各パラメータを変更します。 このプロシージャは、モデルの先頭まですべて伝播します。マーケットベクトルが私たちの仕事にとって最も重要な情報を表すように、マーケットベクトルにインプットを埋め込む方法を微調整します。 それぞれのLSTMがいつ覚えているかを微調整し、出力が仕事に最も関連するようにします。 私たちのLSTMが学ぶ抽象を調整して、私たちの仕事にとって最も重要な抽象概念を学ぶようにします。 これは、われわれがどこにも指定する必要のないこのような複雑さと抽象をすべて持っているので、私の意見では驚くべきことです。 MathaMagically私たちがエラーとみなすものの仕様から推測されます。

次は何ですか

今私はこれを書面で明らかにしたが、それでも私は欲しいと思う。 誰かがこれを読むのを邪魔するかどうかを確認する。 親愛なる読者が指摘している間違いをすべて修正する これがまだ実現可能かどうかを検討する そしてそれを構築する あなたがこれまで来たのであれば、間違いを指摘し、あなたの意見を共有してください。

他の考え

ここでは、このプロジェクトに関するいくつかのより高度な考え方、私が試してみたいこと、それが実際にうまくいくかも知れない理由が私には分かります。

資本の流動性と効率的利用

一般的に、特定の市場がより流動性が高いほど効率的です。私はこれが鶏肉と卵のサイクルによるものだと考えていますが、市場はより流動的になりますが、資本がそれ自体を傷つけずに出入りする資本を吸収することができます。市場が流動的になり、資本を増やすにつれて、洗練されたプレーヤーが入居することになります。これは洗練された費用がかかり、大規模な資本でリターンする必要があるためです。運用コストを正当化します。 迅速な結果は、流動性の低い市場では、競争はそれほど洗練されていないので、このようなシステムが取引できる機会はないと考えられます。要点は私が試してこれを試してみることでした。それは市場の液状ではない部分、つまりおそらくS&P 500の代わりにTASE 100で試すことです。

このことは新しいものです

これらのアルゴリズムの知識、それらを実行するためのフレームワーク、それらを訓練するコンピューティングパワーは、少なくとも自分自身のような平均的なJoeに利用可能であるという意味では全く新しいものです。私は、トッププレーヤーが数年前にこのようなことを考え出し、長い間実行する能力を持っていたと仮定したいと思いますが、上の段落で言及したように、彼らはそのサイズをサポートできる液体市場で実行する可能性が高いです。市場参加者の次の層は、技術的な同化の速度が遅く、その意味で未開拓の市場でこれを実行しようとする競争があるか、またはすぐになると思います。

複数のタイムフレーム

私は上記の1つのインプットの流れについて述べましたが、私は、効率的なトレーニング方法は、市場のベクトルを(少なくとも)複数の時間枠で訓練し、推論段階でそれを供給することだと思います。つまり、私の最低時間フレームは30秒ごとにサンプリングされ、ネットワークは最大でも時間を伸ばす依存関係を学習すると期待しています。 彼らが適切かどうかはわかりませんが、複数の時間枠にパターンがあると思います。計算コストを十分に低く抑えることができれば、それらをモデルに組み込むことは価値があります。私はまだ計算上のグラフ上でこれらを表現するのが最善の方法と対立しており、おそらくそれを開始することは必須ではないかもしれません。

MarketVectors

NLPで単語ベクトルを使用するときは、通常、事前にトレーニングされたモデルから始め、モデルのトレーニング中に埋め込みの調整を続けます。私の場合は、事前に訓練された市場のベクトルはありませんし、またそれらを訓練するための明確なアルゴリズムもありません。 私の元々の考察は、この論文のように自動エンコーダーを使用することでしたが、終了までのトレーニングはよりクールです。 より深刻な考慮点は、シーケンスが最終的に単一のベクトルとして符号化され、次いで異なる表現(音声からテキストまたは英語からフランス語のような)に復号される、翻訳および音声認識におけるシーケンス間シーケンスモデルの成功である。その見方では、私が記述したアーキテクチャ全体は基本的にエンコーダであり、実際にはデコーダを配置していません。 しかし、私は最初のレイヤー、つまり4000次元のベクトルを入力として取り、300次元のものを出力するレイヤーに特有のものを実現したいと考えています。私はそれがさまざまな株式間の相関や関係を見つけて、それらに関する特徴を構成したいと思っています。 代わりに、各入力をLSTMを介して実行し、おそらくすべての出力ベクトルを連結し、エンコーダステージの出力を考慮する。私は、楽器とその機能の間の相互作用や相関関係が失われ、10倍の計算量が必要になるため、これは非効率的だと思います。一方、そのようなアーキテクチャは、複数のGPUとホスト間で単純に並列化することができ、これが利点です。

CNNs

近年、文字レベルの機械翻訳に関する論文が盛んになっている。このホワイトペーパーでは、RNNではなく畳み込みレイヤーを使用して、長距離の依存関係をキャプチャできるようになったので、私の目には惹かれました。私はそれを短く読まれた以上のものではありませんでしたが、私は、各株をチャネルとして扱い、最初に(RGBイメージのように)チャネルを畳み込む改造は、市場のダイナミックスを本質的に文字から意味的意味を符号化するのと同じ方法である。

参考

https://medium.com/@TalPerry/deep-learning-the-stock-market-df853d139e02#.gk4f2pc1i