pandas 的 rolling regression

本文介绍了一种使用Pandas和Statsmodels进行滚动窗口多元线性回归的方法。通过生成虚拟交易数据,演示了如何利用RollingOLS进行回归分析,并手动计算预测值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Pandas的Rolling

使用pandas的rolling时,pandas DataFrame rolling 后的 apply 只能处理单列,就算用lambda的方式传入了多列,也不能返回多列 。因此如果想要做一个滚动的多元线性回归,则非常不方便。
最早的时候,有人问过这样子的问题
在这里插入图片描述
当时的解决办法是:

model = pd.stats.ols.MovingOLS(y=df.Y, x=df[['X1', 'X2', 'X3']], 
                               window_type='rolling', window=100, intercept=True)
df['Y_hat'] = model.y_predict

但是现在pandas已经没有 stats 了,因此只能换一种方式
搜索到 statsmodels 中有 rolling,因此可以尝试看看这种写法的效率如何:

使用 statsmodels

我们先生成一些测试数据

start_date = '20150101'
end_date = '20210601'
trading_date_lst = list(assistant.ReturnTradingCalendar(start_date=start_date,end_date=end_date)['cal_date'].astype(str))
test_df = pd.DataFrame({'Date':trading_date_lst},index=pd.to_datetime(trading_date_lst))

我们假设有 Y = 3X1 + 7X2 - 10*X3

import random
x1_lst = []
x2_lst = []
x3_lst = []
y_lst = []
for i in range(len(test_df)):
    x1 = 10*np.sin(2*np.pi*i/60 + 100)
    x2 = 10*np.sin(2*np.pi*i/178 + 31)
    x3 = 10*np.cos(2*np.pi*i/121 + 12)
    y = 3*x1 + 7*x2 - 10*x3
    y_lst.append(y)
    x1_lst.append( x1+ 2*random.random())
    x2_lst.append( x2+ 1*random.random())
    x3_lst.append( x3+ 0.9*random.random())
test_df['X1'] = x1_lst
test_df['X2'] = x2_lst
test_df['X3'] = x3_lst
test_df['Y'] = y_lst
test_df.head(20)

在这里插入图片描述
现在我们进行rolling的回归

from statsmodels.regression.rolling import RollingOLS
model = RollingOLS(endog =test_df['Y'].values , exog=test_df[['X1','X2','X3']],window=40)
rres = model.fit()
rres.params

在这里插入图片描述
但是速度稍微有点慢。
神奇的是,rres里并没有predict的一个选项,因此我们计算y_hat时,还得手动计算?

para_df = rres.params
test_df['Y_hat'] = (para_df * test_df[['X1','X2','X3']]).sum(axis=1)
PythonPandas库中,`rolling()`函数是一个非常有用的功能,它允许你在时间序列数据上应用统计计算,比如均值、标准差等,以指定的时间跨度(这里是60)形成一个移动窗口。如果你想对这个滑动窗口对象进行回归分析,通常你会: 1. **创建窗口**:首先,你需要对数据应用滚动窗口,例如计算每60个数据点的平均值或累计总和,这取决于你的回归模型需要哪种类型的输入。 ```python window_a = a.rolling(window=60).mean() # 使用平均值作为示例 ``` 2. **拟合模型**:然后,你可以选择适合的回归算法(如线性回归、岭回归等),并使用滚动窗口的数据集作为自变量(X)来训练模型。假设你想做线性回归,可以这样做: ```python from statsmodels.formula.api import ols model = ols('your_regression_variable ~ window_a', data=a.iloc[60:].reset_index(drop=True)) # 确保窗口足够大,从第60个点开始 results = model.fit() ``` 3. **获取预测**:一旦模型训练完成,你可以使用模型对未来数据进行预测: ```python predictions = results.predict(start=len(a) - len(window_a), end=len(a)) ``` 4. **评估性能**:最后,你可以根据需要评估模型在滚动窗口上的预测效果,比如查看残差、R²分数等指标。 注意:这里假设`a`是包含时间序列数据的Pandas DataFrame,并且有明确的回归目标。实际操作中,可能还需要处理缺失值和异常值等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值