一、什么是移动平均数
移动平均数是指在一定时期内,求出一组数值的平均值,并将这组数据的最早的一个值去掉,再加上一个最新的数值,再求新的平均值的一种数学计算方法。
以股市为例,移动平均数被广泛应用于股票价格的分析,可以帮助投资者更加准确地预测股票价格的走势。
二、移动平均数的计算方法
移动平均数的计算方法可以分为简单移动平均数(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