悲観的リターンレシオ(PRR)とは
バックテストの取引回数が少ないほど統計的なデータの信頼性は下がってしまいます。
例えばプロフィットファクター(PF)でいえば、取引回数が少ないときほどその値は大きく見積もってあげないといけないわけです。
じゃあ具体的にどれだけ大きく見積もる必要があるのかを数学的な根拠をもって考慮したEAの評価指標が「悲観的リターンレシオPRR」です。
そもそも、ランダムなトレードのプロフィットファクター(PF)の偶然起こりうる振れ幅をどうやって導いているのかの解説はこちらです。
悲観的リターンレシオ(PRR)のソースコード
手持ちのEAにコピペするだけ!
#include <Math\Stat\Math.mqh>
//+------------------------------------------------------------------+
//| OnTester |
//+------------------------------------------------------------------+
input group "●--カスタム指標--●"
input bool Carry = true; // 最適化するときに計算結果に100をかける
//+------------------------------------------------------------------+
//| 悲観的リターンレシオ(PRR)
//+------------------------------------------------------------------+
double OnTester()
{
const int dig = 2; // ←悲観的リターンレシオを小数点以下何桁まで表示するか
double n, PF, PRR;
//--- プロフィットファクターと取引回数
PF = TesterStatistics(STAT_PROFIT_FACTOR);
n = TesterStatistics(STAT_TRADES);
//--- 悲観的リターンレシオの計算
PRR = PF / ((n + 1.96 * sqrt(n)) / (n - 1.96 * sqrt(n)));
//--- 桁数の設定
PRR = MathRound(PRR, dig);
//--- 最適化のときにのみ結果に100をかける(MT5のバグ対策)
if(Carry == true && MQLInfoInteger(MQL_OPTIMIZATION))
PRR *= 100;
return PRR;
}
※最適化のときにのみ結果に100をかけている理由はMT5の最適化結果のOnTester結果の数値の表示で小数点以下が見えないバグがあるために、100をかけて無理やり小数点以下2桁を見ています。
悲観的リターンレシオ(PRR)についてツイートしたのがこれです。
https://twitter.com/FX180507/status/1572156118226255872?s=20&t=KIEqK_hNa7h8Hdkg8c9WXA
ラルフ・ビンスの悲観的リターンレシオ(PRR)
ラルフ・ビンス(著)「投資家のためのマネーマネジメント」(パンローリング)の中で紹介されている悲観的リターンレシオの計算式です。考え方は同じでこちらの式は上の悲観的リターンレシオより少し楽観的な数値が出ます。どちらがいいかはお好みで。
#include <Math\Stat\Math.mqh>
//+------------------------------------------------------------------+
//| OnTester |
//+------------------------------------------------------------------+
input group "●--カスタム指標--●"
input bool Carry = true; // 最適化するときに計算結果に100をかける
//+------------------------------------------------------------------+
//| 悲観的リターンレシオ(PRR)
//+------------------------------------------------------------------+
double OnTester()
{
const int dig = 2; // ←悲観的リターンレシオを小数点以下何桁まで表示するか
double PT = 0, LT = 0, PRR = 0;
//--- 勝トレード数と負トレード数
PT = TesterStatistics(STAT_PROFIT_TRADES);
LT = TesterStatistics(STAT_LOSS_TRADES);
//--- 悲観的リターンレシオの計算
PT = (PT - sqrt(PT)) * (TesterStatistics(STAT_GROSS_PROFIT) / PT);
LT = (LT + sqrt(LT)) * (-TesterStatistics(STAT_GROSS_LOSS) / LT);
PRR = PT / LT;
//--- 桁数の設定
PRR = MathRound(PRR, dig);
//--- 最適化のときにのみ結果に100をかける(MT5のバグ対策)
if(Carry == true && MQLInfoInteger(MQL_OPTIMIZATION))
PRR *= 100;
return PRR;
}