エクセルVBAによるシステムトレードソフトの作り方

エクセルVBAを使ってトレードシステムを自動構築するツールを無料で配布しています。複数の相場データに対して複数の手法を連続的に自動で検証できます。FX、先物、個別株なんでも使えます。ファイルのダウンロードはこちらから。ファイルを使いこなすことで得られるメリットはこちらで解説してます。

ブック「EXCEL-TRADING」の中の初期状態に書き込まれているプロシージャの中では、どのような作業が行われているのか、早見表として記しておきます。ツールを自作する際など、この早見表を見てステートメントをコピー&ペーストすると作るのが楽になると思います。
 
Optimize
1.検証結果をシート「最適化」に貼り付ける。
2.計算結果をグラフ化する。
3.最適な結果を返している変数を取得する
4.最適な結果を返している変数を評価シートに書き込む。

Optimize_contour
1.検証結果をシート「等高線」に貼り付ける。
2.「GET_Optm_Number」を呼び出す
3.等高線グラフを描く
 
GET_Optm_Number
1.検証結果の中で、最も大きな値が返っているパラメーターを取得する。
2.変数a、変数bのそれぞれ最も良かったパラメーターを「評価シート」に書き込む。
各種ENTRYとEXIT
各種エントリールール、イグジットルールを書き込むマクロ (プロシージャ名はENTRY、EXITで始まります)
1.検証シートにエントリールールを書き込む。
2.価格データが入っている最終行より下の行を削除する。
3.評価シート内の初期値、ルール名などを書き換える。

SheetAdjust_test
1.検証シート内に書き込まれているワークシート関数を21行目からオートフィルにより、価格データの入っている最終行までコピーする(エントリールールの一部の列を除く)。
2.「検証シート」内の 価格データが入っている最終行より下の行を削除する。
SheetAdjust_paformance
1.評価シート内のパフォーマンス評価セルの参照位置を65356行目まで拡大する。
2.もし、マネーマネジメントルールにより、一部の評価セルのワークシート関数を書き換える。
3.価格データが入っている最終行より下の行を削除する(これにより、パフォーマンス評価セルの参照位置が、価格データの最終行までとなる)。
 
Draw_Equitycurve
1.資産曲線のデータが書き込まれている範囲を取得する。
2.グラフの種類、レイアウト、表示位置などを指定しグラフを描く。
 
Draw_MonthlyNetProfit
1.曲線のデータが書き込まれている範囲を取得する。
2.グラフの種類、レイアウト、表示位置などを指定する。
 
Draw_Drawdown
1.ドローダウンのデータが書き込まれている範囲を取得する。
2.グラフの種類、レイアウト、表示位置などを指定する。
 
Money_Mng_ATR
1.評価シート内にテキスト、初期値を書き込む。
2.検証シート内にマネーマネジメントルールのワークシート関数を書き込む。
 
Money_Mng_single
1.シート内にテキスト、初期値を書き込む。
2.シート内にマネーマネジメントルールのワークシート関数を書き込む。
 
COPY_DATA_DATABOOK
1.ブック「databook」を開く
2.インプットボックスから取り込むデータの入っているシート名を指定する
3.価格データを検証シートにコピーする
 
複数データを連続的に検証
1.ブック「databook」を開く。
2.「連続検証」というプロシージャを呼び出し、変数「datasheet」を渡す
 
連続検証
1.「複数データを連続的に検証」から渡された変数に基づき、ブック「databook」から価格データを「検証シート」へコピーする。
2.貼り付けたデータより下の行は全て削除する。
3.ブック「Excel-TRADING」内にグラフシートが存在すれば全て削除する。
4.検証したいストラテジーをサブルーチンとして呼び出す。
5.「SheetAdjust_test」、「SheetAdjust_paformance」、「Optimize_contour」、「Draw_Equitycurve」、「REPORT_PAFORMANCE」をサブルーチンとして順番に実行する。
6.検証したシートを一時ファイルにコピーする。
7.一時ファイルに名前を付けてブックを保存する。
8.名前を付けたブックを閉じる。
 
複数戦略を連続的に検証
1.ブック「databook」を開く
2.「EXCEL-TRADING」ブック上にグラフシートがあれば削除する
3.評価シート上に埋め込みグラフがあれば削除する
4.For nextで指定している値によって、ストラテジーを指定し、指定したストラテジーをサブルーチンで呼び出す。
5.「SheetAdjust_test」、「SheetAdjust_paformance」、「Optimize_contour」、「Draw_Equitycurve」、「REPORT_PAFORMANCE」をサブルーチンとして順番に実行する。
 
