时间序列分析

时间序列分析和回归分析的区别:

  • 回归分析训练得到的是目标变量y与自变量x(一个或多个)的相关性,然后通过新的自变量x来预测目标变量y。
  • 时间序列得到的是目标变量y与时间的相关性。
  • 回归分析擅长的是多变量与目标结果之间的分析,往往与时间无关。
  • 时间序列分析建立在时间变化的基础上,分析目标变量的趋势、周期、时期和不稳定因素等。

经典模型:

AR、MA、ARMA、ARIMA

AR(Auto Regressive)中文叫自回归模型,它认为过去若干时刻的点通过线性组合,再加上白噪声就可以预测未来某个时刻的点。AR 模型还存在一个阶数,称为 AR(p)模型,也叫作 p 阶自回归模型。它指的是通过这个时刻点的前 p 个点,通过线性组合再加上白噪声来预测当前时刻点的值。

MA (Moving Average)中文叫做滑动平均模型,与 AR 模型大同小异,AR 模型是历史时序值的线性组合,MA 是通过历史白噪声进行线性组合来影响当前时刻点。MA 模型也存在一个阶数,称为 MA(q) 模型,也叫作 q 阶移动平均模型。

ARMA (Auto Regressive Moving Average)中文叫做自回归滑动平均模型,也就是 AR 模型和 MA 模型的混合。相比 AR 模型和 MA 模型,它有更准确的估计。ARMA 模型存在 p 和 q 两个阶数,称为 ARMA(p,q) 模型。

ARIMA (Auto Regressive Integrated Moving Average)中文叫差分自回归滑动平均模型,也叫求合自回归滑动平均模型。相比于 ARMA,ARIMA 多了一个差分的过程,作用是对不平稳数据进行差分平稳,在差分平稳后再进行建模。ARIMA 的原理和 ARMA 模型一样。相比于 ARMA(p,q) 的两个阶数,ARIMA 是一个三元组的阶数 (p,d,q),称为 ARIMA(p,d,q) 模型。其中 d 是差分阶数。

构建函数

from statsmodels.tsa.arima_model import ARMA

ARMA(endog, order, exog=None)
  • endog:英文是 endogenous variable,代表内生变量,又叫非政策性变量,它是由模型决定的,不被政策左右,可以说是要分析的变量,或者说是项目中需要用到的变量。
  • order:代表是 p 和 q 的值,也就是 ARMA 中的阶数。
  • exog:英文是 exogenous variables,代表外生变量。外生变量和内生变量一样是经济模型中的两个重要变量。相对于内生变量而言,外生变量又称作为政策性变量,在经济机制内受外部因素的影响,不是模型要研究的变量。

模型判断标准:

引入 AIC 准则,也叫作赤池消息准则,衡量统计模型拟合好坏的一个标准,数值越小代表模型拟合得越好。

例子

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
from statsmodels.tsa.arima_model import ARMA

# 创建数据
data = [5922, 5308, 5546, 5975, 2704, 1767, 4111, 5542, 4726, 5866, 6183, 3199, 1471, 1325, 6618, 6644, 5337, 7064, 2912, 1456, 4705, 4579, 4990, 4331, 4481, 1813, 1258, 4383, 5451, 5169, 5362, 6259,
        3743, 2268, 5397, 5821, 6115, 6631, 6474, 4134, 2728, 5753, 7130, 7860, 6991, 7499, 5301, 2808, 6755, 6658, 7644, 6472, 8680, 6366, 5252, 8223, 8181, 10548, 11823, 14640, 9873, 6613, 14415,
        13204, 14982, 9690, 10693, 8276, 4519, 7865, 8137, 10022, 7646, 8749, 5246, 4736, 9705, 7501, 9587, 10078, 9732, 6986, 4385, 8451, 9815, 10894, 10287, 9666, 6072, 5418]
