用Python对美天然气期货价格进行了预测。
(我Python不好,照猫画虎,如有不对,欢迎指正。)
采用非平稳时间序列分析。代码如下:
#-*- coding: utf-8 -*-
#arima时序模型
import pandas as pd
#参数初始化
discfile = 'D:/natgas/natgasprices3.xls'
forecastnum = 5
#读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式
data = pd.read_excel(discfile, index_col = u'Date')
#时序图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
data.plot()
plt.show()
#自相关图
plot_acf(data).show()
#平稳性检测
print(u'原始序列的ADF检验结果为:', ADF(data[u'Prices2']))
#返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore
#差分后的结果
D_data = data.diff().dropna()
D_data.columns = [u'一阶差分']
D_data.plot() #时序图
plt.show()
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'Prices2']=data[u'Prices2'].astype(float)
pmax = 5 #
qmax = 5 #
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(9) #作为期5个月的预测,返回预测结果、标准误差、置信区间。
——————分割线——————
以上代码会输出如下结果:
这是去月度特性的走势图。(其实和真实数据的走势图相差不大)
做完一阶差分后会成为平稳序列。
预测值如下:
上述预测值为去月度特性之后的预测值,再乘以月度特性即得出最终预测结果。
黑底白字部分为最终预测结果。也就是6月价格会在2.859左右波动。
从目前走势来看,这个6月的预测值偏低,但不是太离谱。
从另一个角度说,目前的实际值偏高。
凡属预测,皆属娱乐。
但娱乐也可以玩儿得很认真。
领取专属 10元无门槛券
私享最新 技术干货