Python用CEEMDAN-LSTM-VMD金融股价数据预测及SVR、AR、HAR对比可视化

news2024/11/14 11:32:48

全文链接:https://tecdat.cn/?p=38224

分析师:Duqiao Han

股票市场是一个复杂的非线性系统,股价受到许多经济和社会因素的影响。因此,传统的线性或近线性预测模型很难有效、准确地预测股票指数的价格趋势。众所周知,深度学习通过逐层特征转换,将原始空间中样本的特征表示转换为新的特征空间,并提取大量原始时间序列数据的特征,从而使预测更加容易点击文末“阅读原文”获取完整代码数据)。

KPCA-EMD-CEEMDAN-LSTM的股指收盘价格预测介绍

金融市场中,股指收盘价格的准确预测对于投资者、金融机构等具有重要意义。然而,金融时间序列的不稳定特征往往使得传统预测方法效果欠佳。因此,探索更为有效的预测模型成为研究热点。

相关方法介绍

(一)KPCA(核主成分分析)

在对初始数据进行处理时,我们采用 KPCA 来实现降维操作。其核心在于引入非线性映射函数,以此挖掘数据集中所包含的非线性信息,并且把原始空间中的数据映射到高维空间。具体而言,其包含以下几个关键步骤:

  1. 计算核矩阵:通过特定的核函数来计算数据点之间的关系矩阵,这一步骤为后续分析奠定基础。

  2. 集中化核矩阵:对核矩阵进行集中化处理,使得数据在某种程度上更加规整,便于后续的分解等操作。

  3. 分解特征值:将处理后的核矩阵进行特征值分解,以获取数据的主要特征信息。

  4. 将特征向量标准化:把得到的特征向量进行标准化操作,确保各特征向量具有可比性。

  5. 选择主分量的数量:依据一定的标准,从众多的特征分量中挑选出合适数量的主分量,用于后续的计算。

  6. 计算主非线性分量:基于前面所选的主分量,进一步计算出主非线性分量,从而完成 KPCA 的降维过程。

(二)EMD-CEEMDAN(经验模态分解及改进算法)

首先,利用 EMD 对实验数据进行分解操作。在这个过程中,会通过筛选的方式来选择出那些异常的 IMF(本征模函数)分量。然后,基于 EMD 算法,通过降噪处理得到正常的 IMF 分量,并在对重构残差 IMF 后进行直接分解。最后,提取每个 IMF 分量的能量作为一个特征,以此构造一个特征集。

(三)Regularized LSTM(正则化长短期记忆网络)

深度学习模型尤其是 LSTM 在处理金融时间序列预测时,存在一些问题。由于其本身是一个黑箱模型,有时会出现模型过于复杂以及过拟合的情况,这就导致训练出来的模型预测效果较差。

为此,本文采用 L2 正则化方法在原目标函数上添加一个惩罚项。这个惩罚项的作用是惩罚那些高复杂度的模型,从而减少使模型过于复杂的干扰特性,有效改善过拟合问题,进而提高模型的预测效率。

主要创新点

(一)分解方法创新

引入(1)- 双分解来取代传统的经验模式分解方法来分解金融时间序列趋势。这种创新的分解方法能够更有效地处理金融时间序列中的复杂成分,提取出更有价值的特征信息,相比传统的 EMD 分解方法具有明显优势。

(二)特征因素选择

结合实际投资经验,选择了相对更全面、更合理的特征因素。具体而言,包括 CSI 300 指数的技术分析指标和相应的基础分析指标,并考虑了国内外金融市场的其他交易。选择 CSI 300 指数品种的影响,并选择这些交易品种的市场数据提取特征。通过这种全面合理的特征因素选择,能够使预测模型更好地捕捉到与股指收盘价格相关的各种信息,提高预测的准确性。

(三)LSTM 模型正则化

对 LSTM 模型进行正则化处理,建立 LSTM - 正则模型来预测 CSI 300 指数在下一个交易日的走势趋势,获得比 LSTM 更好的预测精度。通过正则化操作,有效克服了 LSTM 模型过拟合的问题,使得模型在实际预测中能够更加稳定、准确地输出预测结果。

实验设置与结果

在实验中,使用滑动时间窗来构建样本,滑动窗口的宽度为 10。通过这样的样本构建方式,能够更好地利用历史数据,同时兼顾数据的时效性。

在进行各项操作如 KPCA 因子降维、EMD-LSTM 对偶分解以及 LSTM 正则化等之后,对构建的预测模型 KPCA-EMD-LSTM - 正则进行验证。结果表明,模型正则化、KPCA 因子降维、EMD-LSTM 对偶分解操作均起到了优化作用,充分验证了预测模型 KPCA-EMD-LSTM - 正则的优越性。

请注意,在相关实验过程中可能会涉及到一些图表来展示数据和结果

afc8c3724abf84366761257f3a5c0f39.png

e0e5e0a9c953e19cb25f32909940fcb7.png 

金融时间序列的不稳定特征对其预测效果产生了不利影响。传统的EMD分解方法为缓解这种不利影响提供了思路。本文采用EMD-塞姆丹对偶分解代替传统的EMD分解,并补充了KPCA因子降维和模型正则化,构建了比传统的LSTM模型更准确的KPCA-EMD-LSTM-正则预测模型。本文充分考虑了CSI 300指数的相关因子,构建了一个完整的因子库。在实验中,使用滑动时间窗来构建样本,滑动窗口的宽度为10。最后,验证了模型正则化、KPCA因子降维、EMD-LSTM对偶分解操作的优化,以及预测模型KPCA-EMD-LSTM-正则的优越性。

CEEMDAN-LSTM 及其相关模型(SVR、AR、HAR)在金融数据预测|附数据代码

本文聚焦于金融数据的分析与预测,详细阐述了运用 CEEMDAN-LSTM 模型以及其他相关模型(如 SVR、AR、HAR)进行数据处理和预测的具体流程。通过对原数据的展示、关键指标的计算、数据分解及各模型的构建与评估等环节的深入探讨,并结合相关可视化图像的辅助说明,全面展示了不同模型在金融数据预测中的应用效果,为金融数据分析与预测领域提供了有价值的参考。

