見出し画像

テクノファンダさん発案ストラテジー「クロコダイル」の検証

ProjectBBBです。

テクノファンダさん(@TechnoFunda0 )がブログで「クロコダイル」というストラテジーを発表しました。

TradingViewのpineコードも公開していただいており、はむすたーではすでに稼働しています。今回は「クロコダイル」を徹底的に検証して、どんな風に用いるのがベストなのかを考察していきます。
同じような検証を誰でもできるように文章は冗長になってしまいましたが、考えたことを順序通りに記載しました。
ぜひ皆さんも真似をしてみてください。

<クロコダイルについて>

まずこちらが「クロコダイル」のバックテスト結果です。

BitMEX
2018年1月~
手数料0.135%換算
inicial_capital = 10,000 $

優秀なストラテジーですね。
まずは要素を洗い出していきます。

こちらがpineコードです。
はむすたーのExecutiveのまちゅけんさん(@mtkn1btcfx)が「クロコダイル」公開後30分という短い時間であっと言う間に各要素の検証ができるよう変数化してくれたものです。
ぜひ数字を自分で変えていじくりまわしてみてください。

//@version=3
strategy(title="crocodile modified", overlay=true, commission_value=0.135,initial_capital=10000)

//Test period
testPeriodStart = timestamp("Asia/Tokyo",input(2018, "From Year") ,input(1, "From Month"),input(1, "From Day"),input(0, "From Hour"),0)
testPeriodStop = timestamp("Asia/Tokyo",input(9999, "To Year"),input(1, "To Month"),input(1, "To Day"),input(0, "To Hour"),0)
testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false

// Input
volemalen = input(5, "値幅のEMA期間", type=integer, minval=1)
volemak = input(1.1, "値幅の係数", type=float, minval=0.0)
src = input(hlc3, "RSIのソース", type=source)
rsilen = input(6, "RSIの期間", type=integer, minval=1)
rsimalen = input(4, "RSIのSMA期間", type=integer, minval=1)
rsibrk = input(20, "RSIのブレイク", type=integer, minval=1)

//Logic
up = rma(max(change(src), 0), rsilen)
down = rma(-min(change(src), 0), rsilen)
udCal(up, down) =>
   if down == 0
       100
   if  up == 0
       0
   else
       100 - (100 / (1 + up / down))
fastrsi = udCal(up, down)
Buy_IN = close < open and abs(close - open) > ema(abs(close - open), volemalen) * volemak and sma(fastrsi,rsimalen) < rsibrk
Sell_IN = open < close and abs(close - open) > ema(abs(close - open), volemalen) * volemak and sma(fastrsi,rsimalen) > 100 - rsibrk
Close = (strategy.position_size > 0 and fastrsi > rsibrk ) or (strategy.position_size < 0 and fastrsi < 100 - rsibrk)

// Order
if testPeriod() 
   strategy.entry("BUY", strategy.long, when=Buy_IN)
   strategy.entry("SELL", strategy.short, when=Sell_IN)
   strategy.close_all(Close)
else
   strategy.cancel_all()
   strategy.close_all()

こちらは売買タイミングをわかりやすくプロットしたもの。
青色でロング、赤色でショートしています。

またこれがパフォーマンスサマリーです。

それでは洗い出した要素を分解・検証していきます。
できるだけ定量的に書いていくのがコツです。

<分解・検証>

思考経路をオープンにするために、冗長になりますが細かく書きました。
とりあえずメリット・デメリットをわけずにリストアップ。

・純利益は1月~だと+46.17%、4月~だと+4.5%
 1月~3月(バブル期後期)と4月~現在までで成績に落差がある。
 値動きが力強いときのほうが利益を出せる。
・勝率63.89%(手数料込)
 勝率の高い逆張りストラテジー。
・建玉の平均保有時間は2時間。
 丸半年で108回の取引であり、1日の平均取引回数は0.6回
 ポジションを持っていない期間が非常に長い。
・最大ドローダウンは1月~で1.8%、4月~で1.71%
 短期間で決済するためドローダウンが非常に低い。
 これがこのストラテジーの最大の強み。
・レバレッジを4倍だと最大ドローダウンは1月~で4.69%、4月~で6.05%
 (複利換算)
 高レバレッジでも比較的安全。
・ローソク足軸のストラテジー。シンプル。
・ストラテジョーの堅牢性(ロバスト性)が高い。
 足の長さや変数を多少変えても右肩上がりのグラフが成り立つ。
・トレンド発生時のトレンドフォロー系には成績が明確に劣る。
 (例:純正ドテン君は1月~で+248.29%)
・プロフィットファクターは4.152
 リスクリワード比は、2.347
 このストラテジーの収益の源泉は高勝率にある。
・終値ベースでの取引である。

こんなところでしょうか。
上のぐしゃぐしゃな箇条書きを多少まとめます。

<まとめ>

「クロコダイル」は高勝率損小利小のストラテジー。
ドローダウンが低く安全に回すことができるが、その反面ここぞというタイミング以外では取引をしないため取引回数は少ない。
堅牢性が高く、非常に安定しているのでバックテストに近い結果が今後も得られる可能性は高い。(カーブフィッティングではない。)
一方で細かく利益を積み重ねるストラテジーにとって取引回数が少ないのは最大のデメリットである。
「クロコダイル」のみを回す際には、マーケットに参加できる時間は非常に少なくなる。
自動売買で回すにしろ、これのみで回すのは機会損失になってしまう感が否めない。

