В TA-LIB отсутствуют точки данных при расчете простой скользящей средней

Я использую 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
    )

)

Как видите, мы получаем нули в начале набора, как и ожидалось. Однако в конце нам не хватает точек данных, а количество отсутствующих точек данных всегда соответствует количеству точек данных, по которым я усредняю. Это приводит к неестественному разрыву в конце, когда я строю скользящую среднюю по своим ценовым данным.

Любые идеи о том, что происходит?


person Fullminster    schedule 18.10.2014    source источник


Ответы (1)


Оказывается, я сделал глупую ошибку, что неудивительно. Я на самом деле написал свою собственную функцию:

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-LIB. Таким образом, вопрос, который я изначально задал, недействителен. Простая ошибка, пустая трата времени, но приятно знать, что TA-LIB работает так, как я хочу.

person Fullminster    schedule 18.10.2014
comment
Для теста идеально подходит =) assertEquals(trader_sma($close, 4), sma($close, 4)); - person Jens A. Koch; 21.10.2014