在金融市场的研究与实践中,准确预测金融数据的走势对于投资者、金融机构等各类市场参与者具有至关重要的意义。为了实现更精准的预测,本文引入了多种先进的数据处理方法和预测模型,其中重点探讨了 CEEMDAN-LSTM 及其相关模型在金融数据预测中的应用,并对其性能进行了详细分析。

数据准备与初步处理

(一)导入库与设置绘图格式

首先,我们导入了一系列在金融数据分析过程中常用的库。pandas库主要用于数据的读取、处理和分析操作;numpy库则提供了强大的数值计算功能,便于进行各种数学运算;matplotlib.pyplot库用于绘制各类图表,以直观展示数据的特征和变化趋势。同时,还导入了datetime库用于处理日期相关的操作,并通过warnings.filterwarnings('ignore')语句忽略了可能出现的警告信息,确保程序运行过程中不会因一些非关键警告而中断。

此外,为了使绘制的图表更加美观、规范,我们设置了绘图的风格为seaborn,并指定了图形的大小为长 12 单位、宽 6 单位,分辨率为每英寸 300 像素,即通过以下代码实现:

plt.style.use('seaborn')
plt.rcParams\['figure.figsize'\] = \[12, 6\]
plt.rcParams\['figure.dpi'\] = 300

(二)原数据展示

在对数据进行深入分析之前,我们先对原始数据进行了初步展示,通过temp_data.head()语句可以查看原始数据temp_data的前几行内容,以便对数据的整体结构和大致情况有一个直观的认识。

001e364f1994d0471479b04b5aa343d5.png

(三)计算 RV 值及相关处理

1. RV 值计算函数定义

为了后续分析的需要,我们定义了一个函数RV用于计算已实现波动率(RV)值。其计算原理是先对输入数据的每个元素进行平方操作,然后求和,最后再对求和结果进行开平方运算,具体代码如下:

def RV(x):
    return np.sqrt(np.sum(x**2))

该函数接受一个数据序列x作为输入参数,经过上述计算步骤后返回对应的 RV 值。

2. 对数收益率计算与 RV 值按日计算

在金融数据分析中,对数收益率是一个重要的指标。我们通过以下代码计算了数据的对数收益率,并将其存储在新的列'log return'中:

data\['log return'\] = np.log(data\['close'\] / data\['close'\].shift(1))
dfr = data.loc\[:, 'log return'\].copy()

这里,先通过np.log(data['close'] / data['close'].shift(1))计算出每一行数据相对于上一行数据的对数收益率,然后将其提取出来赋值给dfr变量以便后续操作。

接着,我们按照一日周期对对数收益率数据进行分组,并应用前面定义的RV函数来计算每日的 RV 值,最后将计算得到的 RV 值添加到原始数据data的新列'RV'中,同时,为了避免数据中可能出现的无穷大值对后续分析造成影响,我们将其替换为 0,具体代码如下:

dfrv = dfr.groupby(pd.Grouper(freq='1d')).apply(RV)
data\['RV'\] = dfrv
data.replace(np.inf, 0, inplace=True)

在完成 RV 值的计算和处理后,我们还绘制了 RV 值的时间序列图

f504e8bf2d149ebd19672555b19c66e8.png


点击标题查阅往期内容

c7f9b0fd2b917ab40b7313faf0490810.png

Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化

outside_default.png

左右滑动查看更多

outside_default.png

01

2c275abf650043fd07c72aef2ee065d7.png

02

b8919bb94dd8995e1a0da067c164a027.jpeg

03

6bd22a10897719d92b9819d3d702bfca.png

04

b9cf427163d09dd03c5dfcb3265f10b3.png

CEEMDAN 分解与可视化

在对数据进行进一步分析时,我们采用了 CEEMDAN 方法对数据进行分解,并对分解结果进行了可视化展示。首先,我们创建了一个时间序列t,其取值范围是从 0 到 RV 值数据序列RVs的长度,步长为 1,即通过t = np.arange(0, len(RVs), 1)语句实现。

然后,我们调用了Visualisation类(这里假设该类已经在其他地方定义好,用于数据可视化相关的操作)的相关方法进行数据分解结果的可视化。通过vis.plot_imfs(imfs=imfs_close, residue=res_close, t=t, include_residue=True)语句,将分解得到的本征模函数(IMFs)和残差按照时间序列t进行绘制,并设置了包含残差的可视化选项。虽然代码中还存在vis.plot_instant_freq(t, imfs=imfs)这样的注释行(可能用于绘制即时频率相关的内容,但在当前示例中未启用),最后通过vis.show()方法将绘制好的图像展示出来

472ead73f32cea13c7d459868c62e7ed.png

在完成 CEEMDAN 分解的可视化后,我们还对分解后的数据进一步提取了多种特征,如计数、均值、标准差、偏度、峰度、JB 统计量、Q 统计量(这里假设de_countde_meande_stdde_skewde_kurtosisde_jbde_Q等变量已经在前面的代码中计算得到),并将这些特征整理成数据框decompose_data_feature进行展示,具体代码如下:

de\_data\_feature = np.vstack((de\_count, de\_mean, de\_std, de\_skew, de\_kurtosis, de\_jb, de_Q)).T
decompose\_data\_feature = pd.DataFrame(de\_data\_feature, columns = \['count', 'mean', 'std', 'skew', 'kurtosis', 'J-B', 'Q(10)'\], index = decompose_data.columns)

通过上述代码,我们将提取的各种特征按照指定的列名和索引进行整理,形成了一个便于查看和分析的数据框

abe74961f79df0f94a05c4bb1974fd43.png

建模与预测

(一)直接 LSTM 建模

1. 数据划分

在构建直接 LSTM 模型进行预测之前,我们首先需要对数据进行划分,确定训练集、验证集和测试集。这里我们设定了窗口大小为26,通过调用get_tain_val_test函数(这里假设该函数已经在其他地方定义好,用于按照指定窗口大小划分数据)对 RV 值数据RVs进行处理,划分出训练集、验证集和测试集,分别得到x_train_ally_train_allx_val_ally_val_allx_test_ally_test_all,具体代码如下:

