Esempio n. 1
0
 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);
 }