では具体的にはどう回すのがよいのでしょうか。

<活用方法>

「クロコダイル」だけですと、暴騰暴落のタイミングで大きな利益を出す、というようなスタンダードな稼ぎ方はできません。
そこで「トレンドに逆らわない」という先人の教えに従い、トレンドフォロー系のストラテジーはそれはそれとして動かしつつ、同時並行で「クロコダイル」を回すのがオススメです。
ドローダウンが低くレバレッジをかけるべきストラテジーであると言えるので、たとえばトレンドフォロー系をレバ1倍、「クロコダイル」をレバ2倍、合計レバレッジ3倍で回すとどうなるのか見てみます。

100万円スタートで回して半年で+445%、最大ドローダウン率は14.03%という結果になりました。
同じ条件で純正ドテン君のみを回すと、+248%、最大ドローダウン率は16.89%
「クロコダイル」をレバ2倍で回すと、+101%、最大ドローダウン率は3.27%となります。

レバレッジ3倍で回した方がドローダウンを抑えつつ、大きな利益も狙えるという結果になりました。
まるで魔法ですね!
特に「クロコダイル」は逆張りのストラテジーですので、順張りのトレンドフォロー系のストラテジーとの相性は抜群です。
単品でレバレッジをかけて回すのも良し、ですがぜひ組み合わせて回して見てください。

組み合わせて回してみろなんて言われてもどうやればいいのかわからないという方は仮想通貨自動売買プラットフォーム「はむすたー」を使いましょう。
誰でも簡単に上記のようにストラテジーを組み合わせた自動売買が実現できます。

<はむすたーで自動売買するためのコード>

はむすたーで「クロコダイル」を動かすためのpineスクリプトは下記のものになります。
また「クロコダイル」の売買タイミングでアラートを飛ばせるコードになっているので、アラートを見て手動で売買するから大丈夫という方もぜひ試してみてください。

//@version=3
study(title="crocodile modified", overlay=true)

// Input
volemalen = input(5, "値幅のEMA期間", type=integer, minval=1)
volemak = input(1.1, "値幅の係数", type=float, minval=0.0)
src = input(hlc3, "RSIのソース", type=source)
rsilen = input(6, "RSIの期間", type=integer, minval=1)
rsimalen = input(4, "RSIのSMA期間", type=integer, minval=1)
rsibrk = input(20, "RSIのブレイク", type=integer, minval=1)

//Logic
up = rma(max(change(src), 0), rsilen)
down = rma(-min(change(src), 0), rsilen)
udCal(up, down) =>
   if down == 0
       100
   if  up == 0
       0
   else
       100 - (100 / (1 + up / down))
fastrsi = udCal(up, down)
Buy_IN = close < open and abs(close - open) > ema(abs(close - open), volemalen) * volemak and sma(fastrsi,rsimalen) < rsibrk
Sell_IN = open < close and abs(close - open) > ema(abs(close - open), volemalen) * volemak and sma(fastrsi,rsimalen) > 100 - rsibrk
Buy_Close = fastrsi > rsibrk
Sell_Close = fastrsi < (100 - rsibrk)

//switch
switch = 0
setA = 0
setB = 0
if (Buy_IN and (switch[1] == 0))
   switch := 1
   setA := 1
   setB := 0
else    
   if (Buy_Close and (switch[1] == 1))
       switch := 0
       setA := 0
       setB := 1
   else
       switch := nz(switch[1],0)
       setA := 0
       setB := 0
switch2 = 0
setC = 0
setD = 0
if (Sell_IN and (switch2[1] == 0))
   switch2 := 1
   setC := 1
   setD := 0
else    
   if (Sell_Close and (switch2[1] == 1))
       switch2 := 0
       setC := 0
       setD := 1
   else
       switch2 := nz(switch2[1],0)
       setC := 0
       setD := 0

//plot
plotshape(setA,title="Buy_IN",style=shape.triangleup,text="Buy_IN",color=green,textcolor=green,location=location.belowbar)
plotshape(setC,title="Sell_IN",style=shape.triangledown,text="Sell_IN",color=red,textcolor=red,location=location.abovebar)
plotshape(setB,title="Buy_Close",style=shape.triangledown,text="Buy_Close",color=lime,textcolor=lime,location=location.abovebar)
plotshape(setD,title="Sell_Close",style=shape.triangleup,text="Sell_Close",color=orange,textcolor=orange,location=location.belowbar)

//alert
alertcondition(setA, title = "Buy_IN", message = ",crocodile,BUY,1,LONG")
alertcondition(setC, title = "Sell_IN", message = ",crocodile,SELL,1,SHORT")
alertcondition(setB, title = "Buy_Close", message = ",crocodile,SELL,1,LONG_EXIT")
alertcondition(setD, title = "Sell_Close", message = ",crocodile,BUY,1,SHORT_EXIT")

様々な特性を持ったストラテジーを上手く組み合わせることによって楽しく資産を増加させて行きましょう。

ProjectBBBでした。

読んでいただいてありがとうございます!