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

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

カテゴリ: 第4章 ワークシート取扱い説明書

1. 検証シート内を手作業で書き換える
 検証シート上にワークシート関数を用いてボリンジャーバンド、予備列のブランク、エントリーサイン、約定値段、エントリールール列上部の解説を書き換えて下さい。検証シート上でセルが黄色くなっているセルがその箇所です。
 
書き換えると「検証シート」内の21行目のワークシート関数は次のようになります。

K21
=IF(ISERROR(AVERAGE(OFFSET(E21,-評価シート!$A$4+1,0):E21)),"",AVERAGE(OFFSET(E21,-評価シート!$A$4+1,0):E21))

L21
=IF(ISERROR(K21+評価シート!$A$6*STDEV(OFFSET(E21,-評価シート!$A$4+1,0):E21)),"",K21+評価シート!$A$6*STDEV(OFFSET(E21,-評価シート!$A$4+1,0):E21))

M21
=IF(ISERROR(K21-評価シート!$A$6*STDEV(OFFSET(E21,-評価シート!$A$4+1,0):E21)),"",K21-評価シート!$A$6*STDEV(OFFSET(E21,-評価シート!$A$4+1,0):E21))

N21~Q21
=""

R21
=IF(OR(V21=0,K21="",S21<>""),"",IF(AND(M21>E21,M20<E20),"sell",IF(AND(L21<E21,L20>E2
111
0),"buy","")))

S21
=IF(OR(AD20<>"",AC20<>""),"",IF(OR(R20="sell",R20="buy"),B21,S20))

2.評価シート内を手作業で書き換える
評価シートのセルA2~A8とセルI2~I5を手作業で書き換えます。

3.VBEを開きコードを改造する

「ENTRY_SMA_CROSS」を開き、コピーして別の場所を貼り付け、前述した手順に従いコードを改造していきます。

改造が終了したコードは、コードは、「ENTRY_B_BAND」でも見ることが可能です。

では、書き換えた箇所のコードを見てみましょう。太いフォントで書き込まれたテキストは実際のコードの中にはございませんので、ご注意ください。

