下面的代码中的sma计算似乎有错误...有人可以指出...
/ ** *简单移动平均线(sma) * *
移动平均线是一个指标,显示一段时间内证券价格的平均值。当计算移动平均值时,进行在预定时间段内安全性的平均值的数学分析。随着证券价格的变化,其平均价格会上涨或下跌。
* *通过将证券的收盘价加上若干时间段(例如12天)然后将该总额除以时间段数来计算简单或算术移动平均线。结果是该时间段内证券的平均价格。简单的移动平均线给予每日价格相同的权重。
* *公式:
* * - SUM(n期结束)/ n * /
<?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中做过同样的事情...... ??
(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"
也是这个......
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;
}
答案 0 :(得分:1)
这是基于您问题中最后一段代码的翻译:
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;
}