資金管理の集大成プログラム~最終回
本日は、1枚のEAの中で5つのマジックナンバーを設定してポートフォリオを組む場合に、VST化搭載の複利プログラムをどのように記述すればよいか考えたいと思います。
やり方は人によっていろいろあると思いますので、あくまでもサンプルとしてご理解ください。
まずは、マジックナンバーと外部パラメーターを設定します。
私の場合、ポートフォリオを組むときは、各個のシステムの計算期間などは、外部パラメーターとせずに、スタート関数内にその数値を直接記述します。バックテストはそれぞれのシステムごとに行うべきだし、ポートフォリオで各個のシステムの計算期間まで外部パラメーターにしてしまうと、あまりにも見苦しいからです。なので、上の例では、VST化のための損切り率や利食い率などは記述されていません。
次に、スタート関数へ入る前に、いくつかオリジナル関数(グローバル関数)を宣言しておきます。
まずは、double型の最適枚数算出関数で、パラメーターは、
int ab = AccountBalance()
double slw = 損切り幅
の2つです。
次は、各システムごとの損切り損失額の合計算出関数で、パラメーターは、
int magic = マジックナンバー
のみです。
ロングなら、損失額=(約定価格-損切り価格)×ロット数×100000
ショートなら、損失額=(損切り価格-約定価格)×ロット数×100000
でしたよね。
次は、いよいよ補正枚数算出関数です。パラメーターは、
int ab = AccountBalance()
int ac = AccountCredit()
int elsumsum = すべてのシステムの損切り損失額の合計
int am = AccountMargin()
double slw = 損切り幅
double price = 約定価格
int al = AccountLeverage()
の7つです。
念のため、方程式の解をおさらいすると、
でしたよね。これを1ロット=10万通貨で千通貨単位の業者用に関数化すると、
となります。
あとは、発注関数(通信エラー対策などは省略します)で、パラメーターは、
int magic = マジックナンバー
double lots = ロット数
double slw = 損切り幅
double tpw = 利食い幅
の4つにしておきます。
これで、オリジナル関数がすべて出来上がりました。いよいよスタート関数へ入ります。
まずは、必要な口座情報を入手します。
次に、先ほど宣言したオリジナル関数の一つである、マジックナンバーごとの損切り損失額の合計の算出関数(ELSUM()関数)を呼び出して、各システムの損切り損失額をすべて合計し、これをELSUMSUMという変数に渡します。
ここで、VST化のための標準偏差を呼び出しますが、計算期間については、前述のように、直接数値を書き込みます。
あとは、本日最初に宣言したオリジナル関数を適宜呼び出して、前回までと同様に、
1.VSTによる最適損切り幅の算出
2.BestLots1()関数による最適枚数の算出
3.BestLots2()関数による補正枚数の算出
4.MathMin()関数による選択
5.「0」ロット発注の防止
という流れになります。
なお、蛇足ですが、上の記述で、たとえば、double Lots12 というのは、「システム1のBestLots2」という意味です。なので、
システム2であれば、double Lots22
システム3であれば、double Lots32
という具合に記述すれば、混乱を避けられるので、私はいつもこのように変数を宣言しています。
さて、完成したプログラムでバックテストをしてみましょう。
その前に、自作のシステムの中から適当に5つほどセレクトして、まず単利のポートフォリオを組んでみました。
これを、VST化搭載の複利プログラムで運用したものが次です。
ちょっと見づらいですが、画面をクリックして、下の緑の棒グラフ(ロット数)の変化に注目してください。
普通の複利プログラムの場合、緑の棒グラフがきれいに増えていきますが、VST化を搭載した場合、そのときどきの標準偏差に応じて損切り幅とロット数が反比例するために、トレード毎にロット数が激しく変動しているのがわかります。このようにして、コンピューターが自動的にリスクヘッジしてくれるわけです。
ちなみに、このVST化搭載型の複利ポートフォリオのパフォーマンスは、
でした。
そこで、もう少し、最大ドローダウン率を下げるために、外部パラメーターとして設定した、
という部分を最適化し、最大ドローダウン率を15%以内に抑えましょう。その結果が次です。
これならなんとか運用できそうです。
応援よろしくお願いします。
↓
にほんブログ村
やり方は人によっていろいろあると思いますので、あくまでもサンプルとしてご理解ください。
まずは、マジックナンバーと外部パラメーターを設定します。
私の場合、ポートフォリオを組むときは、各個のシステムの計算期間などは、外部パラメーターとせずに、スタート関数内にその数値を直接記述します。バックテストはそれぞれのシステムごとに行うべきだし、ポートフォリオで各個のシステムの計算期間まで外部パラメーターにしてしまうと、あまりにも見苦しいからです。なので、上の例では、VST化のための損切り率や利食い率などは記述されていません。
次に、スタート関数へ入る前に、いくつかオリジナル関数(グローバル関数)を宣言しておきます。
まずは、double型の最適枚数算出関数で、パラメーターは、
int ab = AccountBalance()
double slw = 損切り幅
の2つです。
次は、各システムごとの損切り損失額の合計算出関数で、パラメーターは、
int magic = マジックナンバー
のみです。
ロングなら、損失額=(約定価格-損切り価格)×ロット数×100000
ショートなら、損失額=(損切り価格-約定価格)×ロット数×100000
でしたよね。
次は、いよいよ補正枚数算出関数です。パラメーターは、
int ab = AccountBalance()
int ac = AccountCredit()
int elsumsum = すべてのシステムの損切り損失額の合計
int am = AccountMargin()
double slw = 損切り幅
double price = 約定価格
int al = AccountLeverage()
の7つです。
念のため、方程式の解をおさらいすると、
補正枚数=(口座残高+口座クレジット-既存のポジションの損切り損失額の合計-1.5×既存の必要証拠金額の合計)÷(新規のポジションの損切り幅+1.5×新規のポジションの約定価格÷レバ)÷10000
でしたよね。これを1ロット=10万通貨で千通貨単位の業者用に関数化すると、
となります。
あとは、発注関数(通信エラー対策などは省略します)で、パラメーターは、
int magic = マジックナンバー
double lots = ロット数
double slw = 損切り幅
double tpw = 利食い幅
の4つにしておきます。
これで、オリジナル関数がすべて出来上がりました。いよいよスタート関数へ入ります。
まずは、必要な口座情報を入手します。
次に、先ほど宣言したオリジナル関数の一つである、マジックナンバーごとの損切り損失額の合計の算出関数(ELSUM()関数)を呼び出して、各システムの損切り損失額をすべて合計し、これをELSUMSUMという変数に渡します。
ここで、VST化のための標準偏差を呼び出しますが、計算期間については、前述のように、直接数値を書き込みます。
あとは、本日最初に宣言したオリジナル関数を適宜呼び出して、前回までと同様に、
1.VSTによる最適損切り幅の算出
2.BestLots1()関数による最適枚数の算出
3.BestLots2()関数による補正枚数の算出
4.MathMin()関数による選択
5.「0」ロット発注の防止
という流れになります。
なお、蛇足ですが、上の記述で、たとえば、double Lots12 というのは、「システム1のBestLots2」という意味です。なので、
システム2であれば、double Lots22
システム3であれば、double Lots32
という具合に記述すれば、混乱を避けられるので、私はいつもこのように変数を宣言しています。
さて、完成したプログラムでバックテストをしてみましょう。
その前に、自作のシステムの中から適当に5つほどセレクトして、まず単利のポートフォリオを組んでみました。
資産増加倍率 3.04倍(直近2年)
これを、VST化搭載の複利プログラムで運用したものが次です。
ちょっと見づらいですが、画面をクリックして、下の緑の棒グラフ(ロット数)の変化に注目してください。
普通の複利プログラムの場合、緑の棒グラフがきれいに増えていきますが、VST化を搭載した場合、そのときどきの標準偏差に応じて損切り幅とロット数が反比例するために、トレード毎にロット数が激しく変動しているのがわかります。このようにして、コンピューターが自動的にリスクヘッジしてくれるわけです。
ちなみに、このVST化搭載型の複利ポートフォリオのパフォーマンスは、
1トレードにおける最大許容損失率 2.0%
資産増加倍率 28.74倍(直近2年)
最大ドローダウン率 16.76%
でした。
そこで、もう少し、最大ドローダウン率を下げるために、外部パラメーターとして設定した、
という部分を最適化し、最大ドローダウン率を15%以内に抑えましょう。その結果が次です。
1トレードにおける最大許容損失率 1.7%
資産増加倍率 17.77倍(直近2年)
最大ドローダウン率 14.31%
これならなんとか運用できそうです。
応援よろしくお願いします。
↓
にほんブログ村
by xchsshzo
| 2011-07-19 14:36
| メタトレーダー