php中的指数移动平均线

时间:2016-09-12 06:48:12

标签: php math exponential weighted-average

我想用PHP计算EMA(指数移动平均线)值。

我尝试使用以下代码,但它给了我500个错误。

$real = array(12,15,17,19,21,25,28,12,15,16);
$timePeriod = 3;
$data = trader_ema($real,$timePeriod);
var_dump($data);

PHP:EMA计算函数trader-ema

长时间使用谷歌搜索但没有在PHP中获得任何帮助。所以,我不知道在计算EMA值时需要做些什么。

编辑-1:已安装的附加信息

我已经安装了所有必要的扩展,现在我得到了输出。 但它似乎没有提供适当的输出。

我认为用于计算EMA的PHP函数无法正常工作。 任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:1)

我建议使用以下数学库: https://github.com/markrogoyski/math-php

public static function exponentialMovingAverage(array $numbers, int $n): array
{
     $m   = count($numbers);
     $α   = 2 / ($n + 1);
     $EMA = [];

     // Start off by seeding with the first data point
     $EMA[] = $numbers[0];

     // Each day after: EMAtoday = α⋅xtoday + (1-α)EMAyesterday
     for ($i = 1; $i < $m; $i++) {
        $EMA[] = ($α * $numbers[$i]) + ((1 - $α) * $EMA[$i - 1]);
     }

     return $EMA;
}

答案 1 :(得分:0)

PHP 的交易者扩展实际上看起来很有前途。底层代码看起来非常成熟,我在撰写本文时注意到最新的稳定 PHP 模块 (0.5.1) 于今年年初发布,支持 PHP8。

可能需要阅读一些 documentation,例如围绕 trader_set_unstable_period 和上帝保佑的 trader source code 的注释才能精通。

如果我在 PHP Docker container

中快速安装交易者模块
apt-get update
pecl install trader
docker-php-ext-enable trader

使用 here 中的文章作为基准

ema-benchmark-numbers

并编写一个简单的测试脚本,比较@Tryke 和 trader_ema

提供的函数
function exponentialMovingAverage(array $numbers, int $n): array
{
     $m   = count($numbers);
     $α   = 2 / ($n + 1);
     $EMA = [];

     // Start off by seeding with the first data point
     $EMA[] = $numbers[0];

     // Each day after: EMAtoday = α⋅xtoday + (1-α)EMAyesterday
     for ($i = 1; $i < $m; $i++) {
        $EMA[] = ($α * $numbers[$i]) + ((1 - $α) * $EMA[$i - 1]);
     }

     return $EMA;
}

function merge_results($input, $avgs) {
    $results = [];
    $empty = count($input) - count($avgs);
    foreach($input as $i => $price) {
        $results[] = $i < $empty ? [$price, null] : [$price, round($avgs[$i], 2)];
    }
    return $results;
}

$real = [
    22.27,
    22.19,
    22.08,
    22.17,
    22.18,
    22.13,
    22.23,
    22.43,
    22.24,
    22.29,
    22.15,
    22.39,
    22.38,
    22.61,
    23.36,
    24.05,
    23.75,
    23.83,
    23.95,
    23.63,
    23.82,
    23.87,
    23.65,
    23.19,
    23.10,
    23.33,
    22.68,
    23.10,
    22.40,
    22.17
];

$timePeriod = 10;
$traderData = trader_ema($real,$timePeriod);
echo "trader ema\n";
var_dump(merge_results($real, $traderData));


$phpData = exponentialMovingAverage($real, 3);
echo "\n\nphp ema\n";
var_dump(merge_results($real, $phpData));

trader_ema 的结果完全匹配。 Tryke 函数的结果没有。它似乎从第一天开始就有结果,而我的期望(以及 trader_ema 和基准数字的输出反映)是在 $timePeriod 过去之前没有结果。请参阅 Investopedia article on EMA

中的此注释 <块引用>

计算 EMA 需要比 SMA 多一项观察。 假设您想使用 20 天作为观察次数 EMA。然后,您必须等到第 20 天才能获得 SMA。在 第 21 天,您可以使用前一天的 SMA 作为 昨天的第一个 EMA。