Statsmodels ARIMA分位数预测疑问:置信度与分位数的区别及替代方案
问题解答:时间序列多百分位数预测
目标
计算同一天的多百分位数预测值。
用户代码
# import the data catfish_sales = pd.read_csv('/kaggle/input/time-series-toy-data-set/catfish.csv', parse_dates = [0], index_col=0, date_parser=parse_date) train_data, test_data = np.split(catfish_sales, [int(len(catfish_sales)*0.95)]) forecast_data = pd.DataFrame() for conf in range(0,101,10): # Perform arima fit and forecast aux_df = arima.fit().get_forecast(steps=len(test_data)).conf_int(alpha=(1-(conf/100))) # print(forecast_data.dtypes) aux_df['Total_forecast'] = aux_df[['lower Total', 'upper Total']].mean(axis=1) conf_lbl = 'p'+str(conf)+'_' aux_df = aux_df.add_prefix(conf_lbl) print(aux_df.head()) forecast_Data = pd.concat([forecast_data,aux_df],axis=0)
当前输出
p0_lower Total p0_upper Total p0_Total_forecast 2011-08-01 15273.493541 15273.493541 15273.493541 2011-09-01 14611.272886 14611.272886 14611.272886 2011-10-01 13929.948620 13929.948620 13929.948620 2011-11-01 11729.123604 11729.123604 11729.123604 2011-12-01 12358.778644 12358.778644 12358.778644 p10_lower Total p10_upper Total p10_Total_forecast 2011-08-01 15130.404131 15416.582950 15273.493541 2011-09-01 14442.952828 14779.592943 14611.272886 2011-10-01 13747.205922 14112.691318 13929.948620 2011-11-01 11535.026991 11923.220217 11729.123604 2011-12-01 12154.903296 12562.653992 12358.778644 ..................... p90_lower Total p90_upper Total p90_Total_forecast 2011-08-01 13400.513982 17146.473099 15273.493541 2011-09-01 12408.034870 16814.510902 14611.272886 2011-10-01 11537.924366 16321.972875 13929.948620 2011-11-01 9188.481426 14269.765781 11729.123604 2011-12-01 9690.136982 15027.420306 12358.778644 p100_lower Total p100_upper Total p100_Total_forecast 2011-08-01 -inf inf NaN 2011-09-01 -inf inf NaN 2011-10-01 -inf inf NaN 2011-11-01 -inf inf NaN 2011-12-01 -inf inf NaN
技术问题解答
1. 置信水平与百分位数是否为同一概念?将90%置信度视为90分位数的假设是否正确?
二者不是同一概念,这个假设完全错误:
- 置信水平:针对模型的预测均值,90%置信区间表示有90%的概率真实预测均值落在该区间内,它是围绕均值的对称区间(基于正态分布假设)。
- 百分位数预测:针对未来实际观测值的分布,90分位数表示未来观测值有90%的概率小于等于该值,是分布上的一个分位点,和均值没有直接对称关系。
2. 为什么所有置信度下的均值完全相同?
这是因为你计算的是置信区间上下限的均值,而ARIMA的置信区间是以固定的预测均值为中心对称展开的(假设残差服从正态分布)。不管置信水平怎么调整,上下限的中点永远等于预测均值,所以所有置信度下的结果都一致。这说明你混淆了置信区间的中心和分位数的概念——分位数不是置信区间的中点,而是分布的某个临界值。
3. 若ARIMA不适合,推荐哪些替代模型实现多百分位数预测?
ARIMA本身可以做分位数预测,但不是用conf_int方法。更合适的模型包括:
- 分位数ARIMA(QARIMA):直接针对不同分位数拟合ARIMA模型,输出对应分位数的预测值。
- 树模型(XGBoost/LightGBM/GBRT):将时间序列转化为特征(如滞后值、时间特征、滚动统计量等),使用分位数损失函数训练模型,可直接输出多个分位数的预测结果。
- Facebook Prophet:支持直接指定分位数输出预测,通过调整参数可以获取不同分位数的结果,使用门槛低。
- GARCH类模型(如QGARCH):如果数据存在波动聚类特征,分位数GARCH模型可以更精准地捕捉不同分位数下的波动情况,输出分位数预测。
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