REPORT_PAFORMANCE
1.ブック「レポート」を開く
2.「検証シート」内のパフォーマンス評価セルをコピーする。
3.ブック「レポート」にコピーする
4.ブック「レポート」をセーブして、保存する。
 
ウォークフォワードテスト
1.「databook」を開く
2.インプットボックスからテストを行うデータの入ったシート名を入力する
3.価格データの情報を「databook」から「評価シート」に書き込む
4.データブック内に入っている価格データの行数から、ウォークフォワード用の期間算出の準備を行う。
5.テストにおける最適化のデータ範囲を選択して、検証シートにコピーする。
6.ウォークフォワードテストを行うシステムのストラテジーを書き込む。
7.「SheetAdjust_test」、「SheetAdjust_paformance」、「Optimize_contour」をサブルーチンとして順番に実行する(最適化がおこなわれる)。
8.最適化の結果をシート「ウォークフォワードテスト」に書き込む
9.テストにおけるフォワードテストのデータ範囲を選択て、検証シートにコピーする。
10.フォワードテストの結果をシート「ウォークフォワードテスト」に書き込む。

このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

 ここでは、ワークシートを組んでいく際に、あらわれやすいエラー(エラーのようなもの)をご紹介していきます。
 各自でワークシート関数を改造していく際に、「あれ?なぜここがこうなっちゃっているんだろう?」という疑問が浮かんだときなどに参照してください。
  また、不具合らしきものを発見されたら巻末で紹介しているメールアドレスまでご報告ください。

1.検証シート、評価シート内で困った

○エントリーサインが返されない
考えられる原因
原因1.マネーマネジメント指標が0になっている
もし、マネーマネジメント指標の値が0になっていると売買サインが返らないようになっています。
マネーマネジメント指標は、リスクとボラティリティと資金量を用いて売買枚数を決定するので、評価シート内のリスク、資金量を増やすことで改善します。
原因2.テクニカル指標とエントリーサインのバランスが悪い
テクニカル指標のパラメーターによっては、エントリーサインが返されない可能性があります。
例えば、ボリンジャーバンドで10日移動平均線を引き、HIバンド、LOWバンドのパラメーターの設定で、標準偏差の値が大きすぎる場合、終値がバンドの外に出る可能性が極めて低くなってしまいます。

↑同じ価格データの中で2×標準偏差(左)と5× 標準偏差(右)のバンドを引いたもの。
 
○異常にパフォーマンスが悪い。
ごく一般的な売買ルールをテストしているにも関わらず、極端にパフォーマンスが悪いことがあります。この原因には「リスクの取り過ぎ」の可能性があります。
 
これら2つの資産曲線は、リスク率以外は同じ売買ルールに基づいたものです。画像左は、リスクを10%に設定し、右はリスクを1%に設定しました。
 
このようにリスクを大きくすると、検証期間の初期において、資金の大半を失ってしまうため、途中から建玉ができなくなってしまいます。

2.グラフで困った
 
○グラフの日付が数値になってしまっている。
→グラフを描き、そのまま保存して、もう一度開くと、グラフの日付がなくなっていることがあります。このような場合は、グラフ描画のマクロを再度実行してください。
 
○資産曲線が途中から動いていない

考えられる原因
1.資金が減ってリスクが取れなくなり、ポジションが取れていない。
マネーマネジメントルールをATRにしている場合、資金量が減ると建玉ができなくなりますので、そのような場合は、途中から資産曲線が動かなくなります。
2.エントリーサインが価格データの最終行まで書き込まれていない。
新しい価格データを流し込んだあと、再度エントリールールを描くプロシージャを実行していない場合、価格データの途中までしか、エントリーサインが返されないことがあります。

3.最適化で困った
 
○グラフが描画できない
考えられる原因
プロシージャ「optimaze_contour」や「optimize」内の設定ミス
もし、変化させるパラメーターのセルが間違っていたり、変化させる値によってエントリーサインが出なくなるような場合(前述のボリンジャーバンドの例など)、評価シート内もエラーになり、等高線もエラーだらけになってしまい、グラフの描画ができません。
 
このような場合、プロシージャ「optimaze_contour」や「optimize」と評価シート内の変数エリアを確認し、正常な結果が出るように設定しなおしてください。
↑シート「等高線」内にエラーが返されている例。
↑エントリーサインが出ないなどして、評価シートがエラーになっている画面。

その他、ワークシート上で作業していく上で「エラーかな?」と思ったら次の点をチェックしてみてください。
 
検証シート
1. エントリーサインは正常に返されていますか?
2. エントリーサインに応じて、ポジションの種類、約定値段は正しく返されていますか?
3. イグジットのルールは正常に返されていますか?
4. イグジットのルールに基づいた損益の計算は正しく行われていますか?

