第7回 「パターン認識」

 

 前回までのシグナルは1つの条件を基に発生させていました。今回はいくつかの条件を組み合わせる検証の方法を見ていきましょう。

組み合わせる条件は数日間の値動きのパターン、移動平均やRSIのようなテクニカル指標のシグナルなど何でも構いません。それぞれのパターンになっているときどのようなパフォーマンスをもたらすのか、データベースのようなものを作っていく作業となります。今回は前日までのパターンを見て、「当日寄付に建てて当日引けで手仕舞う」というルールで作っていきます。

まず前回作ったBookを違う名前で保存して下さい。今回も不要な部分は消しながら作っていきます。

 

1) 今回は過去4日間の上げ、下げ(終値ベース)のパターンについて検証していきます。“評価項目計算シート”の710列目に入っていたものは必要ありませんのでクリアして下さい。まず、R1C7に“上下(c−c)”と入力して下さい。R21C7に、“=IF(RC[-1]>R[-1]C[-1],1,IF(RC[-1]<R[-1]C[-1],0,R[-1]C))”と入力して、データの最後の行までコピーして下さい。これはどういうことをしているかというと、「もし当日の終値が前日の終値より高かったら“1”を表示し、もし当日の終値が前日の終値より安かったら“0”を表示する。どちらでもなかったら前日の値を表示する。」ということを表しています。

 

2) R1C8に“パターン”と入力して下さい。R28C8に、“=R[-3]C[-1]*1000+R[-2]C[-1]*100+R[-1]C[-1]*10+RC[-1]”と入力して、データの最後の行までコピーして下さい。これは、「3日前の7列目の値を1000倍したもの、2日前の7列目の値を100倍したもの、1日前の7列目の値を10倍したもの、当日の7列目の値を合計する。」ということを表しています。この列で、視覚的にそれぞれの日のパターンを見やすくします。

 

3) R1C9に“パターン番号”と入力して下さい。R28C9に、“=BIN2DEC(RC[-1])+1”と入力して、データの最後の行までコピーして下さい。これは、「当日の8列目の値を2進法と見なして10進法に変換し、1を加算する」ということを表しています。このような変換をし、パターンの番号を振り分けることによってパターンごとの整理を行いやすくしておきます。

1を加算するのはパターン番号が0というのも使いにくいので、1を加算しているだけです。

 

4) 30列に入力している式は必要ありませんのでクリアして下さい。まず、R2C30に“1”と入力して下さい。ここには検証するパターン番号を入力していくことになります。R29C30に、“=IF(R[-1]C[-21]=R2C30,1,0)”と入力して、データの最後の行までコピーして下さい。これは、「前日のパターン番号が検証するパターン番号と一致していれば“1”を表示し、そうでなければ“0”を表示する」ということを表しています。今回は初めに売り買いが決まっているわけではないのでとりあえずそれぞれのパターンで買った場合について計算します。

 

5) 3133列に入力していた式は必要ありませんのでクリアして下さい。R1C31に“ポジションの期間”と入力して下さい。R29C31に、“=IF(RC[-1]<>0,1,0)”と入力して、データの最後の行までコピーして下さい。これは、「当日のシグナルが“0”でなかったら“1”と表示し、そうでなかったら“0”と表示する。」ということを表しています。今回はこの列の値は “1”か“0”となります。

 

6) 次に50列のトータルの“建値”の式を変更します。R29C50に“=IF(RC[-20]<>0,RC[-47],0)”と入力して、データの最後の行までコピーして下さい。これは、「当日のシグナルが“0”でなかったら始値の値を表示し、そうでなかったら“0”と表示する。」ということを表しています。

 

7) 次に51列のトータルの“落値”の式を変更します。R29C51に“=IF(RC[-21]<>0,RC[-45],0)”と入力して、データの最後の行までコピーして下さい。これは、「当日のシグナルが“0”でなかったら終値の値を表示し、そうでなかったら“0”と表示する。」ということを表しています。

 

8) 次に52列のトータルの“確定損益”の式を変更します。R29C52に“=IF(RC[-22]=1,RC[-1]-RC[-2],IF(RC[-22]=-1,RC[-2]-RC[-1],0))”と入力して、データの最後の行までコピーして下さい。これは、「もし当日のシグナルが“1”ならば当日の落値−建値を表示し、もし当日のシグナルが“−1”ならば当日の建値−落値を表示し、どちらでもなかったら“0”を表示する」ということを表しています。

(−1のときの場合も作っておくのは、データベースが出来上がった後で、売りシグナルの検証をするためです。)

 

9) 今回はR3C53の手数料はとりあえず“0”と入力しておいて下さい。今回はそれぞれのパターンで初めに売るか買うかが決まっているわけではなく、データベースを作って、後からルールを決めるという順序になっています。したがって、最初はすべてのパターンについて買った場合どうなっていたかを検証するので、手数料はルールが設定できた後で計算に入れます。

 

10) 次に63列のトータルの“損失取引”の式を変更します。R29C63に“=IF(AND(RC[-33]<>0,RC[-11]-RC[-10]<=0),RC[-11]-RC[-10],"")”と入力して、データの最後の行までコピーして下さい。これは、「もし当日のシグナルが“0”でなく、確定損益−手数料が“0”以下のときは、確定損益−手数料の値を表示し、そうでないときは何も表示しない。」ということを表しています。

 

11) 次に66列の買いの“シグナル”の式を変更します。R29C66に“=IF(RC[-36]=1,1,"")”と入力して、データの最後の行までコピーして下さい。これは、「もし当日のシグナルが“1”なら、“1”と表示し、そうでなければ何も表示しない。」ということを表しています。

 

