时间序列分析方法之 -- 移动平均(Moving Average)原理及Python代码示例

目录

 

原理

适用情况

Python 示例代码

结论


 

原理

移动平均(Moving Average, MA)是一种常用的时间序列分析和数据平滑方法。其基本思想是通过取时间序列中某个时间窗口内数据的平均值来消除短期波动,从而更好地揭示数据的长期趋势。根据取平均值的方式不同,移动平均可以分为简单移动平均(Simple Moving Average, SMA)、加权移动平均(Weighted Moving Average, WMA)和指数移动平均(Exponential Moving Average, EMA)等。

  1. 简单移动平均(SMA) 简单移动平均是最基本的移动平均方法,其计算方式是取指定窗口内的数据点的简单平均值。

    eq?text%7BSMA%7D%28t%29%20%3D%20%5Cfrac%7B1%7D%7BN%7D%20%5Csum_%7Bi%3D0%7D%5E%7BN-1%7D%20x%28t-i%29

    其中,x(t)x(t)x(t) 是时间序列在时间 ttt 的值, NNN 是窗口大小。

  2. 加权移动平均(WMA) 加权移动平均在计算平均值时为每个数据点赋予不同的权重,通常是靠近当前时间点的数据点权重较大。

    eq?%5Ctext%7BWMA%7D%28t%29%20%3D%20%5Cfrac%7B%5Csum_%7Bi%3D0%7D%5E%7BN-1%7D%20w_i%20%5Ccdot%20x%28t-i%29%7D%7B%5Csum_%7Bi%3D0%7D%5E%7BN-1%7D%20w_i%7D

    其中, eq?w_i​ 是权重,通常满足 eq?w_0%20%3E%20w_1%20%3E%20%5Ccdots%20%3E%20w_%7BN-1%7D​。

  3. 指数移动平均(EMA) 指数移动平均是一种递归计算的移动平均方法,其特点是对最新数据点赋予更大的权重。其计算公式为:

    eq?%5Ctext%7BEMA%7D%28t%29%20%3D%20%5Calpha%20x%28t%29%20+%20%281%20-%20%5Calpha%29%20%5Ctext%7BEMA%7D%28t-1%29

    其中, α 是平滑系数,取值范围为 0<α<1。

适用情况

  1. 简单移动平均(SMA)

    • 适用于需要平滑短期波动并揭示长期趋势的情况。
    • 适合处理周期性较弱、波动较小的时间序列数据。
  2. 加权移动平均(WMA)

    • 适用于需要对最近数据点赋予更高权重的情况。
    • 常用于金融市场中的技术分析。
  3. 指数移动平均(EMA)

    • 适用于需要对最新数据点反应更敏感的情况。
    • 常用于金融市场中的短期预测和交易策略。

Python 示例代码

以下是一些使用 Python 实现移动平均的方法及示例代码:

  1. 简单移动平均(SMA)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 生成样本数据
np.random.seed(0)
data = np.random.randn(100).cumsum()

# 计算简单移动平均
window_size = 5
sma = pd.Series(data).rolling(window=window_size).mean()

# 可视化结果
plt.figure(figsize=(12, 6))
plt.plot(data, label='Original Data')
plt.plot(sma, label='SMA', linewidth=2)
plt.legend()
plt.title('Simple Moving Average')
plt.show()
  1. 加权移动平均(WMA)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 生成样本数据
np.random.seed(0)
data = np.random.randn(100).cumsum()

# 计算加权移动平均
window_size = 5
weights = np.arange(1, window_size + 1)
wma = pd.Series(data).rolling(window=window_size).apply(lambda x: np.dot(x, weights) / weights.sum(), raw=True)

# 可视化结果
plt.figure(figsize=(12, 6))
plt.plot(data, label='Original Data')
plt.plot(wma, label='WMA', linewidth=2)
plt.legend()
plt.title('Weighted Moving Average')
plt.show()
  1. 指数移动平均(EMA)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 生成样本数据
np.random.seed(0)
data = np.random.randn(100).cumsum()

# 计算指数移动平均
span = 20
ema = pd.Series(data).ewm(span=span, adjust=False).mean()

# 可视化结果
plt.figure(figsize=(12, 6))
plt.plot(data, label='Original Data')
plt.plot(ema, label='EMA', linewidth=2)
plt.legend()
plt.title('Exponential Moving Average')
plt.show()

 

结论

移动平均是一种有效的时间序列平滑和分析方法,通过不同的加权方式可以适应各种不同的数据特性和分析需求。简单移动平均适合平滑短期波动并揭示长期趋势;加权移动平均和指数移动平均则适合对最新数据点赋予更高权重,从而对变化更为敏感。在实际应用中,选择合适的移动平均方法应根据具体数据的特性和分析目标进行权衡和调整。

 

 

 

移动平均法是一种常用的时间序列分析方法,用于平滑数据并预测未来的趋势。在Python中,可以使用移动平均方法来计算数据的平均值。 移动平均法有两种形式:居中移动平均和截尾移动平均。居中移动平均是指在给定的窗口大小内,将数据平均分布在窗口的中心。而截尾移动平均则是将数据平均分布在窗口的末尾。 for i in range(window)] test = [X[i for i in range(window, len(X))] predictions = [] # 预测模型 for t in range(len(test)): length = len(history) yhat = np.mean([history[i for i in range(length - window, length)]) predictions.append(yhat) history.append(test[t]) print('predicted=%f, expected=%f' % (yhat, test[t])) # 计算均方误差 error = mean_squared_error(test, predictions) print('Test MSE: %f' % error) # 绘制图表 plt.figure(figsize=(15, 7)) plt.plot(test) plt.plot(predictions, 'r') plt.show() ``` 以上代码将根据历史数据预测未来的观测值,并计算预测误差。最后,将绘制原始数据和预测结果的图表。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【时间序列】时序分析之移动平均-python实战](https://blog.csdn.net/qq_33431368/article/details/119495438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值