window_size = 26
x\_train\_all, y\_train\_all, x\_val\_all, y\_val\_all, x\_test\_all, y\_test\_all = get\_tain\_val\_test(RVs, window\_size)
2. LSTM 模型构建与训练

在完成数据划分后,我们调用implement_LSTM函数(同样假设该函数已在其他地方定义好,用于构建和训练 LSTM 模型),使用划分好的训练集和验证集数据构建并训练 LSTM 模型,得到训练历史信息history和训练好的模型model,具体代码如下:

history, model = implement\_LSTM(x\_train\_all, y\_train\_all, x\_val\_all, y\_val_all)
3. 预测与可视化

利用训练好的模型对测试集数据x_test_all进行预测,通过model.predict(x_test_all).reshape(-1)语句得到预测结果y_pre_all,并将其转换为一维数组形式以便后续分析。同时,提供了相关的可视化图像

2769fa10de8a0665c9302af8afa4e096.png

1eb6a23181cfbc1fdff443e3a403e23e.png

deecman + LSTM 建模

1. 数据处理与模型训练

针对经过 CEEMDAN 分解后的数据decompose_data的每一列数据,我们分别进行如下操作:首先提取每列数据作为时间序列数据serie_data,然后按照设定的窗口大小window_size,通过调用get_tain_val_test函数划分出训练集、验证集和测试集,再调用implement_LSTM函数构建并训练 LSTM 模型,得到每列数据的预测结果y_pre并添加到列表y_pre_list中,同时将对应的测试集数据添加到列表y_test_list中。具体代码如下:

y\_pre\_list = \[\]
y\_test\_list = \[\]
for column in decompose_data.columns:
    serie\_data = decompose\_data\[column\]
    x\_train, y\_train, x\_val, y\_val, x\_test, y\_test = get\_tain\_val\_test(serie\_data, window_size)
    history, model = implement\_LSTM(x\_train, y\_train, x\_val, y_val)
    y\_pre = model.predict(x\_test)
    y\_pre\_list.append(y_pre)
    y\_test\_list.append(y_test)
2. 预测结果可视化与汇总

为了更直观地展示每列数据的预测结果与实际值的对比情况,我们通过绘制多个子图的方式进行可视化。首先创建一个指定大小的图形对象fig,然后通过循环遍历decompose_data.columns,在每个子图中分别绘制对应列数据的实际值和预测值,并添加相应的图例说明,具体代码如下:

fig = plt.figure(figsize=(10, 20))
for i, column in enumerate(decompose_data.columns):
    axes = fig.add\_subplot(len(decompose\_data.columns), 1, i + 1)
    axes.plot(y\_test\_list\[i\], 'b-', linewidth = '1', label='实际')
    axes.plot(y\_pre\_list\[i\], 'r-', linewidth = '1', label='预测')
    plt.legend()

aa2117b73b315a4d632f041fb5d5fa38.png

对应的可视化

2d79f79b6fe7627260e358dfd1aa842b.png

最后,我们将所有列数据的预测结果进行求和汇总,通过y_pre_total = np.sum(np.array(y_pre_list), axis = 0).reshape(-1)语句得到总的预测结果y_pre_total,并计算了该预测结果与原始测试集数据y_test_all对比的多种评估指标,如平均绝对误差(MAE)、均方误差(MSE)、分层平均绝对误差(HMAE)、分层均方误差(HMSE)等,通过以下代码输出这些评估指标的值:

print("MAE:", mean\_absolute\_error(y\_test\_all, y\_pre\_total))
print("MSE:", mean\_squared\_error(y\_test\_all, y\_pre\_total))
print("HMAE:", h\_mean\_absolute\_error(y\_test\_all, y\_pre_total))
print("HMSE:", h\_mean\_squared\_error(y\_test\_all, y\_pre_total))

对应的评估结果可视化图像

b2064cfab0986e30b43599571cd15729.png

c679fdab0617295ebe9b6802a50f57db.png

其他相关模型

SVR 模型

对于 SVR 模型,我们分别对训练集、验证集和测试集数据(x_train_allx_val_allx_test_all)使用 SVR 模型进行预测,通过svr.predict函数得到预测结果y_pre_all_svr1y_pre_all_svr2y_pre_all_svr3,然后将这些预测结果进行水平拼接得到总的预测结果y_pre_all_svr,同时将对应的真实标签数据y_train_ally_val_ally_test_all也进行水平拼接得到y_all_label。具体代码如下:

y\_pre\_all\_svr1 = svr.predict(x\_train_all)
y\_pre\_all\_svr2 = svr.predict(x\_val_all)
y\_pre\_all\_svr3 = svr.predict(x\_test_all)
y\_pre\_all\_svr = np.hstack((y\_pre\_all\_svr1, y\_pre\_all\_svr2, y\_pre\_all\_svr3))
y\_all\_label = np.hstack((y\_train\_all, y\_val\_all, y\_test\_all))

并提供了相关的可视化图像

48b148b92a3464ae19ea2695f818e547.pnga367314fbd1b941193e17c7bbd1b731d.png

AR 模型
1. 模型拟合

statsmodels.tsa.ar_model导入AutoReg类,首先确定训练数据的长度(取 RVs 数据长度的 90%),然后使用二阶 AR 模型对训练数据RVs[:train_lenth]进行拟合,得到拟合好的 AR 模型AR_model,具体代码如下:

from statsmodels.tsa.ar_model import AutoReg
import numpy as np

train_lenth = int(len(RVs) * 0.9)
AR\_model = AutoReg(RVs\[:train\_lenth\], 2).fit()
2. 预测与数据拼接

使用拟合好的 AR 模型分别对训练数据范围内和后续测试数据范围进行预测,通过AR_model.predict(0, train_lenth).valuesAR_model.forecast(len(y_test_all)).values得到预测结果predict_AR_1predict_AR_2,再将这两个预测结果进行水平拼接得到总的预测结果predict_all_ar,同时将对应的真实标签数据y_train_ally_val_ally_test_all也进行水平拼接得到y_all_label。具体代码如下:

