如何使用Python降低股票预测模型的噪声与输出波动率
股票预测曲线降噪、聚焦趋势的实操方案
先修正你现有绘图代码里的注释错位问题:当前代码中
plt.plot(y_pred_org)对应的是预测价格序列、plt.plot(y_test_t_org)对应的是真实测试集价格序列,原注释刚好写反,后续调整时注意对应关系不要搞混。
最快实现:无需改动模型,直接对预测曲线做平滑处理
这类方法不需要重新训练模型,只需要对输出的预测序列做预处理,就能快速把高频随机波动去掉,让曲线聚焦中长期趋势,完全适配“不追求单天精准数值、只关注趋势方向”的目标:
- 中心滑动平均平滑
这是股票场景最常用的趋势对齐方法,选择3-7天长度的滑动窗口做均值计算,既能滤掉单日随机跳变的噪声,又不会把短期趋势磨平。用pandas实现的代码如下:
之后把原代码中绘制预测曲线的参数替换为import pandas as pd # 取5天窗口,min_periods=1避免序列开头出现空值,center=True消除窗口带来的时间滞后 y_pred_smoothed = pd.Series(y_pred_org).rolling( window=5, min_periods=1, center=True ).mean().valuesy_pred_smoothed即可,如果真实价格序列本身有日常报价杂波,也可以用同样的窗口做轻度平滑,窗口长度不要超过10天,否则会丢失关键趋势拐点。 - 指数加权平滑(EWMA)
如果觉得普通滑动平均对窗口边缘的数值处理太生硬,可以用指数加权移动平均,给近期的预测值分配更高权重,对趋势拐点的反应比普通滑动平均更灵敏:# alpha值越小,平滑程度越高,一般取0.2-0.4区间最合适 y_pred_smoothed = pd.Series(y_pred_org).ewm(alpha=0.3, adjust=False).mean().values
根源降噪:从预测输出层面减少无意义波动
如果希望预测值本身就贴合趋势、不是只做绘图层的后处理,可以在推理后增加简单的约束规则,从推理输出的逻辑上减少无意义波动:
- 相邻值跳变约束:统计真实测试集的日价格变动波动率,对预测序列中相邻两日的差值超过真实波动率3倍的异常跳点,按正常波动率水平收窄修正,从根源避免单天预测的突兀跳涨跳跌;
- 零相位低通滤波:用scipy的Butterworth低通滤波器,直接把周期短于5天的高频随机波动滤除,比手动滑动平均的物理滤波逻辑更严谨,代码示例:
from scipy.signal import butter, filtfilt # 4阶低通滤波器,截止频率0.2对应滤除所有5天以内的高频波动 b, a = butter(4, 0.2, btype='low') # filtfilt做双向滤波,不会让平滑后的曲线出现时间滞后,避免和真实趋势错配 y_pred_smoothed = filtfilt(b, a, y_pred_org)
绘图细节优化
- 正式出图时不要把原始高波动的预测曲线和平滑后的曲线直接叠放,把平滑后的预测曲线、真实价格曲线作为核心对比图层,图例对应标注“平滑后趋势预测”“真实价格”;
- 如果需要保留原始预测的参考价值,可以把未处理的原始预测曲线设置为10%透明度的浅灰色放在底层,既可以看到原始波动范围,又不会被杂波掩盖核心趋势线。
内容的提问来源于stack exchange,提问作者iceAtNight
相关产品推荐
相关产品推荐