Sub ENTRY_B_BAND()
※マクロ名をボリンジャーバンドであるとわかるように書き換えました。
' エントリーサイン「ボリンジャーバンド」に書き換えるマクロ
※コード内の解説も書き換えておくと便利です。
(中略)
'検証シートにボリンジャーバンドのワークシート関数を書き込む
Range("K21").Formula = "=IF(ISERROR(AVERAGE(OFFSET(E21,-評価シート!$A$4+1,0):E21)),"""",AVERAGE(OFFSET(E21,-評価シート!$A$4+1,0):E21))"
※セルK21にボリンジャーバンドを書き込んだ「検証シート」内セルK21からコピペします。ペーストする際には、ブランクを表す””を””””と書き換えることを忘れないようにしてください。

Range("K21").AutoFillDestination:=Range("K21",Range("A65536").End(xlUp).Offset(, 10))
※K21をオートフィルするマクロは書き換える必要がありません。
 
Range("L21").Formula = "=IF(ISERROR(K21+評価シート!$A$6*STDEV(OFFSET(E21,-評価シート!$A$4+1,0):E21)),"""",K21+評価シート!$A$6*STDEV(OFFSET(E21,-評価シート!$A$4+1,0):E21))"
Range("L21").AutoFillDestination:=Range("L21",Range("A65536").End(xlUp).Offset(, 11))
Range("M21").Formula = "=IF(ISERROR(K21-評価シート!$A$6*STDEV(OFFSET(E21,-評価シート!$A$4+1,0):E21)),"""",K21-評価シート!$A$6*STDEV(OFFSET(E21,-評価シート!$A$4+1,0):E21))"
Range("M21").AutoFillDestination:=Range("M21",Range("A65536").End(xlUp).Offset(, 12)) 
※セルL21、M21のワークシート関数も同様にコピーします。
 
Range("N21").Formula=""""" Range("N21").AutoFillDestination:=Range("N21",Range("A65536").End(xlUp).Offset(, 13))
※N21~Q21までは、ブランクを書き込む予備列となるので、ワークシート関数はありません。
(中略)
Range("R21").Formula="=IF(OR(K21="""",S21<>""""),"""",IF(AND(M21>E21,M20<E20),""sell"",IF(AND(L21<E21,L20>E20),""buy"","""")))"
Range("R21").AutoFillDestination:=Range("R21", Range("A65536").End(xlUp).Offset(, 17))
113
Range("S21").Formula="=IF(OR(AD20<>"""",AC20<>""""),"""",IF(OR(R20=""sell"",R20=""buy""),B21,S20))"
Range("S21").AutoFillDestination:=Range("S21",Range("A65536").End(xlUp).Offset(, 18))
※同様にエントリーサイン、約定値段の関数もコピーしますが、約定値段のセルは、「移動平均線のクロス」とまったく同じです。
'検証シート上部にボリンジャーバンド列の解説を書き込む
Range("K1").Formula = "SMA"
Range("K2").Formula = ""
Range("L1").Formula = "HIバンド"
Range("L2").Formula = ""
Range("M1").Formula = "LOWバンド"
Range("M2").Formula = ""
※ボリンジャーバンドを構成する単純移動平均線、標準偏差バンドの列に名前を書き込みます。
(中略)
'評価シート内の変数などをボリンジャーバンド用に書き換える
Sheets("評価シート").Select
Range("A2").Formula = "ボリンジャーバンド変数"
Range("A3").Formula = "SMA"
Range("A4").Formula = "30"
Range("A5").Formula = "標準偏差"
Range("A6").Formula = "2"
Range("A7").Formula = ""
Range("A8").Formula = ""
Range("I3").Formula = "ボリンジャーバンド"

※評価シート内に、ボリンジャーバンドを構成する単純移動平均線、標準偏差バンドの名前、指標を算出する変数の初期設定値などを書き込みます。
 
MsgBox ("エントリーサイン「ボリンジャーバンド」の書き込みが完了しました")

※ボリンジャーバンドの書き込みが終了したのですから、その旨をユーザーに知らせるメッセージを表示させます。
 
End Sub
 
以上で、エントリールールの改造をすることができました。
次にイグジットルールを書き換えてみましょう。
まず、ATRイグジットのプロシージャを見ながら、その意味を解説いたします。太いフォントで書き込まれているテキストは実際にはコードの中に含まれておりませんので、ご注意ください。
Sub EXIT_ATR()
' イグジットサイン「ATRイグジット」に書き換えるマクロ
※マクロを実行する際に、ウィンドウに表示されるマクロ名がsubと ()間のテキストです。マクロを改造する際には、マクロ名を書き換えるのも忘れずに行ってください。
Dim lastdata As Long
'計算中の画面更新を止めて処理速度を早くする
Application.ScreenUpdating = False
'「検証シート」内の価格データが入っている最終行の行数を変数に代入する
Sheets("検証シート").Select
lastdata = Range("A65356").End(xlUp).Row
'「検証シート」にATRイグジットのワークシート関数を書き込み、価格データの入っている最終行までコピーする
115
Range("X21").Formula = "=IF(S21="""","""",IF(R20=""sell"",S21-ROUND(J20*評価シート!$C$9, 評価シート!$C$21),IF(R20=""buy"",S21+ROUND(J20*評価シート!$C$9, 評価シート!$C$21),X20)))"
※まず、セルX21にイグジット(利食い)を表すのークシート関数を書き込みます。ワークシート関数内でブランクを表す””を、コード内で表現する際には、””をさらに””で囲むため、””””となっております。
Range("X21").AutoFillDestination:=Range("X21",Range("A65536").End(xlUp).Offset(, 23))
※セルX21に書き込まれたマクロを価格データの入っている最終行まで、オートフィルでコピーするステートメントです。オリジナルのイグジットルールを自動で書く際には、21行目のワークシート関数だけをステートメント内にコピーすれば良いのです。
(中略)
Range("Z21").Formula = "="""""
Range("Z21").AutoFillDestination:=Range("Z21",Range("A65536").End(xlUp).Offset(, 25))
※予備列には、ブランクを書き込みます。
(中略)
Range("AF21").Formula = "=IF(AND(U21=""buy"",AC21=""opLC""),(B21-S21)*評価シート!$C$15*W21-評価シート!$C$17*W21,IF(AND(U21=""buy"",AC21=""LC""),(Y21-S21)*評価シート!$C$15*W21-評価シート!$C$17*W21,IF(AND(U20=""buy"",AD20=""EXIT""),(B21-S20)*評価シート!$C$15*W20-評価シート!$C$17*W20,"""")))"
Range("AF21").AutoFillDestination:=Range("AF21",Range("A65536").End(xlUp).Offset(, 31))
※イグジットルールを書き換える際には、必ずAF列までマクロで書き込むようにします。

'検証シート上部にEXIT列の解説を書き込む
Range("X1").Formula = "ATR_EXIT"
Range("X2").Formula = ""
(中略)
Range("AC1").Formula = "LOSSCUTサイン"
Range("AC1").Formula = ""
'価格データが入っている最終行より下の行を削除する
Range(Cells(lastdata + 1, 1), Cells(65536, 1)).EntireRow.Delete
Range("ar21").AutoFillDestination:=Range("ar21",Range("a65536").End(xlUp).Offset(, 43))
'評価シート内の変数やイグジットルールの解説をATRイグジット用に書き換える
Sheets("評価シート").Select
Range("C8").Formula = "EXIT変数"
Range("C9").Formula = "2"
Range("C10").Formula = "LOSSCUT変数"
Range("C11").Formula = "2"
Range("I5").Formula = "ATRイグジット"
※評価シート内に、検証シート上に何のイグジットルールが書き込まれているのかを書き込むマクロです。
MsgBox ("イグジットルール「ATRイグジット」の書き込みが完了しました")
※計算が終了したときに、ユーザーに知らせるメッセージを指定するマクロです。この場合、「ATRイグジット」が書き込まれた訳ですから、上記のようなメッセージを表示させるようになっております。
End Sub

以上で、「EXIT_ATR」のマクロの解説は終わりです。
オリジナルのエントリールールを書き込む際には、ここで解説した箇所を書き換えることになります。
では、ここでATRイグジットのプロシージャを、トレーリングストップによるイグジットルールに書き換えるマクロに改造してみましょう。
 
1. 検証シート内を手作業で書き換える
 
検証シート上にワークシート関数を用いてトレーリングストップ、予備列のブランク、イグジットサイン、ロスカットサイン、損益、イグジットルール列上部の解説を書き換えて下さい。
検証シート上でセルが緑色になっている列がその箇所です。
 
2.評価シート内を手作業で書き換える
評価シートのセルC8~C11とセルI5を手作業で書き換えます。
 
3.VBEを開きコードを改造する
「EXIT_ATR」を開き、プロシージャをコピーして別の場所に新しいプロシージャとして貼り付け、前述した手順に従いコードを改造していきます。
改造が終了したコードは、コードは、「EXIT_T_STOP」でも見ることが可能です。
では、書き換えた箇所のコードを見てみましょう。太いフォントで書き込まれたテキストは実際のコードの中にはございませんので、ご注意ください。
 
Sub EXIT_T_STOP()
' イグジットサイン「トレーリングストップ」に書き換えるマクロ
Dim lastdata As Long

'計算中の画面更新を止めて処理速度を早くする
Application.ScreenUpdating = False
Sheets("検証シート").Select
lastdata = Range("A65356").End(xlUp).Row
'検証シートにトレーリングストップのワークシート関数を書き込む
Range("X21").Formula = "=IF(S21="""","""",IF(R20=""sell"",S21-J20*評価シート!$C$9,IF(R20=""buy"",S21+J20*評価シート!$C$9,X20)))"
Range("X21").AutoFillDestination:=Range("X21",Range("A65536").End(xlUp).Offset(, 23))
Range("Y21").Formula = ""
Range("Y21").Formula="=IF(S21="""","""",IF(AND(T21>1,U21=""sell"",Y20>B21+J20),B21+J20,IF(AND(T21>1,U21=""buy"",Y20<B21-J20),B21-J20,IF(R20=""sell"",B21+ROUND(J20*評価シート!$C$11,0),IF(R20=""buy"",S21-ROUND(J20*評価シート!$C$11,0),Y20)))))"
Range("Y21").AutoFillDestination:=Range("Y21",Range("A65536").End(xlUp).Offset(, 24))
Range("Z21").Formula="=""""" Range("Z21").AutoFillDestination:=Range("Z21",Range("A65536").End(xlUp).Offset(, 25))
Range("AC21").Formula="=IF(OR(AD20<>"""",AC20<>""""),"""",IF(AND(U20=""sell"",Y20<=B21),""opTS"",IF(AND(U20=""buy"",Y20>=B21),""opTS"",IF(AND(U21=""sell"",Y21<=C21),""TS"",IF(AND(U21=""buy"",Y21>=D21),""TS"","""")))))"
Range("AC21").AutoFillDestination:=Range("AC21",Range("A65536").End(xlUp).Offset(, 28))