predict\_AR\_1 = AR\_model.predict(0, train\_lenth).values
predict\_AR\_2 = AR\_model.forecast(len(y\_test_all)).values
predict\_all\_ar = np.hstack((predict\_AR\_1, predict\_AR\_2))
y\_all\_label = np.hstack((y\_train\_all, y\_val\_all, y\_test\_all))

并提供了相关的可视化图像

59547570f1c7464e0a18a5cd113c0a28.png

3353fd299a8c0e5f16de28d531bd21f3.png

HAR 模型
1. 数据准备

首先将 RVs 数据进行移位操作(RVs.shift(-1)),目的是为了预测下一天的 RV 值,得到目标数据RVs_target

然后将原始 RV

s 数据(除最后一个数据点)作为特征数据X,对应的移位后的数据(除最后一个数据点)作为目标数据y,具体代码如下:

RVs_target = RVs.shift(-1) # 这里是为了预测下一天的RV值
X = RVs\[:-1\]
y = RVs_target\[:-1\]
2. 数据划分与预测

按照 90% 的比例划分训练集和测试集,通过split = int(0.90 * RVs.shape[0])确定划分点,然后得到X_trainX_testy_trainy_test,分别作为训练集的特征数据、测试集的特征数据、训练集的目标数据、测试集的目标数据。虽然文中未明确给出后续基于 HAR 模型的具体预测操作及结果展示,但通过前面的数据准备和划分步骤,为进一步使用 HAR 模型进行预测奠定了基础。同时,也提供了相关的可视化图像

06f80477dbc67f297fd1a64affc86f00.png

089dd2fc081ff12fdef89d60db1c4ad1.png

 结论

本文详细介绍了基于 CEEMDAN-LSTM 及其相关模型(SVR、AR、HAR)在金融数据预测中的应用流程。从数据的初步处理,包括原数据展示、RV 值计算等,到采用 CEEMDAN 方法进行数据分解与可视化,再到各模型的构建、训练、预测以及性能评估等环节,都进行了深入探讨。

通过对不同模型的分析可知,每种模型都有其特点和适用场景。直接 LSTM 模型在处理整体数据时能够给出一定的预测结果;CEEMDAN + LSTM 模型结合了数据分解的优势,对分解后的各部分数据分别进行预测并汇总,能更细致地捕捉数据特征,其评估指标可反映出预测性能;SVR 模型、AR 模型和 HAR 模型也各自通过不同的方式对数据进行处理和预测,相应的可视化图像和数据拼接等操作有助于我们直观了解其预测效果。

然而,各模型在实际应用中也存在一定的局限性,例如某些模型可能对数据的特定分布或趋势较为敏感,导致在不同数据集上的预测效果有所差异。未来的研究可以进一步探索如何更好地结合这些模型的优势,或者对模型进行改进以适应更复杂的金融数据环境,从而提高金融数据预测的准确性和可靠性,为金融市场参与者提供更有价值的决策参考。

CEEMDAN\_VMD\_GRU 在股票数据预测中的应用|附数据代码

本文详细介绍了一种基于 CEEMDAN(完全集成经验模态分解与自适应噪声)、VMD(变分模态分解)和 GRU(门控循环单元)的股票数据预测方法。通过对原始股票数据进行一系列分解、聚类、建模及预测操作,展示了该方法在处理股票价格预测问题上的流程及优势,为相关领域的研究与实践提供了参考。

股票市场的价格预测一直是金融领域的研究热点,准确的预测对于投资者制定合理的投资策略具有重要意义。随着数据挖掘和机器学习技术的发展,多种方法被应用于股票价格预测。本文所探讨的 CEEMDAN\_VMD\_GRU 方法旨在综合多种先进的数据处理和预测技术,提高股票价格预测的准确性。

相关方法及函数实现

(一)数据预处理与分解函数

  1. ceemdan_decompose 函数(CEEMDAN 分解)

def ceemdan\_decompose(series=None, trials=10, num\_clusters = 3):  # CEEMDAN分解函数
    decom = CEEMDAN()
    decom.trials = trials  # 输入的白噪声数量
    df_ceemdan = pd.DataFrame(decom(series.values).T)
    df\_ceemdan.columns = \['imf'+str(i) for i in range(len(df\_ceemdan.columns))\]
    return df_ceemdan

该函数用于对输入的时间序列数据(如股票价格数据)进行 CEEMDAN 分解。首先创建 CEEMDAN 对象并设置白噪声输入的次数,然后对数据进行分解操作,将结果转换为 DataFrame 格式并为各列命名,最终返回分解后的结果。通过这种分解,可以将原始数据分解为多个本征模函数(IMF)分量,以便后续进一步分析和处理。

  1. sample_entropy 函数(样本熵计算)

def sample\_entropy(df\_ceemdan=None, mm=1, r=0.1):  # 样本熵计算函数;mm取值为1或2;r取值为0.1或0.2
    np_sampen = \[\]
    for i in range(len(df_ceemdan.columns)):
        sample\_entropy = sampen2(list(df\_ceemdan\['imf'+str(i)\].values),mm=mm,r=r,normalize=True)
        np\_sampen.append(sample\_entropy\[1\]\[1\])
    df\_sampen = pd.DataFrame(np\_sampen, index=\['imf'+str(i) for i in range(len(df_ceemdan.columns))\], columns=\['CODE'\])
    return df_sampen

此函数用于计算 CEEMDAN 分解后各 IMF 分量的样本熵。通过遍历各 IMF 分量,调用sampen2函数计算其样本熵,并将结果整理为 DataFrame 格式返回。样本熵可用于衡量时间序列的复杂性和不规则性,为后续基于熵值的聚类等操作提供依据。

  1. kmeans_cluster 函数(基于样本熵的 K-Means 聚类)

def kmeans\_cluster(df\_sampen=None, num_clusters=3):  # 基于样本熵进行K-Means聚类
    np\_integrate\_form = KMeans(n\_clusters=num\_clusters, random\_state=9).fit\_predict(df_sampen)
    df\_integrate\_form = pd.DataFrame(np\_integrate\_form, index=\['imf'+str(i) for i in range(len(df_sampen.index))\], columns=\['Cluster'\])
    return df\_integrate\_form

