トランプ大統領のツイートからFXの為替相場を予想する方法

使っているFX会社はどこ?
テクニカル分析用(チャートが使いやすい) → DMM FX
Python API用(FX APIはここしかない) → OANDA ジャパン
デイトレ用(スプレッドがとにかく狭い) → SBI FXトレード

 

トランプ大統領のツイートを解析してドル円レートの値動きを予測する方法をまとめました。pythonとナイーブベイズを使って、ツイートデータの前処理からモデリングまでの手順を初心者向けに公開しています。

こんばんは、新米データサイエンティスト(@algon_fx)です。最近、仕事が忙しいのを理由にジムに行けてませんでした。そんな生活が2ヶ月も続くと、気づけば体重が増えてました(汗)。来週からジム復活して、またしっかり頑張る所存です。

さて、私の体型などどうでも良い話ですね。今日のブログのネタは少し変わったネタをやりたいと思います。まずは下のツイートをみてください。

そうです、今回のブログではトランプ大統領のツイート内容を分析して、ドル円の為替レートの値動きを予測する流れをPythonを使って行います。

いつも通りですが本記事はFX予測手法を公開!これをやれば儲かります!といった類の話ではありません。これから機械学習の手法を活用してFXトレードをやってみたい!という方向けの入門チュートリアル的な内容です。

簡単なPythonの知識があれば実装が可能です。是非、みなさん挑戦してみてください!

ファンダメンタルズとは

FXトレードには大きく分けると2種類のトレード手法があります。それが「テクニカル分析」と「ファンダメンタルズ分析」です。

私は原則としてテクニカル分析を使ってFXトレードを主に行なっています。テクニカル分析とは、過去の為替レートの値動きを細かく分析をして今後のトレンドや将来の値動きを推測してトレードを行う手法です。

対してファンダメンタルズ分析とは、国の経済状態を分析して将来の為替レートの値動きを推測してトレードを行う手法です。

経済状態というと難しく聞こえますが、ニュースなどで耳にする「GDP(国内総生産)」や「貿易収支」などといった指標からその国の経済、さらにはその国の通貨を評価するわけです。

ファンダメンタルズの根本にあるのは非常にシンプルな考え方です。ファンダメンタルズが強い国(つまり経済状態が良好な国)の通貨はいずれ上昇する、逆にファンダが弱い国(つまり経済状態が悪い国)は通貨が下降すると考えに基づきます。

もう少し具体的な話をしましょう。ファンダメンタルズには数多くの指標が存在します。その中でも特に為替相場を大きく動かすのに「米国雇用統計」という指標が存在ます。下のチャートをみてください。

参照:ジャパンネット銀行

上の図は2012年4月の雇用統計が発表された直後のドル円のチャートです。たったの60秒でドル円が80銭も大幅に動いています。このように雇用統計が発表されると多くのトレーダーがドルの経済状況を加味してトレードすることにより、ドル円の相場が大きく動きます。

話が逸れるので雇用統計の詳細は割愛しますが、重要なのは経済指標が発表されるとドル円のレートが飛ぶように動くよ!ってところです。ドル円の相場を動かすのは雇用統計だけではありません。

ドル円を動かす指標は数多くありますが、今回はアメリカのトランプ大統領に焦点を当てましょう。日銀総裁や首相、大統領などが発言をして為替レートが動くことも多々あります。さんこうまでにですが、これららは「要人発言」と呼ばれます。

なぜトランプ大統領なのか?ですが特に理由はありません。強いていうのであれば、当選前からメディアを騒がし、問題発言などが多くドル円も敏感に反応するのでは?と考えたからです。事実、トランプ大統領が発言して世間が反応するので「トランプ砲」なんて言われたりします。

この記事の目標とやる事

この記事で行う内容、また達成したい目標を簡単にまとめます。

目標
・トランプ大統領のツイートデータを取得
・トランプ発言の10分後のドル円の値動きを予測

やる事
・2018年9〜10月のツイートデータを習得
・同時期のドル円レートデータをAPIから習得
・両データをクリーニング&前処理
・ナイーブベイズで解析
・テストデータを使ってモデルの評価

