4 「パラメータの最適化」

 

前回までの作業で色々な売買ルールの検証が出来る状態になりました。今回はそれらを用いて「どのパラメータがその売買ルールにおいて最も有効であったのか」を調べていくことにします。ただし、単純にパラメータの最適化のみによって作られた売買ルールは単なるこじつけになっている場合もあります。その結果、現実にはまったく役に立たないルールができてしまうことも多いのでパラメータの最適化を行う前に充分そのルールの意味を吟味する必要があります。

 

パラメータの最適化

(1) この「パラメータの最適化」とは、変数(各指標の計算期間など)を変えることで、総損益、総損益/最大ドローダウンなどを基に、そのなかで最も良い変数を選出することです。今回は売買ルールに移動平均線を用い“総損益”の最適化を行います。

さて、その計算を自動的にさせる道具が“テーブル”と呼ばれているものです。(テーブルの詳しい解説はExcelの解説書などを参考にして下さい。)

では、作業の説明に入ります。まず新しく“最適化シート”を作ります。セルR3C2、セルR3C3にそれぞれ“変数1”、“変数2”を入力します。(現段階では“変数1”を13、“変数2”を26としておきます。)

 

ここでは“移動平均線”で最適化を行うために、以下のような作業をして頂きます。

まず変数1にあたる“移動平均線(a)”の変数(現在は13と入力されています)が“最適化シート”の変数1を表示するようにします(移動平均線(b)も同様に変数2を表示させます)。具体的には“シート・移動平均線”のセルR2C7 が“最適化シート”のセルR3C2を参照するようにします。式は“=最適化シート!R[1]C[-5]”となります。

 

このように別のシートやブックのセル・範囲を指定することも可能です。ただし、この場合“青い枠”が出てこない為、確認は手作業で行って下さい。実際に“最適化シート”の変数1を変えると“移動平均線(a)”の値が変わるはずです。

 

 

(2) 次にセルR3C8に“値洗い損益の(最終的な)累計”を表示させます。そのためにまず、シート“移動平均線”に値洗い損益の累計が計算されるセルを作ります。シート“移動平均線”のセルR2C55に“=SUM(R[29]C:R[2677]C)”と入力します。これが「値洗い損益の累計」を表しています。(“R[2677]C”はデータの最後のセルになります。このセルはデータ数によって異なります。)

 

先程と同様にして“最適化シート”のセルR3C8が、シート“移動平均線”の値洗い損益の累計を参照するようにします。式は“='移動平均線 '!R[-1]C[49]”となります。

 