该函数依据前面计算得到的样本熵数据,使用 K-Means 算法进行聚类操作。设置聚类的簇数并通过fit_predict方法得到聚类结果,将其整理为 DataFrame 格式返回,其中包含了各 IMF 分量所属的聚类信息,有助于进一步分析数据的内在结构。

  1. integrate_imfs 函数(整合 IMF 分量)

def integrate\_imfs(df\_integrate\_form=None, df\_ceemdan=None):  # 整合IMF分量和残差为3个协同IMF
    df_tmp = pd.DataFrame()
    for i in range(df\_integrate\_form.values.max()+1):
        df\_tmp\['imf'+str(i)\] = df\_ceemdan\[df\_integrate\_form\[(df\_integrate\_form\['Cluster'\]==i)\].index\].sum(axis=1)
    df\_integrate\_result = df_tmp.T  # 根据样本熵对协同IMF进行排序
    df\_integrate\_result\['sampen'\] = sample\_entropy(df\_tmp).values
    df\_integrate\_result.sort_values(by=\['sampen'\], ascending=False, inplace=True)
    df\_integrate\_result.index = \['co-imf'+str(i) for i in range(df\_integrate\_form.values.max()+1)\]
    df\_integrate\_result = df\_integrate\_result.drop('sampen', axis=1, inplace=False)
    return df\_integrate\_result.T

此函数的目的是将经过聚类后的 IMF 分量进行整合,形成协同 IMF(Co-IMFs)。通过遍历不同的聚类,对属于同一聚类的 IMF 分量进行求和操作,得到整合后的结果。然后根据样本熵对协同 IMF 进行排序,并去除用于排序的样本熵列,最终返回整合后的协同 IMF 数据,以便后续进行进一步的分解和预测操作。

  1. vmd_decompose 函数(VMD 分解)

def vmd_decompose(series=None, alpha=2000, tau=0, K=10, DC=0, init=1, tol=1e-7, draw=True):  # VMD分解函数
    imfs\_vmd, imfs\_hat, omega = VMD(series, alpha, tau, K, DC, init, tol)  
    df\_vmd = pd.DataFrame(imfs\_vmd.T)
    df_vmd.columns = \['imf'+str(i) for i in range(K)\]
    return df_vmd

该函数用于对特定的协同 IMF(如co-imf0)进行 VMD 分解。设置 VMD 分解的相关参数,如正则化参数alpha、模态数量K等,通过调用VMD函数进行分解操作,得到分解后的 IMF 分量,并将其转换为 DataFrame 格式返回,各列对应不同的 IMF 分量,为后续基于 VMD 分解结果的预测提供数据基础。

(二)预测相关函数

  1. GRU_model 函数(构建 GRU 模型)

def GRU\_model(trainset\_shape):# 构建GRU模型
    model = Sequential()
    model.add(GRU(128, input\_shape=(trainset\_shape\[1\], trainset\_shape\[2\]), activation='tanh', return\_sequences=True))
    model.add(Dropout(0.2))
    model.add(GRU(64,activation='tanh',return_sequences=True))
    model.add(Dropout(0.2))
    model.add(GRU(32,activation='tanh',return_sequences=False))
    model.add(Dropout(0.2))
    model.add(Dense(1,activation='tanh'))
    model.compile(loss='mse', optimizer='adam')
    return model

此函数用于构建 GRU 模型,这是一种常用于处理时间序列数据的循环神经网络模型。在模型构建过程中,设置了不同层的 GRU 单元数量、激活函数以及 Dropout 比例等参数,以防止过拟合。最后编译模型,指定损失函数为均方误差(MSE),优化器为adam,并返回构建好的模型,该模型可用于对股票价格数据进行预测。

  1. evaluation_model 函数(模型评估)

def evaluation\_model(y\_test, y_pred):  # 模型评估函数
    y\_test,y\_pred = np.array(y\_test).ravel(),np.array(y\_pred).ravel()
    r2 = r2\_score(y\_test, y_pred)
    rmse = mean\_squared\_error(y\_test, y\_pred, squared=False)  # MSE和MAE在不同尺度上有所不同
    mae = mean\_absolute\_error(y\_test, y\_pred)
    mape = mean\_absolute\_percentage\_error(y\_test, y_pred)
    df_evaluation = pd.DataFrame({'r2': r2, 'rmse': rmse, 'mae': mae, 'mape': mape}, index = range(1))
    return df_evaluation

该函数用于对预测模型的性能进行评估。输入测试集的真实值和预测值,通过计算相关评估指标,如决定系数(R2)、均方根误差(RMSE)、平均绝对误差(MAE)和平均绝对百分比误差(MAPE)等,并将这些指标整理为 DataFrame 格式返回,以便直观地了解模型的预测效果。

  1. create\_train\_test_set 函数(创建训练集和测试集)

def create\_train\_test\_set(data=None, timestep=30, co\_imf\_predict\_for_fitting=None):  # 创建带有归一化的训练集和测试集
    if isinstance(data, pd.DataFrame):  # 初始化DataFrame格式的训练集和测试集
        dataY = data\['sum'\].values.reshape(-1, 1)
        dataX = data.drop('sum', axis=1, inplace=False)
    else:  # 初始化Series
        dataY = data.values.reshape(-1, 1)
        dataX = dataY

    scalarX = MinMaxScaler(feature_range=(0,1))  # 通过sklearn进行归一化
    dataX = scalarX.fit_transform(dataX)
    if co\_imf\_predict\_for\_fitting is not None: co\_imf\_ppredict\_for\_fitting = scalarX.transform(co\_imf\_predict\_for\_fitting)

    scalarY = MinMaxScaler(feature_range=(0,1))
    dataY = scalarY.fit_transform(dataY)

    trainX, trainY = \[\], \[\]  # 创建训练集和测试集
    for i in range(len(dataY)-timestep):
        trainX.append(np.array(dataX\[i:(i+timestep)\]))
        trainY.append(np.array(dataY\[i+timestep\]))
        if co\_imf\_predict\_for\_fitting is not None:  # 拟合时,使用今日的预测结果
            if i<(len(dataY)-timestep-len(co\_imf\_predict\_for\_fitting)): trainX\[i\] = np.insert(trainX\[i\], timestep, dataX\[i+timestep\], 0)
            else: trainX\[i\] = np.insert(trainX\[i\], timestep, co\_imf\_predict\_for\_fitting\[i-(len(dataY)-timestep-len(co\_imf\_predict\_for\_fitting))\], 0)

    return np.array(trainX), np.array(trainY), scalarY