こんな流れでやっていきます。Pythonの初歩的な知識があれば誰でも実装可能です。機械学習の基礎知識があれば、より楽しめる記事だとは思いますが、無くても問題ないように解説します。

では、やってみましょう!

STEP1 ライブラリのインポート

Jupyter Notebooを起動して、一緒にコーディングしてみましょう。Google Colabを利用すれば、ブラウザ一つで本記事の内容が実装可能です。(詳しくは「Google Colabの使い方」をご参照ください)

まずは今回使うライブラリをインポートしましょう。

機械学習の三種の神器とも言える「Numpy」「Pandas」「Matplotlib」に加えて、「nltk」と呼ばれるライブラリもインポートしています。

「nltk」とはNatural Language Toolkitの略です。今回はトランプ大統領のツイート、つまり言語を解析します。言語解析で役に立つのがnltkです。nltkですが、Google Colabにはデフォルトでインストールされていますので追加構築は不要です。

nltkで追加のモジュールをダウンロードしちゃいましょう。下記のコードをセルに入力して実行してください。

すでにモジュールがダウンロードされていれば「True」が出力されます。

また、今回の使う機械学習の手法はナイーブベイズです。これはScikit-learnを使って実装します。

STEP2 トランプ大統領のツイートデータ取得

続いて今回の主役ともいえるトランプ大統領のツイートデータを習得しましょう。最初はツイッターのAPIを接続して取得されば良いかと考えていましたが・・甘かったです。

どうやらツイッターAPIは昔より使用制限が厳しくなり、申請してから最低でも一週間程度かかるとのこと。それは困る。とりあえずトランプさんだけのデータでもなんとかならないか・・

と考えてググっていたら、ありました便利なサイト。その名もtrumptwitterarchive.comです。そのままやん(笑)下記のフルアーカイブのページからデータの取得が可能です。

http://www.trumptwitterarchive.com/archive

今回は直近の2018年9月10月の二ヶ月分のトランプ大統領のツーイトデータを取得しました。上記のサイトから取得したデータをCSVにまとめています。下記のURLからダウンロード可能です。上記のサイトから自身でCSVファイルを生成しても問題ないです。

ダウンロード:trump.csv

では、早速ツイートのデータをPandasのデータフレームで読み込んでみましょう。Google Colabを使っている方はCSVファイルをGoogle Colabにアップロードしてから下記のコードを実行してください。

2ヶ月間のツイート総数は751のようです。思ったよりもツイート数が多いですね。単純計算すると115分に一度はつぶやいていることになります。まじか。

ではデータの内容も確認してみましょう。

少し見辛いですがこんなデータです。こちらのサイトで取得したデータですが、ツイッターのAPI経由で取得したデータをサイトに掲載しているそうです。

ツイートのデバイス情報やリツイートやファボ数など興味深いデータではありますが、今回は不要なのでデータから落としちゃいましょう。加えてツイート発信時間を「time」、ツイート内容を「tweet」とカラム名を変更します。

ツイート発信時間ですがデータ型がオブジェクトですので、Datatime型へ変換してあげましょう。さらにツイート発信時間の秒数を四捨五入します。これは後ほどの結合するドル円の為替レートのデータには秒数が含まれないためです。(1分足のデータなので)

ひとまずはトランプ大統領の2ヶ月間のツイートデータが取得できました。

STEP3 ドル円1分足データの取得

ツイートデータが揃いましたので、続いてドル円の過去為替レートのデータを作りましょう。こちらも同期間のデータが必要なのOANDA APIから2018年9月〜10月のドル円レートを取得しました。

APIから取得したデータをCSVファイルにまとめました。下のリンクからダウンロード可能です。APIから直接データを作ってみたい方は「PythonでFX APIを動かす基本技10選」をご参照ください。

→ usd_1min_trump.csv

ではレートのデータをPandasで読み込みましょう。今回は「時間(t)」と「終値(c)」のみしか使いませんので他のカラムは除外します。また、時間のデータをDatatime型へ変換もしています。

いきなり9月3日ですが、1日・2日は土日なのでレートデータがありません。

STEP4 教師データの作成

前段階としてトランプ大統領のツイートデータ、また同期間のドル円の為替レートデータが揃いました。これらのデータを少し調理して教師データとしてまとめましょう。

