スクリーンショット_2018-03-24_1

暗号通貨自動トレードシステム開発キャンプ#4:巷で話題のVIX戦術の解説とTrading Viewでのバックテストについて

#bot開発キャンプ第4夜
#VIX戦術とは
#Trading Viewでの実際の使い方
#バックテスト
//取引所への登録
//みなさんへのお詫び
//最近流行っているVIX戦術を解説
//VIXの表示方法
//VIX戦術トレードを行う前にご覧ください(必読)
//恐怖指数と呼ばれている所以
//VIX戦術を用いた自動売買システムのバックテスト方法

こんばんは、しゃしゃしゃしゃです。
bot開発キャンプ第4夜を進めて行こうと思います。今回のnoteでは最近暗号通貨トレーダーの間で流行っているVIX戦術をメインに扱って行こうと思います。

・取引所の口座開設
 実際にトレードをするに当たって取引所の口座が必要になりますので口座開設がまだで、トレードを行いたいかたは以下のリンクから登録することができます。
<bitflyer>
https://bitflyer.jp?bf=yaa5px3n
今後BitMEXでのbot開発もしていくのでこちらも登録よろしくお願いします。
<BitMEX:以下リンクから登録すると手数料が10%割引になります。>
https://www.bitmex.com/register/smlBwx


・みなさんへのお詫び
 みなさん、前回のnoteはご覧になっていただけたでしょうか?新SFDの導入が発表されたのでそれにのっかって新SFDに対応したbotを作成していったのですが、導入が発表されてから乖離が5%以上に広がることはなかったですね。。。
以前よりもFXが現物と連動していると考えたら嬉しいことなのですが、動かす機会がないものを紹介してしまって少し心苦しく思っています。
個人的には110万あたりを超えて、以前の様に価格上昇ムードが漂い始めたら再び乖離が広がっていくのじゃないかなぁと思っています。ただ以前に比べて、乖離が広がる方向のインセンティブはなくなり(むしろディスインセンティブ)、縮小方向にインセンティブが発生するので市場原理的に5%を大きく超えて10%に突入とかはまずありえないだろうと言うのが私の考えです。
 乖離が5%付近になったら、あんな記事あったなぁと思い出していただけると幸いです。

・最近流行っているVIX戦術を解説
 皆さん、最近Twitterを賑わせているVIX戦術はご存知ですか?
VIX戦術とはラリー・ウィリアムズの開発したVIX FIX(恐怖指数)を利用したトレーディングシステムです。VIX指数自体は昔からあるインジケーターなのですが暗号通貨のレバレッジ取引率の高さを逆手にとって優位性のある戦術を広めたのは「仮想NISHI@Nishi8maru」さんと言われています。

VIX指数を用いたトレード戦略

・VIXの表示方法
 上記の様なチャートはTrading Viewというサービスを使うことで非常に簡単に設定することができます。有料版もありますが、機能が制限されたバージョンであれば無料で利用することもできます。
 世界中の方が、自分の考案した戦略などを公開しており、かなり参考になる情報が転がっています。もちろん、そのまま運用するのは難しいのですが私が普段しているbotの中にはTrading Viewのアイデアから思想を流用して組み上げたものがあります。
また、自分が考えたロジックが使えるのかどうかを調べる際、非常に簡単にバックテストをすることのできる仕組みが整っているのでこれからbotを作ろうと考えている方は是非使用してください。

Twitterでよくみる画像はTrading Viewを使ってバックテストをしているときのものです。

<Trading Viewの登録はこちらからできます。>
https://tradingview.go2cloud.org/aff_c?offer_id=2&aff_id=9758

Trading Viewに登録された方は以下の動画をご覧になってVIX戦術の設定を行ってください。