此函数的主要作用是创建用于模型训练和测试的数据集。根据输入数据的格式(DataFrame 或 Series)进行相应的处理,通过MinMaxScaler对数据进行归一化操作,然后按照指定的时间步长将数据划分为训练集和测试集,并根据是否有拟合相关的数据进行相应的插入操作,最终返回处理好的训练集、测试集以及用于反归一化的scalarY对象。

  1. GRU_predict 函数(GRU 预测函数)

def GRU\_predict(data=None, epochs=100, predict\_duration=100, fitting=None):  # GRU预测函数
    trainX,trainY,scalarY = create\_train\_test\_set(data, co\_imf\_predict\_for_fitting=fitting)  # 获取训练集和测试集的X、Y
    x\_train,x\_test = trainX\[:-predict\_duration\],trainX\[-predict\_duration:\]  # 划分训练集和测试集
    y\_train,y\_test = trainY\[:-predict\_duration\],trainY\[-predict\_duration:\]
    train\_X = x\_train.reshape((x\_train.shape\[0\], x\_train.shape\[1\], x_train.shape\[2\]))  # 转换为张量
    test\_X = x\_test.reshape((x\_test.shape\[0\], x\_test.shape\[1\], x_test.shape\[2\]))  # 转换为张量

    model = GRU\_model(train\_X.shape)  # 构建模型 # 使用model.summary()可查看模型结构
    patience = epochs//10 
    EarlyStop = EarlyStopping(monitor='val_loss', patience=5*patience, verbose=0, mode='auto')  # 在小学习率时提前停止
    Reduce = ReduceLROnPlateau(monitor='val_loss', patience=patience, verbose=0, mode='auto')  # 自适应学习率
    history = model.fit(train\_X, y\_train, epochs=epochs, batch\_size=16, validation\_split=0.1, verbose=0, shuffle=True, callbacks=\[EarlyStop,Reduce\])  # 训练模型

    y\_test\_predict = model.predict(test_X)  # 预测
    df\_gru\_evaluation = evaluation\_model(y\_test, y\_test\_predict)  # 评估模型
    y\_test\_predict = y\_test\_predict.ravel().reshape(-1,1) 
    y\_test\_predict\_result = scalarY.inverse\_transform(y\_test\_predict)  # 反归一化
    y\_test\_raw = scalarY.inverse\_transform(y\_test)    
    df\_predict\_raw = pd.DataFrame({'raw': y\_test\_raw.ravel(), 'predict': y\_test\_predict\_result.ravel()}, index=range(len(y\_test_raw)))  # 输出
    df\_train\_loss= pd.DataFrame({'loss': history.history\['loss'\], 'val\_loss': history.history\['val\_loss'\]}, index=range(len(history.history\['val_loss'\])))
    return df\_predict\_raw, df\_gru\_evaluation, df\_train\_loss

该函数实现了基于 GRU 模型的预测流程。首先通过create_train_test_set函数获取训练集和测试集,然后对数据进行形状调整以便输入模型。接着构建 GRU 模型,并设置提前停止和自适应学习率等机制以优化训练过程。通过模型对测试集进行预测,之后对预测结果进行评估、反归一化等操作,最终返回预测结果、模型评估指标以及训练过程中的损失信息等。

主函数及整体流程

在主函数中,主要执行了以下步骤:

(一)数据加载

if \_\_name\_\_ == '\_\_main\_\_':
    start = time.time()
    CODE, PATH ='sh.000001', 'D:\\\Stock-LSTM\\\'  # 如'sh.000001'这样的代码

    # 1.加载原始数据
    df\_raw\_data = pd.read\_csv(PATH+CODE+'.csv', header=0, parse\_dates=\['date'\], date_parser=lambda x: datetime.datetime.strptime(x, '%Y%m%d'))
    series\_close = pd.Series(df\_raw\_data\['close'\].values,index = df\_raw_data\['date'\])

首先设置股票代码和数据存储路径,然后通过pd.read_csv函数读取指定路径下的股票原始数据文件,并提取出收盘价数据序列,为后续的分析和预测做准备。

(二)数据分解与处理

  1. CEEMDAN 分解

# 2.CEEMDAN分解
df\_ceemdan = ceemdan\_decompose(series_close) 
# df_ceemdan.plot(title='CEEMDAN分解', subplots=True)

对收盘价数据序列进行 CEEMDAN 分解,得到各 IMF 分量。

  1. 样本熵计算与聚类

# 3.样本熵计算
df\_sampen = sample\_entropy(df_ceemdan) 
# df_sampen.plot(title='样本熵')

# 4.K-Means聚类(基于样本熵)
df\_integrate\_form = kmeans\_cluster(df\_sampen) 
# print(df\_integrate\_form)

接着计算 CEEMDAN 分解后各 IMF 分量的样本熵,并基于样本熵进行 K-Means 聚类。

  1. 整合 IMF 分量

# 5.整合IMF分量和残差为3个协同IMF
df\_integrate\_result = integrate\_imfs(df\_integrate\_form, df\_ceemdan)
# df\_integrate\_result.plot(title='整合的IMF(协同IMF)的CEEMDAN', subplots=True)

将经过聚类后的 IMF 分量进行整合,形成协同 IMF。若执行df_integrate_result.plot(title='整合的IMF(协同IMF)的CEEMDAN', subplots=True),可绘制出整合后的协同 IMF 情况图,以便直观了解!

  1. VMD 分解