※ATRイグジットにおけるEXITサインは、LOSSCUT、opLC、EXITなどを使用していましたが、トレーリングストップを表すTSという記号を用いてワークシートを構築してみました。
(中略)
Range("AE21").Formula = "=IF(AND(U21=""sell"",AC21=""opTS""),(S21-B21)*評価シート!$C$15*W21-評価シート!$C$17*W21,IF(AND(U21=""sell"",AC21=""TS""),(S21-Y21)*評価シート!$C$15*W21-評価シート!$C$17*W21,IF(AND(U20=""sell"",AD20=""EXIT""),(S20-B21)*評価シート!$C$15*W20-評価シート!$C$17*W20,"""")))"
※EXITをあらわす記号が、TSになったことに従い、損益を返す列でも、TSという記号を使用します。
Range("AE21").AutoFillDestination:=Range("AE21",Range("A65536").End(xlUp).Offset(, 30))
(中略)
'検証シート上部にEXIT列の解説を書き込む
Range("X1").Formula = "EXIT"
Range("X2").Formula = ""
Range("Y1").Formula = "T_STOP"
Range("Y2").Formula = ""
Range("Z1").Formula = "予備列"
Range("Z2").Formula = ""
Range("AA1").Formula = "予備列"
Range("AA2").Formula = ""
Range("AB1").Formula = "予備列"
Range("AB2").Formula = ""

Range("AC1").Formula = "TSサイン"
Range("AC2").Formula = ""
※イグジットルール列の上部の説明を書き換えてください。
(中略)
'評価シート内の変数などをMACD用に書き換える
Sheets("評価シート").Select
Range("C8").Formula = "EXIT変数"
Range("C9").Formula = "2"
Range("C10").Formula = "TS変数"
Range("C11").Formula = "2"
Range("I5").Formula = "トレーリングストップ"
※評価シート内に、EXITルールを説明、検証シートから絶対参照して使う値などを書き込みます。
MsgBox ("イグジットルール「トレーリングストップ」の書き込みが完了しました")
End Sub
 
以上で、エントリールールの改造をすることができました。
このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

 次にマクロによって、検証シート上にオリジナルの売買ルールを描くようにするマクロの書き方を解説します。
エントリールール「移動平均線のクロス」を描くマクロは既に解説しました。
 このマクロを改造して、あなただけのオリジナルのエントリールールを自動で描けるようになりましょう。
 まず、エントリールール「移動平均線のクロス」のコードを見ながら、中身の解説をいたします。ゴシックのフォントで書き込まれているテキストは実際にはコードの中には、含まれておりませんので、ご注意ください。

  これを読んでいただいたあとに、移動平均線のクロスのマクロをボリンジャーバンドのマクロに書き換えてみましょう。

Sub ENTRY_SMA_CROSS()
※マクロを実行する際に、ウィンドウに表示されるマクロ名がsubと ()間のテキストです。マクロを改造する際には、マクロ名を書き換えるのも忘れずに行ってください。
' エントリールール「移動平均線クロス」に書き換えるマクロ
Dim lastdata As Long
'計算中の画面更新を止めて処理速度を早くする
Application.ScreenUpdating = False
'「検証シート」内の価格データの入っている最終行の行数を変数に代入する
Sheets("検証シート").Select
lastdata = Range("A65356").End(xlUp).Row

'「検証シート」に移動平均線のワークシート関数を書き込み、価格データの入っている最終行までコピーする
Range("K21").Formula = "=IF(ISERROR(AVERAGE(OFFSET(E21,-評価シート!$A$4+1,0):E21)),"""",AVERAGE(OFFSET(E21,-評価シート!$A$4+1,0):E21))"
※まず、セルK21に短期の移動平均線のワークシート関数を書き込みます。ワークシート関数内でブランクを表す””を、コード内で表現する際には、””をさらに””で囲むため、””””となっております。
Range("K21").AutoFillDestination:=Range("K21",Range("A65536").End(xlUp).Offset(, 10))
 
