Pineスクリプト入門記事第4弾です。
前回は細かく解説しながら一緒にサンプルコードを読みました。
今回はTrading viewが用意しているRSIメソッドを使って、一番有名な使い方をPineスクリプトで書いていきます。
プログラムの難易度自体は簡単なものですが、手法をプログラムに落とし込む作業があるのでそこが今回のポイントです。
ぜひ一緒に手を動かしながら読み進めてもらえたらと思います。
RSI
RSI とは
RSI とはトレードをする時に使うインジケータの1つです。
Relative Strength Index の略で、日本語では「相対力指数」と訳されます。
このインジケータは0から100までの数値で相場の勢いの強さや過熱感を調べるためによく使われています。
数値は期間内の陽線陰線の割合から算出しています。
一般的には14期間のRSIが使われることが多いです。
RSI の手法
RSIでよく言われる使われ方として以下のようなものがあります。
- RSIが70を超えると買われすぎなので逆張りで売る
- RSIが30を下回ると売られすぎなので逆張りで買う
今回はこの手法でストラテジーを作成し、バックテストできるようにしたいと思います。
手法整理
手法をストラテジーとして作っていく前に内容を整理します。
頭の中で整理しながら実装できるようになればいらなくなる作業ですが、はじめはこんがらがってきて、いま何が足りなくて何を書けばいいのかがわからなくなってきますので今回に限らず、ぜひやってもらえたらと思います。
今回のRSIを手法整理するとこのようになります。
エントリー条件
- 買い:RSIが30未満になった時に買い
- 売り:RSIが70より大きくなった時に売り
クローズ条件
- 買い決済:RSIが30より大きくなる かつ 買いポジションを持っている
- 売り決済:RSIが70より小さくなる かつ 売りポジションを持っている
手法整理したことでこの4つの条件を判断するロジックとそのロジックをもとにエントリー/クローズ処理を書けばいいことがわかりました。
実装に取りかかる前に各条件を整理して必要な実装内容を確認する。
ストラテジー実装
それでは整理した内容をもとに実装を始めていきたいと思います。
実装する流れは入門1でも説明しましたように、「クローズロジック -> クローズ処理 -> エントリーロジック -> エントリー処理」の順で進めていきます。
前準備
ではまず空のストラテジーを開いてください。(入門2参照)
5行目のstrategyメソッドの第一引数はチャートに追加した時に出るストラテジーの名前になりますので好きな名前をつけてください。
ここでは RSI strategy としておきます。
第二引数のoverlayはインジケータ等、何か表示するものがあった時にチャート上に追加するか(true)、別枠で表示するか(false)を指定できます。
ここではそのままtrueにしておきます。
あとは実装する内容がわかるように大枠をコメントして、既存のコードをコメントに合わせて移動させれば準備完了です。
- 追加したコメント:7, 10, 13, 18 行目
- 移動させたコード:14〜15, 19〜23行目
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © LoGie BLOG
//@version=4
strategy("RSI strategy", overlay=true)
// クローズロジック
// クローズ処理
// エントリーロジック
longCondition = crossover(sma(close, 14), sma(close, 28))
shortCondition = crossunder(sma(close, 14), sma(close, 28))
// エントリー処理
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
クローズ
まずクローズロジックを実装していきます。
- 買い決済:RSIが30より大きくなる かつ 買いポジションを持っている
- 売り決済:RSIが70より小さくなる かつ 売りポジションを持っている
この内容から考えるとロジックを作るにあたってRSIとポジションのデータが必要そうです。
RSIは rsiメソッド を使って取得することができます。
第一引数(x)に価格データを、第二引数(y)に期間を指定することでRSIの値を取得できます。
rsi(x, y) → series[float] // 定義
今回は14期間の終値でRSIを取得するので下記のようになります。
rsi(close, 14)
続いてポジションデータですが、これはTrading viewが strategy.position_size という変数を用意してくれています。
この変数が0より大きければ買いポジションを、0より小さければ売りポジションを持っています。
それでは今までの情報をもとに実装してみます。
// クローズロジック
rsi = rsi(close, 14)
buyCloseCondition = crossover(rsi, 30) and strategy.position_size > 0
sellCloseCondition = crossunder(rsi, 70) and strategy.position_size < 0
RSIの値はエントリーロジックでもクローズロジックでも使われるので2行目でrsi変数を定義して取得したRSIを入れてます。
3行目、4行目では買いと売りのクローズ変数を作っています。
右辺の前半では crossover/crossunder メソッドを使って、RSIの条件を書いています。
これは入門3を読んでいれば簡単ですね。
右辺の後半ではポジション条件について書いています。
このRSIの条件とポジションの条件の両方が true になった時に変数に true を代入したいので and でつないでいます。
次にクローズ処理を書いていきます。
持ってるポジションを決済するには strategy.closeメソッド を使います。
入門3の strategy.entryメソッド を説明した時にIDを設定したことを覚えていますか?
strategy.closeメソッドではentryメソッドで指定したIDを第一引数に指定することでそのエントリーしたポジションをクローズできます。
今回は買いエントリーのIDを long 、売りエントリーのIDを short とします。
それでは実装します。
// クローズ処理
if buyCloseCondition
strategy.close("long")
if sellCloseCondition
strategy.close("short")
今回はif文でクローズ処理の条件分岐をしていますが、strategy.closeメソッドのwhenオプションを使って下記のように実装しても大丈夫です。
when オプションは渡した値が true の場合にクローズ処理を実行するif文のような役割を果たします。
// クローズ処理
strategy.close("long", when=buyCloseCondition)
strategy.close("short", when=sellCloseCondition)
どっちで実装するかは自分が読みやすい方でいいと思います。
それではクローズ部分を実装した全体像です。
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © LoGie BLOG
//@version=4
strategy("RSI strategy", overlay=true)
// クローズロジック
rsi = rsi(close, 14)
buyCloseCondition = crossover(rsi, 30) and strategy.position_size > 0
sellCloseCondition = crossunder(rsi, 70) and strategy.position_size < 0
// クローズ処理
if buyCloseCondition
strategy.close("long")
if sellCloseCondition
strategy.close("short")
// エントリーロジック
longCondition = crossover(sma(close, 14), sma(close, 28))
shortCondition = crossunder(sma(close, 14), sma(close, 28))
// エントリー処理
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
エントリー
続いてエントリーロジックに入りますが、こちらはクローズロジックよりも簡単です。
- 買い:RSIが30未満になった時に買い
- 売り:RSIが70より大きくなった時に売り
条件を見ればわかる通り、クローズロジックからポジションの条件を抜いて、RSIの条件を逆にするだけです。
さっそく実装します。
// エントリーロジック
longCondition = crossunder(rsi, 30)
shortCondition = crossover(rsi, 70)
既にある longCondition 、shortCondition の右辺を今回のRSIのロジックに書き換えました。
説明することも特にないので最後のエントリー処理に入ります。
エントリーロジックで実装した変数を使って実装します。
注意点としてはクローズ処理のときに指定したIDをエントリーのメソッドでも指定する必要があります。
では実装します。
// エントリー処理
if (longCondition)
strategy.entry("long", strategy.long)
if (shortCondition)
strategy.entry("short", strategy.short)
第一引数のIDに long、short を指定しました。
これで実装完了です。
こちらが完成したコード全体になります。
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © LoGie BLOG
//@version=4
strategy("RSI strategy", overlay=true)
// クローズロジック
rsi = rsi(close, 14)
buyCloseCondition = crossover(rsi, 30) and strategy.position_size > 0
sellCloseCondition = crossunder(rsi, 70) and strategy.position_size < 0
// クローズ処理
if buyCloseCondition
strategy.close("long")
if sellCloseCondition
strategy.close("short")
// エントリーロジック
longCondition = crossunder(rsi, 30)
shortCondition = crossover(rsi, 70)
// エントリー処理
if (longCondition)
strategy.entry("long", strategy.long)
if (shortCondition)
strategy.entry("short", strategy.short)
チャートに追加してみる
IN/OUT を確認
実装したコードを保存し、チャートに追加して意図通りに動いているか確認してみましょう。
追加する手順は入門2を参考にしてみてください。