12) 次に80列の売りの“シグナル”の式を変更します。R29C80に“=IF(RC[-50]=-1,-1,"")”と入力して、データの最後の行までコピーして下さい。これは、「もし当日のシグナルが“−1”なら、“−1”と表示し、そうでなければ何も表示しない。」ということを表しています。

 

ここまでで一通り完成です。後はR2C30にパターン番号をいろいろと入力して使えそうなパターンを探すこととなります。パターンごとの損益はパターン番号をパラメータと見なして最適化のところで使ったテーブルを使うと比較的楽になります。ただし、総損益、損益平均と個別に1項目づつにしかできません。

パターンの損益はすべて買った場合の計算をしていますから、損益がプラスになるものは「買いのパターン」、損益がマイナスになるのは「売りのパターン」になります。良さそうなパターンが見つかったら、手数料を入れて計算し直しきちんとした値を算出します。

(売りの場合は30列の式を“=IF(R[-1]C[-21]=R2C30,-1,0)”に変更する必要があります。)

 

補足説明

 今回行ったパターン番号計算では、それぞれの条件が2種類の場合にしか対応できません。例えば、(1)当日の終値が前日高値より高いとき、(2)当日の終値が前日の高値より安く前日の安値より高いとき、(3) 当日の終値が前日安値より安いとき、というように条件が3種類の場合には使えません。このような場合について補足します。別の名前でBookを保存して下さい。

 

1) 今回は過去3日間の上記の終値の位置のパターンについて検証していきます。“評価項目計算シート”の79列目に入っていたものは必要ありませんのでクリアして下さい。まず、R1C7に“位置”と入力して下さい。R21C7に、“=IF(RC[-1]>R[-1]C[-3],2,IF(RC[-1]<R[-1]C[-2],0,1))”と入力して、データの最後の行までコピーして下さい。これはどういうことをしているかというと、「もし当日の終値が前日の高値より高かったら“2”を表示し、もし当日の終値が前日の安値より安かったら“0”を表示し、どちらでもなかったら“1”を表示する。」ということを表しています。

 

2) R1C8に“パターン”と入力して下さい。R28C8に、“=R[-2]C[-1]*100+R[-1]C[-1]*10+RC[-1]”と入力して、データの最後の行までコピーして下さい。これは、「2日前の7列目の値を100倍したもの、1日前の7列目の値を10倍したもの、当日の7列目の値を合計する。」ということを表しています。

 

3) R28C9に、“=IF(R[-2]C[-2]=2,18,IF(R[-2]C[-2]=1,9,0))”と入力して、データの最後の行までコピーして下さい。これは、「2日前の7列目の値が“2”のときは“18”を表示し、“1”のときは“9”を表示し、“どちらでもないときは“0”を表示する。」ということを表しています。

 

4) R28C10に、“=IF(R[-1]C[-3]=2,6,IF(R[-1]C[-3]=1,3,0))”と入力して、データの最後の行までコピーして下さい。これは、「1日前の7列目の値が“2”のときは“6”を表示し、“1”のときは“3”を表示し、“どちらでもないときは“0”を表示する。」ということを表しています。

 

5) R28C11に、“=IF(RC[-4]=2,2,IF(RC[-4]=1,1,0))”と入力して、データの最後の行までコピーして下さい。これは、「1日前の7列目の値が“2”のときは“2”を表示し、“1”のときは“1”を表示し、“どちらでもないときは“0”を表示する。」ということを表しています。

 

6) R2C12に“パターン番号”と入力して下さい。R28C12に、“=SUM(RC[-3]:RC[-1])+1”と入力して、データの最後の行までコピーして下さい。これは、「9〜11列目の値の合計に1を加算した値を表示する。」ということを表しています。

 

さて、3)〜5)ではパターンの番号を計算するための元になる数値を算出しているわけですが、まずパターンの総数を計算します。この場合3×3×3=27通り、となります。

次に最初の条件(2日前の終値位置)の数で割ります。27÷3=9となります。したがって条件ごとにパターンの番号を計算するために9の倍数をあてるとよいわけですが、9列には0、9、18をあてます。

次の条件(1日前の終値位置)の数で割ります。9÷3=3となるので、10列には3の倍数の0、3、6をあてます。

最後の条件(当日の終値位置)の数で割ります。3÷3=1となるので、11列には1の倍数の0、1,2をあてます。

これらを合計することでパターン番号を算出するわけですが、合計するだけでは番号が0から始まるので、1を加算することで分かりやすくします。

 

 分かりにくいかもしれませんので表を使って説明します。

 

ア(0)

イ(9)

ウ(18)

カ(0)

キ(3)

ク(6)

カ(0)

キ(3)

ク(6)

カ(0)

キ(3)

ク(6)

サ0

シ1

ス2

サ0

シ1

ス2

サ0

シ1

ス2

サ0

シ1

ス2

サ0

シ1

ス2

サ0

シ1

ス2

サ0

シ1

ス2

サ0

シ1

ス2

サ0

シ1

ス2

 

 上の表は、上段が条件1、中段が条件2、下段が条件3についての場合分けを示しており、各条件に対応する「パターン別の数値」が入っています。各条件には3種類のパターンがありますので、この表を利用することで、パターンの総数である27(3×3×3)通りの全てを0から26の数字で表すことができます。

例えば、条件1はア(0)、イ(9)、ウ(18)、条件2はカ(0)、キ(3)、ク(6)に、さらに条件3はサ(0)、シ(1)、ス(2)であるとします。その時、ア−カ−サは番号0(0+0+0)であり、イ−クーシは番号16(9+6+1)となります。

 

7) 30列に入力している式は参照するセルがずれていますのでR29C30に、“=IF(R[-1]C[-18]=R2C30,1,0)”と入力して、データの最後の行までコピーして下さい。

                                    (以上)