2 関数を使った損益計算の仕方

今回からは、前回作成した指標を使ってシミュレーションをしていきます。

ここで言うシミュレーションとは、「もしこの指標(ルール)に従って取引していたなら、過去の成績はどのようになっていたのか?」を検証作業することと捉えて下さい。仮にある特定の期間で大変優秀な成績を上げた売買ルールがあったとしても、過去数年間の収益がマイナスになっているならば良い売買ルールとは言えないでしょう。

過去のデータを使い、そのルールに従って取引をしたものと仮定して損益計算を行うと、そのシステムが過去において有効であったかどうかの判断が出来ます。短期間のシミュレーションならば手計算で可能かも知れませんが、5年、10年間のシミュレーションはコンピュータを用いなければ大変な作業になりますので、ぜひマスターして頂きたいと思います。

(1) 損益計算の準備

まず、検証したい売買ルールを構築していかなければなりません。売買ルールとは、「何がどのようになれば買い・売り」ということです。今回はこの部分は飛ばして、各指標において一般に有効であると言われているルールを用います。(本来、この部分がシステム売買での成功においてもっとも重要な部分になります。)

今回の設定は以下の通りにします。

“売買ルール”・・・各指標において一般に有効であると言われているルールを用います。

(各指標のところで説明します。)

“シグナル”・・・買いは“1”、売りは“-1”、ニュートラルは“0”と表示する。

“建値・落値”・・・シグナル(終値で算出)が発生した場合、翌日の始値で売買する。

*“売買値段(建値・落値)”を表示するといくらで仕掛けて、いくらで手仕舞ったかが良く分り便利になります。

(2) 損益計算

各指標についてそれぞれ損益計算をしていきますが、まず始めに列の位置について説明します。前回はデータのすぐ横の列から指標の計算式を作っていきましたが、今回作るシグナルと損益計算は列を離して作っていきます。理由は幾つかあるのですが、まず「新しい計算式を追加する時に便利であること」、そして「計算式を他のシートに貼り付けることが簡単にできる」ということが挙げられます。具体的に説明しますと、移動平均線シートの「30列にシグナル」を「50列以降に建値、落値、確定損益、手数料、確定累計・・・」を作ります。そして別のシートでも損益計算を作成するときには、そのシートの30列にシグナルを作り、後は先程作った移動平均線シートの各損益計算(50列以降)をコピーして貼り付けるだけで完成してしまいます。何故かと言いますと、この2枚のシートにおいて「計算式で指定するセルの位置が同じ列になる」為です。

ここでは良く分からないかもしれませんが、同じ種類の計算式を常に同じ列に作っておくことが後々の作業を楽にしてくれるはずです。

a移動平均線

売買ルール・・・13日線と26日線のゴールデンクロス及びデッドクロス (具体的には、13日線の値が26日線の値よりも高いなら買い、低いなら売り)

(1) 前回計算した移動平均線は1421日間ですので、まず1326日間に変更します。

シート移動平均線の R2C7R2C8にそれぞれ“13”・“26”と入力します。すると、移動平均線(b)の値に“#REF!”というエラー値が現れますので、セル“R24C8R28C8”の値を削除して下さい。そして、このデータの範囲が間違っていないかどうか確認して下さい。

(2) 次にシグナルを表示させます。

まず、セルR1C30に“シグナル”と書き込みます。

そして、セルR29C30に“if関数”を使って式を入力します。

=IF(RC[-22]>RC[-23],1,IF(RC[-22]<RC[-23],-1,0))”という式になります。

この式の意味は、「もしRC[-23]13日線)がRC[-22]26日線)よりも大きければ“1”(買い)を表示し、そうでない場合にもしRC[-23]RC[-22]よりも小さければ“-1”(売り)を表示し、さらにそうでない場合は“0”(ポジションなし)を表示する」となっています。

このセルを下までコピーすると、30列目には数字(1-10)が表示されているはずです。この数字が売買シグナルとなります。下にコピーする方法ですが、左の列が空欄の時は黒十字をダブルクリックしてもできませんので、黒十字を押したまま画面の下に向かってコピーしたいセルまで移動させて下さい。

さて、ここでも用いているように、if関数を幾つか組み合わせることでもっと複雑なルールを表現できるようになります。しかし、「自分がどのようなルールを作っているのか」、「この条件の時はこれを表示させる」などを理解して作っていかなければ失敗の原因になります。

(3) 次は建値を表示させます。

まず、セルR1C50に“建値”と書き込みます。

