Pythonでゴールデンクロスとデッドクロスを分析する方法

使っているFX会社はどこ?
自動売買用(1万円キャッシュバック中) → インヴァスト証券
Python API用(FX APIはここしかない) → OANDA ジャパン

Pythonを使って単純移動平均のゴールデンクロス・デッドクロスを算出して、簡単なバックテストを行う方法。プログラミングの簡単な知識があれば実装が可能です。

こんばんは、新米データサイエンティスト(@algon_fx)です。本業で、とあるエンジニア向けの雑誌に記事執筆をすることになりまして、締め切りに追われる毎日です。

ただ、本職のライターさんが校正をしてくれるので、非常に学ぶことが多いです。人生の3分の1以上を海外で過ごしてしまった私は・・日本語での文章力が非常に拙いので・・プロの方の書き方を見ると勉強になります!

さて、仕事で気の抜けない文章ばかりを書いて疲れたので、ブログを更新します(笑)。今日のお題は「みんな大好きゴールデンクロスとデッドクロス」です。

FXテクニカルトレードの最も初歩的と言われる手法です。非常に単純な使い方で、実際のFXトレードで参考にしている方も多いかと思います。

今回はPythonを使って単純移動平均(SMA)のゴールデンクロス/デッドクロスを分析する手法をまとめました。では、やってみましょう!

ゴールデンクロス&デッドクロスとは?

