def arima_regression(): # 参数初始化 discfile = SRC_PATH + '/data/arima_data.xls' forecastnum = 5 # 读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式 data = pd.read_excel(discfile, index_col=u'日期') # 时序图 data.plot() plt.show() # 自相关图 plot_acf(data).show() print u'原始序列的ADF检验结果为:', ADF(data[u'销量']) # 差分后的结果 D_data = data.diff().dropna() D_data.columns = [u'销量差分'] D_data.plot() # 时序图 plt.show() print data print D_data plot_acf(D_data).show() # 自相关图 plot_pacf(D_data).show() # 偏自相关图 print u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分']) # 平稳性检测 # 白噪声检验 print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) # 返回统计量和p值 data[u'销量'] = data[u'销量'].astype(float) # 定阶 pmax = int(len(D_data) / 10) # 一般阶数不超过length/10 qmax = int(len(D_data) / 10) # 一般阶数不超过length/10 bic_matrix = [] # bic矩阵 for p in range(pmax + 1): tmp = [] for q in range(qmax + 1): try: # 存在部分报错,所以用try来跳过报错。 tmp.append(ARIMA(data, (p, 1, q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) bic_matrix = pd.DataFrame(bic_matrix) # 从中可以找出最小值 p, q = bic_matrix.stack().idxmin() # 先用stack展平,然后用idxmin找出最小值位置。 print(u'BIC最小的p值和q值为:%s、%s' % (p, q)) model = ARIMA(data, (p, 1, q)).fit() # 建立ARIMA(0, 1, 1)模型 model.summary2() # 给出一份模型报告 model.forecast(5) # 作为期5天的预测,返回预测结果、标准误差、置信区间。
def arima(): import matplotlib.pyplot as plt import pandas as pd import numpy as np test_data = list([random.randint(1, 20) for i in range(49)]) # 时序图 data = pd.Series(test_data) data.plot() plt.show() # 自相关 from statsmodels.graphics.tsaplots import plot_acf #plot_acf(data).show() # 平稳性检测 from statsmodels.tsa.stattools import adfuller as ADF print('original ADF result is', ADF(data)) D_data = data.diff(3).dropna() #print(D_data) D_data.plot() plt.show() print('Diffenciate ADF result is', ADF(D_data)) from statsmodels.tsa.arima_model import ARIMA # 定阶 pmax = int(len(D_data) / 10) qmax = int(len(D_data) / 10) bic_matrix = [] for p in range(pmax + 1): tmp = [] for q in range(qmax + 1): try: tmp.append(ARIMA(data, (p, 1, q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) print(bic_matrix) # 展平后找出最小的位置 bic_matrix = pd.DataFrame(bic_matrix) p, q = bic_matrix.stack().idxmin() print('BIC minimum p and q is', p, q) model = ARIMA(data, (p, 1, q)).fit() model.summary2() model.forecast(5)
def test(): #''' #使用指数衰减方法来做 #''' #ewma = test.ewm(span=7).mean() test2 = test.diff(7) test2.dropna(inplace=True) ''' 使用ACF图对MA部分定阶,由于自相关系数拖尾,偏自相关系数也拖尾,因此使用ARMI模型, 由于偏自相关图从二阶开始在置信区间内,因此AR部分p = 1, 自相关图从二阶开始控制在置信区间内,因此MA部分q = 1 ''' plot_acf(test2).show plot_pacf(test2).show ''' 建立ARIMA模型,BIC 500多。。。 ''' model = ARIMA(test2, (1, 0, 1)).fit() print(model.summary2()) ''' 使用python的forcast方法 传入step = 14 预测下面14个时间步,返回值tuple第一个为预测值 ''' res = model.forecast(steps=7)[0] ''' trainingSet和validationSet基本呈现稳定的7天周期性,后续在前面加入指数衰减,另外剔除trainingSet异常点效果会更好,对数值进行平滑处理 指数衰减同时也是对结果做的一次平滑处理 ''' trainingSet, validationSet = data.getUserPay() ''' 先按照shop_id, datetime做聚合再count ''' return res
def arima_forecast( self, ts, p, i, q, ): arima = ARIMA(ts, order=(p, i, q)).fit(disp=-1) # ts_predict = arima.predict() next_ret = arima.forecast(1)[0] return next_ret, arima.summary2()
def arima_forecast(self, ts, p, i, q,): arima = ARIMA(ts, order=(p, i, q)).fit(disp=-1) ts_predict = arima.predict() next_ret = arima.forecast(1)[0] #print("Forecast stock extra return of next day: ", next_ret) # plt.clf() # plt.plot(ts_predict, label="Predicted") # plt.plot(ts, label="Original") # plt.legend(loc="best") # plt.title("AR Test {},{}".format(p, q)) # #plt.show() return next_ret, arima.summary2()
def bulidModel(data, p, q): ''' 建立ARIMA 模型,修复平稳性检测不通过的情况 :param data: :param p: :param q: :return: ''' try: model = ARIMA(data, (p, 1, q)).fit() except: # 平稳性检测不通过,参考:https://github.com/statsmodels/statsmodels/issues/1155/ model = ARIMA(data, (4, 1, 1)).fit() try: # 检测模型是否可用 model.summary2() except: # 模型平衡性查,就固定p,d,q固定为4,1,1 model = ARIMA(data, (4, 1, 1)).fit() model.summary2() # 保存模型 # model.save('model.pkl') return model
def test(): #参数初始化 discfile = "menori.xlsx" forecastnum = 5 #读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式 data = pd.read_excel(discfile, index_col=u'Time') #时序图 print(data) #用来正常显示中文标签 plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示负号 plt.rcParams['axes.unicode_minus'] = False data.plot() plt.show() plot_acf(data).show() print('原始序列的检验结果为:', adfuller(data[u'nums'])) D_data = data.diff().dropna() D_data.columns = [u'差分'] D_data.plot() # 画出差分后的时序图 plt.show() plot_acf(D_data) # 画出自相关图 plt.show() # plot_pacf(D_data) # 画出偏相关图 # plt.show() dta = D_data.diff().dropna() dta.plot() # 画出差分后的时序图 plt.show() plot_acf(dta) # 画出自相关图 plt.show() print(u'差分序列的ADF 检验结果为: ', adfuller(D_data[u'差分'])) # 平稳性检验 # 差分序列的ADF 检验结果为: (-3.1560562366723537, 0.022673435440048798, 0, 35, {'1%': -3.6327426647230316, # '10%': -2.6130173469387756, '5%': -2.9485102040816327}, 287.5909090780334) # 一阶差分后的序列的时序图在均值附近比较平稳的波动, 自相关性有很强的短期相关性, 单位根检验 p值小于 0.05 ,所以说一阶差分后的序列是平稳序列 # 对一阶差分后的序列做白噪声检验 from statsmodels.stats.diagnostic import acorr_ljungbox print(u'差分序列的白噪声检验结果:', acorr_ljungbox(D_data, lags=1)) # 返回统计量和 p 值 # 差分序列的白噪声检验结果: (array([11.30402222]), array([0.00077339])) p值为第二项, 远小于 0.05 # 对模型进行定阶 model = ARIMA(np.array(data, dtype=np.float), (0, 1, 1)).fit() print( "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" ) print(model.summary2()) # 生成一份模型报告 print( "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" ) print(model.forecast(12)) # 为未来5天进行预测, 返回预测结果, 标准误差, 和置信区间
def bulid_arima_predict(data, p, d, q, predict_days): #根据给定的数据与参数来构建arima模型 from statsmodels.tsa.arima_model import ARIMA model = ARIMA(data, order=(p, d, q)).fit() S = model.summary2() #给出一份模型报告 if predict_days > 0: P = model.forecast(predict_days) #作为期5天的预测,返回预测结果、标准误差、置信区间。 print( '================================================report========================================================' ) print(S) print( '=================================================predict of the 5 days in future=============================================================' ) print(pd.Series(list(P)).iloc[0]) predict_data = [] #构造一个预测序列列表,其中包括历史数据(经过d次查分)以及最终预测出来的数据 for i in range(len(data)): predict_data.append(data[i]) for i in range(predict_days): predict_data.append(pd.Series(list(P)).iloc[0][i]) return predict_data
def ts_arima(tsdata, forenum=5): tsdata = tsdata.astype(float) # 定阶 D_data = ts_diff(tsdata) pmax = int(len(D_data) / 10) # 一般阶数不超过length/10 qmax = int(len(D_data) / 10) # 一般阶数不超过length/10 bic_matrix = [] # bic矩阵 for p in range(pmax + 1): tmp = [] for q in range(qmax + 1): try: # 存在部分报错,所以用try来跳过报错。 tmp.append(ARIMA(tsdata, (p, 1, q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) bic_matrix = pd.DataFrame(bic_matrix) # 从中可以找出最小值 # 可视化BIC矩阵 fig, ax = plt.subplots(figsize=(10, 8)) ax = sns.heatmap( bic_matrix, mask=bic_matrix.isnull(), ax=ax, annot=True, fmt='.2f', ) ax.set_title('BIC') plt.show() p, q = bic_matrix.stack().idxmin() # 先用stack展平,然后用idxmin找出最小值位置。 # print(u'BIC最小的p值和q值为:%s、%s' % (p, q)) model = ARIMA(tsdata, (p, 1, q)).fit() # 建立ARIMA(0, 1, 1)模型 summary = model.summary2() # 给出一份模型报告 forecast = model.forecast(forenum) # 作为期forenum天的预测,返回预测结果、标准误差、置信区间。 return bic_matrix, p, q, model, summary, forecast
def programmer_6(): """ 警告解释: # UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure "matplotlib is currently using a non-GUI backend, " 调用了多次plt.show() 解决方案,使用plt.subplot() # RuntimeWarning: overflow encountered in exp 运算精度不够 forecastnum-->预测天数 plot_acf().show()-->自相关图 plot_pacf().show()-->偏自相关图 """ discfile = 'data/arima_data.xls' forecastnum = 5 data = pd.read_excel(discfile, index_col=u'日期') fig = plt.figure(figsize=(8, 6)) # 第一幅自相关图 ax1 = plt.subplot(411) fig = plot_acf(data, ax=ax1) # 平稳性检测 print(u'原始序列的ADF检验结果为:', ADF(data[u'销量'])) # 返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore # 差分后的结果 D_data = data.diff().dropna() D_data.columns = [u'销量差分'] # 时序图 D_data.plot() plt.show() # 第二幅自相关图 fig = plt.figure(figsize=(8, 6)) ax2 = plt.subplot(412) fig = plot_acf(D_data, ax=ax2) # 偏自相关图 ax3 = plt.subplot(414) fig = plot_pacf(D_data, ax=ax3) plt.show() fig.clf() print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分'])) # 平稳性检测 # 白噪声检验 print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) # 返回统计量和p值 data[u'销量'] = data[u'销量'].astype(float) # 定阶 pmax = int(len(D_data) / 10) # 一般阶数不超过length/10 qmax = int(len(D_data) / 10) # 一般阶数不超过length/10 bic_matrix = [] # bic矩阵 data.dropna(inplace=True) # 存在部分报错,所以用try来跳过报错;存在warning,暂未解决使用warnings跳过 import warnings warnings.filterwarnings('error') for p in range(pmax + 1): tmp = [] for q in range(qmax + 1): try: tmp.append(ARIMA(data, (p, 1, q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) # 从中可以找出最小值 bic_matrix = pd.DataFrame(bic_matrix) # 用stack展平,然后用idxmin找出最小值位置。 p, q = bic_matrix.stack().idxmin() print(u'BIC最小的p值和q值为:%s、%s' % (p, q)) model = ARIMA(data, (p, 1, q)).fit() # 建立ARIMA(0, 1, 1)模型 model.summary2() # 给出一份模型报告 model.forecast(forecastnum) # 作为期5天的预测,返回预测结果、标准误差、置信区间。
pmax = int(len(D_O3) / 10) #一般阶数不超过length/10 qmax = int(len(D_O3) / 10) #一般阶数不超过length/10 e_matrix = [] #评价矩阵 for p in range(pmax + 1): tmp = [] for q in range(qmax + 1): try: #存在部分报错,所以用try来跳过报错。 tmp.append(ARIMA(O3last2month, (p, 1, q)).fit().aic) except: tmp.append(None) e_matrix.append(tmp) e_matrix = pd.DataFrame(e_matrix) #从中可以找出最小值 p, q = e_matrix.stack().idxmin() #先用stack展平,然后用找出最小值位置。 print('AIC最小的p值和q值为:%s、%s' % (p, q)) model = ARIMA(O3last2month, (p, 1, q)).fit() model.summary2() #给出模型报告 print(model.forecast(5)) #作为期5天的预测,返回预测结果、标准误差、置信区间。 preO3 = model.forecast(1)[0] #PM2.5 from statsmodels.graphics.tsaplots import plot_acf plot_acf(data10.loc[:, 'PM2.5']) from statsmodels.stats.diagnostic import acorr_ljungbox print('白噪声-检验结果:', acorr_ljungbox(data1.loc[:, 'PM2.5'], lags=1)) from statsmodels.tsa.stattools import adfuller as ADF print('ADF-检验结果:', ADF(data10.loc[:, 'PM2.5'])) PM25last2month = data10.iloc[-60:, 2] from statsmodels.tsa.arima_model import ARIMA PM25last2month = PM25last2month.astype(float) pmax = int(len(PM25last2month) / 10) #一般阶数不超过length/10 qmax = int(len(PM25last2month) / 10) #一般阶数不超过length/10
print('差分序列的ADF检验结果为:', ADF(D_data['销量差分'])) # 平稳性检测 # 白噪声检验 from statsmodels.stats.diagnostic import acorr_ljungbox print('差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) # 返回统计量和p值 from statsmodels.tsa.arima_model import ARIMA # 定阶 data['销量'] = data['销量'].astype(float) pmax = int(len(D_data) / 10) # 一般阶数不超过length/10 qmax = int(len(D_data) / 10) # 一般阶数不超过length/10 bic_matrix = [] # BIC矩阵 for p in range(pmax + 1): tmp = [] for q in range(qmax + 1): try: # 存在部分报错,所以用try来跳过报错。 tmp.append(ARIMA(data, (p, 1, q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) bic_matrix = pd.DataFrame(bic_matrix) # 从中可以找出最小值 p, q = bic_matrix.stack().idxmin() # 先用stack展平,然后用idxmin找出最小值位置。 print('BIC最小的p值和q值为:%s、%s' % (p, q)) model = ARIMA(data, (p, 1, q)).fit() # 建立ARIMA(0, 1, 1)模型 print('模型报告为:\n', model.summary2()) print('预测未来5天,其预测结果、标准误差、置信区间如下:\n', model.forecast(5))
plot_acf(D_data).show() #自相关图 from statsmodels.graphics.tsaplots import plot_pacf plot_pacf(D_data).show() #偏自相关图 print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分'])) #平稳性检测 #白噪声检验 from statsmodels.stats.diagnostic import acorr_ljungbox print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) #返回统计量和p值 from statsmodels.tsa.arima_model import ARIMA #定阶 pmax = int(len(D_data)/10) #一般阶数不超过length/10 qmax = int(len(D_data)/10) #一般阶数不超过length/10 bic_matrix = [] #bic矩阵 for p in range(pmax+1): tmp = [] for q in range(qmax+1): try: #存在部分报错,所以用try来跳过报错。 tmp.append(ARIMA(data, (p,1,q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) bic_matrix = pd.DataFrame(bic_matrix) #从中可以找出最小值 p,q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。 print(u'BIC最小的p值和q值为:%s、%s' %(p,q)) model = ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型 model.summary2() #给出一份模型报告 model.forecast(5) #作为期5天的预测,返回预测结果、标准误差、置信区间。
# print(data.head(3)) data['销量'] = data['销量'].astype(float) # print(data.head(3)) p_max = int(len(D_data) / 10) # 一般不超过len/10 q_max = int(len(D_data) / 10) # 一般不超过len/10 # print(p_max) bic_matrix = [] for p in range(p_max + 1): temp = [] for q in range(q_max + 1): try: temp.append(ARIMA(data, (p, 1, q)).fit().bic) except: temp.append(None) bic_matrix.append(temp) # print(bic_matrix) bic_df = pd.DataFrame(bic_matrix) # print(bic_df) p, q = bic_df.stack().idxmin() # 先用stack展平,再用idxmin找出最小值位置 print("BIC中p和q分别为: {p}、{q}".format(p=p, q=q)) model = ARIMA(data, (p, 1, q)).fit() # 建立模型 print('输出模型报告:', '\n', model.summary2()) print('输出预测5的结果:', '\n', model.forecast(5)) # 预测值、标准误差、置信区间 # print(model.summary.tables[1])
for p in range(pmax+1): tmp = [] for q in range(qmax+1): try: tmp.append(ARIMA(data,(p,1,q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) bic_matrix = pd.DataFrame(bic_matrix) #从中找出最小值 print(bic_matrix) p,q = bic_matrix.stack().idxmin() #使用stack展平 然后找出最小值位置 print('bic最小的p和最小的q为: %s \ %s' %(p,q)) model = ARIMA(data,(p,1,q)).fit() #建立模型arima(0,1,1) result = model.summary2() print(result) test = model.forecast(5) #给出未来五天的预测 返回预测结果 标准误差 置信区间 print(test)
def arima_test(): discfile = 'arima_data.xls' forecastnum = 5 data = pd.read_excel(discfile, index_col=u'日期') fig = plt.figure(figsize=(8, 6)) # 第一幅自相关图 ax1 = plt.subplot(411) fig = plot_acf(data, ax=ax1) # 平稳性检测 print(u'原始序列的ADF检验结果为:', ADF(data[u'销量'])) # 返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore # 差分后的结果 D_data = data.diff().dropna() D_data.columns = [u'销量差分'] # 时序图 D_data.plot() plt.show() # 第二幅自相关图 fig = plt.figure(figsize=(8, 6)) ax2 = plt.subplot(412) fig = plot_acf(D_data, ax=ax2) # 偏自相关图 ax3 = plt.subplot(414) fig = plot_pacf(D_data, ax=ax3) plt.show() fig.clf() print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分'])) # 平稳性检测 # 白噪声检验 print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) # 返回统计量和p值 data[u'销量'] = data[u'销量'].astype(float) # 定阶 pmax = int(len(D_data) / 10) # 一般阶数不超过length/10 qmax = int(len(D_data) / 10) # 一般阶数不超过length/10 bic_matrix = [] # bic矩阵 贝叶斯似然值 data.dropna(inplace=True) # 存在部分报错,所以用try来跳过报错;存在warning,暂未解决使用warnings跳过 data = np.array(data, dtype=np.float) # print('*'*20,ARIMA(data, (1, 1, 1)).fit().bic) import warnings warnings.filterwarnings('error') for p in range(pmax + 1): tmp = [] for q in range(qmax + 1): try: tmp.append(ARIMA(data, (p, 1, q)).fit().bic) #一阶差分 except: tmp.append(None) bic_matrix.append(tmp) # 从中可以找出最小值 bic_matrix = pd.DataFrame(bic_matrix) print(bic_matrix) # 用stack展平,然后用idxmin找出最小值位置。 p, q = bic_matrix.stack().idxmin() print(u'BIC最小的p值和q值为:%s、%s' % (p, q)) # model = ARIMA(data, np.array(p, 1, q)).fit() # 建立ARIMA(0, 1, 1)模型 model = ARIMA(data, (p, 1, q)).fit() # 建立ARIMA(0, 1, 1)模型 model.summary2() # 给出一份模型报告 model.forecast(forecastnum) # 作为期5天的预测,返回预测结果、标准误差、置信区间。
print(u'1-diff series white noise test result: ', acorr_ljungbox(D_data, lags=1)) # 返回统计量和p值 data[u'SALES_VOLUME'] = data[u'SALES_VOLUME'].astype(float) # 定阶 pmax = int(len(D_data) / 10) # 一般阶数不超过length/10 qmax = int(len(D_data) / 10) # 一般阶数不超过length/10 bic_matrix = [] # bic矩阵 for p in range(pmax + 1): tmp = [] for q in range(qmax + 1): try: # 存在部分报错,所以用try来跳过报错。 tmp.append(ARIMA(data, (p, 1, q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) bic_matrix = pd.DataFrame(bic_matrix) # 从中可以找出最小值 p, q = bic_matrix.stack().idxmin() # 先用stack展平,然后用idxmin找出最小值位置。 print(u'BIC minimal p-value and q-value is:%s、%s' % (p, q)) model = ARIMA(data, (p, 1, q)).fit() # 建立ARIMA(0, 1, 1)模型 # 给出一份模型报告 print("************************************************************") print(model.summary2()) print("************************************************************") print() print("************************************************************") print(model.forecast(forecastnum)) # 作为期forecastnum天的预测,返回预测结果、标准误差、置信区间。
tmp.append(ARIMA(D_data, (p, 1, q)).fit().bic) except: tmp.append(100000) bic_matrix.append(tmp) bic_matrix = pd.DataFrame(bic_matrix) p, q = bic_matrix.stack().idxmin() print(u'BIC最小的p值和q值为:%s、%s' % (p, q)) # set_pq(data) from statsmodels.tsa.arima_model import ARIMA model_8_1 = ARIMA(data, (2, 1, 3)).fit() print(model_8_1.summary2()) # 给出一份模型报告 # 预测结果进行评估 test_81 = data0['data'][500:505] predictions__81 = model_8_1.predict(start=len(data), end=len(data) + len(test_81) - 1, dynamic=False, typ='levels') predictions__81 = np.matrix(predictions__81) test_81 = np.matrix(test_81) for i in range(5): # print(test[i]) print('predicted_81=%f, expected=%f', predictions__81[0, i], test_81[0, i]) from sklearn.metrics import mean_squared_error
qmax = int(len(data_1) / 10) #一般阶数不超过length/10 bic_matrix = [] #bic矩阵 for p in range(pmax + 1): tmp = [] for q in range(qmax + 1): try: #存在部分报错,所以用try来跳过报错。 tmp.append(ARIMA(data, (p, 1, q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) bic_matrix = pd.DataFrame(bic_matrix) #从中可以找出最小值 p, q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。 print(p, q) model = ARIMA(data, (p, 1, q)).fit() model.summary2() model.forecast(6)[0] #%% --对定阶前的处理 columns = df.columns.tolist() test = {} for i in columns: city = df[i].values.astype(float) print(i, city) test[i] = city #%% #从一阶差分后的序列是平稳的非白噪声序列可以看出ARIMA模型中的d=1 from statsmodels.tsa.arima_model import ARIMA for k, i in test.items(): data = i
plot_pacf(D_data).show() print(u'1阶差分序列的ADF检验结果为:',ADF(D_data[u'销量差分'])) from statsmodels.stats.diagnostic import acorr_ljungbox print(u'差分序列的白噪声检验结果为:',acorr_ljungbox(D_data,lags=1)) from statsmodels.tsa.arima_model import ARIMA data[u'销量'] = data[u'销量'].astype(float) pmax=int(len(D_data)/10) qmax=int(len(D_data)/10) bic_matrix=[] for p in range(pmax+1): tmp=[] for q in range(qmax+1): try: tmp.append(ARIMA(data,(p,1,q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) bic_matrix=pd.DataFrame(bic_matrix) print(bic_matrix) p,q=bic_matrix.stack().idxmin() print(u'bic最小的P值和q值为:%s、%s'%(p,q)) model=ARIMA(data,(p,1,q)).fit() model.summary2() forecast=model.forecast(5) print(forecast)
rishouyi = shoupanjia.diff(1) plt.plot(rishouyi,'r-') plt.show() Close_log = np.log(Close) rishouyi_log = Close_log.diff(1) rishouyi_log.dropna(inplace=True) mydata=rishouyi[1:500] plt.plot(mydata,'r-') plt.show() ##########首先是ARIMA(1,2,3)模型 from statsmodels.tsa.arima_model import ARIMA model = ARIMA(mydata, (1,2,3)).fit() print(model.summary2()) #给出一份模型报告 ####评估模型预测结果 test=rishouyi[500:505] predictions = model.predict(start=len(mydata), end=len(mydata)+len(test)-1, dynamic=False,typ='levels')######有差分,要加typ='levels' predictions=np.matrix(predictions) test=np.matrix(test) # print(predictions[0,1]) # print(test[0,1]) #print(test) for i in range(5): #print(test[i]) print('predicted=%f, expected=%f' ,predictions[0,i], test[0,i]) from sklearn.metrics import mean_squared_error
print(u'差分序列的ADF检验结果为:', ADF(D_data['positive_sum_diff'])) #平稳性检测 #白噪声检验 from statsmodels.stats.diagnostic import acorr_ljungbox print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) #返回统计量和p值 from statsmodels.tsa.arima_model import ARIMA positive_time['positive_sum'] = positive_time['positive_sum'].astype(float) # #定阶 # pmax = int(len(D_data)/10) #一般阶数不超过length/10 # qmax = int(len(D_data)/10) #一般阶数不超过length/10 # bic_matrix = [] #bic矩阵 # for p in range(pmax+1): # tmp = [] # for q in range(qmax+1): # try: #存在部分报错,所以用try来跳过报错。 # tmp.append(ARIMA(positive_time, (p, 1, q)).fit().bic) # except: # tmp.append(None) # bic_matrix.append(tmp) # # bic_matrix = pd.DataFrame(bic_matrix) #从中可以找出最小值 # p,q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。 # print(u'BIC最小的p值和q值为:%s、%s' %(p,q)) model = ARIMA(positive_time, (1, 0, 1)).fit() #建立ARIMA(0, 1, 1)模型 model.summary2() #给出一份模型报告 predict_value, wucha, qujian = model.forecast(5) #作为期5天的预测,返回预测结果、标准误差、置信区间。 print(predict_value, wucha, qujian)
plt.rcParams['axes.unicode_minus'] = False data.plot() plt.show() from statsmodels.graphics.tsaplots import plot_acf plot_acf(data).show() from statsmodels.tsa.stattools import adfuller as ADF print 'ADF test result:', ADF(data['value']) D_data = data.diff().dropna() D_data.columns = ['diff value'] D_data.plot() plt.show() plot_acf(D_data).show() from statsmodels.graphics.tsaplots import plot_pacf plot_pacf(D_data).show() print 'diff seq ADF test result:', ADF(D_data['diff value']) from statsmodels.stats.diagnostic import acorr_ljungbox print 'dff white noise test result:', acorr_ljungbox(D_data, lags = 1) from statsmodels.tsa.arima_model import ARIMA model = ARIMA(data, (1,1,1)).fit() model.summary2() model.forecast(5*6)