下に表示しているのがストラテジーで使ったものと同じ14期間RSIです。
実際にRSIの値と比較してみるとちゃんとロングもショートも意図通り動作していそうですね。
バックテストの成績
最後に実装したRSIストラテジーの成績を見てみましょう。
今回はBitFlyerのFXBTCJPYで見ていきます。

見事な負けっぷりですね。笑
「RSI とは」と調べれば何度も目にする手法をいざ実践すると大爆死することがこのバックテストの結果からわかりました。
ここで覚えておいてほしいことは、ストラテジーを実装してその手法が勝てる手法であることが一番ですが、今回のように実装してみたら惨敗していたというのも成果の1つです。
なぜならPineスクリプトを覚えてバックテストしていなかったら、その手法が負ける手法だと知らずにお金を無駄にしてしまっていたかもしれないからです。
Pineスクリプトでバックテストをすることは勝てる手法を探すことにも役立ちますが、それと同時に大切なお金を守ることにも役立ちます。
終わりに
今回はRSIのよく知られた手法を使ってストラテジーを一緒に実装してきました。
入門3で一緒にストラテジーを読んだ後であれば少しは自力で実装できたり、解説の内容が頭に入るようになってきているんじゃないかと思います。
また実装したストラテジーでバックテストの成績を確認すると、これだけよく知られた手法の1つであるにも関わらず、少なくともFXBTCJPYでは負けてしまうことがわかりました。
このように手法をバックテストすることはトレードをする上で非常に重要であることも実感してもらえたかと思います。
それでは最後にこの記事で出てきたポイントをまとめます。
実装に取りかかる前に各条件を整理して必要な実装内容を確認する。
記事としてなにか取り上げて欲しいトピックやPineスクリプトでわからないところ等ありましたら質問箱に投稿してもらえたらと思います。

今回はここまでです。お疲れ様でした。
コメント