PythonでFXのトレンドラインを引いてみる

2018年12月21日

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

FXのトレンドラインをPythonを使って引く方法のまとめ。為替レートのデータを処理して抵抗線と支持線をチャートに表示させます

こんばんは、新米データサイエンティスト(@algon_fx)です。今月はTwitterを使ったFX予想を頑張るという目標を掲げながらも、勾配ブースティングが楽しすぎて・・までTwitterまで着手できていません(笑)

勾配ブースティングの初心者向けチュートリアルも、また後日更新する予定です。今日は別ネタで、為替レートを処理してトレンドラインをPythonで作る方法をまとめます。

上記でツイートした通りですが、機械学習トレード(機械学習を活用したFXトレードを勝手に命名)では、線形回帰が思った以上に役に立ちます。

そもそもFXトレードの原則はやはりトレンドな訳であり、ニューラルネットワークのような複雑なアルゴリズムで為替レートを学習するのも重要ですが、単純に線形回帰でトレンドをしっかり把握するのも重要です。(参考:TensorFlowでニューラルネットワークを使ってFX予想をする方法

そもそもトレンドラインとは?

トレンドラインはテクニカル指標の最も初歩的な指標と言っても過言ではありません。トレンドラインには「上昇トレンドライン」と「下降トレンドライン」の2種類あります。

上昇トレンドラインとは、ローソク足の安値同士を結んで引く線です。対して下降トレンドラインは高値同士を結んで線を引きます。

チャートをみると一目瞭然です。下の赤い線が上昇トレンドラインです。赤丸の部分の安値を基軸として、直線を引いたものです。一目瞭然でレートが上昇トレンドとなっているのが確認できます。

対して緑色が下降トレンドラインです。これは緑丸の高値2点を直線で結んだもので、その後のレートが下降トレンドを示しているのが解ります。

トレンドラインですが、冒頭でも話した通り最も初歩的なテクニカル指標であり、トレードラインを参考にトレードしている方は非常に多いです。そのため、トレンドライン付近では売買が盛んに行われるため、結果としてトレンドラインにある程度協調したレートが形成されていく訳です。

構造はとってもシンプルなトレンドラインですが、Pythonを使って実際に計算をしてみましょう。

STEP1 ライブラリとデータのインポート

まずはいつも通りライブラリとデータをインポートしましょう。今回も私がAPI経由から取得したドル円の1日足のレートを使います。

データは下記のURLからCSVファイルをダウンロードできます。

usd_jpy_api.csv

まずは基本的なライブラリをインポートしてあげましょう。

トレンドラインの処理のために、scipy.statsのlinregressをインポートしています。scipy.statsとは、統計関数をまとめたモジュールでちょっとした処理を行うときは重宝します。

また、今回のトレンドラインを引く主役とも言えるのが「linregress」です。これはXとYの値を渡すと、単回帰直線を求めてくれる非常にハンディーな関数です。

単回帰直線とは、与えられた2つのデータポイントを通る直線をさします。下の図を見てください。これは(2, 5)のデータと(7, 15)のデータです。

この二つを通る直線ですが、y = 2x + 1と求めることが可能です。xに掛かっている「2」は直線の傾きを表しています。実際に下の直線の傾きを計算してみると「2」が出てくると思います。

対して「+1」はY切片を表しており、これは単純に直線がY軸と交わる時のXの値です。下の図をみると赤い直線がY軸と交わっている部分が1なのが解ります。

linregress()はXとYを渡すことで、この直線を導き出してくれます。簡単にPythonを使ってやって見ましょう。まずは上の黒丸の2つのポイントをNumpy配列で作ります。

では、この2つのポイントの直線を導き出してみましょう。

ご覧通り、slope(傾き)が2.0、intercept(Y切片)が1.0と出ています。では、上の表にはありませんが、仮にXが10とした時のYの値を直線を使って計算をしてみましょう。

21と算出できました。上のグラフで見ても、Xが10の時のYはおおよそ21の付近になるのが確認できます。

すでに勘が鋭い方であれば気づいたかもしれませんが、単回帰直線の傾きはトレンドの強さを表しているのが判ると思います。トレンドが強ければ強いほど、直線の傾きは増えます。

前奥が長くなりましたが、次はCSVファイルを読み込んでデータフレームに変換してあげます。

こちらのレートデータはドル円の1日足のデータを私が綺麗にしたものです。為替データの取得を自分でして見たい方は、OANDA APIがオススメです。(参照:Pythonを使ったOANDA API v1で知っておきたい10の基本操作

STEP2 データの簡単な前処理

データの前処理と言うほどでもありませんが、簡単な処理が必要です。上の単回帰直線でもやりましたが、直線を導き出すにはXとYの値が必要です。

当然ではりますが、Yは為替レートです。上昇トレンドラインの場合のYは「安値(low)」、逆に下降トレンドラインでは「高値(high)」を使います。

では、Xの値はどうすれば良いでしょうか?色々な算出方法がありますが、最も単純に日付ごとに1を増やした値をXとしましょう。

こちらの為替レートのデータは古い日付から新しい日付でソートされていますので、単純にインデックスに1を加えることで、1日目、2日目・・・といった具合の数値を作れます。

ご覧通り、データの1日目のtime_idは「1」、それ以降は1ずつ増えているのが確認できます。続いて、上昇トレンド、下降トレンド、表示用のデータを切り分けておきましょう。

STEP3 上昇トレンドラインを算出

まずは上昇トレンドラインを算出します。前述した通りscipy.statsの統計モジュールにあるlinregress()=単回帰直線を使って算出します。

コードを見ていただくと解りやすいですが、高値のポイントを計算して、high_trendとしてトレンドラインを算出しています。

STEP4 下降トレンドラインを算出

同じ要領で下降トレンドラインも算出しましょう。上昇トレンドラインでは高値(high)を使って算出しますが、過去トレンドラインは安値(low)を使っている部分に注意してください。

これで上昇・下降トレンドラインの算出が完了です。

STEP5 チャートに落としてみる

では、正しくトレンドラインが算出できているか簡単なチャートに落として確認して見ましょう。

めちゃくちゃ手抜きコードでごめんなさい(笑)ちゃんとローソク足でトレンドラインチャートを作りたい方は、Pythonでローソク足チャートを作るこちらの記事をご参照ください。

手抜きではありますが、意図した通り上昇トレンドライン(赤)と下降トレンドライン(緑)がしっかり算出されているのが確認できます。

それではそれぞれのトレンドラインの傾きを確認してみましょう。

上昇トレンドラインの傾きは0.0.134、下降ラインは0.0117と出ています。加えてY切片(intercept)の値も確認が可能です。

まとめ

今回は非常にシンプルではありますが、為替レートからPythonを使ってトレンドラインを算出する方法をまとめました。

トレードをやっている方であれば、上級者でも初心者でもトレンドラインをひとまずは参考にして決断をしている方も多くいらっしゃるかと思います。

機械学習トレードでも、トレンドラインをその都度算出することで役に立つことが多くあります。参考までにですが、私は様々な期間(例:1分足、5分足、10分足、1時間)など期間別にトレンドラインを算出して使っています。

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

【人気記事】

私の機械学習の開発環境&トレード環境

2018年12月21日FX 機械学習

Posted by algon