您的位置:

移动平均数的详细阐述

一、什么是移动平均数

移动平均数是指在一定时期内,求出一组数值的平均值,并将这组数据的最早的一个值去掉,再加上一个最新的数值,再求新的平均值的一种数学计算方法。

以股市为例,移动平均数被广泛应用于股票价格的分析,可以帮助投资者更加准确地预测股票价格的走势。

二、移动平均数的计算方法

移动平均数的计算方法可以分为简单移动平均数(SMA)和指数移动平均数(EMA)两种。

1. 简单移动平均数

简单移动平均数的计算方法比较简单,只需要将一段时间内的所有数据相加,再除以这个时间段的长度即可。

def sma(data, n):
    """
    data: 数据列表
    n: 时间段长度
    """
    sma_list = []
    for i in range(n-1, len(data)):
        sma = sum(data[i-n+1:i+1])/n
        sma_list.append(sma)
    return sma_list

2. 指数移动平均数

指数移动平均数是对简单移动平均数的一种改进方法,它主要依赖于前一个时间段内的平均数以及最新的数据,计算公式为:EMA(今)=2/(N+1)*(收盘价-昨日EMA)+昨日EMA。

def ema(data, n):
    """
    data: 数据列表
    n: 时间段长度
    """
    ema_list = []
    sma_sum = sum(data[:n])/n
    multiplier = 2/(n+1)
    ema_list.append(sma_sum)
    for i in range(n, len(data)):
        ema = (data[i] - ema_list[-1]) * multiplier + ema_list[-1]
        ema_list.append(ema)
    return ema_list

三、移动平均数的应用

1. 股票价格的分析

股票价格的走势受多种因素影响,使用移动平均数可以消除价格波动的短期噪音,更好地观察长期趋势。

2. 简单预测模型

使用移动平均数可以构建简单的预测模型,预测某个时间段内的数据走势。

def simple_model(data, n):
    """
    data: 数据列表
    n: 时间段长度
    """
    model_list = []
    for i in range(n-1, len(data)):
        model = data[i] - data[i-n]
        model_list.append(model)
    return model_list

3. 数据平滑处理

移动平均数可以用于数据平滑处理,特别是对于一些噪声比较严重的数据,可以通过移动平均数来平滑曲线,减少数据的误差。

四、移动平均数的优化

为了提高移动平均数的准确度,可以对其进行优化,如加权移动平均数(WMA)、自适应移动平均数(AMA)等。

1. 加权移动平均数

加权移动平均数是对简单移动平均数的改进,它采用不同的权重系数来平衡数据的不同影响程度,计算方法为将每个数据乘以对应的权重系数后再求和除以权重和。

def wma(data, weights):
    """
    data: 数据列表
    weights: 权重系数列表
    """
    wma_list = []
    n = len(weights)
    for i in range(n-1, len(data)):
        wma = sum([weights[j]*data[i-j] for j in range(n)])/sum(weights)
        wma_list.append(wma)
    return wma_list

2. 自适应移动平均数

自适应移动平均数是对指数移动平均数的改进,它可以根据数据的波动性自适应地调整参数,从而提高预测的准确度。

def ama(data, fast, slow, threshold):
    """
    data: 数据列表
    fast: 快速移动平均数的时间段
    slow: 慢速移动平均数的时间段
    threshold: 阈值
    """
    ama_list = []
    diff_sum = [0]*(slow-1)
    for i in range(slow-1, len(data)):
        if i == slow-1:
            diff_sum[i] = sum([data[j] for j in range(i-slow+1, i+1)])/slow
        else:
            diff_fast = 2/(fast+1)*(data[i]-ama_list[-1])+ama_list[-1]
            diff_slow = 2/(slow+1)*(data[i]-ama_list[-1])+ama_list[-1]
            diff = diff_fast - diff_slow
            if abs(diff) < threshold:
                diff_sum[i] = diff_sum[i-1] + diff
            else:
                diff_sum[i] = diff_sum[i-1]
            diff_ama = 2/(slow+1)*diff_sum[i] + ama_list[-1]
            ama_list.append(diff_ama)
    return ama_list