Pythonでサポートラインとレジスタンスラインを引いてみる

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

こんばんは、新米データサイエンティスト(@algon_fx)です。気づけば前回の記事が2018年12月…だいぶ長らくブログをサボってしまいました。

この4ヶ月は本業にて執筆業務が多くなり、空いている時間は文章よりもコードを書きたい強い衝動に駆られ…今流行りの仮想通貨BOTに手を出してみたり、Kaggleなどをやっていました。

仮想通貨BOTは奥が深く、引き続き個人的に勉強を進めていく所存ですが、やはり私はONANDAのAPIを使ったFX機械学習トレードがメインだなと気づかされました。

久しぶりに仕事以外で文章を書く気が起きたので、今年初めてのネタはみんな大好き「サポートライン」「レジスタンスライン」をPythonで引く方法をまとめます。

毎度でですが初心者向けの内容です。これを実装して儲かるとか、実戦トレードに役に立つという内容ではありません。Pythonを使ってFX自動売買を始めたいみたいと考えている方向けに「きっかけ」になって欲しいと思い書いています。

データを含めて全コードを本記事に掲載しています!Python初心者の方でも実装可能ですので、是非トライしてみて下さい!Pythonの環境がない方はGoogle Colabでブラウザから実行可能です。(参照 : Google Colabの使い方

サポートラインとは

サポートラインはFXトレードで非常に重要な役割を持ちますが、個人的には扱いが難しいと考えています。まずは下のチャートをみて下さい。

これはとある日のドル円の10分足のローソクチャートです。ローソク足チャートに対して赤線が水平に引かれていますが、これが「サポートライン」です。

サポートラインは別名「下値支持線」と呼ばれています。名前の通り、レートの下値を支えるような線を指します。為替レートが下値圏へ突入した時、このサポートラインがレートを「支える」ように見えませんか?実際に上の事例ではサポートライン付近でレートは反発しています。これには理由があります。

それはサポートラインを見てトレードしている方が多いからです。FXトレーダーは常にレートが安値圏なのか、高値圏なのか、各自の判断でトレードを行います。レートが安値圏に入った時、今が買いのチャンスだ!と買い注文を入れる人が増えます。売りポジションを持っている人は逆に安値圏で買い戻しをするケースもあります。そのようなトレーダーの心理と行動がサポートライン付近でレートが反発する理由です。

サポートラインの引き方は単純です。ローソク足チャート内で安値圏が2つ以上のポイントを直線で結ぶだけです。上の図の赤矢印のポイントを見て下さい。この安値圏のポイントを直線で結んだのがサポートラインです。

上の図の青矢印を見て下さい。レートがサポートライン付近に近づくにつれて、安値圏ですのでレートが反発すると予測出来ますが、サポートラインを突き抜けることも当然あります。

サポートラインをレートが突き抜けた場合、「今まで支持されていた下値圏が抜けた!これは下降トレンドが始まるのでは?!」と多くのトレーダーが判断します。下の図は上の図のレートの続きです。青矢印でレートは一度サポートラインを突き抜けたかのように見えましたが、その直後に反発しています。

しかし、反発後にサポートラインを再度突き抜けて、その後は下降トレンドへ転換しているのが確認できます。恐るべしサポートライン

レジスタンスラインとは

レジスタンスラインは高値支持線とも呼ばれており、サポートラインの高値バージョンと考えて問題ないです。下の図を見て下さい。青い線がレジスタンスラインです。

青矢印の高値を水平線で結んだものです。一本目と二本目の青矢印部分ではレートが反発して戻されています。その後にレートはレジスタンスラインを大きく抜けて、上昇トレンドへ転換しているのが確認できます。

実際のトレードではサポート・レジスタンスライン(以後 S/Rライン)を綺麗に引くのは難しいですが、裁量トレードを続けていくうちに、うまいラインの引き方が身に付いていきます。

私はS/Rスラインの考え方がとてもシンプルで大好きです。実際に機械学習FXトレードでも少し形を変えて使っています。

ってことで、このS/RラインをPythonとpandasを使ってレートデータから算出してみましょう!

STEP1 実行環境&データ準備

冒頭でも書きましたが、これは私が実際にトレードで使っているものではありません。あくまで、これからPythonを使ったFX取引を始めたいと考えている方向けの初心者入門記事です。自分がトレードで実際に使っている手法は公開したくありませんし、何より初心者機械学習トレーダーの役に立てばと思って書いています。ですので、これ実装したけど使いものにならねってクレームはご遠慮ください笑。(何故か記事公開の度に一定数そうゆう反応がある

この記事で使うのは以下の通りです。自身の環境で実行する場合は各パッケージのインストールが必要です。

・Python 3
・NumPy
・Pandas
・Matplotlib
・Jupyter Lab(実行完了)

とりあえずオンラインから実行して見たい方はGoogle Colabがおすすめです。

使うデータは以下のリンクから取得可能です。実際のドル円の10分足のデータを使います。このCSVファイルは私がOANDA FX APIから取得して綺麗に整形したものです。PythonでFX API使いたい方は日本ではOANDA FXしか扱いありません。数日でAPIキーの取得が可能です。(参照 : OANDA FX

使うデータ
usd_10min_api.csv

では、実際にPythonを使ってR/Sラインを算出してみましょう。

STEP2 データの読み込み

usd_10min_api.csvをpandasで読み込みましょう。まずは本記事で使うライブラリをインポートします。

動作上は問題ない警告は無視しましょう。warningsモジュールの設定を変更します。

usd_10min_api.csvをpandasのデータフレームとして読み込みます。CSVファイルにこの記事で使わないデータも含まれるので、必要なカラムのみをusecols引数へ指定して読み込みましょう。最初の5行をheadメソッドで確認します。

ドル円の10分足ですのでtimeカラムが10分刻みになっているのが確認できます。close(終値)、open (始値)、high(高値)、low(安値)のレートデータを持っています。

OANDA FX APIからデータを取得した場合、最低限の前処理が必要です。詳しくはPythonを使ったOANDA API v1で知っておきたい10の基本操作をご参照ください。

STEP3 サポート・レジスタンスラインを算出

さて、いよいよ本題です。先ほど読み込んだドル円の為替レートデータからS/Rラインを算出してみましょう。Candlestick Ninjaさんがとても解りやすくS/Rラインの算出を記事にしてくれたので、そちらを今回は使います。(参照:Identifying Support and Resistance with Python

S/Rラインの算出方法ですが、様々な考え方が可能です。おそらく最もメジャーなのはsavgol_filter関数を使い終値を平準化して、ローカルのミニマとマキシマを求める方法です。本記事ではやりませんが、実戦で実装して見たい方は調べて見てください。

ではNinjaさんが書いてくれたコードを拝借して、S/Rラインをレートから算出する関数を定義しちゃいましょう。

コードを紐解いて頂くと解りますが、下記の6つの引数を使います。

low : 終値(pandas series)
high : 高値(pandas series)
n:S/Rライン検出の対象とするローソク足の本数
min_touches:S/Rラインの検出の基となるローソク足との接触数
stat_likeness_percent:ライン検出のエラーマージン(許容度)
bounce_percent:反転時のレート値動きの割合

こちらの関数の戻しは以下の4カラムを持つデータフレームです。

sup:サポートラインのレート
res:レジスタンスラインのレート
sup_break:サポートラインの反転時
res_break:レジスタンスラインの反転時

上で定義した関数をみると解りますが、for文による処理ですので処理的には非常に重いです。

STEP4 S/Rラインをレートデータから算出

では、実際に為替レートのデータからS/Rラインを算出してみましょう。データには16,422件の10分足データが入っており、全期間を使ってS/Rラインを算出するのは無意味です。Pythonのslice関数を使い適当な期間を指定しましょう。

では、supres関数を使いS/Rラインを算出してみます。今回は高値圏(または安値圏)で3回ローソク足と接触したらS/Rラインとして算出します。

サポート・レジスタンスラインが算出できたか確認をしてみましょう。

レジスタンスラインが106.942の位置で算出されているのが確認できます。

STEP5 S/Rラインをローソク足チャートへ落とし込む

無事にS/Rラインが算出できているようなので、為替データからローソク足チャートをMatplotlibを使い描写して、S/Rラインを一緒に引いて見ましょう。

先ほどの定義したsupres関数を使い、データからローソク足+S/Rラインを描写する関数を定義します。

start、end引数へデータの特定の箇所を指定して描写してみましょう!

赤がサポートライン(下値支持線)で青がレジスタンスライン(上値支持線)です。一見するとランダムにラインが引かれており、意味のあるラインに見えませんが・・よくラインを見てみると確かに下値(または上値)を支持しているラインが見受けられます。

引数を色々と調整することで、より意味のあるS/Rラインを算出することが可能です。試しに同期間でエラーマージン(mint引数)を下げて算出してみましょう。

先はmint=3.5でしたが、今回はmint=1.5とエラーマージンを下げました。ご覧の通りS/Rラインがより的確にデータに対して算出されています。

今度はn引数をあげてS/Rラインを算出するレンジを広げてみましょう。レンジが広がるのでエラーマージンを大幅にあげて確認してみます。

より的確なS/Rラインが算出できているように見えますね!

まとめ

今回はPythonを使って為替レートデータからサポート・レジスタンスラインを算出する方法をやってみました!冒頭でもしつこいほど書きましたが・・これをそのまま実装しても実戦ではあまり役に立ちません。しかし、これを土台に自身でより精度の高いS/Rラインを算出する方法を挑戦して見てください!

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

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

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

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

FX トレード

Posted by algon