(3)次はテーブルを使って最適化を行います。先程入力したセルの右と下方向に計算させたい変数を掛け算の九九のように入力していきます。テーブルを使いこの全ての組み合わせについて“値洗い損益の累計”が計算されますので、その値の中から最も有効であると思われる(各個人の判断になります)ものを選ぶことで最適化とします。ここで注意して頂きたいのですが、変数の値によってテーブルの計算ができなくなることがありますので、予め計算範囲を確認しておいて下さい。(ここでは移動平均線の計算時に“#REF!”が出てしまうことです。範囲を“変数の最大値”に合わせて、計算できなくなってしまうセルは消しておきます。)

今回は変数1・2ともに“240”を範囲とします。

ここでExcelの便利な機能を1つ紹介します。例えば1〜50までの数字を入力するとき、1つずつ入力していくと大変ですが、黒十字を利用して“数値をコピー”すると簡単にできます。手順は“1,2,・・・”と2つ以上のセルに入力し、そのセル(2つ以上)を選択(黒く反転)します。そして黒十字を利用して任意のセル、数値までコピーするだけです。“2,4,・・・”とすれば偶数のみ表示されます。

ここで黒十字の説明をしておきます。セルを選択したとき右下に黒い点が現れます。その点にマウスポインタを合わせると白矢印から黒十字に変わります。この状態でドラッグ(クリックしたままマウスを動かすこと)するとコピーができます。

 

では“値洗い損益の累計”のセルから変数全てを含むように範囲を選択して下さい。その後、“メニューのデータ” “テーブル”を選択すると次のようなものが現れます。

 

ここで横に入力した変数が“変数1”、縦に入力した変数が“変数2”になりますので、「行の代入セル」にはR3C2(変数1)を、「列の代入セル」にはR3C3(変数2)を指定します。“OKボタン”を押すと計算が開始されます。

*テ−ブル実行中の注意・・・計算終了まで何も行わないこと(クリックや他のアプリケーションを開くなどの行為)。もし行ってしまったなら、はじめから“再計算”されてしまいます。計算終了後も作業を行う毎に“再計算”が続く為、速やかにテーブルの範囲(計算結果が表示されている部分のみ)をコピーし、“値で張り付け”(補足説明参照)て対処します。

(4)得られた値から有効であると思われる変数の組み合わせを探します。このとき“ステータスバー(画面右下)”を利用すると簡単に調べることができます。

ステータスバーの中に“選択した範囲の数値について平均、合計、最大・最小値、などを表示する”部分がありますので、その機能を利用します。

数値が表示されている部分にマウスポインタを合わせて右クリックすると、平均、データの個数、数値の個数・・・と表示されているウィンドウが現れますので、利用したい項目を選んで使って下さい。

 

ここで見つけた組み合わせを実際に“評価項目シート”の移動平均線の期間に入力して、“評価項目一覧表”で確認して下さい。

これで最適化は終了です。

 

応用編

(1)「他の指標(売買ルール)で最適化する」

今回は、以前作って頂いた指標の中の “チャネルバンド”を例に挙げます。

移動平均線のときと同様に、「変数1・2、値洗い損益の累計」を書き換えます。まず変数1にあたる“チャネルバンド(High)”の変数(現在は13と入力されています)が“最適化シート”の変数1を表示するようにします(チャネルバンド(Low)も同様に変数2を表示させます)。その後に上述した最適化の作業をすると“チャネルバンド”についての最適化が完了です。

次に“評価項目一覧表”で確認します。「“チャネルバンドの計算式”を移動平均線の計算式の列に張り付け、同様にシグナルも貼り付ける」と、“チャネルバンドの評価項目一覧表”が完成します。(このときは値でなく、“普通の貼り付け”を使います。)

 

(2)複数のマーケット(データ)の同時最適化

これについては少し面倒なので詳しく説明します。

この作業は「複数のマーケットで最も有効であった“パラメータ”を探すとき」に利用します。

実際の作業の説明に入ります。まず新しいファイルを作成し、調べたいマーケットのシートを作り、データを貼り付けておきます。

 

それぞれのシートに“移動平均線”の指標計算式(7,8列)とシグナル(30列)、建値〜値洗い損益累計(50〜56列)を貼り付けます(列に気を付けて下さい)。46〜49列には使用するデータ(3〜6列)を貼り付けておきます。前回は「先物」の検証でしたので、手数料の計算をするときは“単純つなぎ”データを使いました。今回は「現物」の検証ですので使用するデータを張り付けておいて下さい。

次に“最適化シート”を作ります。このシートで各マーケットでの“値洗い損益の累計”を平均した値を最適化します。

このとき注意する点を述べます。各マーケットで売買代金(丸代金)が異なる場合、値洗い損益の累計を単純に比較することができません。そこで今回は、「値洗い損益の累計」を「平均株価(終値の平均値)」で割った値を用います。

また、検証期間が異なる場合も、単純に比較することができません。(補足説明参照)この問題を解決する為に、「値洗い損益の累計」を「検証期間(データ数)」で割った値を比較するようにします。

この2つの問題を考慮して調整した値を“比較データ”としておきます。

 

*“比較データ”=“値洗い損益の累計”/“平均株価”/“検証期間”

 

複数のマーケットについての“比較データ”の平均値を最適化すると、「複数のマーケットにおいて最も有効であったパラメータ」を求めることができます。

具体的な説明をしておきます。今回、5種類のデータ(マーケット)を使用しますので、それぞれのシート(5枚)を作成します。そして最適化シートに“銘柄”、“値洗い損益の累計”、“平均株価”、“データ数”、“比較データ”を表示する表を(各データの入ったシートを参照して)作成しておきます。

例えばNTTでは以下のようになります。

銘柄・・・R6C1、“NTT

値洗い損益の累計・・・R6C2、“=NTT!R[-4]C[53]

平均株価・・・R6C3、“=NTT!R[-4]C[46]

データ数・・・R6C4、“=COUNT(NTT!R[-2]C[-3]:R[2557]C[-3])

比較データ・・・R6C5、“=RC[-3]/RC[-2]/RC[-1]

(シート名“NTT!”のところが、実際はそれぞれのシート名が入ります。)

 

その表に各マーケットの“値洗い損益の累計”、“平均株価”、“データ数”を表示させます。(データ数は“COUNT関数”を利用します。(今回は1列の日付の数を数えています。)) そして“比較データの平均値”をR3C8に“AVERAGE関数”で計算し、テーブルを作って下さい。

 

*補足説明

 

「変数の設定」

これについては個人の好みがありますが、最適化したい範囲が広い場合“1,2,3,・・・”とするより“2,4,6,・・・”としたほうが、同じ計算時間で広い範囲の最適化ができます。大まかなテーブル計算である程度の見当を付け、細かいところを再びテーブル計算したり、手作業で計算したりすれば時間の短縮になると思います。

 

「値で貼り付ける」

「計算式(=if...や=R3C7R3C8)でなく数値(計算された結果の1、−10などのことです)として張り付ける」ということです。どのようにするかと言いますと、貼り付けるときに“貼り付け”でなく“形式を選択して貼り付け”をクリックします。そして貼り付け項目の“値”をチェックしてOKボタンをクリックすると完了です。

 

「検証期間が異なる場合、なぜ単純に比較してはいけないか」

この問題は、検証期間が長い(データ数が多い)ほうの結果が全体の結果に与える影響が大きいために起こります。今回は、最適化を行うときに“複数のマーケットにおける総損益の平均値”の変化を調べているため、どうしてもデータ数の多いマーケットの結果の影響を大きく受けます。

 

今回の最適化で良いパラメータを発見されたかも知れませんが、最適化と言う行為はあくまでも“過去の結果”について行っていることを忘れてはいけません。今後もこのパラメータが最適であるとは限りませんので、全てを信用してしまうことのないようにして頂きたいと思います。

 

一概には言えませんが、良いルールを見分けるには、パラメータによる結果の変動が少なく安定していることが一つのポイントと考えています。同様に、良いパラメータを選出するには、飛び抜けて良い結果をもたらしたパラメータを選ぶのではなく、その周辺のパラメータも安定しているものを選出するのが良いのではないかと考えています。

 

さて次回は、リスクマネジメントに必要となる「ロスカット」の解説をする予定です。

 

 

(続く)