まずは時間軸を揃えてあげましょう。ドル円レートのデータは私がCSVファイルに落とす前に日本時間へ変換しています。対してツイートデータの時間は全て「GMT」基準ですがデータ取得先のサイトが米国東海岸時間(EST)へ全て変換しています。ですのでESTからJSTへ変換が必要です。

ESTとJST(日本時間)は時差が-14時間です。単純にGMTから-14時間を引いてあげましょう。(この時間の計算ですが注意が必要です。後ほど解説します)

これでツイートデータと為替レートデータの時間軸が整いました。

では、教師ラベルをデータに追加してあげましょう。今回はとても単純な教師ラベルを使います。トランプ大統領がツイートをした時間から10分後にドル円レートが情報すれば「1」、逆にレートが下がれば「0」とします。

今回は適当に10分後、さらには1分足のデータを使っていますが、これが正解という訳ではありません。1分後の直後ではどうなのか?翌日のデータは?といった具合に細かい検証が必要です。過去レートのデータ取得はOANDA APIを使えば異なる期間/ローソク足のデータ取得が可能です。

ではターゲットを作成しましょう。

念のため確認してみましょう。これが間違っていたら全てが台無しです。

大丈夫そうですね。一番上の09:04のレートと5分後のレートを比較してみると上がっているので教師ラベルは「1」で正解です。

STEP5 レートとツイートデータを結合

為替レートのデータへ教師ラベルも追加出来ました。2つのデータを結合しましょう。結合に使うKeyは時間とします。すでに前の項目で両データの時間軸を整えているので、トランプ大統領がツイートした時間の為替レートのデータが1行で表されます。

結合により不要なカラムがありますので除外しましょう。加えてターゲット(ドル円が上がったか下がったか)の分布を確認します。

若干ではありますがトランプ砲が放たれた五分後のドル円レートは下がる傾向の方が強いようです。(ラベルが0は五分後にレートが下がった、1は五分後にレートが上がったでしたね)

STEP6 言語データの前処理

教師データが揃いましたので、次は機械学習アルゴリズムが学習しやすいようんデータの前処理を行ってあげましょう。今回の訓練データは「言語データ」です。前処理の方法は数多くありますが、本記事では最も基礎的な以下の処理を行います。

・全文字列を小文字化する
・句読点を削除
・ストップワードを削除
・特殊記号を削除

それぞれの処理を行いながら簡単な解説も入れていきます。最終的に関数を作成して一括で処理をしますが、前処理を段階的に理解するためそれぞれの処理を確認してみましょう。サンプルのためデータの一番最初のツイートを切り出します。

最初の前処理は小文字化です。これは例えばLoveとloveの2単語が含まれていた場合、loveと小文字で統一することで同単語として認識するためです。

ご覧の通りサンプルのツイートの最初の単語「If」が「if」へ変換されています。

次は句読点を文書から取り除きます。句読点は人間が文章を理解する上でとても重要な役割を果たしますが、データとして解析するには少し厄介だからです。

よく出力結果をみてみると「,」などの句読点が文章から除外されているのが確認できます。ただし、ツイートをみてみると特殊文字「“」や「’」が未だ含まれています。これも邪魔なので除外しましょう。

不要な特殊記号も除外されています。クリーニングの最後は「ストップワード」を削除しましょう。ストップワードとは一般的に文章解析を行う際に役に立たないと考えられる単語をさします

nltkには英語のストップワードが収録されています。いくつか出力して確認してみましょう。

「i」や「me」などが英語ではストップワードです。人間の私たちからすれば、これらの単語は非常に重要な意味合いを持ちますが、解析を行う際には不要と考えて除外を行います。(ストップワードを除外することが100%正しい訳ではありません)

出力結果をみてみると「the」などの単語が除外されています。では、今までの処理を関数にまとめて、データを一括で綺麗にしてあげましょう。

句読点や記号など不要なデータが除外されて綺麗な文章になりました。今回はあくまで「基本」の処理です。これ以外にも数字を除外したり、類義語を一つにまとめるなど様々な処理があります。文章を解析するのはそれだけ大変って話です。

