見出し画像

【バイオプ×TradingView】RSI指標による逆張りでは全く勝てない真実

どうもこんにちは!
はちです( ゚Д゚)

今回はバイオプ必勝法としてよく取上げられているRSIによる逆張り取引をバックテストしてみて実際に勝てるのかどうかを検証していきたいと思います。

タイトルでネタバレしてますが、このまま続けます!

RSI指標について

RSIとは、「Relative Strength Index(相対力指数)」の略で、テクニカルアナリストのJ.W.ワイルダー氏によって開発されました。

一定期間の値動きを上昇と下降に分けて、上昇分が全体の何%になるかというのを示したもので、「買われすぎているか?」または「売られすぎているか?」を数値で表したオシレーター系のインジケーターの1つです。

50%を中心としてRSIが大きければ大きいほど買われていて、小さければ小さいほど売られているということを表します。

したがって適当に閾値を決めて取引をします。
例えば80%と20%を閾値として
80%を超えたら買われすぎ、20%を割ったら売られすぎ
ということになりますから以下のようなロジックを考えます。

・買われすぎ(80%を超えた)の時に売り注文する。
・売られすぎ(20%を割った)の時に買い注文する。


下記の図では売りシグナルのあとに下降し買いシグナルのあとに上昇しているのが確認できます。(下図はとある期間のUSD/JPY 1分足です。)
上記ロジック通りの値動きになっている言えます。

noteTradingViewの記事のテンプレ

図の右側にも80にふれているような山がありますが、ギリギリふれてないです。(79.xくらいの値)
これは80を超えていないので今回のロジックでは十分に値が上がりきっていないことを指します。

バイオプにおけるRSI指標によるエントリーについて

バイオプ=バイナリーオプションの取引間隔は非常に短く、基本的には15分後または短いものだと30秒後の相場が今よりも”高い”か”安い”かを予想します。予想が的中したときにのペイアウトは出資金に加えて大体70%~90%前後です。

ここでバイオプに勝つための方法を考えていきます。

相場自体は日足ベースでは上昇相場であっても極短期的には上げ下げを繰返しますから、バイオプのような極短期のエントリーでは日足ベースの上昇、下降は特に意味を持ちません。
従って特に重大な発表がない限りは短期的にはより相場全体の流れよりもテクニカル分析によるセオリーに従って値動きする確率が高いのではないかと考えるわけです。←ポイント①


更に為替相場は30秒程度ではほとんど値動きは変わりません。
またゴールデンクロスによって上昇に転じるような相場で15分でエントリーしたとしても15分後に上がっていなければLOSEします。
(20分後、30分後に上昇したしても15分後の時点で上がっていなければ負けてしまうということでFXより難しい点だと言えます)
ゴールデンクロスのようなじわじわ相場が反転するようなシグナルではいつ値動きに反映されるのかあるいはされないのか予想するのが難しいです。

逆にRSIのような売られすぎ、買われすぎの条件をもとにした逆張りのほうが相場はシグナルが出たその瞬間に値動きとして変動しやすいのでバイオプに適用しやすいのです。←ポイント②

以上のポイント①によって以下の取引手法を考えます


RSI閾値を超えた瞬間にエントリーする
     ↓
直後に値動きが期待方向に動く
     ↓
あとは自分が設定した時間経過するのをお祈りして待つ
     ↓
再反転しない限り勝ち
     ↓
トータルで勝率50%を大きく超える


というバイオプ必勝方程式が出来上がるのです。

これを用いてあとはルール通りに取引するようにメンタル管理と資金管理さえすれば必ず勝てるようになっていく・・・


そう考えてた時期がぼくにもありました。( ゚Д゚)

Pineスクリプトのロジックを考える

Pineスクリプトでも前述のロジックをもとにコードを組みます。

①RSI閾値を超えた瞬間にエントリーする
◇閾値が80を超えた後に80を割ったときに買われすぎ相場の値戻り(下落) が始まったとして売りでエントリーします。
◇閾値が20を割った後に20を超えたときに売られすぎ相場の値戻り(上昇)が始まったとして買いでエントリーします。
◇上記閾値は設定で変更できるよう調整。
②経過時間を設定して自動クローズする
◇エントリーしたタイミングから時間を測定し15分経過したときに自動でEXITする
◇上記EXITまでの時間間隔は設定で変更できるよう調整。

非常にシンプルです。では早速バックテストしてみましょう!


Pineスクリプトでバックテスト結果

上記要件にてバックテストを行いました結果は以下のようになりました。

(見ずらいので拡大してくださいごめんなさい)

概要
|取引回数・・・447回|勝率・・・50.78%|

キャプチャ

