ボリンジャーバンドを改良してPythonの自動売買に実装してみた。

スポンサードリンク
スポンサードリンク

ボリンジャーバンドを改良してみよう

最近統計学を勉強しているので、その知識のアウトプットを兼ねてまずは平均分散の関係を使ったテクニカル指標であるボリンジャーバンドを改良してみようかと思います。

なので、本記事の構成としては、

  1. 既存のボリンジャーバンドを紹介したのち、問題点の列挙。
  2. それを改善できうるかも?と言うようなモデルの提案。
  3. コードに落とし込む

と言った感じになります。検証等は出来次第追記していきます。

ボリンジャーバンドについて

ボリンジャーバンドは、指定期間における平均値から現在価格が大きく離れた時に逆張りのポジションを持つことで利益を取ろうというテクニカル指標です。

具体的には、以下の式にてテクニカル指標を計算しています。

そして、この(1), (2), (3)の計算式をチャートにプロットしたものが下図になっています。

これは、ドル円の1時間足です。(1)が黒色の線。(2)が黄色の線。(3)が赤色の線。

この図を見る限り、ある程度の法則性が見て取れます。よく言われているのが、赤色の線にローソク足が引っかかるとそこで価格が反発しているのが伺えます。

他には、トレンドの始まる寸前においては、赤色の線がくびれていることが見て取れます。つまり、この赤色の線の幅が狭くなっている状態で、現在価格が赤色の線を越えるとその方向に向かってトレンドが発生する可能性が高いと言うわけです。

このような特徴がボリンジャーバンドにはあります。

しかし、このような特徴を持っているとはいえ、ボリンジャーバンドにはいくつか問題点がございます。

  1. ダマし(通例とは逆の動きをする事)に引っかかりやすい
  2. 所詮過去の数字をもとに計算されているため、そもそもの反発やトレンドの発生自体の初歩の発見には向いてない。
  3. ローソク足が確定するまで指標の動向がはっきりしない。(急激な上昇下落に対して過敏に反応してしまう)

これらの問題点があるため、ボリンジャーバンドのみで投資の意思決定を行うのはとても熟達した手練は必要になりますし、本ブログの趣旨からもそれてしまいます。

ですので、数理的な立場から感覚で行うような取引の意思決定をデータをもとに客観的に判断しようという事で、以下にこのボリンジャーバンドの欠点を補うようなモデルを提案し、コードに落とし込んで行こうというわけです。

スポンサードリンク

改善モデルの提案

実際に、このボリンジャーバンドの欠点1や2を改善するためには、いわゆるノイズを除去するか、素直に過去データを基にトレードアルゴリズムを構成するかのどちらかが良いかと思います。

後者のやり方は芸がないので、ノイズ除去のやり方で試してみましょう。

ノイズ除去を組み込む前に・・・

ノイズ除去といえど、これは小手先のテクニックです。なので、もう一つ大きな素地のような、相場の大きな流れというのも考えるようにしたいと思います。

具体的には、ボリンジャーバンド単体で使うのは良くないと言いましたが、もう振り切って、ボリンジャーバンドを二つ使っちゃいましょう!

つまり、ボリンジャーバンドでは移動平均と標準偏差を計算するために、n本分のローソク足を使っていました。なので、この本数を二つ使って行いましょうというわけです。

今回のモデルでは、25本分と50本分のローソク足を使ったボリンジャーバンドを使うことにします。

通例だと、ボリンジャーバンドは20本分のローソク足を用いていますが、今回は25本と50本です。

なんで・・・?ってなりますが深い意味はありません。なんとなく2倍分の本数で大きな流れを見たいという目的なので、20本の倍の40本と考えるとなんだか心許ないなと思ったので、25本の2倍である50本として考えます。
もちろん、読者の裁量に任せるところです。本記事では25本、50本で行おうというわけなので、これが正解ではないのでご自由に変更してください。

ノイズ除去の方法

最初に思いついていたのが、ローソク足の超短期の移動平均線をもとに考えれば?と思って少し調べたのですが、どうやらその発想で大丈夫なようでした。
ですので、今回は25本に対してその5分の1である5本足の平均線をもとにトレードしていこうかと思います。

この5本分に関してもなぜ?って言われれば、なんとなくです。フィーリングです。勘です。感じてください。

なので、今回は以下の7本の線を参考にしてそれらの位置関係を鑑みてトレードをしていこうという発想で行なっていきます。

トレードルール

本題のトレードルールについて決めていきましょう。

以下のルールをもとに取引していきます。なお、(1)が短期移動平均線(±2)短期±2σ線(3)長期移動平均線(±4)長期±2σ線(5)超短期移動平均線を表しています。

”買いシグナル”
・(-2)>(-4) かつ (5)<(-2)

“売りシグナル”

・(+4)>(+2) かつ (5)>(+2)

で行くとしましょう。意外とシンプルになりましたが、色々アイデアが生まれたら付け足そうかなと思います。

”利確条件”

どちらも(1)にローソク足が達したらポジションを下ろします。

”損切り条件”

どちらも20pipsの損失が生じたら損切りをします。

 

コードに落とし込む

これまでのことを踏まえてコードに落とし込んでいきましょう。

開発環境はPythonを用いて、OANDAが提供してくれているAPIから為替データを取得してトレードを行うプログラムを書いていきます。

環境構築に関しては、以下の記事たちを参考にしてください。

参照記事:PythonでOANDA APIを使って、過去レートを5000件以上取得する方法

この記事を全て踏襲できていれば、以下のコードをコピペすれば動くのでぜひ参考にしてください。

 

コードの流れは、APIにアクセス、過去チャートデータの取得関数の定義、そしてwhile文でトレードを行います。

コードがうまく動かない方へ

本記事で書いているのは、全てoandapyで書いているため、もしかするとデモ口座とのバージョンがあっていない可能性があります。

OANDAの提供するAPIには二つのバージョンがあります。本記事ではoandapyのバージョン1を使用しているため、バージョン20を使用している人は、下記のnoteにて有料でコードを公開しているので、ぜひお買い求めください。

勉強用とはいえ、このブログの運営にも力を入れていきたいため、支援していただけると助かります。

noteの記事先はこちらです。

[OANDA V20]ボリンジャーバンドの改良版自動売買モデル

 

報告!!実際に利益の出たプログラムをnoteにて販売中!!

自分が長いこと研究して実際に1週間に3%ほどの利益を上げれている自動取引BOTを下記のリンク先にて公開中です!気になるかたはぜひご覧ください!

FxトレーダーでOANDA使ってる方、Pythonで作ったこの自動売買BOTを試して欲しいです。

スポンサードリンク