如何对非连续金融时间序列使用seasonal_decompose做季节性分解
金融交易日数据季节性分解解决方案
seasonal_decompose 抛出该错误的核心是无法自动识别数据的季节周期,你不需要强行兼容日频要求,两种方案都可以解决问题:
方案1:手动指定季节周期(更推荐)
直接通过period参数传入你要分解的季节周期长度即可,不需要修改原始数据,是处理不规则时间索引最简便的方案,金融交易日常用周期参考:
- 周度季节性:对应5个交易日,
period=5 - 月度季节性:对应约22个交易日,
period=22 - 年度季节性:对应约252个交易日,
period=252
修改后的代码示例(以周度季节性分解为例):
from statsmodels.tsa.seasonal import seasonal_decompose import pandas as pd import datetime import pandas_datareader as data df = data.get_data_yahoo('UGA', start=everSince, end=today) df_close = df[['Close']] # 新增period参数即可正常运行 result = seasonal_decompose(df_close, model='multiplicative', period=5)
方案2:补全完整工作日索引
如果后续分析需要依赖严格对齐的工作日索引,可以先补全非交易日的缺失值再运行:
from statsmodels.tsa.seasonal import seasonal_decompose import pandas as pd import datetime import pandas_datareader as data df = data.get_data_yahoo('UGA', start=everSince, end=today) df_close = df[['Close']] # 生成覆盖数据区间的完整工作日索引 full_biz_index = pd.date_range(start=df_close.index.min(), end=df_close.index.max(), freq='B') # 重索引后填充缺失值,可根据需求选择ffill前值填充、线性插值等填充方法 df_close_full = df_close.reindex(full_biz_index).ffill() # 此时索引自带freq属性,无需指定period即可运行 result = seasonal_decompose(df_close_full, model='multiplicative')
两种方案的差异:
- 手动指定
period的方案不会修改原始数据,也不会引入填充带来的额外误差,适合仅做季节性分解的场景 - 补全索引的方案适合后续需要做其他依赖连续时间索引的时间序列分析的场景
内容的提问来源于stack exchange,提问作者roschach
相关产品推荐
相关产品推荐