評価シート
1.価格データとティックの指示(セルC21)は合っていますか?
2.ポイントバリュー(セルC7)は正しく書き込まれていますか?
3.リスクと初期投資金額は正しく書き込まれていますか(セルC3、C5)?
4.リスクを取り過ぎていませんか(セルC5)?
このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

 ここでは、ブック「EXCEL-TRADING」の中に保存されているプロシージャの中でも、特に説明が足りていない箇所を取り上げ、個別に解説いたします。
 
Money_Mng_single と Money_Mng_ATR

 この2つのプロシージャはマネーマネジメントルールを変更するためのプロシージャです。
 Money_Mng_single は、システム検証時に「1回のトレードあたり1枚ずつトレードする」というルールで検証されるものです。Money_Mng_ATR は、市場のボラティリティと資金量、リスクを考慮して売買枚数を決定するものです。おそらく、最も実用的なマネーマネジメントルールではないでしょうか。
 それぞれどちらのルールを採用するかで売買枚数が変化するわけなので、パフォーマンス評価の方法が若干変更されます。
 そのため、「評価シート」内のワークシート関数が書き換えられることになるので、ご注意ください。

所要時間を測る
 
 このプロシージャは、別のプロシージャをサブルーチンとして呼び出し、その実行に要した時間を返すプロシージャです。例えば、下記の例では「ENTRY_SMA_CROSS」というエントリールールを書き換える際に要した時間を返すプロシージャになっています。
 この箇所に別のプロシージャ名を書き込んで、プロシージャ「所要時間を測る」を実行していただければ、呼び出されたサブルーチンの処理に要した時間が返されます。また、呼び出されるサブルーチンの中で、「○○が完了しました」といったようなメッセージボックスが開かれる場合、「OK」をクリックするまでの時間がカウントされてしまいますのでご注意ください。
 
Sub 所要時間を測る()
STIME = Time
ENTRY_SMA_CROSS
ETIME = Time
RTIME = (ETIME - STIME) * 24 * 60 * 60
RTIME = Application.WorksheetFunction.Round(RTIME, 1)
MsgBox "マクロの実行に要した時間は" & RTIME & "秒です。"
End Sub
 0706
↑終了後の画面。メッセージボックス内に処理にかかった時間が返されています。
 
ウォークフォワードテスト

 ウォークフォワードテストとは、過剰な最適化を避けるためのテストの手法のことです。
 ここでは、ウォークフォワードテストを次のように定義してプロシージャを作成いたしました。
 まず、価格データが1から100まであると仮定します。
 1回目は、データの1~25までを使用して、パラメーターの最適化を行い、その後、そのパラメーターを使用して、データ26~35でテストを行い、最適化の結果とデータ26~35での結果を比較します。
 2回目は、データ11~35までを使用して、パラメーターの最適化を行い、その後、そのパラメーターを使用して、データ36~45でテストを行い、最適化の結果とデータ36~45での結果を比較します。
 このように、徐々にデータをずらしていき最終的にはデータ100までテストを行います。
 その結果が記録されるのが、シート「ウォークフォワードテスト」です。

 最適化されたパラメーターで別の期間を用いてテストを行ってみると、必ずしも良い結果がでるとは限らないことがわかります。

以上の結果を踏まえて、算出されるのが、ウォークフォワード効率というものです。

これは、

ウォークフォワード効率
=全ての期間のフォワードテストの結果の平均÷全ての期間の最適化の結果の平均

という式で求めております。

この値により、そのシステムのルールやパラメーターの有効性を測ることが可能になります。
目安としては、0.5以上は欲しいところです。

↑「ウォークフォワードテスト」プロシージャ実行時の画面。

実際に、このプロシージャを使用する手順は、

プロシージャ内の
'ウォークフォワードテストを行うシステムのストラテジーを書き込む。
Call EXIT_ATR
Call ENTRY_SMA_CROSS
Call SheetAdjust_test
Call SheetAdjust_paformance
Call Optimize_contour
の箇所に、テストしたいストラテジーをサブルーチンとして書きこみ、最適化プロシージャのOPTIMIZE_CONTOUR内のステートメントをストラテジーに合わせておきます(※1)。
 
次にプロシージャ「ウォークフォワードテスト」を実行し、インプットボックスにブック「databook」から読みこみたいデータのシート名を書き込んでください。
 
※1・・・最適化したいパラメーターを指定するということです。つまり、2本の移動平均線のパラメーターの最適化ならば、そのパラメーターを変更するようにステートメントを改造します。

このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

このページのトップヘ