バックテストツールのチュートリアルを兼ねて

このエントリーをはてなブックマークに追加

ツールのチュートリアルを兼ねてテストを行います。StrategyをコーディングしてTraderにActionを渡しながらループさせるってのが基本的な流れになります。

サラッと眺めていきましょう。

目次

実践

サンプル1

ストラテジーは特定日付で売買をするようにコーディングします。1305を1株だけ3月17日に買い3月30日に売ります。再び4月25日に買い5月10日に売ります。それぞれの取引は終値で行います。株価は下記のとおりです。

  • 3月17日: 1412
  • 3月30日: 1423 (+11円)
  • 4月25日: 1471
  • 5月10日: 1402 (-69円)

したがって、1回目の取引が11円の勝ちで2回目の取引が69円の負けとなります。実際にコードを走らせてみます。

require File.expand_path '../../../lib/sok', File.dirname(__FILE__)
include Kabu

class Sample1Strategy

  def decide(env)
    close = env[:close]
    date = env[:date]
    code = env[:code]

    case date.strftime('%Y%m%d')
    when '20160317'
      Action::Buy.new(code, date, close, 1)
    when '20160330'
      Action::Sell.new(code, date, close, 1)
    when '20160425'
      Action::Buy.new(code,date, close, 1)
    when '20160510'
      Action::Sell.new(code ,date, close, 1)
    else
      Action::None.new(code)
    end
  end
end

trader = Trader.new
strategy = Sample1Strategy.new
code = 1305
soks = Sok.joins(:company).where('companies.code=?',code).order('date')

soks.each do |sok|
  action = strategy.decide(code: code, date: sok.date, close: sok.close)
  trader.receive [action]
end

trader.summary
dir = File.expand_path('../../../data/test/sample1', File.dirname(__FILE__))
trader.save dir
trader.plot_recorded_chart dir + '/chart'

出力結果は下記のとおりです。正しく計算できていますね。

======================================================
net income:               -58.0
profit | loss:            11.0    | -69.0
pf:                       0.2
max profit | max loss:    11.0     | -69.0
trades | wins | looses:   2     | 1     | 1
wins{%}                   50.0
max series of wins:       1
max series of looses:     1
average span{win}:        8
average span{loose}:      7
max drow down:            -69.0
======================================================

グラフも見てみます。

  • 損益曲線 profit_curve

  • 損益ヒストグラム profit_histgram

  • 月次損益 monthly_profit

取引回数が少ないため、もっさりとしたグラフですが、良さそうです。前回には書いていなかったグラフも追加しています。実際にトレードした時のチャートはどうなっていたのかを知るためのグラフです。三角マークが取引したところです。

  • 3/17~3/30 Trade1

  • 4/25~5/10 Trade1

Y軸の目盛りが微妙ですが、十分確認できるんじゃないでしょうか。

サンプル2

続いてドテンルールでのトレードを想定したストラテジーをコーディングします。反対注文を現在のポジションより多く発注することでドテンすることができます。コードはこのようになります。Action.newの引数が1から2に変わっています。

require File.expand_path '../../../lib/sok', File.dirname(__FILE__)
include Kabu

class Sample1Strategy

  def decide(env)
    close = env[:close]
    date = env[:date]
    code = env[:code]

    case date.strftime('%Y%m%d')
    when '20160317'
      Action::Buy.new(code, date, close, 1)
    when '20160330'
      Action::Sell.new(code, date, close, 2)
    when '20160425'
      Action::Buy.new(code,date, close, 2)
    when '20160510'
      Action::Sell.new(code ,date, close, 1)
    else
      Action::None.new(code)
    end
  end
end

trader = Trader.new
strategy = Sample1Strategy.new

code = 1305
soks = Sok.joins(:company).where('companies.code=?',code).order('date')

soks.each do |sok|
  action = strategy.decide(code: code, date: sok.date, close: sok.close)
trader.receive [action]
end                                                                                              
trader.summary
dir = File.expand_path('../../../data/test/sample2', File.dirname(__FILE__))
trader.save dir
trader.plot_recorded_chart dir + '/chart'

結果はこのようになります。

======================================================
net income:               -106.0
profit | loss:            11.0    | -117.0
pf:                       0.1
max profit | max loss:    11.0     | -69.0
trades | wins | looses:   3     | 1     | 2
wins{%}                   33.3
max series of wins:       1
max series of looses:     2
average span{win}:        8
average span{loose}:      12
max drow down:            -117.0
======================================================

負けトレード回数が一回増えています。3/30~4/25で売りから入った-48円が正しく計上されています。

サンプル3

最後に買いましを想定したコードです。

require File.expand_path '../../../lib/sok', File.dirname(__FILE__)
include Kabu

class Sample1Strategy

  def decide(env)
    close = env[:close]
    date = env[:date]
    code = env[:code]

    case date.strftime('%Y%m%d')
    when '20160317'
      Action::Buy.new(code, date, close, 1)
    when '20160330'
      Action::Buy.new(code, date, close, 1)
    when '20160425'
      Action::Sell.new(code,date, close, 1)
    when '20160510'
      Action::Sell.new(code ,date, close, 1)
    else
      Action::None.new(code)
    end
  end
end

trader = Trader.new
strategy = Sample1Strategy.new

code = 1305
soks = Sok.joins(:company).where('companies.code=?',code).order('date')

soks.each do |sok|
  action = strategy.decide(code: code, date: sok.date, close: sok.close)
trader.receive [action]
end
trader.summary
dir = File.expand_path('../../../data/test/sample3', File.dirname(__FILE__))
trader.save dir
trader.plot_recorded_chart dir + '/chart'

結果は下記のとおりで。あ。。。 バグ。なかったことにして修正後の結果を載せます。

======================================================
net income:               38.0
profit | loss:            59.0    | -21.0
pf:                       2.8
max profit | max loss:    59.0     | -21.0
trades | wins | looses:   2     | 1     | 1
wins{%}                   50.0
max series of wins:       1
max series of looses:     1
average span{win}:        26
average span{loose}:      25
max drow down:            -21.0
======================================================
  • 3/17~4/25 Trade4

  • 3/30~5/10 Trade5

まとめ

ストラテジーは日付固定で売買を行うものにして、バックテストツールのテストを行いました。細かいところが微妙な雰囲気を醸していますが、まぁ良い感じにはなっているんじゃないでしょうか?次回からいよいよストラテジーの検証に入っていきたいと思います。

Recent Entries
Categories
    Tags
    Archives
    Search