ホーム | アプリケーション | Tips | ダウンロード | プログラム | コラム

CBアプリ工房


Tips >

マクロと VBA でシステムトレードの条件式を作る

更新 : 2008/05/06

 



解説:
C++Builder で OLE を扱っているとエクセルとの関わりが生まれてきます。最近公開した、エクセルに条件式を記述して使う株ストラテジー検証ソフトもエクセル(特に関数、マクロ)の知識がないと利用が難しいかもしれません。一般に出ているシステムトレードのソフトも、エクセルを使うことが多いようです。こうした検証ソフトを、関数などの記述方法がわからなくて使えないとすればもったいない話です。

今回は、システムトレードとして条件式やマクロ(「VBA」という一種のプログラミング言語で書く)をどう記述するば良いか書いてみたいと思います。なお、エクセル自体の操作説明はしませんので、インターネットや書籍で調べてください。

解説は、"sample1.xls" を参照しながら行います(こちらからダウンロード)。

サンプルコード:
まずは肝心の条件式(セルでの記述では if 文が分かればいけると思います。使われる関数はいくつか必要)。もっとも C++Builder でプログラミングしている方には条件式といってもそう難しくはないでしょう。
ただセルでの記述は、ちょっと癖がありますので、条件式が複雑になるとやっかいかもしれません。

(例 1)
Sheet1 のセル G4 には =IF(E4>E5,1,-1) と記述されています。これの意味するところは、もし当日の終値(セル E4)が前日の終値(セル E5)より高ければセル G4 に 1 と表示し、安いか同値なら -1 を表示しろ、ということです。

具体的なセルへの記述方法(コピー)は以下です。
(1) セル G4 に =IF(E4>E5,1,-1) と入力。
(2) セル G4 をクリックして、強調表示された四角形の右隅にカーソルを移動。
(3) 十字が現れたら、右ボタンを押したまま、セル G29 までカーソルを移動。
(4) ボタンを離すとメニューが表示されるので、"セルのコピー"をクリック。
これでセル G4 の内容がセル G29 までコピーされます。

(例 2)
もし当日の終値(セル E4)が前日の終値(セル E5)より高く、前日の高値(セル C5)より高ければセル G4 に 1 と表示し、それ以外でなら -1 を表示しろ、であれば =IF(AND(E4>E5,E4>C5),1,-1) と記述します。

VBA なら、if a>b AND a>c then 〜(CB では、if (a>b && a>c) 〜)となるところ、セルでは、AND(a>b,a>c)となります。セル内に長いコードを記述していくと見通しが悪くなってきます。また if 文は最大 7 つまでのネストという制限もあります。セルでは似たようなコードが大量に入ってくるので、間違うことも増え、バックテスト中は修正する回数も多いのでセルへの複雑な条件式の代入はあまりお勧めできません。セルでのコードが増えてきたら、マクロとして標準モジュールに記述(エクセルの知識がより必要になる)することを考えた方が良いです(システムトレードとしては、判定文が多い場合、カーブフィッティングの疑いが出てきます)。

(例 3)
もし当日の終値(セル E4)が前日の終値(セル E5)より高いか、あるいは前日の高値(セル C5)より高ければセル G4 に 1 と表示し、それ以外でなら -1 を表示しろ、であれば =IF(OR(E4>E5,E4>C5),1,-1) と記述します。

(例 4)
もし当日の終値(セル E4)が前日の終値(セル E5)より高く、なおかつ前々日の終値(セル E5)より高いか、あるいは前日の高値(セル C5)より高ければセル G4 に 1 と表示し、それ以外なら -1 を表示しろ、であれば =IF(AND(E4>E5,OR(E4>E6,E4>C5)),1,-1) と記述します。

使用例:
(例 1)の条件式を標準モジュールで処理(マクロの記述)する場合。

(1) [ツール | マクロ | Visial Basic Editor]メニューをクリック。
(2) [挿入 | 標準モジュール]メニューをクリック。
(3) 以下のように記述。

Sub Macro1()
    Dim i As Integer
    For i = 29 To 4 Step -1
        If Cells(i, 5) > Cells(i + 1, 5) Then
            Cells(i, 11) = 1
        Else
            Cells(i, 11) = -1
        End If
    Next
End Sub

流れとしては、マクロ名 Macro1 でプロシージャを作成。整数 i を変数宣言。For文で行番号 29 から 4 まで逆に処理。もし当日の終値 Cells(i, 5) が前日の終値 Cells(i + 1, 5) より高ければセル Cells(i, 11)  に 1 と代入し、安いか同値なら -1 を代入。Cellsの部分は、Rangeで記述することもできるが行列共に変数を使う場合を考えて Cells にしてある。

(4) [実行 | Sub/ユーザー フォームの実行]メニューをクリック。
(5) マクロダイアログで実行をクリック。
(6) 結果が、列Kに表示されます。表示内容は、列Gと同じ。

以上、セルでの記述と VBA での記述を見てきました。C++Builder ユーザーにとっては、VBA での記述のが馴染みやすいのではないでしょうか。

時間がある方は、(例 2〜4)についてもマクロを記述してみるといいと思います。



[ ホーム | ページトップ | ブック | リンク | サイトマップ ]
Copyright(c) 2003 Shibu All rights reserved.