(试水阿里天池)资金流入流出预测-挑战Baseline

赛题简介

通过对例如余额宝用户的申购赎回数据的把握,精准预测未来每日的资金流入流出情况。对货币基金而言,资金流入意味着申购行为,资金流出为赎回行为 。

链接:https://tianchi.aliyun.com/competition/entrance/231573/introduction?spm=5176.12281973.1005.5.3dd524487floHF

一、数据预处理
导入所需模块

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')

导入数据并查看

df=pd.read_csv('user_balance_table.csv',parse_dates=['report_date'])
df.head().append(df.tail())
df.shape
df.info()
df.isnull().sum()

提取“total_purchase_amt”和“total_redeem_amt”并按日求和汇总

daydf=df.groupby(['report_date'])
totaldf=daydf['total_purchase_amt','total_redeem_amt'].sum()
totaldf.head()

在这里插入图片描述
二、建模分析
绘制时序图

plt.style.use('ggplot')
fig=plt.subplots(figsize=(15,5))
ax1=plt.subplot2grid((1,1),(0,0))
totaldf.plot(ax=ax1,linewidth=2,fontsize=14)
ax1.set_title('时序图',fontsize=18)

在这里插入图片描述
使用Dickey-Fuller测试来验证序列平稳性使用Dickey-Fuller测试来验证序列平稳性
total_purchase_am:

import statsmodels.api as sm
sm.tsa.seasonal_decompose(totaldf['total_purchase_amt'].values, freq=7).plot()
print("Dickey-Fuller test: p=%f" % sm.tsa.stattools.adfuller(totaldf['total_purchase_amt'])[1])

在这里插入图片描述
total_redeem_amt:

sm.tsa.seasonal_decompose(totaldf['total_redeem_amt'].values, freq=7).plot()
print("Dickey-Fuller test: p=%f" % sm.tsa.stattools.adfuller(totaldf['total_redeem_amt'])[1])

在这里插入图片描述
p值都大于0.05,说明这两个原始序列都不是平稳序列。

白噪声检验

from statsmodels.stats.diagnostic import acorr_ljungbox
purchase_value=acorr_ljungbox(totaldf['total_purchase_amt'],lags=1)
redeem_value=acorr_ljungbox(totaldf['total_redeem_amt'],lags=1)
purchase_value,redeem_value

序列大于0.05,拒绝原假设,这两个序列都不是白噪声序列。

画出时间序列图及其自相关图和偏自相关图的函数。

import statsmodels.tsa.api as smt
def tsplot(y, lags=None, figsize=(12, 7), style='bmh'):
    """
    画出时间序列的图形
    y - 时间序列
    lags - 延迟大小
    """
    if not isinstance(y, pd.Series):
        y = pd.Series(y)

    with plt.style.context(style):
        fig = plt.figure(figsize=figsize)
        layout = (2, 2)
        ts_ax = plt.subplot2grid(layout, (0, 0), colspan=2)
        acf_ax = plt.subplot2grid(layout, (1, 0))
        pacf_ax = plt.subplot2grid(layout, (1, 1))

        y.plot(ax=ts_ax)
        p_value = sm.tsa.stattools.adfuller(y.values)[1]
        ts_ax.set_title(
            'Time Series Analysis Plots\n Dickey-Fuller: p={0:.5f}'.format(p_value))
        smt.graphics.plot_acf(y, lags=lags, ax=acf_ax)
        smt.graphics.plot_pacf(y, lags=lags, ax=pacf_ax)
        plt.tight_layout()
tsplot(totaldf.total_purchase_amt, lags=60)

在这里插入图片描述
#原序列转化为平稳序列,季节差分设为7天,并设置1阶差分

prc_diff = totaldf.total_purchase_amt - totaldf.total_purchase_amt.shift(7)
tsplot(prc_diff[7:], lags=60)
pca_diff = prc_diff -prc_diff.shift(1)
tsplot(pca_diff[7+1:], lags=60)

在这里插入图片描述

red_diff = totaldf.total_redeem_amt - totaldf.total_redeem_amt.shift(7)
tsplot(red_diff[7:], lags=60)
rda_diff = red_diff -red_diff.shift(1)
tsplot(pca_diff[7+1:], lags=60)