データが綺麗になりましたので、ここで訓練データとテストデータへ切り分けましょう。時系列のデータなので切り分け方に工夫すべきですが・・今回は乱数を使って簡単に分割しちゃいます。(サボります)

STEP7 Bag of Wordsへ変換

いよいよステップ7まできました!実際に予測をする目の前です!最後の力を振り絞って頑張りましょうw

モデル訓練を行う最後の処理は「Bag of Words」です。直訳すると「言葉の袋」です。Bag of wordsとは、文章に含まれる全単語を抽出して、それぞれが含まれるか含まれないかで「0」と「1」で表現する手法です。

Bag of Wordsを使うメリットは処理が非常に簡単なことです。デメリットとしては、単語の順序などが考慮されないことです。詳しく説明すると長くなりますので興味がある方はご自身で調べてみて下さい。

では、やってみましょう。Scikit-learnのCountVectorizer()のクラスを使うことで簡単に処理が可能です。下のコードをみてもわかりますが、単語抽出は「訓練データのみ」です。つまりテストデータにしか含まれない単語は情報として除外されます。

続いてターゲットも訓練・テストデータ共にNumpy配列へ変換してあげましょう。

これで準備完了です!!お疲れ様でした!!次はいよいよモデル訓練と実際に予測をして評価をしてみましょう。

STEP8 モデル訓練と評価

長った・・。内容は基礎的なことしかしていませんが、データ取得から前処理が長かったですね・・。でも皆さん!ここまで来たら後は簡単です!

冒頭でも話しましたが今回使うアルゴリズムはナイーブベイズを使います。ナイーブベイズとは、条件付き確率「ベイズの定理」を基にした機械学習の分類手法の一つです。

ではScikit-learnのナイーブベイズの使ってモデル訓練をしましょう。Scikit-learnには3種類のナイーブベイズが実装されていますが、今回は多項分布ナイーブベイズを利用します。

ではモデル訓練をやってみましょう。

訓練完了です!では、まずは訓練データを使って推測してみましょう。

おおおお!なんかそこそこ予測精度よくねー?って、訓練データですからね。モデルはこれらのデータを学習済みな訳ですから精度が高くて当然です。念のため正解率も算出してみましょう。

訓練データでは97%の正解率が出ました。しつこいようですが、これは訓練データです。さほど大きな意味合いはありません。

では、いよいよ本番!!!!テストデータで推測してみましょう!トランプ砲が放たれた5分後のドル円のレートの動きを上手く予測できたのでしょうか・・ドキドキワクワクです!

あ〜〜・・うん。まぁこんなもんですかね。それでは正解率も出してみましょう。

結果、58.41%の正解率でした!まぁ、トランプ砲が放たれて勘でドル円の値動きを予測するより少しだけ精度の高い推測が出来た結果です。

では、推測した結果をローソク足に落として確認してみましょう。テストデータの12番目のデータを確認してみます。

こちらのデータは正解ラベルが「1」。つまりトランプ砲が放たれた5分後にドル円のレートが上昇したサンプルです。

こちらのツイートの発言時間をデータから探してあげましょう。Pandasのquery()を使って文字列検索を行います。

時間がわかりましたので、為替データから当該時間のデータを切り出してローソク足に出力してみます。

ローソク足の一番左がトランプ砲が放たれた瞬間です。ご覧の通りトランプ大統領がツイートした5分後にドル円レートは上昇しているのが確認できます。

このモデルを信じてトレードしていたら利益が出たことになりますね。

まとめ

今回は少し長くなりましたが、如何でしたでしょうか?本ブログではテクニカル指標を特徴量として様々な手法でFX予想を行って来ましたが、このように文章(ツイート)を使った予測手法は初めてのご紹介でした。

しつこい様ですがこのFX予想手法を使っても儲けは絶対に出ません。ただし、学習するデータの期間やターゲットの作成の仕方などを工夫することでトレードの役立つツールを作ることは可能です!

FXで機械学習を使うための初心者向けチュートリアルもまとめています!Pythonの初歩的な知識があれば実装が可能ですので、興味がある方は是非ご覧ください!

決定木を使ってFX予想をやってみる
FXトレードでロジスティック回帰を独自テクニカル指標として活用する方法

ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!

FX 機械学習

Posted by algon