UTC时间:时间戳是以格林威治时间1970年01月01日00时00分00秒为基准计算所经过时间的秒数,是一个浮点数。Python的内置模块time和datetime都可以对时间格式数据进行转换,如时间戳和时间字符串的相互转换。
报错记录:AR has been removed from statsmodels and replaced with statsmodels.tsa.ar_model.AutoReg.
statsmodels版本太新了。根据提示将sm.tsa.AutoReg换成statsmodels.tsa.ar_model.AutoReg()还是没用,提示module ‘statsmodels.tsa.api’ has no attribute ‘ar_model’。
解决方案:改成sm.tsa.AutoReg. 或者事先from statsmodels.tsa.ar_model import AutoReg
# datetime模块date类的today()方法获取当前日期
import datetime
print(datetime.date.min)
print(datetime.date.max)
print(datetime.date.today())
print(datetime.date.today().year)
print(datetime.date.today().month)
print(datetime.date.today().day)
# datetime模块datetime类的today()方法获取当前日期和时间
import datetime
print(datetime.datetime.now())
print(datetime.datetime.min)
print(datetime.datetime.max)
print(datetime.datetime.today())
print(datetime.datetime.today().year)
print(datetime.datetime.today().month)
print(datetime.datetime.today().day)
print(datetime.datetime.today().hour)
print(datetime.datetime.today().hour)
import datetime
# 创建一个时间戳(以秒为单位)
timestamp = 22
# 带UTC时区时间
dt_with_timezone = datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone.utc)
print("带UTC时区时间:", dt_with_timezone)
# 不带UTC时区时间
dt_without_timezone = datetime.datetime.fromtimestamp(timestamp)
print("不带UTC时区时间", dt_without_timezone)
# 时间戳
import time
print(time.time())
print(time.localtime()) # 获取到当前时间的元组
print(time.mktime(time.localtime()))
# 一周的第几天(周一是0,0-6)、一年的第几天(从1开始,1-366)、夏时令(是夏时令1,不是0,未知-1)。
# 字符串和时间转换
#利用time模块的strftime()函数可以将时间戳转换成系统时间。
import time
time_str = time.strftime(("%Y-%m-%d %H:%M:%S"),time.localtime())
print(time_str)
# 可以用strptime函数将日期字符串转换为datetime数据类型,
import datetime
print(datetime.datetime.strptime('2022-01-15','%Y-%m-%d'))
# 可以用Pandas的to_datetime()函数将日期字符串转换为datetime数据类型。
# to_datetime()函数转化后的时间是精准到时分秒精度的
import pandas as pd
print(pd.to_datetime('2022/01/15'))
# 3. 时间运算--时间差
# 利用datetime将时间类型数据进行转换,然后利用减法运算计算时间的不同之处
# 默认输出结果转换为用(“天”,“秒”)表达
import datetime
delta = datetime.datetime(2022,1,16)-datetime.datetime(2021,1,1,9,15)
print(delta)
print(delta.days)
print(delta.seconds)
这里只介绍一下AR的定义,具体步骤见参考里的文章
通俗一点讲,就是用过去时间点的数据预测未来时间点的数据。
具体公式如下:
X t = a 1 X t − 1 + a 2 X t − 2 + . . . + a p X t − p = ∑ j = 1 p a j X t − j + ε t X_t = a_1X_{t-1} + a_2X_{t-2} +...+a_pX_{t-p} =\sum^{p}_{j=1}a_jX_{t-j}+\varepsilon_t Xt=a1Xt−1+a2Xt−2+...+apXt−p=j=1∑pajXt−j+εt
X t X_t Xt=历史数据 X t − j X_{t-j} Xt−j的加权和+随机扰动 ε t \varepsilon_t εt的叠加;
称 p p p为自回归模型的阶数,因此成为 p p p阶自回归模型,记为 A R ( p ) AR(p) AR(p);
称 a 1 , a 2 . . . a p a_1,a_2...a_p a1,a2...ap为 A R ( p ) AR(p) AR(p)模型的自回归系数
ε t ∼ N ( 0 , 2 ) \varepsilon_t \sim N(0,^2 ) εt∼N(0,2)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm # 导入模型
IndexData = pd.read_csv('./data/timeseries_data.csv')
data = IndexData['close'] # 选择关闭交易时的数据
temp = np.array(data) # 转换成数组
model =sm.tsa.AutoReg(temp,lags = 1) # 训练模型
results_AR = model.fit() # 训练模型
plt.figure(figsize=(20,10))
plt.plot(temp,'b',label='Close')
plt.plot (results_AR.fittedvalues,'r',label='AR model') # results_AR.fittedvalues是模型拟合后的结果
plt.legend()
滑动平均(moving average model/MA)模型也称移动平均模型,是用过去各个时期的随机干扰或预测误差的线性组合来表达当前预测值。
q q q阶MA模型(MA( q q q))的公式:
X t = μ + a t − θ 1 a t − 1 − . . . − θ q a t − q = μ + a t − ∑ i = 1 p θ i a t − i X_t = \mu+a_t-\theta_1a_{t-1}-...-\theta_qa_{t-q} = \mu + a_t -\sum^{p}_{i=1}\theta_{i}a_{t-i} Xt=μ+at−θ1at−1−...−θqat−q=μ+at−i=1∑pθiat−i
其中 μ \mu μ为常量。
MA(1)举例: X t X_t Xt为第 t t t天股价,而 a t a_t at为第 t t t天的新闻影响。当天的股价受当天新闻影响,也受昨天新闻影响 a t − 1 a_{t-1} at−1(但影响力要弱些,所以要乘上系数)。
报错记录:AttributeError: module ‘statsmodels.tsa.api’ has no attribute ‘ARMA’
从版本 0.12 开始,statsmodels 库不再具有单独的 ARMA 类。应该使用 ARIMA 类,该类可以处理自回归 (AR) 和移动平均 (MA) 分量。
import warnings
warnings.filterwarnings("ignore")
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
IndexData = pd.read_csv('./data/timeseries_data.csv')
data = IndexData['close']
temp = np.array(data)
model = sm.tsa.ARIMA(temp, order=(0, 0,10))
results_MA = model.fit()
plt.figure(figsize=(20, 10))
plt.plot(temp, 'b', label='close')
plt.plot(results_MA.fittedvalues,color = 'red',label ='MA')
plt.legend(fontsize = 15)
plt.show()
ARMA模型就是AR模型和MA模型混合,具体公式如下:
X t = [ ∑ i = 1 p a i X t − i ] + [ μ + a t − ∑ i = 1 q θ i a t − i ] X_t = [ \sum^{p}_{i=1}a_{i}X_{t-i} ]+ [ \mu +a_t -\sum^{q}_{i=1}\theta_{i}a_{t-i}] Xt=[i=1∑paiXt−i]+[μ+at−i=1∑qθiat−i]
由此可见,ARMA( p p p,0)模型就是AR ( p p p) 模型,ARMA(0, q q q)模型就是MA( q q q)模型。 μ \mu μ?
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
IndexData= pd.read_csv('./data/timeseries_data.csv')
data =IndexData['close']
temp =np.array(data)
p = 3
q = 10
model = sm.tsa.ARIMA (temp,order=(p,0,q))
results_ARMA = model.fit()
plt.figure(figsize=(20,4*5))
plt.plot(temp,'b',label='close')
plt.plot(results_ARMA.fittedvalues,'r',label='ARMA model')
plt.legend()
ARIMA模型在ARMA模型基础上考虑了时间序列的差分,ARIMA模型有三个参数ARIMA(p,d,q),p为自回归AR项数,q为滑动平均MA项数,d为使序列平稳所做的差分次数(阶数)。
差分后是对序列的差分的结果建立模型而不是真正的序列:例如**ARIMA(p,1,q)**相当于对差分序列 { x t – x t − 1 } \{x_t–x_{t−1}\} {xt–xt−1}进行 ARMA(p,q) 回归。
# 输出ARIMA模型的拟合效果图
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
IndexData = pd.read_csv('./data/timeseries_data.csv')
IndexData = IndexData.set_index(IndexData['date'])
IndexData['colseDiff_1']=IndexData['close'].diff(1)#1阶差分处理
IndexData['closeDiff_2']=IndexData['colseDiff_1'].diff(1)#2阶差分处理
IndexData.plot(subplots=True,figsize=(20,15))
data = IndexData['closeDiff_2']
temp = np.array (data)
p=2;d = 2;q=10
model = sm.tsa.ARIMA(temp,order = (p,d,q))
results_ARIMA = model.fit()
plt.figure (figsize=(20,10))
plt.plot (temp,'b',label='closeDiff_2')
plt.plot (results_ARIMA.fittedvalues,'r',label='ARIMA model')
plt.legend()
时间序列分析—自回归(AR) - 蜡笔小xi的文章 - 知乎
时间序列(二):初识自回归模型AR、滑动平均模型MR - Big冯的文章 - 知乎
建模算法系列二十三:ARMA模型 - Lvy-呀的文章 - 知乎