バックテストを登録するスクリプトのサンプル
エージェントのバックテストでは、各種パラメータの組み合わせをいろいろと変えて動作を調整したい場合があります。(カーブフィティングとかいうやつてずね。)jijiでは複数のエージェントを一括でテスト可能ですが、UIからちまちま登録するのはなかなかメンドイ。スクリプトで、for文とか使ってさくっと一括登録したい。
→ならJSONインターフェイスを使って登録すればいいんじゃね?ということで、jijiにバックテストを登録するRubyスクリプトのサンプルを書いてみました。
- 短期移動平均(10,20,30)x長期移動平均(30,40,50)のすべての組み合わせの移動平均エージェントを実行するバックテストを、デモサイトに登録するサンプルです。
- 処理の流れは以下のとおりです。
- jiji添付のクライアントライブラリを使用して、jijiに接続するためのスタブクラスを作成。
- スタブを利用して、エージェント一覧を取得
- 一覧から実行するエージェントを探し、実行時の引数として渡すエージェント一覧を作成。
- テスト名、メモ、開始日時、終了日時、↑で作成したエージェントの一覧を指定してバックテストを実行します。
require "rubygems" require "jiji/util/json_rpc_requestor" require 'uuidtools' END_POINT = "http://unageanu.homeip.net/jiji-demo" #1.jiji添付のクライアントライブラリを使用して、jijiに接続するためのスタブクラスを作成。 agent_service = JSONBroker::JsonRpcRequestor.new("agent", END_POINT) process_service = JSONBroker::JsonRpcRequestor.new("process", END_POINT) #2.エージェント一覧を取得し、登録対象とするエージェントを探索 ma = agent_service.list_agent_class.find{|i| i["class_name"]=="MovingAverageAgent" && i["file_name"]=="moving_average_agent.rb" } #3.実行するエージェント情報を作成。 # 短期移動平均→10,20,30 # 長期移動平均→40,50,60 #で、3x3の組み合わせをすべて試す。 agents = [] [10,20,30].each {|short| # 短期移動平均のバリエーション [40,50,60].each {|long| # 長期移動平均のバリエーション #登録情報を作成。 agent = ma.dup agent["id"] = UUIDTools::UUID.random_create().to_s agent["class"] = "#{agent["class_name"]}@#{agent["file_name"]}" #いけてない・・。 agent["name"] = "移動平均_#{short}-#{long}" #コンバートしないと実行結果からエージェントの詳細が見えなかったり・・いけてない。 agent["property_def"] = agent["properties"].inject({}){|r,i| r[i["id"]] = i r } agent["properties"] = {"long"=>long,"period"=>10,"short"=>short} agents << agent } } #4.テスト名、メモ、開始日時、終了日時、エージェントを指定してバックテストを実行。 time = Time.local(2009, 8, 20).to_i process_service.new_test( "バックテスト登録のテスト", "メモ", time, time+12*60*60, agents )
もともと公開APIとして考えていなかったのでいろいろといけてない部分もありますが・・。ご容赦。