・VIX戦術トレードを行う前に(必読)
 さて、ここまで読んでいただけていると言うことは、皆さんはVIXを表示させて今すぐにでもこの戦術が効くのかトレードしてみたいと考えていることでしょう。ただ、もう少しだけ待ってください。VIXについて分かっていないのに流行っているから、みんな儲かっているから試してみようという考え、お金溶かして退場することになりますよ?どんなテクニカルもそれを使えば必ず勝てるものなんてないですし、どっかで応用する力がないと遅かれ早かれ他のかたに遅れを取ってしまって損失を出してしまうことになります。
 そして、応用する為には自分が利用しているテクニカルまたは戦術が如何様な性質を持っているのかを理解する必要がある、というのが持論です。どうか私のnoteを読んでくださっている皆さまはVIXに対する理解をある程度深めてからトレードしてください。VIXに対する理解があればトレードしているうちにVIXのデメリットを補完してくれる自分なりのインジケータを思いつく(または検索などで見つける)ことができるかもしれません。そうなってからようやく、自分のトレードというのができていくと思います。
 

・恐怖指数と呼ばれている所以
 前置きが長くなってしまいましたが、VIXについて解説させていただこうと思います。
VIXとはボラティリティ・インデックス(Volatility Index)の略でその名の通り相場の価格変動の激しさを表す指標のことです。別名「恐怖指数」とも言われているのですが相場の変動を表す指標がなぜ恐怖指数と呼ばれているのでしょうか?
簡単なことです。分かりやすい様に以下の2パターンを考えてみましょう。

A:1日あたりに1000円幅しか変動しないBTC
B:1日あたりに10万円幅も変動するBTC
  ※どちらのパターンも1BTC=100万円程度とする。
上記の様にA、Bがあったとするとどちらの方が市場参加者は不安・高揚を感じるのか。答えはもちろんBのパターンですよね。ロングしている人は10万円幅の暴落が来るかもしれませんし、ショートをしている人は10万円幅の暴騰が来るかもしれません。この様に、ボラティリティの大きい相場では市場参加者は不安が高まるのです。
ここまでの解説を読んで「VIXは価格の下落時にしか増大しないんじゃないの?」って考えた方がいらっしゃると思います。その方はほとんど正解ですが、一部誤っています。以下の式をご覧下さい。

((MAX_VALU - MIN_NOW)/MAX_VALU) * 100
MAX_VALU:指定期間の最高値
MIN_NOW:現在足の安値

この式がVIX指数と呼ばれるものの定義になります。思ったよりも単純な式ですよね。
 この式からわかる通り、「指定期間の最高値」と「現在足の安値」の差が大きければ大きいほどVIXというのは大きくなって行きます(理論上の最大値は100)。こう考えると、「やっぱり価格が下落時しか増大しない」と言うのは一見正しい様に思えますが、以下の例を考えてみましょう。


過去10日間の終値の最高値が10万円
昨日の安値は9万円
今日の高値は100万円(MAX_VALU)
今日の安値は前日終値の10万円(MIN_NOW)

この時、VIXの定義に当てはめると
前日VIX=((10-9)/10)*100=10
今日VIX=((100-10)/100)*100 = 90
となり、価格が暴騰したときにもVIXが上昇することが分かります。
ただ、価格が下落するときの方が上昇しやすいこともあって「恐怖指数」と名付けられています。
 ですので、VIXが上昇したからといって本当に相場の恐怖感が上昇しているという訳ではない。ということを頭の中に入れておいてください。RSIやStoch RSIなどの「買われすぎ、売られすぎを表す」オシレーター系指標も「こんな値動きの時買われすぎっぽい」とか「売られすぎっぽい」って言うのを表しているだけであって本当に買われすぎ/売られすぎを表している訳ではないんです。この当たり前のことが頭から抜け落ちてしまっていると、騙しにあった時に「完全に買われすぎだったのに、一向に下落しない。。。なんでこうなったんだ?」と頭を抱えてしまうことになる訳です。
 実際にトレードに使う際は、そのテクニカル指標がどの様な式なのか、結局どんな値動きの時に動くのかと言うのを理解しておいて使用しましょう。結局使い方次第です。聖杯なんてありません。

・VIX戦術を用いた自動売買システムのバックテスト方法
 いよいよ皆さんお待ちかねのTrading Viewでのバックテストに入って行きたいと思います。Trading Viewのサイトに行って検索窓に「XBTUSD」と打ち込んでください。すると以下の様な候補が出て来るのでBitMEXを選択。

次にインタラクティブチャートと書いてあるところをクリック

チャートの下側にある「Pineエディタ」をクリックするとこの様にプログラムを打ち込むエディタが出てきます。

以下のコードを貼り付けてください。