※セルK21に書き込まれたマクロを価格データの入っている最終行まで、オートフィルでコピーするコードです。つまり、オリジナルのエントリールールを自動で描く際には、21行目のワークシート関数だけをコード内にコピーすれば良いのです。
 
(中略)
Range("Q21").Formula = "="""""
Range("Q21").AutoFillDestination:=Range("q21",Range("A65536").End(xlUp).Offset(, 16))
 
※Q列は、移動平均線のクロスを表現するうえでは使われない列ですので、セルQ21にブランクを書き込み、価格データの入っている最終行までコピーします。このように、他のエントリーサインを書き込む際に、もし列が余った場合は、必ずブランクを書き込み、コピーを行うマクロを書き込んでください。
 
Range("R21").Formula="=IF(OR(V21=0,J21="""",L21="""",K21="""",S21<>""""),"""",IF(AND(K21<L21,L20<K20),""sell"",IF(AND(K21>L21,L20>K20),""buy"","""")))"
Range("R21").AutoFillDestination:=Range("R21",Range("A65536").End(xlUp).Offset(, 17))

※売買サインを書き込むコードです。移動平均線と同じように、21行目のワークシート関数をコード内に書き込んでおき、価格データの入っている最終行までコピーしています。

Range("S21").Formula="=IF(OR(AD20<>"""",AC20<>""""),"""",IF(OR(R20=""sell"",R20=""buy""),B21,S20))"
Range("S21").AutoFillDestination:=Range("S21",Range("A65536").End(xlUp).Offset(, 18))

