我制作了这个函数,它应该采用一组价格数据并计算一组月度回报。这个想法是应该能够应对不规则的时间间隔。例如,我有标准普尔 500 指数的每日数据,但许多对冲基金只每月发布价格数据。
这是我想出的:
//Turns a price series into an array of monthly returns.
function monthlyReturns($dates, $prices, $startDate = "", $endDate = ""){
if ($endDate == "") $endDate = time();
if (count($dates) != count($prices)){
die("The dates array must be the same length as the prices array");
}
$i = 0; $firstPass = false;
foreach ($dates as $date){
$d = strtotime($date);
if ($startDate == "" || ($d >= $startDate && $d <= $endDate )) :
$p = $prices[$i];
$month = date('M',$d);
$year = date('Y',$d);
if ($i == 0 || $firstPass == false){
$startPrice = $p;
$lastMonth = $month;
}
if ($month != $lastMonth && $i != 0){
$returnTable['date'][] = $dates[$i-1];
$returnTable['return'][] = $p / $startPrice - 1;
$startPrice = $p;
}
$lastMonth = $month;
$firstPass = true;
endif;
$i++;
}
return $returnTable;
}
我注意到,对于只有月度数据的基金,回报率下降了一个月。任何人都可以看到此功能的任何重大缺陷,可以解释这一点或解决它的解决方案。
有关信息,对冲基金的月度回报通常在月底附近。例如
date | Price
-----------------
2013-01-29 | 25.69
2013-02-28 | 27.62
2013-03-30 | 26.53
2013-04-29 | 28.45