# 6.对高频协同IMF0进行VMD二次分解
df\_vmd\_co\_imf0 = vmd\_decompose(df\_integrate\_result\['co-imf0'\])  # vmd分解(数据集数量必须为偶数)
# df\_vmd\_co_imf0.plot(title='协同IMF0的VMD分解', subplots=True)

对特定的协同 IMF0 进行 VMD 分解,分解后可通过执行df_vmd_co_imf0.plot(title='协同IMF0的VMD分解', subplots=True)绘制出 VMD 分解结果图。

预测与结果汇总

6c2328ab319842f3cc7b357600f66c80.png

7e1181a1474ab22ea604cd0edaeca556.png

90e04496078d8e8815603095a86f4b60.png

关于分析师

35b55fbf486333f5a89106ef9e04fbea.png 

在此对 Duqiao Han 对本文所作的贡献表示诚挚感谢,他在哈尔滨工业大学完成了本科阶段的学习,专业为海洋技术与财务管理。擅长 Python、Stata、SPSS,在数据采集、数据分析方面有着丰富的经验。

8d8cbf6bd3c2bd88d6889fe2965571c7.jpeg

本文中分析的数据、代码分享到会员群,扫描下面二维码即可加群! 

978f9734d0a0dbba06e87e02039dfda0.png


资料获取

在公众号后台回复“领资料”,可免费获取数据分析、机器学习、深度学习等学习资料。

56deaa9e3976a88d023022ef62b0f6d4.jpeg

点击文末“阅读原文”

获取全文完整代码数据资料。

本文选自《Python用CEEMDAN-LSTM-VMD金融股价数据预测及SVR、AR、HAR对比可视化》。

点击标题查阅往期内容

Python注意力机制Attention下CNN-LSTM-ARIMA混合模型预测中国银行股票价格|附数据代码

R语言KERAS用RNN、双向RNNS递归神经网络、LSTM分析预测温度时间序列、 IMDB电影评分情感

Python用CNN-LSTM、ARIMA、Prophet股票价格预测的研究与分析|附数据代码

【视频讲解】线性时间序列原理及混合ARIMA-LSTM神经网络模型预测股票收盘价研究实例

RNN循环神经网络 、LSTM长短期记忆网络实现时间序列长期利率预测

结合新冠疫情COVID-19股票价格预测:ARIMA,KNN和神经网络时间序列分析

深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据

用PyTorch机器学习神经网络分类预测银行客户流失模型

PYTHON用LSTM长短期记忆神经网络的参数优化方法预测时间序列洗发水销售数据

Python用Keras神经网络序列模型回归拟合预测、准确度检查和结果可视化

R语言深度学习卷积神经网络 (CNN)对 CIFAR 图像进行分类:训练与结果评估可视化

深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据

Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析

R语言深度学习Keras循环神经网络(RNN)模型预测多输出变量时间序列

R语言KERAS用RNN、双向RNNS递归神经网络、LSTM分析预测温度时间序列、 IMDB电影评分情感

Python用Keras神经网络序列模型回归拟合预测、准确度检查和结果可视化

Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析

R语言中的神经网络预测时间序列:多层感知器(MLP)和极限学习机(ELM)数据分析报告

R语言深度学习:用keras神经网络回归模型预测时间序列数据

Matlab用深度学习长短期记忆(LSTM)神经网络对文本数据进行分类

R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)

MATLAB中用BP神经网络预测人体脂肪百分比数据

Python中用PyTorch机器学习神经网络分类预测银行客户流失模型

R语言实现CNN(卷积神经网络)模型进行回归数据分析

SAS使用鸢尾花(iris)数据集训练人工神经网络(ANN)模型

【视频】R语言实现CNN(卷积神经网络)模型进行回归数据分析

Python使用神经网络进行简单文本分类

R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析

R语言基于递归神经网络RNN的温度时间序列预测

R语言神经网络模型预测车辆数量时间序列

R语言中的BP神经网络模型分析学生成绩

matlab使用长短期记忆(LSTM)神经网络对序列数据进行分类

R语言实现拟合神经网络预测和结果可视化

用R语言实现神经网络预测股票实例

使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测

python用于NLP的seq2seq模型实例:用Keras实现神经网络机器翻译

用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类

82f92cde98483765433796331f8b42ce.jpeg

3aded9771e4df14fb85940ade23cadf8.png

dd4cf5d54adcff356c0b3fce71ded32d.png

32a2c856d8bef308e68d03105391e5c5.jpeg

7a28724105e6accdcfd06d6cb088940b.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Revit二次开发】创建Ribbon选项卡与带图标的按钮

效果图 创建一个叫做“开发的插件”的选项卡&#xff0c; 选项卡内有一个叫做“Hello”的图标按钮&#xff0c; 点击按钮后运行一个命令&#xff0c; 该命令弹出提示框“Hello Revit!”。 在此示例基础上&#xff0c;可以根据需要替换图标、文字、命令功能。 步骤 安装Revit…

Java面试要点18 - Java运行时多态与编译时多态

本文目录 一、引言二、运行时多态的实现三、编译时多态的实现四、多态与接口五、多态的实际应用六、总结 一、引言 多态是面向对象编程的三大特性之一&#xff0c;它允许我们以统一的方式处理不同类型的对象。Java中的多态分为两种&#xff1a;编译时多态&#xff08;重载&…

使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件

前言 假设您正在现有项目中集成这些包&#xff0c;而该项目的构建工具为 Webpack 或 Vite。同时&#xff0c;您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法&#xff0c;请随时留言。 安装 npm install three types/three react-three/fiber rea…

HBase理论_背景特点及数据单元及与Hive对比

本文结合了个人的笔记以及工作中实践经验以及参考HBase官网&#xff0c;我尽可能把自己的知识点呈现出来&#xff0c;如果有误&#xff0c;还请指正。 1. HBase背景 HBase作为面向列的数据库运行在HDFS之上&#xff0c;HDFS缺乏随机读写操作&#xff0c;HBase正是为此而出现。…

(Go基础)Go的运行流程步骤与包的概念