在这里插入图片描述
差分后的序列图也显示数据在0上下波动,平稳性良好,对于ARIMA模型,d值可以选取1。

确定SARIMA的值

from itertools import product

# 设置初始值
ps = range(2, 5)
d = 1
qs = range(2, 5)
Ps = range(0, 2)
D = 1
Qs = range(0, 2)
s = 7  # 季节性长度任然是7

# 使用所有可能的参数组合创建列表
parameters = product(ps, qs, Ps, Qs)
parameters_list = list(parameters)
len(parameters_list)
from tqdm import tqdm_notebook
from scipy.optimize import minimize
pca_results = []
pca_best_aic = float('inf')  #正无穷
for pca_param in parameters_list:
    
#     try:
    pca_model = sm.tsa.statespace.SARIMAX(totaldf.total_purchase_amt,order=(pca_param[0], d, pca_param[1]),
                                          seasonal_order=(pca_param[2], D, pca_param[3], s)).fit()
#     except ValueError:
#         print('参数错误:',pca_param)
#         continue
    pca_aic = pca_model.aic
    if pca_aic < pca_best_aic:
        pca_best_model = pca_model
        pca_best_aic = pca_aic
        pca_best_param = pca_param
    pca_results.append([pca_param,pca_model.aic])
#输出最优模型
pca_result_table = pd.DataFrame(pca_results)
pca_result_table.columns = ['parameters','pca_aic']
print('最优模型:',pca_best_model.summary())

在这里插入图片描述

tsplot(pca_best_model.resid[7+1:], lags=60)

在这里插入图片描述

# 设置rda初始值
rps = range(1, 5)
rd = 1
rqs = range(1, 5)
RPs = range(0, 2)
RD = 1
RQs = range(0, 2)
Rs = 7  # 季节性长度任然是 24

```python
# 使用所有可能的参数组合创建列表
rda_parameters = product(rps, rqs, RPs, RQs)
rda_parameters_list = list(rda_parameters)
len(rda_parameters_list)
rda_results = []
rda_best_aic = float('inf')  #正无穷
for rda_param in parameters_list:
    rda_model = sm.tsa.statespace.SARIMAX(totaldf.total_redeem_amt,order=(rda_param[0], rd, rda_param[1]),
                                          seasonal_order=(rda_param[2], RD, rda_param[3], s)).fit()
    rda_aic = rda_model.aic
    if rda_aic < rda_best_aic:
        rda_best_model = rda_model
        rda_best_aic = rda_aic
        rda_best_param = rda_param
    rda_results.append([rda_param,rda_model.aic])
#输出最优模型
rda_result_table = pd.DataFrame(rda_results)
rda_result_table.columns = ['parameters','rda_aic']
print('最优模型:',rda_best_model.summary())
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200401131427310.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTczMTc5Mw==,size_16,color_FFFFFF,t_70)

```python
tsplot(rda_best_model.resid[7+1:], lags=60)

在这里插入图片描述

三、建模预测

# “total_purchase_amt”序列建模预测实现代码及结果序列
fig=plt.figure(figsize=(20,5))
ax2=fig.add_subplot(111)
purchase=totaldf['total_purchase_amt']
purchasePredict=pca_best_model.predict('2014-09-01','2014-09-30',typ='levels')
purchasePredict.plot(ax=ax2)
purchase.plot(ax=ax2)

在这里插入图片描述

# “total_redeem_am”序列建模预测实现代码及结果序列
fig=plt.figure(figsize=(20,5))
ax3=fig.add_subplot(111)
purchase=totaldf['total_redeem_amt']
redeemPredict=rda_best_model.predict('2014-09-01','2014-09-30',typ='levels')
redeemPredict.plot(ax=ax3)
purchase.plot(ax=ax3)

在这里插入图片描述

四、输出预测结果

report_date=list(range(20140901,20140931))
sub=pd.DataFrame()
sub['purchase']=purchasePredict
sub['redeem']=redeemPredict
sub=sub.reset_index()
sub['index']=report_date
sub=sub.rename(columns={'index':'report_date'})
sub[['purchase','redeem']]=sub[['purchase','redeem']].astype(np.int64)
sub=sub.set_index(['report_date'])
sub.to_csv('tc_comp_predict_table.csv',sep=',')
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值