成績抜粋
|買い注文回数・・・219回|勝率・・・52.97%|
|売り注文回数・・・228回|勝率・・・48.68%|

画像2

バックテストデータ

うん勝ててないですね。
勝率は50%前後、スプレッドは考慮していないので指標がほぼ無関係といったテスト結果になってしまいました。パラメータを調整したりすることで60%前後までは勝率を上げることができるっちゃできる場面もあるというのは確認していますが、まぐれのレベルですね。

銘柄を足を変えたり時間を変えても結果は大きく変わりませんでした。
やはりRSIだけで取引をするのは無理がありそうです。
複数の指標と組み合わせて取引をするなど研究の余地がありそうです。

少しだけ改良してみた

テスト時からさらに少し工夫してみました。
下記実行画面はテスト時からさらに改良加えて閾値判定に条件を追加して、パラメータ微調整しています。
多少勝率改善しており、もう一工夫でうまくいきそうな感じもあります。

無題

画像5

バイオプなら勝率70%あたりがボーダーになるかと思いますのでまだまだ研究の余地がありそうです。

今回使用した+改良したPineスクリプトコード

今回使用したコード+改良したコードは下記です。
2段階閾値を設定することでRSIが閾値付近で振動するような相場を除外することができます。バックテストでは2段階閾値を使用せずに実施しており、テスト画像は2段階閾値を設定しています。

//@version=4
strategy("バイオプ向けRSI閾値による戦略評価")

//設定ボタンからパラメータを変更できるように入力を定義します。
RsiBuyBaseLine=input(title="買い閾値※RSIが次の値を上回ったら買いエントリーします。", type=input.integer, defval=20)
BuyThreshold=input(title="買い二段階閾値※RSIが閾値付近で停滞する相場を除外するのに有効です。通常買い閾値より大きい値を設定します。無効にするには買い閾値と同じ値にします。", type=input.integer, defval=20)
RsiSellBaseLine=input(title="売り閾値※RRSIが次の値を下回ったら売りエントリーする", type=input.integer, defval=80)
SellThreshold=input(title="売り二段階閾値※RSIが閾値付近で停滞する相場を除外するのに有効です。通常売り閾値より小さい値を設定します。無効にするには売り閾値と同じ値にします。", type=input.integer, defval=80)
timeinterval=input(title="クローズまでに時間を指定する[秒]", type=input.integer, defval=900)

//標準の関数を使用してグラフを描写します。
highlevel=line.new(x1=bar_index,y1=RsiBuyBaseLine,x2=bar_index[2],y2=RsiBuyBaseLine,extend=extend.both,color=#FF0000) 
lowlevel=line.new(x1=bar_index,y1=RsiSellBaseLine,x2=bar_index[2],y2=RsiSellBaseLine,extend=extend.both,color=#FF0000) 
rsiline=rsi(close,7)
plot(rsiline)

//エントリー条件を定義します。
LongEntryflg=crossover(rsiline,RsiBuyBaseLine) and rsiline>BuyThreshold
ShortEntryflg=crossunder(rsiline,RsiSellBaseLine) and rsiline<SellThreshold

//エントリー時にラベルを貼り付けます。
if LongEntryflg
   lads=label.new(bar_index,na,text="買い",color=#00FF00, textcolor=color.black,style=label.style_label_lower_right,xloc=xloc.bar_index,size=size.small,textalign=text.align_right)
   label.set_xy(lads, bar_index, rsiline) 
if ShortEntryflg
   lads2=label.new(bar_index,na,text="売り",color=#FF0000, textcolor=color.black,style=label.style_label_lower_right,xloc=xloc.bar_index,size=size.small,textalign=text.align_right)
   label.set_xy(lads2, bar_index, rsiline) 
   

//タイマーの動作とクローズ条件を定義します。
var longEntryTimer=0
var ShortEntryTimer=0
if LongEntryflg and  longEntryTimer==0
   longEntryTimer:=time
if ShortEntryflg and  ShortEntryTimer==0
   ShortEntryTimer:=time   
LongExitflg = (longEntryTimer + (1000*timeinterval)) <= time
ShortExitflg = (ShortEntryTimer + (1000*timeinterval)) <= time
if LongExitflg
   longEntryTimer:=0
if ShortExitflg
   ShortEntryTimer:=0

//売買します。
strategy.entry("enter long",strategy.long,when = LongEntryflg,comment="買い",alert_message="買いシグナルです")
strategy.entry("enter short",strategy.short,when = ShortEntryflg,comment="売り",alert_message="買いシグナルです")
strategy.close("enter long",when = LongExitflg,comment="買いクローズ")
strategy.close("enter short",when = ShortExitflg,comment="売りクローズ")



この記事が気に入ったらサポートをしてみませんか?