eVWMAドテンステラテジー(BitMEX1時間足)

移動平均のドテンストラテジーを構築してみたかったのでトライしてみました。
今回は「ロケット科学投資法」という書籍内で紹介されて一躍有名になったMAMA(Mesa Adaptive Moving Average)と、eVWMA(Elastic Volume Weighted Moving Average)と呼ばれる、出来高を考慮した移動平均を使います(VWAPとは別物)。
最初にMAMAとFAMAのGC/DCストラテジーと、eVWMAのGC/DCストラテジーをそれぞれ別個に作成したのですが、両者共に散々な結果に終わったので、試しにMAMAをeVWMAで加工してみようと思い立った次第です。

ストラテジーの内容としては
1.MAMAとFAMAを計算
2.それぞれをeVWMAの入力値として使用(本来は終値)し出来高を重み付け
3.算出した二つのeVWMAのGC/DCでドテンエントリー
といったものになります。

では、以下ソースコードです。

//@version=2
strategy("dotenkun_eVWMA",overlay=true)

src = input(hl2, title="Source")
fl = input(.5, title="Fast Limit")
sl = input(.05, title="Slow Limit")
length = input(15, title="Volume Period")
offset = input(1, title="offset")

pi = 3.1415926
sp = (4*src + 3*src[1] + 2*src[2] + src[3]) / 10.0
dt = (.0962*sp + .5769*nz(sp[2]) - .5769*nz(sp[4])- .0962*nz(sp[6]))*(.075*nz(p[1]) + .54)
q1 = (.0962*dt + .5769*nz(dt[2]) - .5769*nz(dt[4])- .0962*nz(dt[6]))*(.075*nz(p[1]) + .54)
i1 = nz(dt[3])
jI = (.0962*i1 + .5769*nz(i1[2]) - .5769*nz(i1[4])- .0962*nz(i1[6]))*(.075*nz(p[1]) + .54)
jq = (.0962*q1 + .5769*nz(q1[2]) - .5769*nz(q1[4])- .0962*nz(q1[6]))*(.075*nz(p[1]) + .54)
i2_ = i1 - jq
q2_ = q1 + jI
i2 = .2*i2_ + .8*nz(i2[1])
q2 = .2*q2_ + .8*nz(q2[1])
re_ = i2*nz(i2[1]) + q2*nz(q2[1])
im_ = i2*nz(q2[1]) - q2*nz(i2[1])
re = .2*re_ + .8*nz(re[1])
im = .2*im_ + .8*nz(im[1])
p1 = iff(im!=0 and re!=0, 2*pi/atan(im/re), nz(p[1]))
p2 = iff(p1 > 1.5*nz(p1[1]), 1.5*nz(p1[1]), iff(p1 < 0.67*nz(p1[1]), 0.67*nz(p1[1]), p1))
p3 = iff(p2<6, 6, iff (p2 > 50, 50, p2))
p = .2*p3 + .8*nz(p3[1])
spp = .33*p + .67*nz(spp[1])
phase = 180/pi * atan(q1 / i1)
dphase_ = nz(phase[1]) - phase
dphase = iff(dphase_< 1, 1, dphase_)
alpha_ = fl / dphase
alpha = iff(alpha_ < sl, sl, iff(alpha_ > fl, fl, alpha_))
mama = alpha*src + (1 - alpha)*nz(mama[1])
fama = .5*alpha*mama + (1 - .5*alpha)*nz(fama[1])

nbfs = sum(volume, length)

calc(price, nb_floating_shares) =>
data = (nz(data[1]) * (nb_floating_shares - volume)/nb_floating_shares) + (volume*price/nb_floating_shares)
data

mama_wv = calc(mama, nbfs)
fama_wv = calc(fama, nbfs)

plot(mama_wv, color=blue, linewidth=1, title="mama")
plot(fama_wv, color=red, linewidth=1, title="fama")

longCondition = crossover(offset(mama_wv, offset), offset(fama_wv, offset))
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)

shortCondition = crossunder(offset(mama_wv, offset), offset(fama_wv, offset))
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)

以下バックテスト結果(出来高平均期間15・手数料0.075%・他デフォルト値)

純利益:21.12%
トレード回数:194
勝率:41.75
PF:1.861
最大DD:2.79%

DDが深いですがまずまずの結果。
試しにMAMA算出ソースを高値安値平均から安値に変更してみます。

純利益:27.73%
トレード回数:194
勝率:47.94%
PF:2.292
最大DD:2.09%

何故か成績が大幅に良化しました。
しかし高値安値平均から安値に変える事によって、どんな優位性が生まれたのか、自分は見当が付きません…。

今回の結果をまとめると
1.MAMA単体・eVWMA単体では使い物にならない
2.MAMAにeVWMAを噛ませるとそれなりの物になった
3.両者共に適応型移動平均である
4.純利益だけ見ると出来高算出期間は15時間がベスト
5.MAMAの算出ソースを高値安値平均から安値に変更すると結果は大幅に改善された

1はまあ予想通り。単体の指標で好成績が出る事は滅多に無い。
2も何となく予想していました。ビットコインは出来高指標が効く事が多いので。
3はチャネルブレイクアウト戦略が効く理由と同じかな。あともしかしたらサイクル系の指標に優位性があることを示唆してるかもしれない。要検証。
4は18に近い数字になるだろうと予想していたので、まあ納得。
5がよくわからん。ただのカーブフィッティングの危険性有。

適応型の指標と出来高指標の組み合わせは、他にもいいものが見つかる気がしてます。
皆さんも是非色々試してみて下さい。
ではでは、本記事は以上となります。皆さんに爆益あれ。

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