时间序列基础-序列分解与序列预测

本文详细介绍了时间序列分析的基础知识,包括非季节性和季节性时间序列的分解,以及ARIMA等预测模型。通过Python代码展示了如何运用SMA、WMA进行数据平滑,以及如何利用statsmodels库进行季节性分解。同时,文章还探讨了时间序列的平稳性转换、差分方法,并用AR、MA、ARMA模型进行序列预测,最后给出了预测代码示例。

时间序列分析就是发现时间序列的变动规律并使用该规律来预测的统计技术。时间序列分析基于以下三个假设:

  1. 假设事物发展规律趋势会延续到未来。
  2. 预测所依据的数据没有不规则性。
  3. 不考虑事物发展之间的因果关系。

时间序列分析主要包括两方面内容:第一是序列分解;第二是序列预测

代码及数据地址:https://github.com/SeafyLiang/machine_learning_study/tree/master/time_series

一、时间序列分解

一个时间序列包含三种影响因素:

  1. 长期趋势:在一个相当长的时间内表现为一种近似直线的持续向上、向下或平稳的趋势。
  2. 季节变动:受季节变化影响所形成的一种长度和幅度固定的短期周期波动,“季节”指的是周期,可以是周、月、年等。
  3. 不规则变动:受偶然因素的影响所形成的不规则波动,如股票市场受利好或者利空信息的影响,使得股票价格产生的波动。

时间序列按照季节性来分类,分为季节性时间序列和非季节性时间序列。

1.1 非季节性时间序列分解

MA(Moving Average)

移动平均是一种简单平滑技术,它通过在时间序列上逐项推移取一定项数的均值,来表现指标的长期变化和发展趋势。

SMA(Simple Moving Average)

简单移动平均将时间序列上前n个数值做简单的算术平均。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv('data/非季节性时间序列.csv', encoding='utf8', engine='python')

original_data = data['公司A']


def sma_demo():
    # 将非季节性的时间序列,分解为趋势部分和不规则部分
    # SMA 简单移动平均
    sma_data = original_data.rolling(3).mean()
    plt.plot(
        data.index, original_data, 'k-',
        data.index, sma_data, 'g-'
    )
    plt.show()
    # 平滑后的曲线,波动性基本被消除

    # 加入随机误差
    random_error = original_data - sma_data
    plt.plot(
        data.index, original_data, 'k-',
        data.index, sma_data, 'g-',
        data.index, random_error, 'r-'
    )
    plt.show()
    # 随机误差在0附件波动,均值趋向于0


if __name__ == '__main__':
    sma_demo()

在这里插入图片描述

WMA(Weighted Moving Average)

加权移动平均在基于简单移动平均的基础上,对时间序列上前n期的每一期数值赋予对应的权重。
它的基本思想是,提升近期的数据并减弱远期数据对当前预测值的影响,使平滑值更贴近最近的变化趋势。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv('data/非季节性时间序列.csv', encoding='utf8', engine='python')

original_data = data['公司A']

def wma_demo():
    # WMA 加权移动平均
    # 定义窗口大小
    wl = 3
    # 定义每个窗口值的权重
    ww = [1 / 6, 2 / 6, 3 / 6]

    def wma(window):
        return np.sum(window * ww)

    sma_data = original_data.rolling(wl).aggregate(wma)
    random_error = original_data - sma_data
    plt.plot(
        data.index, original_data, 'k-',
        data.index, sma_data, 'g-',
        data.index, random_error, 'r-'
    )
    plt.show(
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值