FXには様々なテクニカル指標があります。テクニカル指標とは現在のレートを一定の計算式で処理を行なった「指標」です。これらの指標の動きを捉えることで、為替レートの動きの参考にします。(参考:Pythonでテクニカル指標を計算する方法

指標の動きを特定のパターンでまとめたものが「売買シグナル」です。テクニカル指標が上がったら「買い」、下がったら「売り」などといったルールのようなものがあります。

ゴールデンクロス、デッドクロスはこの売買シグナルの最も初歩的なものと言っても過言ではありません。初心者から上級者のトレーダーまで、幅広いレベルの人に使われています。

ゴールデンクロス(デッドクロス)は移動平均線を使います。移動平均線とは、一定の期間の為替レートの平均です。「一定の期間」と言いましたが、期間設定は人により様々です。一般的には「5日平均」「12日平均」「25日平均」「75日平均」などを使います。

移動平均線にも様々な使い方がありますが、一般的に「短期」と「長期」の2種類を使います。例えば短期は5日平均長期は25日平均と言った具合です。

この短期移動平均線と長期移動平均線の「クロス(交わり)」がゴールデンクロスとデッドクロスです。下の図を見てください。

引用:外為ドットコム

ゴールデンクロスは短期線が長期線を下から上へ突き抜ける状態です。直近の価格傾向が上向きに転じたと捉えられるので「買いシグナル」です。

対してデッドクロスは短期線が長期戦を上から下へ突き抜ける状態です。為替レートが下降トレンドに転じたと捉えられるため「売りシグナル」となります。

非常に単純明確でわかりやすい売買シグナルです。ただ、実はとても奥深い奴でもあるのです。例えば移動平均線は複数種類あります。単純移動平均(SMA)や加重移動平均、さらにはEMAなども移動平均の仲間に入ります。

また「平均」をとる期間によっても大きく使い方が異なります。

今回はドル円の10分足の過去為替データを使って、単純移動平均を求めながらゴールデンクロス、デッドクロスをPythonで分析してみましょう。

STEP1 実行環境とデータ

自分のPCにPythonと機会学習系ライブラリが構築されている方はそちらを使ってください。下記のライブラリ/ソフトウェアを使っています。

  • Python 3
  • Jupyter Notebook
  • Pandas
  • Numpy
  • Matplotlib

Pythonの環境がない方はGoogle Colabがオススメです。特別な設定など不要で、いますぐに機械学習の実行環境であるJupyter Notebookがブラウザからアクセスできます。

Google Colab

Google Colabの詳しい使い方やデータのアップロード方法などはこちらの記事をご参考ください。5分程度でPythonの実行環境が整います。本記事のコードをそのまま写経するだけで、全く同じ結果が得られます。(確認済み)

データは私がOANDA FX APIから取得したドル円の10分足の過去データを使います。下記のリンクからCSVファイルをダウンロードして下さい。自分で為替過去データを取得して見たい方は「OANDA FX API使い方まとめ」の記事をご参照ください。

【使うCSVファイル】
usd_10min_api.csv

ダウロードが出来たら準備完了です。

STEP2 データの確認

ではJupyter Notebookを立ち上げで、データを確認して見ましょう。本記事はGoogle Colabを使った前提で進めます。

まずは必要なライブラリを読み込みましょう。

次にGoogle Colabへusd_10min_api.csvをアップロードする必要があります。下記のコードをGoogle Colab上で実行するとブラウザのファイルアップローダーが立ち上がります。

「選択」をクリックしてusd_10min_api.csvを選ぶと自動でアップロードが開始します。アップロードが完了すると下記のような出力が出ます。

これでGoogle ColabのサーバーへCSVファイルがアップロードされました。次にデータを扱いやすいようにPandasのデータフレーム形式でCSVファイルを読み込みましょう。

念のため最初の1行目と最後の1行目を確認します。

ご覧の通り、こちらのデータは2018年3月1日15:40から2018年8月10日 16:10までの期間のデータです。冒頭でも触れましたがOANDA FX APIから取得した実際のドル円の10分足の過去為替レートです。

データ確認の最後に簡単にこの為替レートをチャートに落としてみましょう。PandasのPlot()を使うと手抜きバージョンのチャートがパッと確認できます。

上昇トレンドが見て取れます。よりちゃんとしたチャートを確認したい方は「Pythonでローソク足チャートを作る」をご参照ください。

STEP3 単純移動平均を計算しよう

簡単なデータの確認も行いましたので、次はゴールデンクロス・デッドクロスの基となる「単純移動平均」を計算してあげましょう。(参照;単純移動平均(SMA)とは?

単純移動平均は字のごとく「単純」な「平均」です。算出方法は色々方法がありますが、最も手軽なNumpyのrolling()関数を使います。

しっかりと期間5期間15の単純移動平均が計算できています。

では、次は終値(close)、期間5単純移動平均(sma_5)、期間15単純移動平均(sma_15)の一部をチャートにして確認してみましょう。

チャート上の矢印は私が書き加えました。青線が終値、緑線が短期線(sma_5)、赤線が長期戦(sma_15)です。

赤矢印の部分に注目してください。こちらは短期線(緑)が長期線(赤)を下から上に突き抜けています。これがゴールデンクロスで買いシグナルです!実際にゴールデンクロスが出た後の相場は上がっているのが確認できます。

青矢印は短期線(緑)が長期線(赤)を上から下に突き抜けています。これがデッドクロスで売りシグナルです!その直後に為替相場が大きく下げているのが確認できます。

このデータだけ観ると、ゴールデンクロスやってりゃ億万長者じゃん!って思いますよね(笑)果たしてそれが本当なのか、Pythonを使って分析しましょう。

STEP4 ゴールデンクロス・デッドクロス算出

長期と短期の単純移動平均の計算が終わりましたので、次はいよいよデータからゴールデンクロス・デッドクロスを計算してみましょう。

まずは短期と長期の移動平均の値の差分を求めます。

一番上のレコード(16417)を確認すると短期平均が110.99で長期平均が110.90、その差分(diff)が0.09と計算できているのが確認できます。

では、まずはゴールデンクロスから検知しましょう。Numpyのsign()関数を使ってdiffがマイナスであれば-1、プラスであれば+1へ変換をします。

次にdiffが0の場合の処理を行なって、最後にnp.roll()で1つずらしたdifの引き算行なっています。現在がゴールデンクロスの場合は-1から+1へ変化を行なったタイミングですので、「-1 – (+1) = -2」となった箇所がゴールデンクロスが出現した場所です。

では確認してみましょう。

ご覧の通り00:30ではdiffがマイナス(短期が長期より下)だったのが、00:50にはプラスへ変換しています。そのタイミングでcrossに1の値がしっかり入っています。

これでゴールデンクロスの検知が行えたので、別途データフレームへgoldenとしてコピーしておきましょう。

同じ要領でデッドクロスも確認します。コードを見ながら、それぞれどのような処理が行われているか確認して見てください。

これでゴールデンクロスとデッドクロスが為替データから抽出することができました!最後に今回のデータでそれぞれ何回出現するのか確認してみます。

ゴールデンクロスが560回、デッドクロスが559回となっています。

STEP5 バックテストをやってみよう

では、実際に今回のデータの期間(約三ヶ月程度)で、この売買シグナル(ゴールデン・デッド)を基にトレードをしたら、どれくらい儲かるか、損するのかを簡単に確認しましょう。

売買シグナルを過去データを使って検証する方法を「バックテスト」と呼びます。実際のバックテストではFX会社のスプレッドなどの取引コスト等を考慮して行いますが、今回は全て無視して簡易版をやりましょう(笑)

バックテストの前提としては・・・

①ゴールデンクロス/デッドクロスが出現したら1万通過オーダー
②オーダーの10分後に決済

という非常にシンプルな条件で確認しましょう。ではPythonを使ってやってみましょう。

ゴールデンクロスが出現した直後に「買い」を発注して、10分後に決済を行なって利益がでたトレードの一部です。golden_profitに0.020とありますが、これは2pipの利益を意味しています。(0.005では実質スプレッドで損になる可能性もありますね)

では、ゴールデンクロスとデッドクロスのシュミレーションの結果をチャートで確認してみましょう!果たして利益が出たのか・・損をしたのか・・

おお!微妙ではありますが・・利益が出ていますね!Y軸の0の部分が利益/損が無しをを意味しています。デッドクロス(緑線)は序盤から調子がよく、少しづつ利益を積み上げていますね。

対してゴールデンクロス(青線)は半ば迄は絶不調でしたが、後半に勢いよく利益をあげて、最終的には微増で増えています。

まとめと次の課題

今回は売買シグナルの最も基本形である単純移動平均の「ゴールデンクロス」「デッドクロス」をPythonを使って算出してバックテストを行いました。

あくまで初歩的な物ですので、これでFXトレードで利益が出るわけではありません。もし興味がある方は、下記のような実験もやってみると良いかと思います。

(実験1)異なる短期・長期線で検証をしてみる(今回は5、15でした)
(実験2)異なるトレードシュミレーションで検証してみる(今回は即決済)

また、私は実際のトレードでは売買シグナルのダマシをモデリングしてトレードの参考にしています。(今回のゴールデンクロスはダマシなのか、そうでないかを学習したモデル)

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

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

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

使っているFX会社はどこ?
自動売買用(1万円キャッシュバック中) → インヴァスト証券
Python API用(FX APIはここしかない) → OANDA ジャパン

FX トレード

Posted by algon