public static function CalcAllStats1($returnTarget, $returnBenchmark) { // initialize the variables $returnCount = 0; $sumTarget = 0.0; $sumBench = 0.0; $sumTargetMinusBench = 0.0; $sumTargetTimesBench = 0.0; $sumBenchMinusTargetOnBadDays = 0.0; $sumBenchMinusTargetSquaredOnBadDays = 0.0; $sumTargetSquared = 0.0; $sumBenchSquared = 0.0; $returnTargetCumulative = 1.0; $returnBenchCumulative = 1.0; $countGoodDays = 0; $returnMax = -10000.0; $returnMin = 10000.0; $varianceTarget = 0.0; $varianceBench = 0.0; $varianceTargetMinusBench = 0.0; // do the first loop foreach ($returnTarget as $r) { $sumTarget += $r; $sumBench += $returnBenchmark[$returnCount]; $returnTargetCumulative *= $r; $returnBenchCumulative *= $returnBenchmark[$returnCount]; $sumTargetMinusBench += $r - $returnBenchmark[$returnCount]; $sumTargetTimesBench += $r * $returnBenchmark[$returnCount]; $sumTargetSquared += pow($r, 2); $sumBenchSquared += pow($returnBenchmark[$returnCount], 2); if ($r > $returnBenchmark[$returnCount]) { // A good day $countGoodDays++; } if ($r < 1) { //threshold = 0 $sumBenchMinusTargetOnBadDays += $returnBenchmark[$returnCount] - $r; $sumBenchMinusTargetSquaredOnBadDays += pow($returnBenchmark[$returnCount] - $r, 2); } if ($r > $returnMax) { $returnMax = $r; } if ($r < $returnMin) { $returnMin = $r; } $returnCount++; } if ($returnCount > 1) { // calculate some figures $returnTargetCumulative -= 1.0; $returnBenchCumulative -= 1.0; $averageTarget = $sumTarget / $returnCount; $averageBench = $sumBench / $returnCount; $averageTargetMinusBench = $sumTargetMinusBench / $returnCount; $averageBenchMinusTargetOnBadDays = $sumBenchMinusTargetOnBadDays / $returnCount; $averageBenchMinusTargetSquaredOnBadDays = $sumBenchMinusTargetSquaredOnBadDays / $returnCount; $covarTargetBench = ($sumTargetTimesBench - $sumTarget * $sumBench / $returnCount) / ($returnCount - 1); // second loop $i = 0; foreach ($returnTarget as $r) { $varianceTarget += pow($r - $averageTarget, 2); $varianceBench += pow($r - $averageBench, 2); $varianceTargetMinusBench += pow($r - $averageBench - $averageTargetMinusBench, 2); $i++; } // calculate the output $varianceTarget /= $returnCount - 1; $varianceBench /= $returnCount - 1; $varianceTargetMinusBench /= $returnCount - 1; $volTarget = sqrt($varianceTarget) * sqrt(240); $volBench = sqrt($varianceBench) * sqrt(240); $volTargetMinusBench = sqrt($varianceTargetMinusBench) * sqrt(240); if ($varianceBench == 0) { $beta = 0; } else { $beta = $covarTargetBench / $varianceBench; } if ($volTarget > 0) { $sharpe = $returnTargetCumulative / $volTarget; } else { $sharpe = 0; } $alpha = $averageTarget - $beta * $averageBench; if ($beta == 0) { $treynor = 0; } else { $treynor = $returnTargetCumulative / $beta; } $trackingError = $volTargetMinusBench; if ($volTargetMinusBench > 0) { $infoQuota = ($returnTargetCumulative - $returnBenchCumulative) / $volTargetMinusBench; } else { $infoQuota = 0; } $consistency = $countGoodDays / $returnCount; $x = pow(($returnCount * $sumTargetSquared - pow($sumTarget, 2)) * ($returnCount * $sumBenchSquared - pow($sumBench, 2)), 1 / 2); //$x = pow(($returnCount*$sumTargetTimesBench-$sumTarget*$sumBench)/pow(($returnCount*$sumTargetSquared-pow($sumTarget,2))*($returnCount*$sumBenchSquared-pow($sumBench,2)),1/2),2); if ($x > 0) { $R2 = pow(($returnCount * $sumTargetTimesBench - $sumTarget * $sumBench) / $x, 2); } else { $R2 = 0; } if ($averageBenchMinusTargetOnBadDays == 0) { $omega = 0; $sortino = 0; // "Div/Null!"; } else { $omega = 1 + $averageTargetMinusBench / $averageBenchMinusTargetOnBadDays; $sortino = $averageTargetMinusBench / pow($averageBenchMinusTargetOnBadDays, 1 / 2); } $VaR = $averageTargetMinusBench + $volTarget * PHPExcel_Calculation_Statistical::NORMSINV(0.01); //$VaR=$averageTargetMinusBench+$volTarget*$this->inverse_ncdf(0.01); } else { $volTarget = 0; $sharpe = 0; $beta = 0; $treynor = 0; $trackingError = 0; $infoQuota = 0; $consistency = 0; $R2 = 0; $VaR = 0; $averageTarget = 1; $returnMax = 1; $returnMin = 1; $sortino = 0; $omega = 0; $averageTargetMinusBench = 0; $averageBenchMinusTargetOnBadDays = 0; } return array($volTarget, $sharpe, $alpha, $beta, $treynor, $trackingError, $infoQuota, $consistency, $R2, $VaR, $averageTarget - 1, $returnMax - 1, $returnMin - 1, $sortino, $omega, $averageTargetMinusBench, $averageBenchMinusTargetOnBadDays); }