※同じように、約定値段の列のコードです。マクロを改造する際には、この約定値段列まで、しっかりコード内に書き込んでください。
 
'「検証シート」上部に移動平均線列の解説を書き込む
Range("K1").Formula = "短期SMA"
Range("K2").Formula = ""
Range("L1").Formula = "長期SMA"
Range("L2").Formula = ""
(中略)
Range("R1").Formula = "エントリーサイン"
Range("R2").Formula = ""
 
※検証シート内の上部に書き込まれているテクニカル指標が何かという説明を書き込むマクロです。ほかのエントリールールに書き換える際には、それぞれ算出される指標の名前を書き込んでください。
 
'価格データが入っている最終行より下の行を削除する
Range(Cells(lastdata + 1, 1), Cells(65536, 1)).EntireRow.Delete
Range("ar21").AutoFillDestination:=Range("ar21",Range("a65536").End(xlUp).Offset(, 43))
'評価シート内の変数、エントリールールの解説を書き換える
Sheets("評価シート").Select

Range("A2").Formula = "SMA変数"
Range("A3").Formula = "短期SMA"
Range("A4").Formula = "5"
Range("A5").Formula = "長期SMA"
Range("A6").Formula = "10"
Range("A7").Formula = ""
Range("A8").Formula = ""
Range("I3").Formula = "移動平均線クロス"
 
※評価シート内に、検証シート上に何のエントリールールが書き込まれているのかを書き込むマクロです。短期移動平均線の算出には、評価シートのセルA4を絶対参照してありますので、セルA4には「5」と書き込むマクロになっているのがわかります。
 
'計算中の画面更新の停止を解除する
Application.ScreenUpdating = False
MsgBox ("エントリールール「移動平均線のクロス」の書き込みが完了しました")
 
※計算が終了したときに、ユーザーに知らせるメッセージを指定するマクロです。この場合、「移動平均線のクロス」が書き込まれた訳ですから、上記のようなメッセージを表示させるようになっております。
End Sub
 
以上で、「移動平均線のクロス」のマクロの解説は終わりです。
オリジナルのエントリールールを書き込む際には、ここで解説した箇所を書き換えることになります。
 
