「売買システム入門」トゥーシャー・シャンデ〜ストラテジ検証③ SMA65CC3 フィルターの効果のほど

AndroidのアプリにTermuxというLinuxターミナルエミュレータが有るのですが、それを使ってツールが動かないかなと試行錯誤してみたら、無事に動かせるってことがわかりました。./configure make make installとか久しぶりでした。

このツールが動くってことはnokogiriとsqlite3が動くってことなのでRails動くかなと思いましたが、インストールできても起動に失敗するようです。また機会があったら挑戦してみようと思います。

さて、このサイトはRubyでバックテストツールを作成し様々なストラテジーを検証することを目的としています。前回はSMA65CC3ストラテジーにロスカットルールを追加しました。そこでパフォーマンスの悪化は見られるものの、システムが堅牢となることを示しました。今回も引き続き「売買システム入門」を読み進め、SMA65CC3の改良を行っていきます。

今回はRAVI指標を用いてシグナルのフィルタリングを行います。今までマイナスを履き続けるシステムでしたが、このフィルターによってようやくプラスを吐き出すことに成功しました。最も使えるかは別ですが。

早速見ていきましょう。

目次

RAVI指標とは

RAVI指標とは、レンジアクション・ベリフィケーション・インデックスの略で、レンジ内で推移する状態に焦点を絞った指標であり、当日の値動きが前日の値動き幅をどの程度上回っているかをみるものになります。

<RAVI指標の計算方法>

RAVI=(短期移動平均-長期移動平均)÷長期移動平均×100

RAVI指標が、基準値を下回った場合には、マーケットはレンジ内での推移と判断し、これ以上の場合はトレンドが現れている事を意味するという使い方をします。

「超早分かり!テクニカル分析」

実際にチャートを見てみましょう。下段がRAVIです。仮に1%を基準値とした場合 、トレンドがないと判断した日足の色を変えています。

ravi

前半はトレンドに勢いがあって、RAVIも吹っ切れていますが、後半はヨコヨコ展開になり、1%を下回る日がちらほらとあります。SMA65CC3によって発生する無駄なシグナルをいくつか消せそうなのが見て取れると思います。

ストラテジーの構築

フィルターの効果を検証するため、前回のロスカットルールは追加しません。またRAVIでシグナルをキャンセルした場合、一旦平均線を逆にクロスするまでは注文をかけないようにします。コードは下記のようになります。

module Kabu
  class Sma65Cc3Ravi

    def initialize(line = 1)
      @line = line
    end

    def decide(env)
      code = env[:code]
      date = env[:date]
      closes = env[:closes]
      open = env[:open]
      position = env[:position]

      ravi = closes.ravi(7,65)
      return Action::None.new(code,open) if ravi[-1] < @line

      aves = closes[-68..-1].ave(65)
      is_buy = 3.times.inject(true) do |ret, i|
        ret = (ret and (closes[-1-i] > aves[-i-1]))
      end
      is_buy = (is_buy and (closes[-4] <= aves[-4]))

      is_sell = 3.times.inject(true) do |ret, i|
        ret = (ret and (closes[-1-i] < aves[-i-1]))
      end
      is_sell = (is_sell and (closes[-4] >= aves[-4]))

      if position.nil?
        if is_buy
          return Action::Buy.new(code,date,open,1)
        elsif is_sell
          return Action::Sell.new(code,date,open,1)
        else
          return Action::None.new(code,open)
        end
      end

      if position.buy? and is_sell
        Action::Sell.new(code,date,open,2)
      elsif position.sell? and is_buy
        Action::Buy.new(code,date,open,2)
      else
        Action::None.new(code,open)
      end
    end
  end
end

検証

2007年〜2017年の33業種別株価指数を用いてバックテストを行ってみましょう。フィルターをかけない場合についてもバックテストして集計結果を比較してみます。

code net income trades win pf average dd
I201 45.29 23 47.83 1.61 1.97 -25.88
I202 12.68 45 42.22 1.07 0.28 -51.85
I203 -71.65 29 20.69 0.55 -2.47 -86.99
I204 -60.81 35 17.14 0.61 -1.74 -41.94
I205 85.88 19 36.84 2.33 4.52 -42.7
I206 15.59 44 31.82 1.11 0.35 -30.76
I207 102.95 31 35.48 2.12 3.32 -24.27
I208 49.18 26 38.46 1.68 1.89 -23.01
I209 120.83 31 51.61 2.44 3.9 -18.23
I210 9.81 49 26.53 1.06 0.2 -71.19
I211 -69.45 42 35.71 0.69 -1.65 -86.34
I212 -6.44 36 30.56 0.97 -0.18 -66.37
I213 -108.57 29 37.93 0.52 -3.74 -76.68
I214 53.21 27 44.44 1.5 1.97 -34.81
I215 68.02 36 33.33 1.5 1.89 -47.18
I216 88.26 25 32.0 1.84 3.53 -31.32
I217 161.7 25 48.0 3.22 6.47 -26.91
I218 45.03 25 32.0 1.38 1.8 -42.0
I219 -174.23 29 31.03 0.31 -6.01 -112.65
I220 101.79 20 50.0 2.45 5.09 -29.03
I221 50.24 21 38.1 1.65 2.39 -33.73
I222 85.85 30 46.67 1.55 2.86 -59.79
I223 107.13 26 46.15 2.26 4.12 -28.91
I224 -139.4 28 21.43 0.28 -4.98 -130.13
I225 20.9 26 34.62 1.19 0.8 -79.6
I226 -46.69 37 32.43 0.73 -1.26 -46.47
I227 -64.09 26 23.08 0.52 -2.46 -74.03
I228 -36.1 34 41.18 0.81 -1.06 -60.87
I229 173.81 38 26.32 1.83 4.57 -61.75
I230 41.08 33 36.36 1.27 1.24 -69.13
I231 83.14 34 41.18 1.57 2.45 -64.67
I232 107.23 38 34.21 1.77 2.82 -48.75
I233 63.45 17 47.06 2.06 3.73 -20.73
平均 27.7 30.0 36.1 1.4 1.1 -53.0
偏差 82.56 7.62 8.74 0.7 2.92 26.53
平均/無 -13.4 69.0 26.3 1.0 -0.1 -47.9
偏差/無 67.06 8.66 4.79 0.27 0.94 16.36

なんということでしょう。全く稼げなかったあのシステムが、わずかばかりか稼げるようになりました。PFの業種間平均は1.4。平均収益の平均は1.1%。そうはいっても、ここから取引コストを勘定することを考えれば、まだまだ使い物にはなりませんね。

著書には、フィルターについてはあまり多く触れられていません。RAVIのラインを切り下げた場合についての比較程度となっています。この辺はカーブフィッティングにつながりやすいからかもしれませんね。ですので、さっぱりとしていますが今回はこれで終わりです。

まとめ

RAVIを使ってシグナルにフィルターをかけました。すると収益が改善することがわかりました。

次回はSMA65CC3システムについてはこれで終わりにして、シャンデ氏の著書に紹介されている次のシステムの検証に入りたいと思います。