首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP中的简单移动平均-错误

PHP中的简单移动平均-错误
EN

Stack Overflow用户
提问于 2014-12-01 22:34:20
回答 1查看 6.2K关注 0票数 1

以下代码中的sma计算似乎存在错误...谁能指出哪里..。

/** *简单移动平均**

移动平均值是一个指标,它显示了一段时间内证券价格的平均值。当计算移动平均值时,对预定时间段内证券的平均值进行数学分析。随着证券价格的变化,它的平均价格会上下浮动。

**

简单的或算术的移动平均值是通过将证券的收盘价相加若干时间段(例如,12天),然后将该总数除以时间段数来计算的。结果是证券在一段时间内的平均价格。简单的移动平均线给予每个每日价格相同的权重。

**

公式:

**-SUM(结束于n个周期)/n */

代码语言:javascript
复制
<?php 
$data = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);

class sma
{
/**
 * @var double[]
 */
private $sma;
/**
 * @param double[] $data
 * @param int $range
 * @return double[]
 */
function get( $data, $range )
{
    $position = 0;
    while ( empty( $data[ $position ] ) ) {
        $position++;
    }
    $i = $position;
    while ( true ) {
        if ( empty( $data[ $i + $range - 1 ] ) ) {
            break;
        }
        $temp_sum = 0;
        for ( $j = $i; $j < $i + $range; $j++ ) {
            $temp_sum += $data[ $j ];
        }
        $this->sma[ $i + $range - 1 ] = $temp_sum / $range;
        $i++;
    }
    return $this->sma;
}
}

$mysma = new sma();
$mysma->get($data,5); $sma = $mysma->get();
echo mysma;

?>

此外,在其他代码中的sma计算似乎更容易。这里有几个例子..如果有人在php中做过类似的..??

代码语言:javascript
复制
(defn moving-average
[coll n]
(cond
(< n 1) nil
(= n 1) coll
:else   (let [sums (reductions + 0 coll)]
          (map #(/ (- %1 %2) n) (drop n sums) sums))))

(time (doall (moving-average coll n)))
# "Elapsed time: 9.184 msecs"

还有这个..。

代码语言:javascript
复制
double[] MovingAverage(int period, double[] source)
{
    var ma = new double[source.Length];

    double sum = 0;
    for (int bar = 0; bar < period; bar++)
        sum += source[bar];

    ma[period - 1] = sum/period;

    for (int bar = period; bar < source.Length; bar++)
        ma[bar] = ma[bar - 1] + source[bar]/period
                              - source[bar - period]/period;

    return ma;
}
EN

回答 1

Stack Overflow用户

发布于 2014-12-01 22:56:05

以下是基于您问题中的最后一段代码的翻译:

代码语言:javascript
复制
function get(array $data, $range)
{
    $sum = array_sum(array_slice($data, 0, $range));

    $result = array($range - 1 => $sum / $range);

    for ($i = $range, $n = count($data); $i != $n; ++$i) {
        $result[$i] = $result[$i - 1] + ($data[$i] - $data[$i - $range]) / $range;
    }

    return $result;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27230638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档