含间隙的股票时间序列数据在PyCaret中的建模方案咨询
带日期间隙的股票时间序列建模方案
一、PyCaret时间序列模块的适配方法
PyCaret时序模块默认要求序列为规则频率且无间隙,但股票交易日属于仅工作日的不规则频率,可通过以下两种方式适配:
1. 直接使用不规则频率序列
PyCaret支持标记不规则频率的时序数据,只需初始化时设置freq=None,同时确保日期列已排序:
from pycaret.time_series import TSForecastingExperiment # 确保数据按日期排序 ps0pyc = ps0pyc.sort_values('Date').reset_index(drop=True) # 初始化实验,指定不规则频率 exp = TSForecastingExperiment() exp.setup(data=ps0pyc, target='PORTVAL', index='Date', freq=None)
此方法无需填充缺失值,适配XGBoost、LightGBM等天然支持不规则时序的模型。
2. 转换为工作日规则序列
若需使用ARIMA、Prophet这类依赖规则频率的模型,可将数据转换为B(工作日)频率,自动跳过周末/节假日,再通过填充处理非交易日的缺失:
# 将日期设为索引,按工作日频率对齐 ps0pyc = ps0pyc.set_index('Date').asfreq('B') # 初始化实验,用迭代填充处理缺失值 exp = TSForecastingExperiment() exp.setup(data=ps0pyc, target='PORTVAL', imputation_type='iterative')
二、替代建模方案
1. 使用支持不规则时序的工具直接建模
- XGBoost/LightGBM:提取日期特征(年、月、星期几、是否月初/月末等),将时序问题转化为监督回归任务训练模型。
- Prophet:天然适配带间隙的时序,直接传入原始日期和目标值即可:
from prophet import Prophet # 转换为Prophet要求的列名:ds(日期)、y(目标值) df_prophet = ps0pyc.rename(columns={'Date':'ds', 'PORTVAL':'y'}) model = Prophet() model.fit(df_prophet) # 生成未来30个工作日的预测数据 future = model.make_future_dataframe(periods=30, freq='B') forecast = model.predict(future)
2. 降采样为低频率规则序列
若无需日度预测,可将数据降采样为周度、月度或季度数据,自然消除间隙:
# 降采样为月度数据,取每月最后一个交易日的数值 ps0_monthly = ps0pyc.set_index('Date').resample('M').last().reset_index() # 直接用PyCaret建模 exp = TSForecastingExperiment() exp.setup(data=ps0_monthly, target='PORTVAL', index='Date', freq='M')
3. 手动填充缺失值后使用PyCaret
若必须用连续日度序列,可手动填充非交易日的缺失值:
- 前向填充(适合股票价格这类连续性数据):
ps0_filled = ps0pyc.set_index('Date').asfreq('D').ffill().reset_index() - 线性插值(适合渐变趋势的数据):
ps0_filled = ps0pyc.set_index('Date').asfreq('D').interpolate(method='linear').reset_index()
填充完成后即可正常使用PyCaret时序模块。
内容的提问来源于stack exchange,提问作者swagdevotee008
相关产品推荐
相关产品推荐

