资金流入流出预测比赛完整流程记录
目录
- 比赛任务描述
- 数据预处理与分析
- ARIMA模型实现与结果
- 周期因子模型实现与结果
- Prophet综合优化方案
- 模型融合策略
- 最终结果与提交
- 经验总结与改进方向
比赛任务描述
报名地址
https://tianchi.aliyun.com/competition/entrance/231573/infor
任务目标
本比赛任务是预测某金融产品在2014年9月1日至9月30日期间的每日申购金额(total_purchase_amt)和赎回金额(total_redeem_amt)。
数据来源
- 训练数据:2014年3月1日至2014年8月31日的用户余额表数据(user_balance_table.csv)
- 数据格式:包含用户ID、报告日期、申购金额、赎回金额等字段
评价指标
使用均方根误差(RMSE)评估模型性能,分数越高表示预测越准确。
数据预处理与分析
数据加载
importpandasaspdimportnumpyasnp# 读取用户余额表数据user_balance=pd.read_csv('user_balance_table.csv')数据转换与筛选
# 将report_date转换为datetime格式user_balance['report_date']=pd.to_datetime(user_balance['report_date'],format='%Y%m%d')# 筛选2014-03-01至2014-08-31的数据user_balance=user_balance[(user_balance['report_date']>='2014-03-01')&(user_balance['report_date']<='2014-08-31')]数据聚合
按日期汇总每日的申购和赎回总金额:
# 按日期汇总total_purchase_amt和total_redeem_amtdaily_data=user_balance.groupby('report_date')[['total_purchase_amt','total_redeem_amt']].sum().reset_index()数据可视化
绘制资金流入流出趋势图,观察数据的周期性和趋势特征:
importmatplotlib.pyplotasplt plt.figure(figsize=(15,6))plt.plot(daily_data['report_date'],daily_data['total_purchase_amt'],label='申购金额',color='blue')plt.plot(daily_data['report_date'],daily_data['total_redeem_amt'],label='赎回金额',color='red')plt.title('资金流入流出趋势图')plt.xlabel('日期')plt.ylabel('金额')plt.legend()plt.grid(True)plt.show()通过可视化分析,我们观察到数据具有明显的周期性特征(周周期和月周期),以及一定的趋势性。
ARIMA模型实现与结果
ARIMA模型介绍
ARIMA(自回归积分移动平均)是一种常用的时间序列预测模型,由三个参数组成:
- p:自回归项数
- d:差分阶数
- q:移动平均项数
根据数据特点,我们选择ARIMA(7,1,7)模型,其中:
- 7阶自回归项捕捉一周的周期性
- 1阶差分使序列平稳
- 7阶移动平均项捕捉短期波动
ARIMA模型实现
fromstatsmodels.tsa.arima.modelimportARIMA# 对申购金额建立ARIMA模型purchase_model=ARIMA(daily_data['total_purchase_amt'],order=(7,1,7))purchase_model_fit=purchase_model.fit()# 对赎回金额建立ARIMA模型redeem_model=ARIMA(daily_data['total_redeem_amt'],order=(7,1,7))redeem_model_fit=redeem_model.fit()# 预测未来30天purchase_pred=purchase_model_fit.forecast(steps=30)redeem_pred=redeem_model_fit.forecast(steps=30)ARIMA模型结果
ARIMA模型的预测结果保存为result.csv,提交后获得了初步的预测分数。
周期因子模型实现与结果
周期因子模型思路
基于数据的周期性特征,我们考虑两种周期因子:
- 星期因子:周一至周日的周期性影响
- 日期因子:1号至31号的周期性影响
这两种因子采用乘法关系,共同影响最终预测结果。
周期因子计算
# 添加星期和日期特征daily_data['weekday']=daily_data['report_date'].dt.weekday# 0=周一, 6=周日daily_data['day_of_month']=daily_data['report_date'].dt.day# 计算星期因子weekday_stats=daily_data.groupby('weekday')[['total_purchase_amt','total_redeem_amt']].mean()weekday_avg_purchase=weekday_stats['total_purchase_amt'].mean()weekday_avg_redeem=weekday_stats['total_redeem_amt'].mean()weekday_purchase_factor=weekday_stats['total_purchase_amt']/weekday_avg_purchase weekday_redeem_factor=weekday_stats['total_redeem_amt']/weekday_avg_redeem# 计算日期因子day_stats=daily_data.groupby('day_of_month')[['total_purchase_amt','total_redeem_amt']].mean()day_avg_purchase=day_stats['total_purchase_amt'].mean()day_avg_redeem=day_stats['total_redeem_amt'].mean()day_purchase_factor=day_stats['total_purchase_amt']/day_avg_purchase day_redeem_factor=day_stats['total_redeem_amt']/day_avg_redeem周期因子模型预测
# 生成未来30天的日期future_dates=pd.date_range(start='2014-09-01',end='2014-09-30')future_df=pd.DataFrame({'report_date':future_dates})future_df['weekday']=future_df['report_date'].dt.weekday future_df['day_of_month']=future_df['report_date'].dt.day# 应用周期因子(乘法关系)future_df['purchase_periodic_factor']=future_df['weekday'].map(weekday_purchase_factor)*future_df['day_of_month'].map(day_purchase_factor)future_df['redeem_periodic_factor']=future_df['weekday'].map(weekday_redeem_factor)*future_df['day_of_month'].map(day_redeem_factor)# 基于历史均值和周期因子进行预测historical_avg_purchase=daily_data['total_purchase_amt'].mean()historical_avg_redeem=daily_data['total_redeem_amt'].mean()future_df['total_purchase_amt']=historical_avg_purchase*future_df['purchase_periodic_factor']future_df['total_redeem_amt']=historical_avg_redeem*future_df['redeem_periodic_factor']周期因子模型结果
周期因子模型的预测结果保存为result2.csv,提交后获得了115分的成绩。
Prophet综合优化方案
为了进一步提高预测精度,我们采用了Facebook Prophet模型进行综合优化,该模型能够更好地处理时间序列的趋势、季节性和节假日效应。
Prophet模型介绍
Prophet是Facebook开发的时间序列预测工具,具有以下特点:
- 自动处理趋势变化点
- 内置周/月/年季节性模型
- 支持添加节假日效应
- 提供直观的模型参数调整
Prophet模型实现
1. 数据准备
# Prophet模型需要的数据集格式:ds(日期)和y(目标值)df_purchase=daily_data[['report_date','total_purchase_amt']].rename(columns={'report_date':'ds','total_purchase_amt':'y'})df_redeem=daily_data[['report_date','total_redeem_amt']].rename(columns={'report_date':'ds','total_redeem_amt':'y'})2. 节假日处理
考虑到2014年9月6日至8日为中秋节假期,我们添加了节假日效应:
# 定义2014年节假日(包含中秋节及前后影响)holidays=pd.DataFrame({'holiday':'mid_autumn','ds':pd.to_datetime(['2014-09-06','2014-09-07','2014-09-08']),# 中秋节及前后'lower_window':0,'upper_window':0,})3. Prophet模型拟合
fromprophetimportProphet# 创建并拟合Prophet模型(申购)prophet_purchase=Prophet(growth='linear',seasonality_mode='multiplicative',holidays=holidays,holidays_prior_scale=5,yearly_seasonality=False,weekly_seasonality=True,daily_seasonality=False,interval_width=0.95)prophet_purchase.add_seasonality(name='monthly',period=30.5,fourier_order=3)prophet_purchase.fit(df_purchase)# 创建并拟合Prophet模型(赎回)prophet_redeem=Prophet(growth='linear',seasonality_mode='multiplicative',holidays=holidays,holidays_prior_scale=5,yearly_seasonality=False,weekly_seasonality=True,daily_seasonality=False,interval_width=0.95)prophet_redeem.add_seasonality(name='monthly',period=30.5,fourier_order=3)prophet_redeem.fit(df_redeem)4. 特征工程增强
为了进一步提高模型性能,我们添加了滞后特征和移动平均特征:
# 添加滞后特征(前7天、14天、21天)daily_features=daily_data.copy()forlagin[7,14,21]:daily_features[f'purchase_lag_{lag}']=daily_features['total_purchase_amt'].shift(lag)daily_features[f'redeem_lag_{lag}']=daily_features['total_redeem_amt'].shift(lag)# 添加移动平均特征(7天、14天)forwindowin[7,14]:daily_features[f'purchase_ma_{window}']=daily_features['total_purchase_amt'].rolling(window=window).mean()daily_features[f'redeem_ma_{window}']=daily_features['total_redeem_amt'].rolling(window=window).mean()# 去除缺失值daily_features=daily_features.dropna()5. 增强模型训练
使用线性回归模型结合Prophet预测和特征工程结果:
fromsklearn.linear_modelimportLinearRegression# 建立增强模型defbuild_enhanced_model(daily_features,target_col,prophet_predictions,target_prophet_col):# 合并特征和Prophet预测X=daily_features.drop(['report_date','total_purchase_amt','total_redeem_amt'],axis=1)X['prophet_prediction']=daily_features['report_date'].map(prophet_predictions.set_index('report_date')[target_prophet_col])y=daily_features[target_col]# 训练模型model=LinearRegression()model.fit(X,y)returnmodel# 建立申购和赎回的增强模型purchase_enhanced_model=build_enhanced_model(daily_features,'total_purchase_amt',prophet_predictions,'purchase_prophet')redeem_enhanced_model=build_enhanced_model(daily_features,'total_redeem_amt',prophet_predictions,'redeem_prophet')模型融合策略
为了综合各模型的优势,我们采用了加权平均的模型融合策略:
- Prophet模型:权重40%,提供基线预测
- 增强模型:权重30%,结合了额外特征
- 周期因子模型:权重30%,捕捉周期性特征
融合实现
# 模型融合:加权平均# 1. Prophet模型预测prophet_preds=prophet_predictions.tail(30).set_index('report_date')# 2. 增强模型预测enhanced_purchase_preds=purchase_enhanced_model.predict(X_future_purchase)enhanced_redeem_preds=redeem_enhanced_model.predict(X_future_redeem)# 3. 周期因子调整的基线预测periodic_purchase_preds=historical_avg_purchase*periodic_preds['purchase_periodic_factor']periodic_redeem_preds=historical_avg_redeem*periodic_preds['redeem_periodic_factor']# 权重分配:Prophet(40%), 增强模型(30%), 改进周期因子(30%)final_purchase_preds=0.4*prophet_preds['purchase_prophet'].values+0.3*enhanced_purchase_preds+0.3*periodic_purchase_preds.values final_redeem_preds=0.4*prophet_preds['redeem_prophet'].values+0.3*enhanced_redeem_preds+0.3*periodic_redeem_preds.values最终结果与提交
生成预测结果
# 生成最终预测结果final_forecast=pd.DataFrame({'report_date':future_dates.strftime('%Y%m%d').astype(int),'total_purchase_amt':final_purchase_preds,'total_redeem_amt':final_redeem_preds})# 保存结果(无表头)final_forecast.to_csv('result_optimized.csv',index=False,header=False)结果提交
将生成的result_optimized.csv文件提交至比赛平台(https://tianchi.aliyun.com/competition/entrance/231573/submission/88),最终获得了145分的成绩,成功通过比赛。
预测结果展示
预测结果的前10天数据如下:
| 日期 | 申购金额(元) | 赎回金额(元) |
|---|---|---|
| 20140901 | 330885275 | 322102155 |
| 20140902 | 312591938 | 291400953 |
| 20140903 | 320636752 | 313180408 |
| 20140904 | 322619932 | 276590303 |
| 20140905 | 266807750 | 252040967 |
| 20140906 | 212011998 | 171840275 |
| 20140907 | 207486402 | 192871410 |
| 20140908 | 320312554 | 318207197 |
| 20140909 | 322580235 | 296540520 |
| 20140910 | 328245020 | 301124852 |
经验总结与改进方向
成功经验
- 数据可视化分析:通过可视化准确识别数据的周期性和趋势性特征
- 多种模型尝试:从简单的ARIMA模型到复杂的Prophet模型,逐步提升预测精度
- 特征工程增强:添加滞后特征和移动平均特征,捕捉更多数据信息
- 模型融合策略:综合不同模型的优势,提高预测稳定性
- 节假日效应处理:考虑到特殊日期对资金流动的影响
改进方向
- 模型参数调优:进一步优化Prophet模型的参数设置
- 更多特征引入:可以考虑引入外部经济数据(如利率、股市行情等)
- 深度学习模型尝试:使用LSTM等深度学习模型处理时间序列数据
- 模型融合优化:尝试更复杂的融合策略,如Stacking或Blending
- 异常值处理:更精细地处理数据中的异常值
通过本次比赛,我们全面掌握了时间序列预测的常用方法和技巧,从数据预处理到模型选择,再到最终的结果优化,形成了一套完整的解决方案。