金と健康と統計と

拝金主義の大学生が色々やるブログ

①番外編 モメンタム効果の定量的な検証

モメンタム効果を定量的に確認してみる。ここでは前のn個のローソクの最高値を更新したらロング、最安値を更新したらドテンショート(逆も然り)する単純なチャネルブレイクアウト戦略の有効性を確認し、間接的にモメンタム効果の検証*1をする。Pythonなどでも実装できるのだが、ここでは簡単のためTradingViewとPineスクリプトを用いる。最後に今回使うPineスクリプトを掲載した。OANDAラボ(www.oanda.jp)の記事に掲載されたスクリプトを少し改変したものである。
デフォルトではn=5に設定している。まずTradingViewで無料アカウントを作成し、チャート画面のPineエディタのところにこれを入力、保存して好みの銘柄でバックテストを実行して欲しい。
日経平均ドル円ビットコインの日足においてデフォルトのパラメーターでバックテストした結果はそれぞれ以下のようになる。
f:id:longtail1019:20190107233035p:plainf:id:longtail1019:20190107233103p:plainf:id:longtail1019:20190107233123p:plain
プロフィットファクター = 利益計 ÷ 損失計
プロフィットファクターは高ければ高い程よく、十分なトレード回数で1を超えていればその戦略が機能していることになる。
日経平均ビットコインドル円よりも数値が高く*2、この戦略が機能しているとわかる。
面白いのは、Cisさんのように勝率が50%を切っているのに利益を出していることである。
これで、厳密ではなかったがモメンタム効果の定量的な確認ができた。
パラメータやチャートの時間軸を変更して結果がどのように変わるか見るとより面白いかもしれない。
また、このブログではPineスクリプトの記法などについては書かないので、それについては他のサイトを参考にして欲しい。

//@version=3

strategy("ChannelBreakOutStrategy", overlay=true)

length = input(title="Length", type=integer, minval=1, maxval=1000, defval=5)

upBound = highest(high, length)
downBound = lowest(low, length)

if (not na(close[length]))
    strategy.entry("Long", strategy.long, stop=upBound + syminfo.mintick, comment="Long")
    strategy.entry("Short", strategy.short, stop=downBound - syminfo.mintick, comment="Short")

*1:必要条件、十分条件の議論をしていない直感的な説明だが悪しからず。

*2:為替であまりモメンタムが確認できないのは、貿易会社が常に逆張りである為らしい。