この建値というのは建てる時の値段(始値)のことで、決済する時の計算に必要となります。(今回はシグナル翌日の始値を用いています。)

次はセルR30C50に式を入力します。

=IF(R[-1]C[-20]=0,0,IF(R[-1]C[-20]<>R[-2]C[-20],RC[-47],R[-1]C))”となります。

これは、「もしR[-1]C[-20]0ならば“0”、そうでないときもしR[-1]C[-20]R[-2]C[-20]が違うならば“RC[-47]”を、そうでないとき(すなわちR[-1]C[-20]R[-2]C[-20]が同じとき)“R[-1]C”を表示する」となります。具体的にどういうことかというと、「もし前日のシグナルが0なら“0”を、そうでないときで、もし前日シグナルと前々日シグナルが違うならば“当日の始値”を、そうでないとき(すなわち前日シグナルと前々日シグナルが同じとき)“前日までのポジションの建値”を表示する」ということになります。

(4) 次は落値を作ります。

セルR30C51に式を“=IF(AND(R[-1]C[-21]<>R[-2]C[-21],R[-2]C[-21]<>0),RC[-48],0)”と入力します。

ここで出てくる“and関数”は、“if関数”と組み合わせて使います。“if関数”だけなら「もしAならばaを、そうでないならbを表示する」となるものも“and関数”を使うと「もしAかつBならばaを、そうでないならbを表示する」というように「ABの両方の条件を満たしておかなければならない」という条件を作ることが出来ます。

ここでは、「もしR[-1]C[-21]R[-2]C[-21]が異なり、かつR[-2]C[-21] 0でないなら、“RC[-48]”を、そうでないとき“0”を表示させる」ということです。

この式の考え方は建値の場合と良く似ていますが、式自体は異なっています。建値はポジションがあるとき(0でないとき)、建てたときの値段が表示され続けますが、落値は決済するときのみ、値段が表示されるようになっています。

(5) 次は確定損益の計算をします。

まず、セルR1C52に“確定損益”と書き込みます。

次はセルR31C52に式を入力します。

この式は“=IF(R[-2]C[-22]<>R[-1]C[-22],IF(R[-2]C[-22]=1,RC[-1]-R[-1]C[-2],IF(R[-2]C[-22]=-1,R[-1]C[-2]-RC[-1],0)),0)”です。

式の内容は、「もしR[-2]C[-22]R[-1]C[-22]が違う場合に、もしR[-2]C[-22]1ならば“RC[-1]-R[-1]C[-2]”を、そうでない場合、もしR[-2]C[-22] -1なら“R[-1]C[-2]-RC[-1]”を、そうでない場合は“0”を表示する」です。式の最後の“0”は、一番目の“if関数”で条件が「もしR[-2]C[-22]R[-1]C[-22]が同じ(違わない)ならば」になったときに表示させます。

RC[-1]が落値、R[-1]C[-2]が前日までのポジションの建値となっていますので、「前日と前々日のシグナルを見て変化があったならば、損益を計算している」と言えるでしょう。

(6) 次は手数料の計算です。

まず、セルR1C53に“手数料”と書き込みます。

次はセルR31C53に式を入力します。

式は“=IF(R[-2]C[-23]<>R[-1]C[-23],IF(R[-2]C[-23]<>0,RC[-7]*0.0008*2*1.05,0),0)”となります。

式の内容を説明する前に、“0.0008*2”の説明をしておきます。ここで使っているデータは「日経平均先物」ですので片道の手数料が「約定値段の0.08%」となっている為です。 シミュレーションにおいて手数料を入れるか入れないかで、取引回数にもよりますが、検証結果が大きく異なりますので予め手数料を考慮して損益計算を行います。ちなみに“*1.05”は手数料にかかる消費税です。

今回、筆者が使用しているデータについてですが、バックアジャストつなぎ足を使用しています。これは、先物の場合、限月間で価格差が発生しますが、その価格差を限月交代時に新しい限月の値段を基準にして修正したデータです。したがって、日経平均先物の場合、約定値段を基準に手数料が計算されますから、そのままでは計算できません。そこで、限月交代時の限月間の差を無視して単純につなげた単純つなぎ足を手数料計算用に使用します。

*今回は、簡略化のため手数料を落値の値段を基準にして計算したものを往復分として2倍しており、消費税については5%で統一しています。また、ポジションを次の限月に持ち越した場合に起こる乗り換えのための手数料も計算していません。

