PHP中的指数移动平均

3
我想在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函数不能正常工作。 如果有任何帮助,将不胜感激。


3
500 是一个通用的错误代码。请检查日志以获取确切的错误消息并更新问题。可能是交易员扩展没有安装:http://php.net/manual/en/trader.installation.php - Alex Blex
谢谢你的负评,能解释一下吗? - Mohit Tanwani
@加载中.. 你删除了我的答案吗? - Patrick Mlr
@加载中,请在问题中添加期望输出和实际输出。 - Alex Blex
显示剩余4条评论
2个回答

6
我建议使用以下数学库: 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
PHP的交易扩展看起来很有前途。底层代码非常成熟,我注意到在撰写本文时,最新的稳定PHP模块(0.5.1)于今年年初发布,并支持PHP8。
可能需要阅读一些文档,例如关于trader_set_unstable_period的说明以及天哪,交易者源代码,以提高熟练程度。
如果我在PHP Docker容器中快速安装交易者模块。
apt-get update
pecl install trader
docker-php-ext-enable trader

使用这里的文章作为基准

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关于EMA文章中的注释:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接