Я использую PHP и недавно начал использовать расширение технического анализа TA-LIB рассчитать показатели по данным о ценах акций. Я получаю странный результат по одному из самых простых показателей: простая скользящая средняя, и я не выяснил причину. Я разместил аналогичный вопрос на форуме TA-LIB, но активность там очень низкая, и я подозреваю, что я не смогу получить ответ в течение длительного времени, если вообще будет.
SMA вычисляет среднее значение на основе заданного количества предыдущих ценовых точек. Проблема, которую я имею, лучше всего иллюстрируется на примере. Допустим, у меня есть набор из 10 ценовых точек, и я хотел бы рассчитать SMA. Для простоты давайте используем среднее значение 4. При расчете этого значения мы ожидаем новый набор из 7 средних значений. Однако TA-LIB возвращает 4, как показано ниже:
$sma=trader_sma($close,4);
echo"<pre>";
print_r($sma);
Array
(
[0] => Array
(
[0] =>
[1] => 0
[2] =>
)
[1] => Array
(
[0] =>
[1] => 1
[2] =>
)
[2] => Array
(
[0] =>
[1] => 2
[2] =>
)
[3] => Array
(
[0] =>
[1] => 3
[2] => 573.267
)
[4] => Array
(
[0] =>
[1] => 4
[2] => 565.307
)
[5] => Array
(
[0] =>
[1] => 5
[2] => 560.552
)
[6] => Array
(
[0] =>
[1] => 6
[2] => 557.382
)
)
Как вы можете видеть, мы получаем нулевые значения в начале набора, как и ожидалось. Однако в конце мы пропускаем точки данных, а число пропущенных точек всегда соответствует количеству точек, по которым я усредняю. Это вызывает неестественный разрыв в конце, когда я строю скользящее среднее против моих ценовых данных.
Есть идеи о том, что происходит?
Оказывается, я сделал глупую ошибку, что неудивительно. Я на самом деле написал свою собственную функцию:
function sma($array,$averagenr){
$length=count($array);
if($length<$averagenr)return(null);
$sma_result=array();
for ($x=1;$x<$averagenr;$x++){
array_push($sma_result,array('',$x,null));
}
for ($x=$averagenr;$x<$length+1;$x++){
$sum=0;
for ($counter=$x-$averagenr;$counter<$x;$counter++){
$sum=$sum+$array[$counter];
}
$avg=$sum/$averagenr;
array_push($sma_result,array('',$x,$avg));
}
return($sma_result);}
echo "<pre>";
print_r(sma($close,4));
Работает нормально, но сравнивая результаты с результатами TA-LIB, я понял, что проблема заключается в синтаксический анализ ошибок Я сделал с результатами TA-LIBs. Таким образом, вопрос, который я изначально задал, недействителен. Простая ошибка, много времени, но приятно знать, что TA-LIB работает так, как я хочу.
Других решений пока нет …