国内漂亮大气的网站,在什么网站做贸易好,wordpress修改底部,成都网站制作scgc数据集说明 比特币价格预测#xff08;轻量级CSV#xff09;关于数据集 致谢 这些数据来自CoinMarketCap#xff0c;并且可以免费使用该数据。 https://coinmarketcap.com/ 数据集:链接: 价格预测器 源代码与数据集 
算法说明 
SARIMAX#xff08;Seasonal AutoRegressive … 
数据集说明 比特币价格预测轻量级CSV关于数据集 致谢 这些数据来自CoinMarketCap并且可以免费使用该数据。 https://coinmarketcap.com/ 数据集:链接: 价格预测器 源代码与数据集 
算法说明 
SARIMAXSeasonal AutoRegressive Integrated Moving Average with eXogenous regressors和 ARIMAAutoRegressive Integrated Moving Average都是用于时间序列分析和预测的强大工具但它们之间存在一些关键区别。这些差异主要体现在模型的灵活性、处理季节性和外生变量的能力上。 
1. 季节性成分 ARIMA适用于非季节性的数据即没有明显周期模式的时间序列。它通过自回归AR、差分I和移动平均MA三个部分来捕捉时间序列中的趋势和平稳性特征。  SARIMAX是ARIMA模型的一种扩展特别设计用来处理具有季节性模式的数据。除了包含ARIMA的所有组件外SARIMAX还增加了额外的参数来描述季节性影响如季节性自回归SAR、季节性差分SI和季节性移动平均SMA。因此SARIMAX可以更好地捕捉时间序列中的长期周期波动。  
2. 外生变量的支持 ARIMA传统上的ARIMA模型仅依赖于时间序列本身的历史值来进行预测不直接支持外部变量的影响。  SARIMAX允许引入外生变量exogenous variables即那些可能影响目标时间序列但不属于该序列内部结构的因素。例如在预测销售量时节假日、促销活动等外部因素可以通过外生变量的形式加入到模型中以提高预测精度。  
3. 数学表示 ARIMA(p, d, q)其中(p)代表自回归项的阶数(d)代表差分阶数(q)代表移动平均项的阶数。  SARIMAX(p, d, q) × (P, D, Q)_m这里不仅包含了非季节性的(p), (d), (q)参数还有额外的季节性参数(P)季节性自回归阶数、(D)季节性差分阶数、(Q)季节性移动平均阶数以及(m)为季节周期长度。  
4. 应用场景 ARIMA适合用于没有明显季节性的平稳或经过适当变换后变得平稳的时间序列数据。  SARIMAX更适合那些展示出显著季节性和/或受其他外部因素影响较大的时间序列数据。比如零售业销售额通常会显示出明显的月度或年度季节性变化而天气条件、经济指标等外部因素也可能对销售产生重要影响。  
综上所述选择使用ARIMA还是SARIMAX取决于您的具体需求和数据特性。如果您的时间序列包含明显的季节性并且您有可用的外生变量信息那么SARIMAX可能是更好的选择否则对于简单的非季节性数据ARIMA已经足够强大且易于实现。 
接下来我们从详细代码方案开始 
# 这个 Python 3 环境附带了许多有用的分析库
# 它是由 kaggle/python 容器镜像定义的https://github.com/kaggle/docker-python
# 例如这里有几个有用的数据包可以加载
import numpy as np  # 线性代数库
import pandas as pd  # 数据处理库用于处理 CSV 文件的输入输出如pd.read_csv
import seaborn; seaborn.set()  # seaborn 是一个基于 matplotlib 的数据可视化库这里通过 seaborn.set() 来设置默认的绘图风格
from sklearn.metrics import mean_squared_error  # 用于计算平均平方误差一种常见的评估回归预测模型的方式
# 输入数据文件位于 ../input/ 目录下。
# 例如运行此代码通过点击运行或按下 ShiftEnter将列出输入目录中的文件# 任何你写入当前目录的结果都会作为输出保存。
import matplotlib.pylab as plt  # 导入 matplotlib 的子模块 pyplabpylab用于绘制图像
%matplotlib inline  # 魔法命令使图表内嵌在 jupyter notebook 中
from matplotlib.pylab import rcParams  # 从 pyplab 中导入 rcParams用于设置图表的参数
rcParams[figure.figsize]  15, 6  # 设置图表的默认尺寸为宽度15英寸高度6英寸
from statsmodels.tsa.stattools import adfuller  # 引入 adfuller 模块用于进行时间序列平稳性检验
from statsmodels.tsa.seasonal import seasonal_decompose  # 引入 seasonal_decompose 模块用于对时间序列数据进行分解
from statsmodels.tsa.stattools import acf, pacf  # 引入 acf 和 pacf 模块用于计算时间序列的自相关和偏自相关函数
from statsmodels.tsa.arima_model import ARIMA  # 引入 ARIMA 模型用于时间序列数据的预测加载数据并研究行和列的值 
# 加载 bitcoin_price_Training - Training.csv 文件作为一个包含时间序列数据的 DataFrame 对象
data  pd.read_csv(../input/bitcoin_price_Training - Training.csv)
# 打印数据表的前五行以查看数据格式
print(data.head(5))
# 打印数据表的最后五行以查看最近的数据
print(data.tail(5))
# 查看每一列的数据类型
data.dtypes
# 获取数据表的信息包括行数、列数、列名、数据类型等
data.info()
# 生成数据表的描述统计信息如计数、均值、最小值、最大值等
data.describe()# 重新加载数据设置日期列为索引
data  pd.read_csv(../input/bitcoin_price_Training - Training.csv, index_colDate)
# 再次打印前五行检查日期是否正确设置为索引
print(data.head(5))# 检查数据表的信息确认索引列已正确设置
data.info()
# 将索引从字符串格式转化为日期时间格式
data.index  pd.to_datetime(data.index)
# 打印索引确认转换成功
print(data.index)
# 再次打印数据表的前五行查看转换后的数据
data.head(5)将数据集按时间顺序排序从最旧到最近 
# 将数据按索引排序从最旧的数据到最近的数据
data  data.sort_index()
# 打印排序后的前五行数据确认排序成功
data.head()绘制比特币收盘价的折线图 
# 绘制比特币每日收盘价的折线图
data[Close].plot()
# 设置 y 轴标签为每日比特币价格
plt.ylabel(每日比特币价格)为了建立模型我将侧重于预测比特币的收盘价因此创建一个新的对象排除其他列 
# 从数据中提取收盘价列创建一个新的 Series 对象
data  data[Close]
# 将原始数据按周重采样并累计创建周比特币价格数据
weekly  data.resample(W).sum()
# 绘制比特币每周价格的折线图
weekly.plot()# 设置 y 轴标签为周比特币价格
plt.ylabel(周比特币价格)按年份统计并绘制比特币平均收盘价格 
# 通过数据中的日期索引按年份进行分组并计算每年的均值
by_year  data.groupby(data.index.year).mean()
# 绘制按年份分组的比特币平均收盘价折线图
by_year.plot()按星期几统计并绘制比特币平均收盘价格 
# 通过数据中的日期索引按星期几进行分组这里是累加每个星期几的所有数据
by_weekday  data.groupby(data.index.dayofweek).sum()
# 将原始 0-6 的数字索引替换为对应的星期几名称
by_weekday.index  [Mon, Tues, Wed, Thurs, Fri, Sat, Sun]
# 绘制按星期几分组的比特币价格累加图
by_weekday.plot()# 通过数据中的日期索引按星期几进行分组这一次是计算每个星期几的收盘价平均值
by_weekday  data.groupby(data.index.dayofweek).mean()
# 再次替换数字索引为星期几名称
by_weekday.index  [Mon, Tues, Wed, Thurs, Fri, Sat, Sun]
# 绘制按星期几分组的比特币平均收盘价折线图
by_weekday.plot()按年内第几天统计并绘制比特币平均收盘价格 
# 通过数据中的日期索引按年内第几天进行分组并计算每一天的均值
by_day  data.groupby(data.index.dayofyear).mean()
# 绘制按日内第几天分组的比特币平均收盘价折线图
by_day.plot()按月份统计并绘制比特币平均收盘价格 
# 通过数据中的日期索引按月份进行分组并计算每个月份的均值
by_month  data.groupby(data.index.month).mean()
# 绘制按月份分组的比特币平均收盘价折线图
by_month.plot()按季度统计并绘制比特币平均收盘价格 
# 通过数据中的日期索引按季度进行分组并计算每个季度的均值
by_quarter  data.groupby(data.index.quarter).mean()
# 绘制按季度分组的比特币平均收盘价折线图
by_quarter.plot()按季度再次分组绘制这次仅为了展示分组操作 
# 通过数据中的日期索引按季度进行分组
by_quarter  data.groupby(data.index.quarter)
# 这次我们只调用 plot 方法不计算平均值用于展示不同季度的数据分布
by_quarter.plot()绘制按季度统计的比特币平均收盘价格以及年度的对比图 
# 计算每个季度的数据平均值
by_quarter_overall  data.groupby(data.index.quarter).mean()
# 绘制季度的比特币平均收盘价折线图
by_quarter_overall.plot()按工作日与周末统计并绘制比特币平均收盘价格 
# 使用 numpy 的 np.where 函数识别交易日为工作日1-5或周末5-0
weekend  np.where(data.index.weekday  5, Weekday, Weekend)
# 将数据按工作日周末及年份分组计算每组的平均收盘价
by_time  data.groupby([weekend, data.index.year]).mean()
# 创建一个包含1行2列的子图用于同时展示工作日和周末的价格对比
fig, ax  plt.subplots(1, 2, figsize(14, 5))
# 绘制工作日的平均收盘价格
by_time.loc[Weekday].plot(axax[0], title工作日)
# 绘制周末的平均收盘价格
by_time.loc[Weekend].plot(axax[1], title周末)最后绘制比特币的价格时间序列图 
# 将数据赋值给 ts
ts  data
# 绘制比特币价格的时间序列图
plt.plot(ts)以上代码主要用于加载比特币的历史价格数据对数据进行预处理、转换、排序并按不同的时间单位如周、月、季及工作日与周末对价格数据进行分组统计最终绘制出这些统计结果的折线图。这有助于分析比特币价格随时间的变化趋势及其季节性特征。 
继续干 
这一部分内容的灵感来源于https://www.analyticsvidhya.com/blog/2016/02/time-series-forecasting-codes-python/ 
from statsmodels.tsa.stattools import adfuller
def test_for_stationary(input_data):r_mean  input_data.rolling(window  7, centerFalse).mean()  # 计算7日移动平均值中心设为Falser_std  input_data.rolling(window  7, centerFalse).std()   # 计算7日移动标准差中心设为False# 绘制数据given  plt.plot(input_data, colorblue, label原始时间序列)rolling_mean  plt.plot(r_mean, colorred, label7日移动平均)rolling_std  plt.plot(r_std, colorgreen, label7日移动标准差)plt.legend(locbest)plt.title(7日移动平均与标准差)plt.show(blockFalse)  # 显示图表# 执行Dickey-Fuller检验print(Dickey-Fuller检验结果)dftest  adfuller(input_data)dfoutput  pd.Series(dftest[0:4], index[检验统计量, p值, 使用滞后数量, 使用观察数量])for key, value in dftest[4].items():dfoutput[临界值 (%s)%key]  value  # 添加临界值到输出中print(dfoutput)test_for_stationary(ts)总结 这段代码定义了一个名为test_for_stationary的函数用于检查时间序列的平稳性。函数首先计算了7日移动平均值和7日移动标准差并绘制了这两个指标与原始时间序列的图表以便于直观地观察时间序列的平稳性。接着代码执行了Dickey-Fuller检验该检验是为了确定时间序列是否有单位根从而判断其是否平稳。检验结果包括检验统计量、p值、使用的滞后数量、使用的观察数量以及不同显著性水平下的临界值。最后函数调用test_for_stationary(ts)对时间序列ts进行了检验。 消除趋势的数据转换 
ts_logtransformed  np.log(ts)  # 对时间序列进行对数转换消除趋势
plt.plot(ts_logtransformed)  # 绘制对数转换后的时间序列图表总结 这段代码对时间序列ts进行了对数转换目的是消除时间序列中的趋势成分。对数转换后的结果被绘制出来以便于观察转换效果。 
ts_logtransformed.head(10)  # 查看转换后的时间序列的前10行数据Rolling_average  ts_logtransformed.rolling(window  7, centerFalse).mean()  # 计算对数转换后的时间序列的7日移动平均值
plt.plot(ts_logtransformed, label对数转换后的序列)
plt.plot(Rolling_average, colorred, label7日移动平均)
plt.legend(locbest)
plt.title(7日移动平均)
plt.show()Rolling_average.head(10)总结 这段代码计算了对数转换后的时间序列的7日移动平均值并绘制了原对数转换序列和7日移动平均值的图表用以观察去除趋势的效果。 
log_Rolling_difference  ts_logtransformed - Rolling_average  # 对数转换后的序列减去7日移动平均值
log_Rolling_difference.head(10)  # 查看差分后的前10行数据
log_Rolling_difference.tail(10)  # 查看差分后的后10行数据# 用0替换上述数据框中的NAN以避免将来出现错误
log_Rolling_difference.dropna(inplaceTrue)
plt.plot(log_Rolling_difference)test_for_stationary(log_Rolling_difference)总结 这段代码对对数转换后的时间序列进行了7日移动平均值的差分通过减去7日移动平均值来进一步去除趋势。差分后的结果被绘制出并检查了其平稳性。差分后的序列应该更加接近平稳性。 使用指数加权移动平均值来改进解决方案 
expwighted_avg  ts_logtransformed.ewm(halflife7, min_periods0, adjustTrue, ignore_naFalse).mean()  # 计算指数加权移动平均值半衰期设为7天
plt.plot(ts_logtransformed, label对数转换后的序列)
plt.plot(expwighted_avg, colorred, label指数加权移动平均值)
plt.legend(locbest)
plt.title(指数加权移动平均值)
plt.show()总结 这段代码计算了对数转换后的时间序列的指数加权移动平均值半衰期设为7天。指数加权移动平均值可以更加灵活地捕捉时间序列的变化因为它对较近的数据点赋予了更高的权重。绘制了原对数转换序列和指数加权移动平均值的图表用以观察去除趋势的效果。 
expwighted_avg.head(10)  # 查看指数加权移动平均值的前10行数据log_expmovwt_diff  ts_logtransformed - expwighted_avg  # 对数转换后的序列减去指数加权移动平均值test_for_stationary(log_expmovwt_diff)总结 这段代码通过减去指数加权移动平均值来进一步去除对数转换后的时间序列中的趋势。差分后的结果被绘制出并检查了其平稳性。差分后的序列应该更加接近平稳性。 现在时间序列已经平稳DS检验统计量值小于1%的临界值。由于权重是从起始索引分配的因此检验结果有效。 消除趋势和季节性的其他方法 
这里我将实现差分和分解方法来消除趋势和季节性。 
# 绘制对数转换后的时间序列
ts_logtransformed.plot()总结 这段代码绘制了对数转换后的时间序列用以观察时间序列的变化趋势和季节性成分。 通过差分消除季节性 
时间序列中的季节性成分可以通过差分来消除。如果存在一个月的季节性成分那么可以通过从当前值中减去上一个月的值来消除。例如10月1日的值减去9月1日的值10月2日的值减去9月2日的值以此类推。差分后的序列将不包含第一个月的数据因为第一个月的数据无法进行差分。 
# 尝试不同的季节性差分并测试平稳性数据
ts_diff_logtrans  ts_logtransformed - ts_logtransformed.shift(7)  # 通过7天差分来消除季节性
plt.plot(ts_diff_logtrans)
ts_diff_logtrans.head(10)ts_diff_logtrans.dropna(inplaceTrue)  # 删除缺失值
test_for_stationary(ts_diff_logtrans)总结 这段代码通过对数转换后的时间序列进行了7天的差分以消除季节性成分。差分后的序列被绘制出并检查了其平稳性。差分后的序列应该更加接近平稳性。 通过分解消除趋势和季节性 
decomposition  seasonal_decompose(ts_logtransformed)  # 对时间序列进行季节性分解trend  decomposition.trend  # 提取趋势成分
seasonal  decomposition.seasonal  # 提取季节性成分
residual  decomposition.resid  # 提取残差成分plt.subplot(411)
plt.plot(ts_logtransformed, label原序列)
plt.legend(locbest)
plt.subplot(412)
plt.plot(trend, label趋势)
plt.legend(locbest)
plt.subplot(413)
plt.plot(seasonal, label季节性)
plt.legend(locbest)
plt.subplot(414)
plt.plot(residual, label残差)
plt.legend(locbest)
plt.tight_layout()  # 调整子图布局
plt.show()总结 这段代码通过seasonal_decompose函数对对数转换后的时间序列进行了季节性分解提取了趋势成分、季节性成分和残差成分。分解后的成分分别被绘制在四个子图中以便于观察时间序列的不同成分。最后对残差成分进行了平稳性检验。 
decomposed_TS  residual  # 将残差成分作为分解后的时间序列
decomposed_TS.dropna(inplaceTrue)  # 删除缺失值
test_for_stationary(decomposed_TS)  # 检查残差成分的平稳性预测 
# ACF和PACF图
lag_acf  acf(ts_diff_logtrans, nlags30)  # 计算自相关函数ACF滞后30期
lag_pacf  pacf(ts_diff_logtrans, nlags50, methodols)  # 计算偏自相关函数PACF滞后50期使用普通最小二乘法# 绘制ACF图
plt.subplot(121)
plt.plot(lag_acf)
plt.axhline(y0, linestyle--, colorgray)  # 绘制0线
plt.axhline(y-1.96/np.sqrt(len(ts_diff_logtrans)), linestyle--, colorgray)  # 绘制下置信区间线
plt.axhline(y1.96/np.sqrt(len(ts_diff_logtrans)), linestyle--, colorgray)  # 绘制上置信区间线
plt.title(自相关函数)# 绘制PACF图
plt.subplot(122)
plt.plot(lag_pacf)
plt.axhline(y0, linestyle--, colorgray)  # 绘制0线
plt.axhline(y-1.96/np.sqrt(len(ts_diff_logtrans)), linestyle--, colorgray)  # 绘制下置信区间线
plt.axhline(y1.96/np.sqrt(len(ts_diff_logtrans)), linestyle--, colorgray)  # 绘制上置信区间线
plt.title(偏自相关函数)
plt.tight_layout()  # 调整子图布局
plt.show()from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf
from matplotlib import pyplot
pyplot.figure()
pyplot.subplot(211)
plot_acf(ts_diff_logtrans, axpyplot.gca(),lags40)
pyplot.subplot(212)
plot_pacf(ts_diff_logtrans, axpyplot.gca(), lags50)
pyplot.show()总结 这段代码计算并绘制了时间序列ts_diff_logtrans的自相关函数ACF和偏自相关函数PACF图。ACF图用于确定移动平均MA参数q而PACF图用于确定自回归AR参数p。图表中的虚线表示置信区间可以用来判断哪些滞后值显著。 
从图表中的一些观察结果 
在这个图表中两侧的虚线表示置信区间。这些虚线可以用来确定自回归AR和移动平均MA参数p和q 
p值是PACF图中首次超过上置信区间的滞后值。在这个例子中p2PACF在第2天显示了一个显著的滞后值。q值是ACF图中首次超过上置信区间的滞后值。在这个例子中q18ACF在第18天显示了一个显著的滞后值。 
PACF在第7天、第8天、第12天、第15天等处可能也有一些显著的滞后值这表明差分后的数据中仍然存在一些季节性成分。我们可以通过尝试不同的ARIMA模型来识别最佳模型通过计算每个模型的残差平方和RSS来比较模型的性能。RSS值越低模型的拟合效果越好。 
# 从 statsmodels.tsa.arima.model 导入 ARIMA
from statsmodels.tsa.statespace.sarimax import SARIMAX as ARIMAts_diff_logtrans  ts_diff_logtrans.fillna(0)  # 用0填充缺失值避免将来出现错误# 构建和拟合ARIMA模型 (p8, d1, q0)
model  ARIMA(ts_logtransformed, order(8, 1, 0))  
results_AR  model.fit(disp-1)  # 拟合模型disp-1表示不显示迭代过程
plt.plot(ts_diff_logtrans)  # 绘制差分后的序列
plt.plot(results_AR.fittedvalues, colorred, label模型拟合值 (p8))  # 绘制模型拟合值
RSS  results_AR.fittedvalues - ts_diff_logtrans  # 计算残差
RSS.dropna(inplaceTrue)  # 删除缺失值
plt.title(RSS: %.4f % sum(RSS**2))  # 设置图表标题显示RSS值
plt.legend(locbest)  # 设置图例位置
plt.show()  # 显示图表# 构建和拟合ARIMA模型 (p2, d1, q0)
model  ARIMA(ts_logtransformed, order(2, 1, 0))  
results_AR  model.fit(disp-1)  # 拟合模型disp-1表示不显示迭代过程
plt.plot(ts_diff_logtrans)  # 绘制差分后的序列
plt.plot(results_AR.fittedvalues, colorred, label模型拟合值 (p2))  # 绘制模型拟合值
RSS  results_AR.fittedvalues - ts_diff_logtrans  # 计算残差
RSS.dropna(inplaceTrue)  # 删除缺失值
plt.title(RSS: %.4f % sum(RSS**2))  # 设置图表标题显示RSS值
plt.legend(locbest)  # 设置图例位置
plt.show()  # 显示图表# 打印模型摘要
print(results_AR.summary())总结 这段代码构建并拟合了两个ARIMA模型一个是p8, d1, q0另一个是p2, d1, q0。每个模型的拟合值和残差都被绘制出来并计算了残差平方和RSS。RSS值越低模型的拟合效果越好。最后打印了模型的摘要信息包括模型参数和统计检验结果。 
# 构建和拟合ARIMA模型 (p0, d1, q18)
model  ARIMA(ts_logtransformed, order(0, 1, 18))  
results_MA  model.fit(disp-1)  # 拟合模型disp-1表示不显示迭代过程
plt.plot(ts_diff_logtrans)  # 绘制差分后的序列
plt.plot(results_MA.fittedvalues, colorred, label模型拟合值 (q18))  # 绘制模型拟合值
RSS  results_MA.fittedvalues - ts_diff_logtrans  # 计算残差
RSS.dropna(inplaceTrue)  # 删除缺失值
plt.title(RSS: %.4f % sum(RSS**2))  # 设置图表标题显示RSS值
plt.show()  # 显示图表# 打印模型摘要
print(results_MA.summary())总结 这段代码构建并拟合了一个ARIMA模型参数为p0, d1, q18。模型的拟合值和残差被绘制出来并计算了残差平方和RSS。RSS值越低模型的拟合效果越好。最后打印了模型的摘要信息包括模型参数和统计检验结果。 
# 绘制对数转换后的时间序列和模型残差
plt.plot(ts_logtransformed, labellog_tranfromed_data)
plt.plot(results_MA.resid, colorgreen, labelResiduals)
plt.title(MA Model Residual plot)
plt.legend(locbest)
plt.show()# 绘制残差的密度图
results_MA.resid.plot(kindkde)
plt.title(Density plot of the residual error values)
plt.show()# 打印残差的描述统计信息
print(results_MA.resid.describe())总结 这段代码绘制了对数转换后的时间序列和MA模型的残差用以观察模型的拟合效果。残差的密度图被绘制出来以检查残差的分布情况。最后打印了残差的描述统计信息包括均值、标准差、最小值、最大值等。这些统计信息可以帮助我们了解残差的分布特征。 
ARIMA 组合模型 
介绍部分 
ARIMA 组合模型 
model  ARIMA(ts_logtransformed, order(8, 1, 18))  
results_ARIMA  model.fit(trend nc, disp-1)  
plt.plot(ts_diff_logtrans)
plt.plot(results_ARIMA.fittedvalues, colorred, label  p 8, q 18)
RSS results_ARIMA.fittedvalues-ts_diff_logtrans
RSS.dropna(inplaceTrue)
plt.title(RSS: %.4f% sum(RSS**2))
plt.legend(locbest)上面的图表和模型展示了不同的残差 RSS残差平方和。评估所有这些模型可能会很困难因此我们对所有可能的 ARIMA 参数进行网格搜索。我们寻找不同的 p、d、q 组合并找到最佳组合。p 的取值为 7、10、13、16、19d 的取值为 0 到 2模型运行 10 次这需要一些时间来完成。 
以下是一个 Python 代码用于评估不同模型的性能以找到最佳的 ARIMA 超参数。 
代码部分 
代码总结 这段代码的目的是通过网格搜索来评估不同 ARIMA 模型的性能找到最佳的 p 和 d 参数组合。代码的逻辑是通过遍历不同的 p 和 d 值计算每个组合的 RSS残差平方和并选择 RSS 最小的组合作为最佳模型。 
import warnings# 定义函数来评估 ARIMA 模型的性能
def evaluate_arima_model(data_set, arima_order):model  ARIMA(data_set, orderarima_order)  # 创建 ARIMA 模型results_ARIMA  model.fit(disp-1)  # 拟合模型RSS_diff  results_ARIMA.fittedvalues - ts_diff_logtrans  # 计算残差RSS  RSS_diff**2  # 计算残差平方和return RSS# 定义函数来评估不同 p 和 d 值的组合
def evaluate_models(dataset, p_values, d_values):best_score, best_cfg  float(inf), None  # 初始化最佳得分和最佳配置for p in p_values:  # 遍历 p 值for d in d_values:  # 遍历 d 值order  (p, d, 18)  # 设置 ARIMA 模型的阶数try:rss  evaluate_arima_model(dataset, order)  # 评估模型if rss  best_score:  # 如果当前 RSS 小于最佳 RSSbest_score, best_cfg  rss, order  # 更新最佳得分和最佳配置print(ARIMA%s RSS%.3f % (order, rss))  # 打印当前模型的 RSSexcept:continueprint(Best ARIMA%s RSS%.3f % (best_cfg, best_score))  # 打印最佳模型的 RSSp_values  range(8, 20, 3)  # 设置 p 值的范围
d_values  range(0, 3)  # 设置 d 值的范围
warnings.filterwarnings(ignore)  # 忽略警告
evaluate_models(ts_logtransformed, p_values, d_values)  # 评估模型代码总结 这段代码的目的是生成 ARIMA 模型的摘要并绘制残差图。代码的逻辑是通过拟合 ARIMA 模型生成模型的摘要信息并绘制残差图以评估模型的性能。 
# 打印 ARIMA 模型的摘要
print(results_ARIMA.summary())# 绘制对数变换后的数据和残差图
plt.plot(ts_logtransformed, labellog_transformed_data)
plt.plot(results_ARIMA.resid, colorgreen, labelResiduals)
plt.title(ARIMA Model Residual plot)
plt.legend(locbest)# 绘制残差误差值的密度图
results_ARIMA.resid.plot(kindkde)
plt.title(Density plot of the residual error values)
print(results_ARIMA.resid.describe())test  pd.read_csv(../input/bitcoin_price_1week_Test - Test.csv,index_col Date)
test.index  pd.to_datetime(test.index)
test  test[Close]
test  test.sort_index()
test代码总结 这段代码的目的是使用 ARIMA 模型进行预测和预测结果的累积求和。代码的逻辑是通过拟合 ARIMA 模型生成预测值并对预测值进行累积求和最终将结果转换回原始尺度。 
# 使用 ARIMA 模型进行预测
predictions_ARIMA_diff  pd.Series(results_ARIMA.fittedvalues, copyTrue)
print(predictions_ARIMA_diff.head())# 对预测值进行累积求和
predictions_ARIMA_diff_cumsum  predictions_ARIMA_diff.cumsum()
print(predictions_ARIMA_diff_cumsum.head())# 将累积求和的结果转换回对数尺度
predictions_ARIMA_log  pd.Series(ts_logtransformed.iloc[0], indexts_logtransformed.index)
predictions_ARIMA_log  predictions_ARIMA_log.add(predictions_ARIMA_diff_cumsum, fill_value0)
predictions_ARIMA_log.head()# 将对数尺度的预测值转换回原始尺度
predictions_ARIMA  np.exp(predictions_ARIMA_log)
plt.plot(data)
plt.plot(predictions_ARIMA)
plt.title(RMSE: %.4f % np.sqrt(sum((predictions_ARIMA - data)**2) / len(data)))dates  [pd.Timestamp(2017-08-01), pd.Timestamp(2017-08-02), pd.Timestamp(2017-08-03),pd.Timestamp(2017-08-04), pd.Timestamp(2017-08-05), pd.Timestamp(2017-08-06), pd.Timestamp(2017-08-07)]forecast  pd.Series(results_ARIMA.forecast(steps7)[0],dates)
forecast  np.exp(forecast)
print(forecast)
error  mean_squared_error(test, forecast)
print(Test MSE: %.3f % error)plt.plot(forecast, color green, label Predicted rates)
plt.plot(test, color  red, label  Observed from test data)
plt.title(RMSE: %.4f% np.sqrt(sum((forecast-test)**2)/len(data)))
plt.legend(loc  best)代码总结 这段代码的目的是使用 MA 模型进行预测并计算预测值与实际值之间的均方误差MSE。代码的逻辑是通过拟合 MA 模型生成预测值并计算预测值与实际值之间的误差。 
# 使用 MA 模型进行预测
predictions_MA_diff  pd.Series(results_MA.fittedvalues, copyTrue)
print(predictions_MA_diff.head())# 对预测值进行累积求和
predictions_MA_diff_cumsum  predictions_MA_diff.cumsum()
print(predictions_MA_diff_cumsum.head())# 将累积求和的结果转换回对数尺度
predictions_MA_log  pd.Series(ts_logtransformed.iloc[0], indexts_logtransformed.index)
predictions_MA_log  predictions_MA_log.add(predictions_MA_diff_cumsum, fill_value0)
predictions_MA_log.head()# 将对数尺度的预测值转换回原始尺度
predictions_MA  np.exp(predictions_MA_log)
plt.plot(data)
plt.plot(predictions_MA)
plt.title(RMSE: %.4f % np.sqrt(sum((predictions_MA - data)**2) / len(data)))# 计算预测值与实际值之间的均方误差
error  mean_squared_error(test, forecast)
print(Test MSE: %.3f % error)以下是翻译后的文章内容包括对代码部分的注释和总结 
# 定义日期列表
dates  [pd.Timestamp(2017-08-01), pd.Timestamp(2017-08-02), pd.Timestamp(2017-08-03),pd.Timestamp(2017-08-04), pd.Timestamp(2017-08-05), pd.Timestamp(2017-08-06), pd.Timestamp(2017-08-07)]# 使用移动平均模型对未来的7天进行预测并将预测结果存储在 forecast 变量中
forecast  pd.Series(results_MA.forecast(steps7)[0], dates)
# 对预测结果进行指数变换恢复到原始数据的尺度
forecast  np.exp(forecast)
# 打印预测结果
print(forecast)# 计算测试数据与预测数据之间的均方误差MSE
error  mean_squared_error(test, forecast)
# 打印测试均方误差MSE
print(Test MSE: %.3f % error)# 以下代码的目的是绘制预测结果和测试数据的图表
plt.plot(forecast, colorgreen, labelPredicted rates)  # 绘制预测结果颜色为绿色标签为 Predicted rates
plt.plot(test, colorred, labelObserved from test data)  # 绘制测试数据颜色为红色标签为 Observed from test data
# 设置图表标题并显示均方根误差RMSE
plt.title(RMSE: %.4f % np.sqrt(sum((forecast - test) ** 2) / len(data)))
plt.legend(locbest)  # 设置图例位置为最佳消除上述时间序列中的季节性是一个需要进行大量工作的任务。可以扩展使用更多方法如曲线拟合和差分来识别季节性并从数据中去除季节性成分。 
改进的模型可以是从前一年的相同日历月的平均币价中减去而不是从相同日期中减去。 
我们可以通过将数据集重新采样为月平均价格来开始。重新采样方法处理了闰年的概念同时消除了偏移例如2月只有28天。 
# 将数据重新采样为月平均价格
monthly_mean  data.resample(M).mean()
# 打印前13个月的月平均价格
print(monthly_mean.head(13))
# 绘制月平均价格的图表
monthly_mean.plot()以下是另一种方法来评估预测性能 
# 对测试数据进行对数变换
test_logtransformed  np.log(test)# 初始化历史数据列表包含对数变换后的训练数据
history  [x for x in ts_logtransformed]
# 初始化预测结果列表
predictions  list()
# 遍历测试数据的每个时间点
for t in range(len(test)):# 使用移动平均模型进行预测output  results_MA.forecast()yhat  output[0]  # 获取预测结果predictions.append(yhat)  # 将预测结果添加到预测列表中# 获取实际观察值并添加到历史数据列表中obs  test_logtransformed[t]history.append(obs)print(predicted%f, expected%f % (yhat, obs))  # 打印预测值和实际值# 计算对数变换后的测试数据与预测数据之间的均方误差MSE
error  mean_squared_error(test_logtransformed, predictions)
# 打印测试均方误差MSE
print(Test MSE: %.3f % error)消除上述时间序列中的季节性是一个需要进行大量工作的任务。可以扩展使用更多方法如曲线拟合和差分来识别季节性并从数据中去除季节性成分。 
改进的模型可以是从前一年的相同日历月的平均币价中减去而不是从相同日期中减去。 
我们可以通过将数据集重新采样为月平均价格来开始。重新采样方法处理了闰年的概念同时消除了偏移例如2月只有28天。 
代码总结 这段代码的目的是使用 Prophet 模型进行时间序列预测。代码的逻辑是通过拟合 Prophet 模型生成未来 7 天的预测值并绘制预测结果。 
from prophet import Prophet# 准备数据
data_prophet  data.copy()
data_prophet  pd.DataFrame(data_prophet)
data_prophet.reset_index(dropFalse, inplaceTrue)
data_prophet.columns  [ds, y]# 创建并拟合 Prophet 模型
m  Prophet()
m.fit(data_prophet)# 生成未来 7 天的预测数据
future  m.make_future_dataframe(periods7, freqD)
forecast  m.predict(future)# 绘制预测结果
m.plot(forecast)
data.plot()# 绘制预测结果的组件
m.plot_components(forecast)# 提取预测值并计算均方误差
forecasted_values  forecast[[ds, yhat]].tail(7)
forecasted_values  forecasted_values.set_index(ds)
forecasted_values.columns  [y]
mean_squared_error(forecasted_values[y], test)代码总结 这段代码的目的是使用 LSTM 模型进行时间序列预测。代码的逻辑是通过创建和训练 LSTM 模型对时间序列数据进行预测。 
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.preprocessing import MinMaxScaler# 创建 LSTM 模型
model  Sequential()
model.add(LSTM(50, input_shape(1, 1)))
model.add(Dense(1))
model.compile(lossmean_squared_error, optimizeradam)# 数据预处理
scaler  MinMaxScaler(feature_range(0, 1))
scaled_data  scaler.fit_transform(data)# 训练模型
model.fit(scaled_data, epochs100, batch_size1, verbose2)总结 
本文介绍了如何使用 ARIMA 和 MA 模型进行时间序列预测并通过网格搜索找到最佳的超参数组合。此外还介绍了如何使用 Prophet 和 LSTM 模型进行时间序列预测。通过这些方法可以有效地预测时间序列数据并评估模型的性能。 文章转载自: http://www.morning.qcbhb.cn.gov.cn.qcbhb.cn http://www.morning.dpbgw.cn.gov.cn.dpbgw.cn http://www.morning.rqbkc.cn.gov.cn.rqbkc.cn http://www.morning.thmlt.cn.gov.cn.thmlt.cn http://www.morning.txfzt.cn.gov.cn.txfzt.cn http://www.morning.ggjlm.cn.gov.cn.ggjlm.cn http://www.morning.wbhzr.cn.gov.cn.wbhzr.cn http://www.morning.zfyfy.cn.gov.cn.zfyfy.cn http://www.morning.djlxz.cn.gov.cn.djlxz.cn http://www.morning.jcxqc.cn.gov.cn.jcxqc.cn http://www.morning.rtmqy.cn.gov.cn.rtmqy.cn http://www.morning.nqnqz.cn.gov.cn.nqnqz.cn http://www.morning.ccffs.cn.gov.cn.ccffs.cn http://www.morning.qkcyk.cn.gov.cn.qkcyk.cn http://www.morning.kpbgp.cn.gov.cn.kpbgp.cn http://www.morning.wdrxh.cn.gov.cn.wdrxh.cn http://www.morning.xcjwm.cn.gov.cn.xcjwm.cn http://www.morning.kztts.cn.gov.cn.kztts.cn http://www.morning.wcqkp.cn.gov.cn.wcqkp.cn http://www.morning.lnsnyc.com.gov.cn.lnsnyc.com http://www.morning.glbnc.cn.gov.cn.glbnc.cn http://www.morning.rwmft.cn.gov.cn.rwmft.cn http://www.morning.mgbcf.cn.gov.cn.mgbcf.cn http://www.morning.xhddb.cn.gov.cn.xhddb.cn http://www.morning.mlmwl.cn.gov.cn.mlmwl.cn http://www.morning.hkng.cn.gov.cn.hkng.cn http://www.morning.bwkhp.cn.gov.cn.bwkhp.cn http://www.morning.yrrnx.cn.gov.cn.yrrnx.cn http://www.morning.thrcj.cn.gov.cn.thrcj.cn http://www.morning.ykkrg.cn.gov.cn.ykkrg.cn http://www.morning.mdxwz.cn.gov.cn.mdxwz.cn http://www.morning.zjqwr.cn.gov.cn.zjqwr.cn http://www.morning.gnhsg.cn.gov.cn.gnhsg.cn http://www.morning.ppqzb.cn.gov.cn.ppqzb.cn http://www.morning.pxbky.cn.gov.cn.pxbky.cn http://www.morning.jhtrb.cn.gov.cn.jhtrb.cn http://www.morning.rylr.cn.gov.cn.rylr.cn http://www.morning.jlktz.cn.gov.cn.jlktz.cn http://www.morning.gwxsk.cn.gov.cn.gwxsk.cn http://www.morning.lnrr.cn.gov.cn.lnrr.cn http://www.morning.pwdgy.cn.gov.cn.pwdgy.cn http://www.morning.lnbcx.cn.gov.cn.lnbcx.cn http://www.morning.jmdpp.cn.gov.cn.jmdpp.cn http://www.morning.txrkq.cn.gov.cn.txrkq.cn http://www.morning.thnpj.cn.gov.cn.thnpj.cn http://www.morning.cflxx.cn.gov.cn.cflxx.cn http://www.morning.jtnph.cn.gov.cn.jtnph.cn http://www.morning.wplbs.cn.gov.cn.wplbs.cn http://www.morning.xdwcg.cn.gov.cn.xdwcg.cn http://www.morning.rfxg.cn.gov.cn.rfxg.cn http://www.morning.kqxwm.cn.gov.cn.kqxwm.cn http://www.morning.rshs.cn.gov.cn.rshs.cn http://www.morning.znqmh.cn.gov.cn.znqmh.cn http://www.morning.jlxld.cn.gov.cn.jlxld.cn http://www.morning.yfqhc.cn.gov.cn.yfqhc.cn http://www.morning.lzqdl.cn.gov.cn.lzqdl.cn http://www.morning.zkdmk.cn.gov.cn.zkdmk.cn http://www.morning.lfqtp.cn.gov.cn.lfqtp.cn http://www.morning.rknsp.cn.gov.cn.rknsp.cn http://www.morning.pxlql.cn.gov.cn.pxlql.cn http://www.morning.wgqtt.cn.gov.cn.wgqtt.cn http://www.morning.bmqls.cn.gov.cn.bmqls.cn http://www.morning.fpngg.cn.gov.cn.fpngg.cn http://www.morning.nqmwk.cn.gov.cn.nqmwk.cn http://www.morning.pakistantractors.com.gov.cn.pakistantractors.com http://www.morning.bsjxh.cn.gov.cn.bsjxh.cn http://www.morning.wfyqn.cn.gov.cn.wfyqn.cn http://www.morning.xkzr.cn.gov.cn.xkzr.cn http://www.morning.rksg.cn.gov.cn.rksg.cn http://www.morning.qichetc.com.gov.cn.qichetc.com http://www.morning.bryyb.cn.gov.cn.bryyb.cn http://www.morning.pfbx.cn.gov.cn.pfbx.cn http://www.morning.ljglc.cn.gov.cn.ljglc.cn http://www.morning.yixingshengya.com.gov.cn.yixingshengya.com http://www.morning.rhjsx.cn.gov.cn.rhjsx.cn http://www.morning.kphsp.cn.gov.cn.kphsp.cn http://www.morning.rnzbr.cn.gov.cn.rnzbr.cn http://www.morning.rmqmc.cn.gov.cn.rmqmc.cn http://www.morning.zgztn.cn.gov.cn.zgztn.cn http://www.morning.jikuxy.com.gov.cn.jikuxy.com