//@version=3
//Noro
//2018

strategy(title = "Wasyasysa's VixFix + RCI", shorttitle = "VixFix + RSI str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 5)
src = input(close, "source")
//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
leverage = input(1, defval = 1, minval = 1, maxval = 100, title = "leverage")
limit = input(40, defval = 40, minval = 2, maxval = 50, title = "RSI Limit")

pd = input(22, title="LookBack Period Standard Deviation High")
bbl = input(20, title="Bolinger Band Length")
mult = input(2.0, minval = 1, maxval = 5, title = "Bollinger Band Standard Devaition Up")
lb = input(50, title="Look Back Period Percentile High")
ph = input(.85, title="Highest Percentile - 0.90=90%, 0.95=95%, 0.99=99%")
pl = input(1.01, title="Lowest Percentile - 1.10=90%, 1.05=95%, 1.01=99%")
hp = input(false, title="Show High Range - Based on Percentile and LookBack Period?")
sd = input(false, title="Show Standard Deviation Line?")

fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Vix Fix
wvf = ((highest(close, pd)-low)/(highest(close, pd)))*100
sDev = mult * stdev(wvf, bbl)
midLine = sma(wvf, bbl)
lowerBand = midLine - sDev
upperBand = midLine + sDev
rangeHigh = (highest(wvf, lb)) * ph
rangeLow = (lowest(wvf, lb)) * pl

//RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//RCI3lines
itvs = input(9, "short interval")
itvm = input(36, "middle interval")
itvl = input(52, "long interval")
upperband=input(title="High line[%]",defval=80,type=integer)
lowerband=input(title="Low line[%]",defval=-80,type=integer)

ord(seq, idx, itv) =>
   p = seq[idx]
   o = 1
   for i = 0 to itv - 1
       if p < seq[i]
           o := o + 1
   o

d(itv) =>
   sum = 0.0
   for i = 0 to itv - 1
       sum := sum + pow((i + 1) - ord(src, i, itv), 2)
   sum
rci(itv) => (1.0 - 6.0 * d(itv) / (itv * (itv * itv - 1.0))) * 100.0

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
//up = (wvf >= upperBand or wvf >= rangeHigh) and fastrsi < limit and close < open
up = (wvf >= upperBand or wvf >= rangeHigh) and rci(itvs) < lowerband and close < open
//dn = (wvf >= upperBand or wvf >= rangeHigh) and fastrsi > (100 - limit) and close > open
dn = (wvf >= upperBand or wvf >= rangeHigh) and rci(itvs) > upperband and close > open
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 3

//Trading
lot = strategy.equity / close * leverage
lot := strategy.position_size == 0 ? strategy.equity / close * leverage : lot[1]

if up
   if strategy.position_size < 0
       strategy.close_all()
       
   strategy.entry("Bottom", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn
   if strategy.position_size > 0
       strategy.close_all()
       
   strategy.entry("Top", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
   
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
   strategy.close_all()

これで、保存を押してチャートへ追加を押すとバックテストが完了します。
15分足で以下の様な結果になります。

2018/3/24追記:どうやら、このままだと動かないらしいので51行目から56行目の先頭にインデント(スペース)を入れてください。
情報提供ありがとうございます。
2018/3/24追記2:確認したところif文やfor文のインデントがコピペをすると4文字から3文字になってしまう様です。51~56行目だけでなく、if文、for文、関数定義の後のインデントが4文字になる様にスペースをいれてください。

時間足を変えれば自動的にテスト結果も変わるのですごい便利です。登録しましょうTrading View
https://tradingview.go2cloud.org/aff_c?offer_id=2&amp;aff_id=9758

だめだ、眠い。。。本当は良さげなアイデアのソースコードを見る方法とかも説明しようと思ったんですが、眠いので次回にします。今回のコードもほとんど他の人が公開しているライブラリから流用したものです。。。
それではbot開発キャンプ第4夜を終わりにしようと思います。

最後までご参加いただきありがとうございました。

私の記事が参考になった方は以下のアドレスにBTCを送付いただけると励みになります。

BTCアドレス:39Bb8Htxvj25mdcW11KtBovMHkeUySqRhS
ETHアドレス:0x427a1d797f3f04c7a899785BC430943D8A5dFA48

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