「単純つなぎ」のデータの位置ですが、46列〜49列が始値〜終値となるようにして下さい。

式の内容は、「もしR[-2]C[-23]R[-1]C[-23]が異なるときで、R[-2]C[-23]0でないならば、“RC[-7]*0.0008*2*1.05”を、そうでないとき“0”を表示する(1番目のif関数でR[-2]C[-23]R[-1]C[-23]が同じ場合は“0”を表示する)」となります。

具体的には、「もし前々日のシグナルと前日のシグナルが異なるときで、前々日のシグナルが0でないならば、手数料“当日始値(単純つなぎ足)の0.0008倍×2(往復分)×1.05(消費税)”を、そうでないとき“0”を表示する」となります。

(7) 次は確定累積損益の計算です。

まず、セルR1C54に“確定累積”と書き込みます。

確定累積損益とは「当日の確定損益(手数料を引いたもの)と前日の確定累積損益の合計」です。

式は“=RC[-2]-RC[-1]+R[-1]C”です。

(8) 次は値洗い損益の計算です。

まず、セルR1C55に“値洗い損益”と書き込みます。

次はセルR31C55に式を入力します。

=IF(R[-2]C[-25]=1,RC[-52]-R[-1]C[-52],IF(R[-2]C[-25]=-1,R[-1]C[-52]-RC[-52],0))”となります。

内容は、「もしR[-2]C[-25]1ならば“RC[-52]-R[-1]C[-52]”を、そうでなく、もしR[-2]C[-25] -1ならば“R[-1]C[-52]-RC[-52]”を、そうでない場合は(R[-2]C[-25] 0の場合)、“0”を表示する」となります。

具体的には、「もし前々日のシグナルが1ならば、“当日の始値−前日の始値”を、そうでなく、もし前々日のシグナルが−1ならば“前日の始値−当日の始値”を、そうでない場合は“0”を表示する」となります。

RC[-52]-R[-1]C[-52]”、“R[-1]C[-52]-RC[-52]”は買い・売りそれぞれ始値ベースで値洗いを計算していることになります。

(9) 次は値洗い累積損益の計算です。

まず、セルR1C56に“値洗い累積”と書き込みます。

次はセルR31C56に式を入力します。

値洗い累積損益とは「当日の値洗い損益と前日までの確定累積損益の合計」なのですが、式では、「当日の値洗い増減分(手数料を引いたもの)と前日までの値洗い累積損益の合計」で表しています。

式は“=RC[-1]-RC[-3]+R[-1]C”です。

 

(10) これで計算式の入力は終了ですが、最後に“確定損益”と“値洗い累積”の折れ線 グラフを作ります。この2つをグラフで比較すると違いが良く分かると思います。

これ以降、各指標のシグナルと損益計算を作っていきますが、解説はシグナルの部分だけにさせて頂きます。損益計算の部分は「移動平均線の損益計算」をコピーして貼り付けるだけだからです。ただし注意してもらう点が一つあります。それは「貼り付ける時に、コピーした列番号と同じ番号の列に貼り付ける」ことです。そうしないと指定する範囲などがずれてしまい計算が合わなくなります。念のために作業後は確認をしておいて下さい。

 

bチャネルバンド

売買ルール・・・当日終値がHigh-Lowのレンジをブレイクすれば、ブレイクの方向について行く。

具体的には、当日終値が当日の“High”より大きければ買い、“Low”小さければ売り、中間なら前日のポジション継続

シグナルの表示

R29C30・・・“=IF(RC[-24]>RC[-23],1,IF(RC[-24]<RC[-22],-1,R[-1]C))

 

cRSI

売買ルール・・・RSI(a)RSI(b)のクロス

具体的には、RSI(a)RSI(b)より大きいなら買い、小さいなら売り

シグナルの表示

R46C30・・・“=IF(RC[-21]>RC[-20],1,IF(RC[-21]<RC[-20],-1,0))

d標準偏差バンド

売買ルール・・・当日終値がプラス・マイナス2σの値をブレイクすればブレイクの方向について行く

具体的には、当日終値がプラス2σの値よりも大きければ買い、マイナス2σの値よりも小さければ売り、中間なら前日のポジション継続

シグナルの表示

R23C30・・・“=IF(RC[-24]>RC[-20],1,IF(RC[-24]<RC[-21],-1,R[-1]C))

 

今回の説明はここまでです。次回は検証の結果を評価するために用いる各種指標(最大ドローダウン、勝率、損益レシオ等)の計算の仕方を解説します。

以上