我想用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函数无法正常工作。 任何帮助都将非常感激。
答案 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 中的文章作为基准
并编写一个简单的测试脚本,比较@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。