コツを振り返ってまとめてみましょう。
1.マクロを使ってワークシート関数を書き込む際に,「""」を使用する場合、「""""」として書きこむ。
2.マクロで検証シートにワークシート関数を書き込む際には、21行目に書き込み、それをオートフィルでデータの入っている最終行までコピーする。
3.余った列には、ブランクを書き込み、オートフィルでデータの入っている最終行までコピーする。
4.約定値段の列のワークシート関数までマクロで書き込む。
5.書き込んだワークシート関数が何かわかるように、検証シート1行目、2行目に名前を書き込む。
では、ここで「移動平均線のクロス」のマクロを、ボリンジャーバンドによるエントリールールに書き換えるマクロに改造してみましょう。
このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

 前述した等高線グラフ化する最適化のマクロでは、複数の判断基準を張り付けることができません。
 そこで、複数の判断基準をシート上に貼り付けて比較できるようにしたい場合、次のようなマクロを使用します。マクロ名は、「Optimize」です。

 では、このマクロの書き換え方を解説いたします。
 次のコードはマクロ「Optimize」を一部抜粋したものです。
optmstart_a = 1
optmstart_b = 10
optmend_a = 9
optmend_b = 20
stepnum_a = 1
stepnum_b = 1
中略(
With shtestima

'変数の範囲を指定する
For a = optmstart_a To optmend_a Step stepnum_a
For b = optmstart_b To optmend_b Step stepnum_b
shtestima.Range("a4").Value = a
shtestima.Range("a6").Value = b

'変数を代入したときの結果を「最適化」シートに順番に貼り付ける
shtoptm.Cells(k + dRow, 1 + dCol).Value = a
shtoptm.Cells(k + dRow, 2 + dCol).Value = b
shtoptm.Cells(k + dRow, 3 + dCol).Value = shtestima.Range("e2").Value
shtoptm.Cells(k + dRow, 4 + dCol).Value = shtestima.Range("e3").Value

shtoptm.Cells(k + dRow, 5 + dCol).Value = shtestima.Range("e4").Value
shtoptm.Cells(k + dRow, 6 + dCol).Value = shtestima.Range("e5").Value
という箇所があります。
最適化をする際に重要になるのは、ほとんどここだけですので、抜粋して意味を解説いたしますが、基本的には等高線を用いた最適化のコードとあまり変わりません。
変数の変化する範囲を書き換える方法は次のようになります。
optmstart_a = 1
optmstart_b = 10
optmend_a = 9
optmend_b = 20
という箇所があります。
これは、変数aと変数bをそれぞれ「どの値からどの値まで変化させるか」を指定するステートメントです。
例えば、移動平均線の算出日数を指定する変数aを1~10 まで、変数bを11 ~20まで変化させたい場合、
optmstart_a = 1
optmstart_b = 11
optmend_a = 10
optmend_b = 20
というように書き換えます。
そして、変化させたい値が大きくなってくると、計算に時間がかかってしまいますので、そのような場合は、「1~20まで2ずつ変化させる」というふうに書き換えることが可能です。
その場合は、
stepnum_a = 1
stepnum_b = 1
の部分を次のように書き換えます'初期設定では1になっています(。
stepnum_a = 2
stepnum_b = 2

こうすることで、計算を素早く終わらせることも可能になります。
そして、変化させたいセルの場所を変えたい場合は次のように書き換えます。
shtestima.Range("a4").Value = a
shtestima.Range("a6").Value = b
という箇所の
 
.Range(“a4”)の「a4」を書き換えたいセルの名前にします。
例えば、変数aとして変化させるセルの場所をセルB1にしたいときには、
'変数のセット
.Range("b1").Value = a
.Range("a6").Value = b
というように書き換えます。
そして、このコードの後半には、検証結果をグラフ化する作業も書き込まれております。
初期設定では、シート「最適化」のC列、D列をグラフ化しているので、隣の列などを比較したい場合などは、グラフの選択範囲を直接マウスで移動するようにしてください。
 0703
↑最適化グラフの例。C列、D列の選択範囲をずらすことで、比較する計算結果を選択できます。
そしてさらに、このプロシージャでは最適化の結果、最も良いパフォーマンスが出たパラメーターを「評価シート」内の変数エリアに書き込む、という作業まで自動で行われます。

等高線を描くプロシージャと同様、パラメーターの選択は、機械的に最大値を返したパラメーターを選択しているだけであるので、過剰な最適化に陥っているリスクがあります。最終的にはトレーダー自身が用心する必要があるのでご注意ください。
このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

 次にマクロを用いて、エントリールールの定義に使われている移動平均線の算出日数を最適化してみましょう。
プロシージャ名は、「OPTIMIZE_CONTUOR」です。

マクロの作業内容と作業手順は次の通りです。
1.セルを指定したとおりに変化させ、そのつど返ってくる計算結果をシート「等高線」に張り付ける。
2.等高線に張り付けた計算結果から等高線グラフを描く

では、このマクロの書き換え方を解説いたします。
「OPTIMIZE_CONTUOR」のコードの一部をご覧ください。

optmstart_a = 1
optmstart_b = 10
optmend_a = 9

optmend_b = 20
stepnum_a = 1
stepnum_b = 1
With shtestima

'変数を変化させる範囲
For b = optmstart_b To optmend_b Step stepnum_b
For a = optmstart_a To optmend_a Step stepnum_a
 
'変数のセット
.Range("a4").Value = a
.Range("a6").Value = b
 
'等高線のシートにパフォーマンスの計算結果を貼り付ける
shtcontour.Cells(m + dRow + 1, l + dCol).Value = shtestima.Range("E10").Value
という箇所があります。
 
最適化をする際に重要になるのは、ほとんどここだけですので、抜粋して意味を解説いたします。
変数の変化する範囲を書き換える方法は次のようになります。
optmstart_a = 1
optmstart_b = 10
optmend_a = 9
optmend_b = 20
という箇所があります。
 
これは、変数aと変数bをそれぞれ「どの値からどの値まで変化させるか」を指定する箇所です。

例えば、短期移動平均線の算出日数を指定する変数aを2から10まで変化させ、長期移動平均線の算出日数を指定する変数bを11から20まで変化させたい場合、
optmstart_a = 2
optmstart_b = 11
optmend_a = 10
optmend_b = 20
 
というように書き換えます。
そして、変化させたい値が大きくなってくると、計算に時間がかかってしまいますので、そのような場合は、「1~20まで5ずつ変化させる」というふうに書き換えることが可能です。
 
その場合は、
stepnum_a = 1
stepnum_b = 1
 
の部分を次のように書き換えます'初期設定では1になっています(。
stepnum_a = 5
stepnum_b = 5
 
こうすることで、計算を素早く終わらせることも可能になります。
そして、変化させたいセルの場所を変えたい場合は次のように書き換えます。
 
'変数のセット
.Range("a4").Value = a
.Range("a6").Value = b
という箇所の
.Range(“a4”)の「a4」を書き換えたいセルの名前にします。
例えば、変数aとして変化させるセルの場所をセルB1にしたいときには、
'変数のセット
.Range("b1").Value = a
.Range("a6").Value = b
というように書き換えます。
そして、最適化の判断を行うために、グラフ化するデータを書き換える場合は、次のように書き換えます。

'等高線のシートにパフォーマンスの計算結果を貼り付ける
shtcontour.Cells(m+dRow + 1, l + dCol).Value = shtestima.Range("e2").Value
 
初期設定では、貼り付けるセルはE2、つまり、損益合計の値になっております。
例えば、ここでRRRを張り付けて評価したいと思った場合、RRRが返されているセルE22を張り付ける必要があるわけですので、
 
'等高線のシートにパフォーマンスの計算結果を貼り付ける
shtcontour.Cells(m+dRow+1, l + dCol).Value = shtestima.Range("e22").Value
と書き換えてください。
 0701_7
↑こうして、シート「等高線」に書きだされた計算結果を基にして描かれる等高線グラフは、新規のシートに描かれます。実際には、そのとき検証シート内でテストされているシステムの最適化の結果が返ります。
 
縦軸のラベルが変数aのパラメーターを表し、横軸が変数bのパラメーターを表します。
 
そしてさらに、このプロシージャでは最適化の結果、最も良いパフォーマンスが出たパラメーターを「評価シート」内の変数エリアに書き込む、という作業まで自動で行われます。
 
しかしながら、パラメーターの選択は、機械的に最大値を返したパラメーターを選択しているだけであるので、過剰な最適化に陥っているリスクがあることに注意してください。最終的にはトレーダー自身が用心する必要があります。

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

次に「検証シート」内で検証されているシステムのドローダウンのグラフを描いてみます。
マクロ名は、「Draw_Drawdown」です。

マクロの作業内容と作業手順は次の通りです。
1.グラフとして描くデータの範囲を指定する
2.グラフの種類、レイアウト、表示位置などを指定する
このドローダウングラフを描いたあとに、システムのテクニカル指標の変数を書き換えるなどして、パフォーマンスが変化した場合なども、それに合わせてグラフが変化するようになっています。
0701_6

↑評価シートに描かれるドローダウングラフの例'実際には、そのとき検証シート内でテストされているシステムの結果が返ります(。
このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

このページのトップヘ