ここでは、Excelブックの中のシート「検証シート」内のワークシート関数、「評価シート」の意味について解説します。それぞれの列に書き込まれているワークシート関数の内容は、それぞれの列の21行目のものを抜粋して、解説いたします。

検証シートの解説

1. 価格データ(A列~E列(
A列~E列は、システムの検証、構築の対象となる価格データを流しこむためのスペースです。

2. ATR(F列~J列(
F列~J列は、ATR'真の値幅の平均(を返すための列です。
それぞれの関数の意味は、
=C21-D21 「当日の高値-当日の安値」を返す
=C21-E20 「当日の高値-前日の終値」を返す
=E20-D21 「前日の終値-当日の安値」を返す
=MAX(F21:H21) 「F21、G21、H21」の中で最も大きい値を返す
=ROUND(AVERAGE(OFFSET(I21,-評価シート!$C$13+1,0):I21),0) 真の値幅のN日間の平均値を返し、小数点以下を四捨五入した値を返す。
※ATR算出のための変数は、評価シートのセルC13の値を絶対参照して使用する。
ということです。
このATRに関しましては、定義によってはテクニカル指標とも言えると思います。しかしながら、ATRは市場のボラティリティを測り、マネーマネジメント指標の算出などに使われるため、このシートでは常にATRの列は設けるような設計になっております。

3. 指標、セットアップ'K列~Q列(
K列~Q列は、システムにおけるエントリーのための条件を設定するための列です。
例えば、システムの構築するために、テクニカル指標を用いたり、ファンダメンタルズのデータを使用する場合、これらの列にデータを入れておくことになります。
このテキストでは、二本の移動平均線のクロスによるエントリーを例として解説します。
K列~Q列までそれぞれの21行目のワークシート関数は次のようになっています。
K21'短期移動平均線(
=IF(ISERROR(AVERAGE(OFFSET(E21,-評価シート!$A$4+1,0):E21)),"",AVERAGE(OFFSET(E21,-評価シート!$A$4+1,0):E21))
L21'長期移動平均線(
=IF(ISERROR(AVERAGE(OFFSET(E21,-評価シート!$A$6+1,0):E21)),"",AVERAGE(OFFSET(E21,-評価シート!$A$6+1,0):E21))
M列~Q列(予備列(
=””
セルK21のワークシート関数の意味は、
AVERAGE(OFFSET(E21,-評価シート!$A$4+1,0):E21)
E21から、評価シートのセルA4の負の値に1を加えた分だけ遡った範囲の平均値
=IF(ISERROR(省略),"", AVERAGE(OFFSET(E21,-評価シート!$A$4+1,0):E21))
AVERAGEで返した値がエラーであれば、ブランクを返す。そうでない場合、AVERAGEの値を返す
ということです。
※ISERROR関数を使用する理由
たとえば、K列の21行目において、移動平均線の変数が10日ならば、過去10日分の価格データは21行目から遡れますが、変数が50日となったとき、価格データが21行目から50日分も遡れないので、本来エラーになってしまいます。

指標の列においてエラーが返ってしまうと、これらを参照するセルも皆エラーとなってしまい、たいへん不便です。
ISERROR関数を使えば、大きすぎる変数が与えられた場合には、その行がブランクになり、それに対応してエントリーサインもブランクになるようにワークシート関数を組んであります。
セルL21のワークシート関数の意味は、
AVERAGE(OFFSET(E21,-評価シート!$A$6+1,0):E21)
E21から、評価シートのセルA6の負の値に1を加えた分だけ遡った範囲の平均値
=IF(ISERROR(省略),"", AVERAGE(OFFSET(E21,-評価シート!$A$6+1,0):E21))
AVERAGEで返した値がエラーであれば、ブランクを返す。そうでない場合、AVERAGEの値を返す
ということです。
L列はK列とほとんど同じです。
セルM21、N21、O21、P21、Q21のワークシート関数の意味は、
=””
ブランクを返す。
ということです。
なぜ、予備列を設けているかといいますと、単純移動平均線では使用する列は1列ですが、MACDなどを描く際には4列必要になります'ユーザー定義関数などを使えば、1列に収めることも可能ですが、計算が遅くなってしまいます(。
テクニカル指標を書き換える際に、使用する指標ごとに列を削除したり、挿入したりすることも可能なのですが、それを行うとなると、価格データを入れ替え、マクロを使ってデータ数にワークシート関数を合わせたりする際に、面倒な問題が生じてしまうのです。
そのため、あらかじめ予備列を含め、指標・セットアップ列として、K列~Q列までの7列を確保しております。

4. エントリーサイン(R列(

R列は、指標・セットアップ列で描いたテクニカル指標などに基づき、エントリーサインを返すための列です。
セルR21のワークシート関数は次のようになっています。
=IF(OR(V21=0,J21="",L21="",K21="",S21<>""),"",IF(AND(K21L21,L20>K20),"buy","")))
このワークシート関数の意味は、
=IF(OR(V21=0,J21="",L21="",K21="",S21<>""),""
マネーマネジメント指標が0のとき、もしくはATR列がブランクのとき、もしくはセルK21がブランクであるとき'指標・セットアップ列がISERROR関数でブランクになっているとき(、もしくはセルS21がブランクではないとき'建玉中のとき(、はブランクを返す
IF(AND(K21
もし、当日時点で、短期移動平均線が長期移動平均線よりも低く、かつ、前日時点で短期移動平均線が長期移動平均線よりも高い場合'つまり、移動平均線がデッドクロスした場合(、sellを返す
IF(AND(K21>L21,L20>K20),"buy"
もし、当日時点で、短期移動平均線が長期移動平均線よりも高く、かつ、前日時点で短期移動平均線が長期移動平均線よりも低い場合'つまり、移動平均線がゴールデンクロスした場合(、buyを返す
,"")))
いずれでもない場合、ブランクを返す
ということです。

5. 約定値段(S列(

S列はR列で返したエントリーサインに基づき、約定した価格を返す列です。
セルS21のワークシート関数は次のようになっています。
=IF(OR(AD20<>"",AC20<>""),"",IF(OR(R20="sell",R20="buy"),B21,S20))
126
このワークシート関数の意味は、
=IF(OR(AD20<>"",AC20<>""),"",
前日時点で、EXITサイン、もしくは、LOSSCUTサインが出ていたらブランクを返す
※これにより、ポジションが仕切られた際には、ポジションが消失することを表現しています。
IF(OR(R20="sell",R20="buy"),B21
もし、前日時点でエントリーサイン列にsellかbuyが出ていたら、当日の始値を返す
,S20))
いずれでもない場合、約定値段列の前日セルを返す
ということです。
マクロでエントリールールを書き換える際には、約定値段列までしっかりとプロシージャ内に書き込んでください。

6. 建玉日数(T列(
T列は、約定したポジションが建玉されてから、何日が経過したのか数えるための列です。
セルT21のワークシート関数は次のようになっています。
=IF(S21="","",IF(R20<>"",1,T20+1))
このワークシート関数の意味は、
=IF(S21="","",
約定値段の列がブランクならば、ブランクを返す
IF(R20<>"",1
前日のエントリーサイン列がブランクではないとき'つまり、sellかbuyが返されたとき(、1を返す
,T20+1))
いずれでもない場合、前日の建玉日数の値に1を加える
ということです。

7. ポジションの種類(U列(
U列はポジションの種類の名前を返す列です。
セルU21のワークシート関数は次のようになっています。
=IF(S21="","",IF(AND(S21<>"",R20<>""),R20,U20))
このワークシート関数の意味は、
=IF(S21="","",
当日の約定値段の列がブランクならば、ブランクを返す
IF(AND(S21<>"",R20<>""),R20
当日の約定値段の列がブランクではなく、かつ、前日のエントリーサインの列がブランクではない場合、エントリーサイン列の文字列を返す
,U20))
いずれでもない場合、ポジションの種類の列の文字列を返す
ということです。

8. マネーマネジメント指標(V列(
V列は建玉枚数を返すためのマネーマネジメント指標の列です。
ここでは「タートルズの秘密」'ラッセル・サンズ著 パンローリング社(の中で紹介されているマネーマネジメント手法を書き込んであります。
計算式は次の通りです。
売買枚数=資金量×リスク率÷'ATR×ポイントバリュー(
※ポイントバリューとは、1ティックごとに生じる損益のことです。たとえば、東京金は倍率が1000
倍で、1ティックが1円なので、1000'倍率(×1'ティック(=1000 ですから、ポイントバリューは1000となります。
このマネーマネジメントは、市場のボラティリティと資金量、リスクを踏まえて、売買枚数を決定するものですが、マネーマネジメントを無視し、売買枚数を1枚にするなどして、検証したい場合などは、この列を書き換えます。
セルV21のワークシート関数は次のようになっています。
=ROUNDDOWN(AI21*評価シート!$C$5/100/(J21*評価シート!$C$7),0)
このワークシート関数の意味は、
AI21*評価シート!$C$5/100/(J21*評価シート!$C$7)
累積損益×リスク率÷100×'ATR×ポイントバリュー(
=ROUNDDOWN( ,0)
上で求めた値の小数点以下を切り捨てた値を返す
ということです。
 
9. 建玉枚数(W列(
W列はマネーマネジメント指標に基づき、何枚建玉したのかを返す列です。
セルW21のワークシート関数は次のようになっています。
=IF(S21="","",IF(OR(R20="sell",R20="buy"),V20,W20))
このワークシート関数の意味は、
=IF(S21="","",
当日の約定値段の列がブランクならば、ブランクを返す
IF(OR(R20="sell",R20="buy"),V20
もし、前日のエントリーサインの列がsellもしくはbuyならば、前日のマネーマネジメント指標の列の値を返す
,W20))
いずれでもない場合、前日の建玉枚数列の値を返す
ということです。

10. EXITルール(X列~AB列(
X列からAB列はイグジットのルールを書き込むための列です。
シート上では、ATRイグジットというルールを書き込んであります。
ATRイグジットのルールは以下のようになります。
■買いの場合
終値時点で、「約定値段+'エントリーサインが出た時点の(ATR×N」に達したら、翌日の始値で利食い
ザラバ中に「約定値段-'エントリーサインが出た時点の(ATR×N」に達したら、その価格で損切り
■売りの場合
終値時点で、「約定値段-'エントリーサインが出た時点の(ATR×N」に達したら、翌日の始値で利食い
ザラバ中に「約定値段+'エントリーサインが出た時点の(ATR×N」に達したら、その価格で損切り
このルールを表現してあるセルX21、Y21のワークシート関数は次の通りです。
セルX21'利食いライン(
=IF(S21="","",IF(R20="sell",S21-ROUND(J20*評価シート!$C$9,0),IF(R20="buy",S21+ROUND(J20*評価シート!$C$9,0),X20)))
これらのワークシート関数の意味は、
=IF(S21="","",
当日の約定値段の列がブランクならば、ブランクを返す
IF(R20="sell",S21-ROUND(J20*評価シート!$C$9,0)
もし、前日時点でsellのエントリーサインが出ていたら、約定値段-ATR×Nを四捨五入した値を返す
,IF(R20="buy",S21+ROUND(J20*評価シート!$C$9,0)

もし、前日時点でbuyのエントリーサインが出ていたら、約定値段+ATR×Nを四捨五入した値を返す
,X20)))
いずれでもない場合、前日時点の利食いラインの値を返す
ということです。
セルY21'損切りライン(
=IF(S21="","",IF(R20="sell",B21+ROUND(J20*評価シート!$C$11,0),IF(R20="buy",S21-ROUND(J20*評価シート!$C$11,0),Y20)))
これらのワークシート関数の意味は、
=IF(S21="","",
当日の約定値段の列がブランクならば、ブランクを返す
IF(R20="sell",B21+ROUND(J20*評価シート!$C$11,0)
もし、前日にsellのエントリーサインが出ていたら、約定値段+ATR×Nの四捨五入した値を返す
,IF(R20="buy",S21-ROUND(J20*評価シート!$C$11,0)
もし、前日にbuyのエントリーサインが出ていたら、約定値段-ATR×Nの四捨五入した値を返す
,Y20)))
いずれでもない場合、前日時点の利食いラインの値を返す
ということです。
そして、Z列、AA列、AB列はイグジットのルールを追加するときのための予備列です。

11. EXITサイン(AC列、AD列(
ここは、EXITルールに基づきEXITのサインを返すための列です。
セルAC21、セルAD21のワークシート関数は次の通りです。
AC列'ロスカットサイン(
=IF(OR(AD20<>"",AC20<>""),"",IF(AND(U20="sell",Y20<=B21),"opLC",IF(AND(U20="buy",Y20>=B21),"opLC",IF(AND(U21="sell",Y21<=C21),"LC",IF(AND(U21="buy",Y21>=D21),"LC","")))))
AD列'EXITサイン(
=IF(AC21<>"","",IF(AND(U21="sell",X21>E21),"EXIT",IF(AND(U21="buy",E21>X21),"EXIT","")))
これらのワークシート関数の意味は次の通りです。
=IF(OR(AD20<>"",AC20<>""),""
前日のEXITサイン、もしくは、前日のLOSSCUTサインがブランクではない場合'つまり、いずれかのポジションを仕切るサインが出ている場合(、ブランクを返す
,IF(AND(U20="sell",Y20<=B21),"opLC"
もし、前日時点のポジションの種類がsellで、当日の始値が、ロスカットの価格以上であれば、opLCを返す
,IF(AND(U20="buy",Y20>=B21),"opLC"
もし、前日時点のポジションの種類がbuyで、かつ、当日の始値がロスカットの価格以下であれば、opLCを返す
,IF(AND(U21="sell",Y21<=C21),"LC"
もし、ポジションの種類がsellで、かつ、当日の高値がロスカットの価格以上であれば、LCを返す
,IF(AND(U21="buy",Y21>=D21),"LC"
もし、ポジションの種類がbuyで、かつ、当日安値がロスカットの価格以下であれば、LCを返す
,"")))))
いずれでもない場合、ブランクを返す
というとです。

ここでは、ロスカットを表すワークシート関数の紹介でしたので、ロスカットサインを「LC」、寄り付きでのロスカットを「opLC」と表現しました。しかし、イグジットのルールをトレーリングストップなどにしたときには、「TS」、「opTS」というサインを返すようになっております。マクロでイグジットルールを書き換える際には注意してください。

12. 損益'AE列、AF列(
ここは、EXITサインに基づいて閉じられたポジションの損益を返す列です。
セルAE21、AF21のワークシート関数は次の通りです。
AE21
=IF(AND(U21="sell",AC21="opLC"),(S21-B21)*評価シート!$C$15*W21-評価シート!$C$17*W21,IF(AND(U21="sell",AC21="LC"),(S21-Y21)*評価シート!$C$15*W21-評価シート!$C$17*W21,IF(AND(U20="sell",AD20="EXIT"),(S20-B21)*評価シート!$C$15*W20-評価シート!$C$17*W20,"")))
AF21
=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,"")))
少々長いですが、細かく分けて見ていくとそれほど難しいことが書いてあるわけではないので、順番に見ていきましょう。
セルAE21のワークシート関数の意味は次の通りです。
=IF(AND(U21="sell",AC21="opLC"),
もし、ポジションの種類がsellで、かつ、opLC'翌日始値でのロスカットのサイン(が出ていたら
(S21-B21)*評価シート!$C$15*W21-評価シート!$C$17*W21,
'約定値段-始値(×倍率×建玉枚数-手数料×建玉枚数 を返す
IF(AND(U21="sell",AC21="LC"), ,
もし、ポジションの種類がsellで、かつ、LC'日中のロスカットのサイン(が出ていたら、
133
(S21-Y21)*評価シート!$C$15*W21-評価シート!$C$17*W21
'約定値段-損切りの価格(×倍率×建玉枚数-手数料×建玉枚数 を返す
IF(AND(U20="sell",AD20="EXIT"),
もし、前日時点のポジションの種類がsellで、かつ、EXITサインが出ていたら、
(S20-B21)*評価シート!$C$15*W20-評価シート!$C$17*W20
'約定値段-始値(×倍率×建玉枚数-手数料×建玉枚数 を返す
,"")))
いずれでもない場合、ブランクを返す
ということです。
次にセルAF21のワークシート関数見ていきます。
セルAF21のワークシート関数の意味は次の通りです。
=IF(AND(U21="buy",AC21="opLC"),
もし、ポジションの種類がbuyで、かつ、opLC'翌日始値でのロスカットのサイン(が出ていたら
(B21-S21)*評価シート!$C$15*W21-評価シート!$C$17*W21
'始値-約定値段(×倍率×建玉枚数-手数料×建玉枚数 を返す
,IF(AND(U21="buy",AC21="LC"),
もし、ポジションの種類がbuyで、かつ、LC'日中のロスカットのサイン(が出ていたら、
(Y21-S21)*評価シート!$C$15*W21-評価シート!$C$17*W21
'損切りの価格-約定値段(×倍率×建玉枚数-手数料×建玉枚数 を返す
,IF(AND(U20="buy",AD20="EXIT"),
もし、前日時点のポジションの種類がbuyで、かつ、EXITサインが出ていたら、
(B21-S20)*評価シート!$C$15*W20-評価シート!$C$17*W20
'始値-約定値段(×倍率×建玉枚数-手数料×建玉枚数 を返す
,"")))

いずれでもない場合はブランクを返す
ということです。
マクロでイグジットルールを書き換える際には、かならず損益列まで書き換えるようにしてください。

13. パフォーマンス評価列(AG列~AW列(
ここは、ワークシート上でテストされているシステムのパフォーマンスの評価に用いる計測結果を返す列です。
初期設定としては、損益曲線、現時点最大損益、ドローダウン、フラット期間、連続負けトレード回数、データ数、保有期間、月次データ数、月次リターン、累積リターンなどを用意しております。
AS列~AW列は、予備列としてあるので、オリジナルの評価方法を書き込みたい場合は、この列を使用してください。
それでは、順番にワークシート関数の解説をしていきます。
損益曲線(AG列~AI列(
まず、20行目について解説いたします
AG列からAAI列までの、それぞれ20行目には次のように書きこまれています。
=評価シート!C3
これは評価シート内の初期投資金額を参照しています。既に解説したマネーマネジメント指標などを算出する際に使用する列です。
シート上では初期投資金額を設定してありますが、マネーマネジメントルールを変更すると、初期投資金額をゼロに設定することもあります。
次にAG21、AH21、AI21のワークシート関数はそれぞれ次のようになっています。
AG21'sell損益曲線( =SUM(AE21)+AG20
AH21'buy損益曲線( =SUM(AF21)+AH20
AI21'総合損益曲線( =IF(AE21<>"",AI20+AE21,IF(AF21<>"",AI20+AF21,AI20))

これらの関数の意味は次の通りです。
AG21 =SUM(AE21)+AG20
Sell損益列の21行目時点の合計+sell損益曲線の前日までの値
AH21 =SUM(AF21)+AH20
Buy損益列の21行目時点の合計+buy損益曲線の前日までの値
AI21
=IF(AE21<>"",AI20+AE21
もし、sell損益列がブランクではなければ、前日時点の総合損益曲線列の値+sell損益列の値を返す
,IF(AF21<>"",AI20+AF21
そうでない場合、もしbuy損益列がブランクでなければ、前日時点の総合損益曲線列の値+buy損益列の値を返す
,AI20))
いずれでもない場合、前日時点の総合損益曲線列の値を返す
ということです。
最大損益、ドローダウン、フラット期間'AJ列~AL列(
AJ列~AL列は現時点最大損益とドローダウン、そしてフラット期間を返す列です。ドローダウンの算出に現時点最大損益は必要な列となり、ドローダウン列の最小値がシステムのパフォーマンス評価を良く用いられる最大ドローダウンということになります。そして、フラット期間とは、現時点最大損益列の更新に要した最長期間のことです。
AJ列(最大損益) =IF(AI21>AJ20,AI21,AJ20)
AK列'ドローダウン( =1-AJ21/AI21
AL列'フラット期間( =IF(AJ21>AJ20,0,1+AL20)
これらの関数の意味は次の通りです。
AJ列(最大損益)
=IF(AI21>AJ20,AI21,AJ20)

もし、当日の総合損益曲線列の値が前日の最大損益列の値よりも大きかったら、当日の総合損益列の値を返す。そうでない場合、前日の最大損益列の値を返す。
AK列'ドローダウン(
=1-AJ21/AI21
1-当日の最大損益列の値÷当日の総合損益曲線の値 を返す
AL列'フラット期間(
=IF(AJ21>AJ20,0,1+AL20)
もし、当日の最大損益列の値が前日の最大損益列の値より大きければ、0を返す。そうでない場合、1に前日のフラット期間列の値を加えた値を返す
ということです。
また、マクロでマネーマネジメントルールを書き換えると、ドローダウンの算出方法が若干変化しますので、ご注意ください。
連続負けトレード回数、連続勝ちトレード回数(AM列、AN列(
AM列、AN列はワークシート上で検証されているシステムが連続で何回勝ったのか、負けたのかを数えるための列です。
この列それぞれの最大値が「最大連続負けトレード回数」、「最大連続勝ちトレード回数」ということになります。
セルAM21(連続負けトレード回数(
=IF(AND(AE21="",AF21=""),AM20,IF(OR(AF21<0,AE21<0),1+AM20,IF(OR(AE21>0,AF21>0),0,AM20)))
セルAN21(連続勝ちトレード回数(
=IF(AND(AE21="",AF21=""),AN20,IF(OR(AE21<0,AF21<0),0,IF(OR(AF21>0,AE21>0),1+AN20,AN20)))
これらのワークシート関数の意味は次の通りです。
セルAM21(連続負けトレード回数(
=IF(AND(AE21="",AF21=""),AM20,

Sell損益列がブランクで、かつ、buy損益列がブランクの場合、前日までの連続負けトレード回数列の値を返す
IF(OR(AF21<0,AE21<0),1+AM20,
そうでない場合、もし、sell損益列が0より小さい、もしくは、buy損益列が0より小さい場合、前日までの連続負けトレード回数に1を加える
IF(OR(AE21>0,AF21>0),0
そうでない場合、もし、sell損益列が0より大きいか、もしくは、buy損益列が0より大きい場合、0を返す
,AM20)))
いずれでもない場合、前日までの連続負けトレード回数列の値を返す
セルAN21(連続勝ちトレード回数(
=IF(AND(AE21="",AF21=""),AN20,
Sell損益列がブランクで、かつ、buy損益列がブランクの場合、前日までの連続勝ちトレード回数列の値を返す
IF(OR(AE21<0,AF21<0),0,
そうでない場合、もし、sell損益列が0より小さいか、もしくは、buy損益列が0より小さい場合、0を返す
IF(OR(AF21>0,AE21>0),1+AN20
そうでない場合、もし、sell損益列が0より大きい、もしくは、buy損益列が0より大きい場合、前日までの連続勝ちトレード回数に1を加える
,AN20)))
いずれでもない場合、前日までの連続勝ちトレード回数列の値を返す
ということです。

データ数、保有期間(AO列、AP列(
ここは、現在ワークシート上に入っている価格データの行数を数える列と建玉されている期間を数える列です。
これらの値を使うことで、システムのパフォーマンスを評価する際に、「保有期間÷データ数」で全期間の中で何%の期間において建玉がされていたのか、という比率を返します。
セルAO21(データ数列(
=1+AO20
セルAP21(保有期間列(
=IF(S24<>"",1+AP23,AP23)
これらのワークシート関数の意味は次の通りです。
セルAO21
=1+AO20
前日までのデータ数列の値に1を加える
セルAP21
=IF(S24<>"",1+AP23,AP23)
もし、約定値段列のブランクではない場合'つまり、建玉中ならば(、前日までの保有期間列の値に1を加える。そうでない場合、前日までの保有期間列の値を返す
ということです。
月次データ数、月次損益、累積損益(AQ~AS列(
ここは、日足データで検証されているシステムの損益を月次で評価するために用いる列です。
AQ21(月次データ数(
=IF(MONTH(A21)<>MONTH(A20),1,1+AQ20)
AR21(月次リターン(
=IF(AQ22="","",IF(AQ22=1,SUM(OFFSET(AE21,-AQ21+1,0):AF21)/OFFSET(AI21,-AQ21+1,0),""))
AS列(累積リターン(

=SUM(AR21)+AS20
これらのワークシート関数の意味は次の通りです。
AQ21(月次データ数(
=IF(MONTH(A21)<>MONTH(A20),1,1+AQ20)
もし、価格データの日付列の月が、前日と当日で異なれば、1を返す。そうでない場合、前日までの月次データ数列の値に1を加える
AR21(月次損益(
=IF(AQ22="","",
もし、翌日の月次損益列がブランクならば、ブランクを返す
IF(AQ22=1,
もし、翌日の月次データ数が1ならば、
SUM(OFFSET(AE21,-AQ21+1,0):AF21)/OFFSET(AI21,-AQ21+1,0)
当日から、「データ数の値分だけ遡った範囲の損益の合計」÷「データ数列の値だけ遡った総合損益曲線列の値」を返す。
つまり、「その月の損益÷その月の始め時点の損益」を返すということになります。
,""))
いずれでもない場合は、ブランクを返す
AS列(累積損益(
=SUM(AR21)+AS20
月次リターンの値に前日までの累積リターン列の値を加える
ということです。
予備列(AT~AX列(
ここは、ユーザーの方が独自にパフォーマンスの評価列を追加するときに使用して頂くための予備列です。AX列までワークシート上ではスペースを確保致しましたが、これよりさらに先の列も同様に使用することが可能です。
なお、独自のパフォーマンス評価列を追加する際には、それに伴い、マクロを書き換えていただくことにもなりますので、ご注意ください。

評価シートの解説
 
ここでは、評価シート内パフォーマンス評価エリアの総合評価列のワークシート関数の意味を解説いたします。
このエリアのワークシート関数の参照点は、検証シート内に読み込まれている価格データの行数で変化いたしますので、ここでは便宜上、価格データが100行目まで入っている、と仮定して解説いたします。
また、これらのワークシート関数は、採用しているマネーマネジメント指標の変化により若干変更されます。ここで解説する例では、マネーマネジメント指標がATRであると仮定しております。
 
ワークシート関数
 
意味
損益合計
=SUM(検証シート!AE21:AE100)+
SUM(検証シート!AF21:AF100)
sell損益列とbuy損益列の合計
仕掛け回数
=COUNTIF(検証シート!R21:R100,"sell")+COUNTIF(検証シート!R21:R100,"buy")
エントリーサイン列内の「sell」と「buy」の数
勝ち回数
=COUNTIF(検証シート!AE21:AE100,">0")
+COUNTIF(検証シート!AF21:AF100,">0")
Sell損益列とbuy損益列の0より高い値が返っているセルの数
勝率
=E4/E3*100
勝ち回数÷仕掛け回数×100
利益合計
=SUMIF(検証シート!AE21:AE100,">0")+
SUMIF(検証シート!AF21:AF100,">0")
Sell損益列とbuy損益列内の0より高い値の合計
損失合計
=SUMIF(検証シート!AE21:AE100,"<0")+
SUMIF(検証シート!AF21:AF100,"<0")
Sell損益列とbuy損益列内の0より低い値の合計
利益平均
=E6/E4
利益合計÷勝ち回数
損失平均
=E7/(E3-E4)
損失合計÷'仕掛け回数-勝ち回数(
プロフィットファクター
=ABS(E6/E7)
利益合計÷損失合計の絶対値
ペイオフレシオ
=ABS(E8/E9)
利益平均÷損失平均の絶対値
141
最大連続負けトレード回数
=MAX(検証シート!AM21:AM100)
連続負けトレード回数列の最大値
最大連続勝ちトレード回数
=MAX(検証シート!AN22:AN100)
連続勝ちトレード回数の最大値
フラット期間
=MAX(検証シート!AL21:AL100)
フラット期間列の最大値
ポジション保有期間'%(
=MAX(検証シート!AP21:AP100)/MAX(検証シート!AO21:AO100)*100
保有期間列の最大値÷データ数列の最大値
最大ドローダウン
=MIN(検証シート!AK21:AK100)
ドローダウン列の最大値
平均月次損益'%(
=AVERAGE(検証シート!AR21:AR100)
月次損益列の平均
月次損益標準偏差
=STDEV(検証シート!AR21:AR100)
月次損益列の標準偏差
リターン
=E2/C3
損益合計÷初期投資金額
RRR
=ABS(E19/E16)
リターン÷最大ドローダウンの絶対値