data = pd.Series(data)
# 绘制数据图
data_index = sm.tsa.datetools.dates_from_range('1901', '1990')
data.index = pd.Index(data_index)
data.plot(figsize=(12, 8))
plt.show()

# 创建ARMA模型
arma = ARMA(data, (7, 0)).fit()
print('AIC: {:.4f}'.format(arma.aic))
# 模型预测
predict_y = arma.predict('1990', '2000')
# 绘制预测结果
fig, zx = plt.subplots(figsize=(12, 8))
ax = data['1901':].plot()
predict_y.plot(ax=ax)
plt.show()

运行结果:

AIC: 1619.6323

                             

实际项目中,可以给 p 和 q 指定一个范围,让 ARMA 都运行一下,然后选择最适合的模型。

实例:对比特币走势进行预测

数据:https://github.com/cystanford/bitcoin

from itertools import product
import matplotlib.pyplot as plt
import pandas as pd
from statsmodels.tsa.arima_model import ARMA
import warnings
from datetime import datetime

warnings.filterwarnings('ignore')

df = pd.read_csv(r'D:\Study\数据分析实战\master\bitcoin-master\bitcoin_2012-01-01_to_2018-10-31.csv')
# 将时间作为df的索引
df.Timestamp = pd.to_datetime(df.Timestamp)
df.index = df.Timestamp

# 按照月、季度、年来统计
df_month = df.resample('M').mean()
df_Q = df.resample('Q-DEC').mean()
df_year = df.resample('A-DEC').mean()

# 按照天、月、季度、年来显示比特币的走势
fig = plt.figure(figsize=[15, 7])
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.suptitle('比特币金额(美金)', fontsize=20)
plt.subplot(221)
plt.plot(df.Weighted_Price, '-', label='按天')
plt.legend()
plt.subplot(222)
plt.plot(df_month.Weighted_Price, '-', label='按月')
plt.subplot(223)
plt.plot(df_Q.Weighted_Price, '-', label='按季度')
plt.legend()
plt.subplot(224)
plt.plot(df_year.Weighted_Price, '-', label='按年')
plt.legend()
plt.show()

# 设置参数范围
ps = range(0, 3)
qs = range(0, 3)
parameters = product(ps, qs)
parameters_list = list(parameters)

# 寻找最优ARMA模型参数,即best_aic最小
results = []
best_aic = float('inf')
for param in parameters_list:
    try:
        model = ARMA(df_month.Weighted_Price, order=(param[0], param[1])).fit()
    except ValueError:
        print('参数错误:', param)
        continue
    aic = model.aic
    if aic < best_aic:
        best_model = model
        best_aic = aic
        bet_param = param
    results.append([param, model.aic])

# 输出最优模型
result_table = pd.DataFrame(results)
result_table.columns = ['parameters', 'aic']
print('最优模型:', best_model.summary())

# 比特币预测
df_month2 = df_month[['Weighted_Price']]
date_list = [datetime(2018, 11, 30), datetime(2018, 12, 31), datetime(2019, 1, 31), datetime(2019, 2, 28),
             datetime(2019, 3, 31), datetime(2019, 4, 30), datetime(2019, 5, 31), datetime(2019, 6, 30)]
future = pd.DataFrame(index=date_list, columns=df_month.columns)
df_month2 = pd.concat([df_month2, future])
df_month2['forecast'] = best_model.predict(start=0, end=91)

# 比特币预测结果显示
plt.figure(figsize=(20, 7))
df_month2.Weighted_Price.plot(label='实际金额')
df_month2.forecast.plot(color='r', ls='--', label='预测金额')
plt.legend()
plt.title('比特币金额(月)')
plt.xlabel('时间')
plt.ylabel('美金')
plt.show()

当对一个数值进行预测的时候,如果考虑的是多个变量和结果之间的关系,可以采用回归分析,如果考虑单个时间维度与结果的关系,可以使用时间序列分析。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值