1. 快速入门 所有的go开发&#xff0c;都必须存在并包含在某一个包内 .go 是go语言程序的后缀名 1.1 编译 通过使用 go build 命令对该go文件进行编译&#xff0c;生成.exe文件 1.2 运行 运行刚刚生成出来的test.exe文件既可&#xff0c;不过并不不是双击&#xff0c;而是在…

蓝桥杯每日真题 - 第11天

题目&#xff1a;&#xff08;合并数列&#xff09; 题目描述&#xff08;14届 C&C B组D题&#xff09; 解题思路&#xff1a; 题意理解&#xff1a;给定两个数组&#xff0c;目标是通过若干次合并操作使两个数组相同。每次合并操作可以将数组中相邻的两个数相加&#xff…

手撸 chatgpt 大模型:简述 LLM 的架构,算法和训练流程

本节我们自顶向下看看大模型的相关概念&#xff0c;了解其基本架构以及从零手撸大模型的基本流程。自从 openai 释放了 chatgpt 后&#xff0c;人工智能就立马进入了大模型时代&#xff0c;我还记得在此之前 NLP 的处理主要依赖于深度学习的 LSTM&#xff0c;GRU 等模型架构。这…

FPGA实现PCIE3.0视频采集转千兆UDP网络输出,基于XDMA+RTL8211E架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案我这里已有的以太网方案本博客方案的PCIE2.0版本 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存UDP视频组包发送UDP协议栈MAC数据缓冲FIFO组…

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto- WriteUp

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto-WriteUp Crypto&#xff1a;Crypto-2&#xff1a;Crypto-3&#xff1a; 前言&#xff1a;本次比赛已经结束&#xff0c;用于赛后复现&#xff0c;欢迎大家交流学习&#xff01; Crypto&#xff1a; Crypto-2&#xff1a; …

PostgreSQL数据库笔记

PostgreSQL 是什么 PostgreSQL&#xff08;简称Postgres或PG&#xff09;是一个功能强大、可靠性高、可扩展性好的开源对象-关系数据库服务器&#xff08;ORDBMS&#xff09;&#xff0c;它以加州大学伯克利分校计算机系开发的POSTGRES版本4.2为基础。 发展历程 起源与发展&a…

el-table合并单元格之后,再进行隔行换色的且覆盖表格行鼠标移入的背景色的实现

el-table 中有现成的隔行换色功能&#xff0c;只要增加 stripe 属性即可。但是如果有单元格合并的话&#xff0c;这个属性就不可用了。这时候我们就需要动点小心思了。 基于相同字段进行合并 单元格合并&#xff1a;基于表头中的某一列&#xff0c;具有相同值的个数相加进行合…

光伏电站容量计算方法科普

光伏电站的容量计算是设计和评估光伏系统性能的关键步骤。通过了解光伏电站的容量&#xff0c;我们可以预估其发电量&#xff0c;优化系统设计&#xff0c;并确保系统能满足电力需求。本文将详细介绍几种常见的光伏电站容量计算方法&#xff0c;并特别介绍小程序“光伏一点通”…

mysql数据库(五)多表查询

多表查询 文章目录 多表查询一、链表查询1.1交叉连接1.2 内连接1.3 左连接1.4 右连接1.5 全连接1.6 例子 二、子查询2.1 in与not in2.2 any/some2.3 all2.4 比较运算符2.5 exists 三、例子 查询中使用的表如下所示 ------------ | id | name | ------------ | 1 | IT | …

06.VSCODE:备战大项目,CMake专项配置

娇小灵活的简捷配置不过是年轻人谈情说爱的玩具&#xff0c;帝国大厦的构建&#xff0c;终归要交给CMake去母仪天下。一个没有使用 CMake 的 C 项目&#xff0c;就像未来世界里的一台相声表演&#xff0c;有了德纲却无谦&#xff0c;观众笑着遗憾。—— 语出《双城记》作者&…

jmeter常用配置元件介绍总结之后置处理器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之后置处理器 8.后置处理器8.1.CSS/JQuery提取器8.2.JSON JMESPath Extractor8.3.JSON提取器8.4.正则表达式提取器8.5.边界提取器8.5.Debug PostProcessor8.6.XPath2 Extractor8.7.XPath提取器8.8.结果状态处理器 8.后置处理…

淘宝/天猫按图搜索商品:taobao.item_search_img API的奇幻之旅

在这个看脸的时代&#xff0c;我们不仅对人要看颜值&#xff0c;连买东西都要“看脸”了。没错&#xff0c;我说的就是淘宝/天猫的按图搜索商品功能——taobao.item_search_img API。这个功能就像是电商平台的“人脸识别”&#xff0c;只不过它认的是商品的颜值。下面&#xff…

豆包MarsCode算法题:数组元素之和最小化

数组元素之和最小化 问题描述思路分析分析思路解决方案 参考代码&#xff08;Python&#xff09;代码分析1. solution 函数2. 计算 1 2 3 ... n 的和3. 乘以 k 得到最终的数组元素之和4. 主程序&#xff08;if __name__ __main__:&#xff09;代码的时间复杂度分析&#x…

已有账号,重装系统激活office后发现没有ppt,word,excel等

有时候重装系统后&#xff0c;登录windows结果右键没有word,excel等 点击进入office 进入右边的账户 找到设备和订阅 直接下载office 安装后就会出现了

【数据结构与算法】第12课—数据结构之归并排序

文章目录 1. 归并排序2. 计数排序3. 排序算法复杂度及稳定性分析在这里插入图片描述 1. 归并排序 分治法&#xff08;Divide and Conquer&#xff09;是一种重要的算法设计策略&#xff0c;其核心思想是将一个复杂的大问题分解为若干个小规模的子问题&#xff0c;递归地解决这些…

shell 100例

1、每天写一个文件 (题目要求&#xff09; 请按照这样的日期格式(xxxx-xx-xx每日生成一个文件 例如生成的文件为2017-12-20.log&#xff0c;并且把磁盘的使用情况写到到这个文件中不用考虑cron&#xff0c;仅仅写脚本即可 [核心要点] date命令用法 df命令 知识补充&#xff1…