欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 移动平均法是一种常用的技术分析工具,用于平滑时间序列数据,减少短期波动的影响,从而更容易识别出长期趋势

移动平均法是一种常用的技术分析工具,用于平滑时间序列数据,减少短期波动的影响,从而更容易识别出长期趋势

2025/2/24 4:05:05 来源:https://blog.csdn.net/wangqiaowq/article/details/143237450  浏览:    关键词:移动平均法是一种常用的技术分析工具,用于平滑时间序列数据,减少短期波动的影响,从而更容易识别出长期趋势

移动平均法是一种常用的技术分析工具,用于平滑时间序列数据,减少短期波动的影响,从而更容易识别出长期趋势。简单移动平均(Simple Moving Average, SMA)是最基本的一种移动平均法。

简单移动平均(SMA)的原理

简单移动平均是在一个固定的窗口内计算数据点的平均值。具体来说,对于一个窗口大小为 n 的简单移动平均,第 t 天的SMA值计算公式如下:

SMA𝑡=∑𝑖=𝑡−𝑛+1𝑡value𝑖𝑛SMAt​=n∑i=t−n+1t​valuei​​

其中:

  • value_i 是第 i 天的数据值。
  • n 是窗口大小。

具体步骤

  1. 选择窗口大小:窗口大小 n 是一个重要的参数,通常根据数据的特性和分析需求来选择。较小的窗口大小对短期波动更敏感,较大的窗口大小则更平滑,但可能会延迟趋势的识别。

  2. 计算SMA:对于每个数据点,计算其窗口内的平均值。如果数据点的数量少于窗口大小,则直接使用原始数据。

  3. 平滑后的数据:将计算得到的SMA值作为新的数据点,形成平滑后的数据序列

import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;public class DataAnalyzer {/*** 预测未来趋势的方法。** @param xAxisDatas 时间轴数据,例如 ["2024-06", "2024-07", "2024-08", "2024-09", "2024-10"]* @param seriesDatas 数值数据,例如 [0, 0, 40500, 0, 0]* @param indicator 指标名称,例如 "销售额"* @return 预测结果字符串*/public static String predictTrend(List<String> xAxisDatas, List<BigDecimal> seriesDatas, String indicator) {// 输入验证if (xAxisDatas == null || seriesDatas == null || indicator == null ||xAxisDatas.size() != seriesDatas.size() || xAxisDatas.isEmpty()) {return "";}// 使用简单移动平均法平滑数据List<BigDecimal> smoothedSeries = simpleMovingAverage(seriesDatas, 3);int riseCount = 0; // 上升次数int fallCount = 0; // 下降次数int flatCount = 0; // 平稳次数// 获取最后五个数据点的趋势,如果数据点少于5个,则取所有数据点int dataSize = Math.min(smoothedSeries.size(), 5);for (int i = 0; i < dataSize - 1; i++) {BigDecimal current = smoothedSeries.get(smoothedSeries.size() - 1 - i);BigDecimal next = smoothedSeries.get(smoothedSeries.size() - 2 - i);if (current.compareTo(next) > 0) { // 当前值大于下一个值,表示上升riseCount++;} else if (current.compareTo(next) < 0) { // 当前值小于下一个值,表示下降fallCount++;} else { // 当前值等于下一个值,表示平稳flatCount++;}}String timePeriod = "一个周期"; // 假设分析的时间周期// 趋势判断int totalPoints = dataSize - 1;int flatThreshold = totalPoints / 2;if (riseCount >= 3 || (riseCount > fallCount && flatCount <= flatThreshold)) {return "根据您查询的数据分析,未来" + timePeriod + "的" + indicator + "可能会持续上升。";} else if (fallCount >= 3 || (fallCount > riseCount && flatCount <= flatThreshold)) {return "根据您查询的数据分析,未来" + timePeriod + "的" + indicator + "可能会持续下降。";} else {return "根据您查询的数据分析,未来" + timePeriod + "的" + indicator + "趋势不确定。";}}/*** 计算简单移动平均值。** @param seriesDatas 原始数值数据* @param windowSize 窗口大小* @return 平滑后的数据列表*/private static List<BigDecimal> simpleMovingAverage(List<BigDecimal> seriesDatas, int windowSize) {if (windowSize <= 0 || seriesDatas.size() < windowSize) {return seriesDatas;}List<BigDecimal> smoothedSeries = new java.util.ArrayList<>();for (int i = 0; i < seriesDatas.size(); i++) {if (i < windowSize - 1) {smoothedSeries.add(seriesDatas.get(i)); // 不足窗口大小时,直接使用原始数据} else {BigDecimal sum = seriesDatas.subList(i - windowSize + 1, i + 1).stream().reduce(BigDecimal.ZERO, BigDecimal::add);BigDecimal average = sum.divide(BigDecimal.valueOf(windowSize), BigDecimal.ROUND_HALF_UP);smoothedSeries.add(average);}}return smoothedSeries;}public static void main(String[] args) {// 示例数据List<String> xAxisDatas = List.of("2024-06", "2024-07", "2024-08", "2024-09", "2024-10");List<BigDecimal> seriesDatas = List.of(new BigDecimal("0"),new BigDecimal("0"),new BigDecimal("40500"),new BigDecimal("0"),new BigDecimal("0"));String indicator = "销售额";// 调用预测方法String result = predictTrend(xAxisDatas, seriesDatas, indicator);System.out.println(result);}
}

详细解释

  1. 输入验证

    • 检查 xAxisDatas 和 seriesDatas 是否为空或大小不一致。
    • 检查 xAxisDatas 是否为空。
  2. 平滑数据

    • 使用 simpleMovingAverage 方法计算简单移动平均值,窗口大小为3。
    • simpleMovingAverage 方法中,如果当前索引小于窗口大小减1,则直接使用原始数据;否则,计算窗口内的平均值。
  3. 趋势计算

    • 循环遍历最后 dataSize 个数据点,计算上升、下降和平稳的次数。
    • 使用 compareTo 方法比较当前值和下一个值,确定是上升、下降还是平稳。
  4. 趋势判断

    • 计算总的数据点数 totalPoints
    • 计算平稳次数的阈值 flatThreshold,即总数据点数的一半。
    • 如果上升次数大于等于3,或者上升次数大于下降次数,并且平稳次数不超过阈值,则判断为上升趋势。
    • 如果下降次数大于等于3,或者下降次数大于上升次数,并且平稳次数不超过阈值,则判断为下降趋势。
    • 否则,判断为趋势不确定。

平滑后的数据计算

  • 窗口大小为3
  • 2024-06: 0(不足窗口大小,直接使用原始数据)
  • 2024-07: 0(不足窗口大小,直接使用原始数据)
  • 2024-08: (0 + 0 + 40500) / 3 = 13500
  • 2024-09: (0 + 40500 + 0) / 3 = 13500
  • 2024-10: (40500 + 0 + 0) / 3 = 13500

趋势计算

  • 2024-06 到 2024-07: 0 到 0 → 平稳
  • 2024-07 到 2024-08: 0 到 13500 → 上升
  • 2024-08 到 2024-09: 13500 到 13500 → 平稳
  • 2024-09 到 2024-10: 13500 到 13500 → 平稳

结论

  • 上升次数:1
  • 下降次数:0
  • 平稳次数:3
  • 总数据点数:4
  • 平稳次数阈值:2

根据上述逻辑,平稳次数(3)超过了阈值(2),因此结论应该是“未来一个周期的销售额趋势不确定”。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词