予定したインジケータは実装できました。
この章の最後に、テストについて言及があります。
が、、
ダウンロードしたコードの方にはテストコードがありません。
まとりあえず、坂本タクマ先生の言及について、確認して行きましょう。
半年分くらいのデータを使う。
予めExcelでインジケータの計算結果を出して置く。
Excelの結果と、実装したインジケータの結果をテストコードを書いて比較する。
実際にデータをダウンロードするところから、テストしている。
小数点以下の比較では、二桁程度で丸めている。
ということなのですが、ワタクシは異論があります。
まだ、単体テストですから、
各インジケータのロジックが正しいかどうかの確認だけでいいはず。
少量のデータで、
予想通りの結果が返るかどうか、それだけ確認すればいいじゃん。
結合テスト的な動作確認はこの段階じゃなくていいんじゃないの。
私なら、以下の方針に従い、単体テストを行う。
少量のデータでダミーのStockをテストコード上に作る。ダウンロードしない。
インジケータの各実装クラスにダミーのストックを与えて生成し、
calculate_indicatorメソッドを直接呼んで結果をチェック。
:price_atの指定があるときは4種類チェック。
データにnilが入ってる場合もチェック。
で大体、こんな感じ。
# coding: Windows-31J
require “./lib/base”
require “./lib/stock”
dummyS = Stock.new(9999,”T”,1)
dummyS.add_price(“2001-01-01”, 1, 9, 1, 2, 9999)
dummyS.add_price(“2001-01-02”, 1, 8, 4, 5, 9999)
dummyS.add_price(“2001-01-03”, 1, 2, 1, 2, 9999)
dummyS.add_price(“2001-01-04”, 1, 4, 4, 4, 9999)
dummyS.add_price(“2001-01-05”, 1, 1, 1, 1, 9999)
dummyS.add_price(“2001-01-06”, nil, nil,nil, nil, 9999)
dummyS.add_price(“2001-01-07”, 1, 5, 3, 5, 9999)
dummyS.add_price(“2001-01-07”, 1, 5, 3, 5, 9999)
dummyS.add_price(“2001-01-07”, 1, 5, 3, 5, 9999)
result = MovingAverage.new(dummyS, :span=>3, :price_at=>:open).calculate_indicator()
puts “:span=>3, :price_at=>:open”
puts result
expect=[nil,nil,1.0, 1.0, 1.0, nil, nil, nil, 1.0]
puts result == expect
#以下、高値、安値、終値も同様にテストする。
Excelでチャント計算して、小数点二桁で丸めて残りもやってみよう。
面倒くさいので、残りは明日やろう。
※どうでもいいが、やっぱコンストラクタで引数渡してるのは、邪魔だと思う。
result = MovingAverage.calculate_indicator(dummyS, :span=>3, :price_at=>:open)
の方が、生成するムダがないと思う。
メソッド一つだけで、引数保持しておく意味ないもの。
質問コーナー、お問い合わせは、sanpome.net@gmail.com まで。