Python时间序列:多期持久化朴素预测的向量化回测实现
实现14天朴素预测(向量化)与回测、SQLite存储
1. 数据准备(规范日期索引)
先确保你的DataFrame日期列是datetime类型,优先设为索引,方便后续操作:
import pandas as pd import numpy as np # 示例日度数据(替换为你的真实数据) dates = pd.date_range(start='2012-01-01', end='2012-02-28') df = pd.DataFrame({'value': np.random.randint(80, 120, size=len(dates))}, index=dates)
2. 向量化生成14天朴素预测
用numpy广播实现无循环的预测生成,直接将每个日期的数值映射到未来14天:
# 提取原始日期和对应数值 original_dates = df.index.values original_values = df['value'].values # 生成每个原始日期对应的14天预测日期(d+1 到 d+14) offsets = np.timedelta64(1, 'D') * np.arange(1, 15) # 1到14天的时间偏移 pred_dates = original_dates[:, np.newaxis] + offsets # 广播生成所有预测日期 # 将原始数值广播为和预测日期匹配的形状 pred_values = np.broadcast_to(original_values[:, np.newaxis], pred_dates.shape) # 整理成标准预测结果DataFrame predictions = pd.DataFrame({ 'base_date': np.repeat(original_dates, 14), # 预测基准日期(当日) 'pred_date': pred_dates.flatten(), # 被预测的日期 'pred_value': pred_values.flatten(), # 预测值 'model_type': 'naive_14day' # 模型标识,方便多模型对比 }) # 可选:过滤超出数据时间范围的预测(最后14天的部分预测可能无实际值) max_valid_pred_date = df.index.max() predictions = predictions[predictions['pred_date'] <= max_valid_pred_date]
3. 回测计算误差指标
将预测结果和实际值合并,计算MAE、RMSE等常用误差指标:
# 合并实际值与预测值 backtest = predictions.merge( df.reset_index().rename(columns={'index': 'pred_date', 'value': 'actual_value'}), on='pred_date', how='left' ) # 计算误差项 backtest['abs_error'] = np.abs(backtest['pred_value'] - backtest['actual_value']) backtest['squared_error'] = backtest['abs_error'] ** 2 # 输出误差指标 print(f"朴素14天预测 MAE: {backtest['abs_error'].mean():.2f}") print(f"朴素14天预测 RMSE: {np.sqrt(backtest['squared_error'].mean()):.2f}")
4. 存储预测结果到SQLite
用pandas内置的to_sql方法直接写入数据库,无需手动拼接SQL:
import sqlite3 # 连接SQLite数据库(文件不存在则自动创建) conn = sqlite3.connect('your_database.db') # 替换为你的数据库文件名 # 写入预测表(if_exists可选replace/append,根据需求选择) predictions.to_sql('naive_predictions', conn, if_exists='replace', index=False) # 写入回测结果表 backtest.to_sql('naive_backtest', conn, if_exists='replace', index=False) # 关闭连接 conn.close()
关键说明
- 全程无迭代行操作,numpy广播和pandas向量化方法保证了大数据量下的运行效率;
- 若原始数据存在日期缺失,上述方法依然有效,因为每个基准日期的预测窗口独立生成;
- 多模型对比时,只需给不同模型的预测结果添加唯一
model_type标识,即可统一存储在同一张表中,方便后续分析。
内容的提问来源于stack exchange,提问作者13sen1
相关产品推荐
相关产品推荐

