本节将通过具体实例展示金融风险建模与管理在现实中的应用。本实例的功能是使用贵州茅台的日线数据和大盘指数数据制作波动性分析模型。
实例5-1:处理股票数据中的缺失值(源码路径:daima/5/maotai.py)
在制作深度学习模型之前,需要准备用于模型训练的数据。这些数据可以包括历史金融市场数据、公司财务数据、宏观经济数据等。确保数据有风险因素的信息,如股票价格、利率、汇率等。编写文件maotai.py,功能是从Tushare获取贵州茅台(600519.SH)在2020年1月1日到2023年9月1日之间的日线数据。
在上述代码中,首先使用Tushare库获取了贵州茅台从2020年1月1日到2023年9月1日的历史日线数据。然后,使用方法to_csv()将数据保存到名为“maotai_stock_data.csv”的本地CSV文件中。运行此代码后,将在当前工作目录下找到名为“maotai_stock_data.csv”的CSV文件,其中包含贵州茅台的历史日线数据。接下来可以在此文件的基础上进行进一步的数据分析和建立风险模型。
编写文件maofeng1.py实现一个简单的ARCH模型,用于估计贵州茅台每日收益率的波动性。ARCH模型通过训练来学习股票波动性的模式,并可以用于预测未来的波动性。这是金融时间序列分析中常见的建模方法之一,用于风险管理和波动性预测。文件maofeng1.py的具体实现代码如下所示。
上述代码的实现流程如下。
(1)从名为“maotai_stock_data.csv”的CSV文件加载股票数据,将日期列转换为日期时间格式,再将日期设置为索引。然后设置提取特定的时间范围:从“2020-01-01”到“2023-09-01”。
(2)使用pct_change()方法计算每日的股票收益率,并将结果存储在名为“returns”的新列中。注意,需要删除包含NaN值的行。
(3)将计算得到的每日收益率数据转换为PyTorch张量(returns_tensor),这是模型的输入。
(4)创建一个简单的ARCH模型,它包含一个线性层(nn.Linear),用于对输入进行线性变换。
(5)初始化ARCH模型(arch_model),使用均方误差损失函数(nn.MSELoss)作为损失函数,使用Adam优化器(torch.optim.Adam)来优化模型的参数。
(6)开始训练ARCH模型:在循环中进行多次迭代训练模型,在每个迭代中计算模型的输出,然后计算输出与真实收益率波动性之间的均方误差。使用反向传播算法更新模型的参数,以减小损失。最后,输出每100次迭代的损失。
(7)在训练完成后,使用训练好的模型对每日收益率的波动性进行预测,并将结果存储在名为“predicted_volatility”的张量中。
(8)使用Matplotlib可视化预测的波动性。
执行后会输出如下训练过程,并绘制预测波动性随时间的变化图,如图5-1所示。
图5-1 预测波动性随时间的变化图
在制作深度学习模型的过程中,如果有其他相关的特征数据如客观经济数据、市场指数、交易量等可用,可以考虑将它们添加到模型中以提高预测性能。例如,股票走势在很大程度上是和大盘指数息息相关的。接下来我们就在前面的ARCH模型中增加“市场指数”特征。
(1)在Tushare 中提供了一些宏观经济数据的获取功能,我们可以使用 Tushare 来获取国内的宏观经济数据,如国内生产总值(Gross Domestic Product,GDP)、居民消费价格指数(Consumer Price Index,CPI)、生产者价格指数(Producer Price Index,PPI)等。可以通过Tushare 的接口来获取这些数据,并将其用于金融分析和建模。编写文件economic.py获取Tushare中提供的2020年1月1日到2023年9月1日的市场指数数据(market_index_data)和交易量(trading_volume_data),将获取到的数据保存到文件“macroeconomic_data.csv”中,具体实现代码如下所示。
此时文件macroeconomic_data.csv中的内容格式如下。
此时文件maotai_stock_data.csv中的内容格式如下。
我们发现两个文件之间的共性是日期,为了便于后面的合并处理,我们将文件maotai_stock_data.csv中的列名“trade_date”修改为“Date”,这样便实现了统一。
(2)编写文件maofeng2.py,首先读取大盘指数数据文件macroeconomic_data.csv,然后将大盘指数数据与贵州茅台的股票数据合并,以确保它们在相同的日期上对齐。最后将合并后的数据用于ARCH模型的训练和优化。文件maofeng2.py的具体实现代码如下所示。
上述代码首先合并了宏观经济数据和股票数据,然后使用ARCH模型对股票收益率的波动性进行建模和预测。这样,可以看到宏观经济数据是否对波动性预测有所帮助。执行后会输出以下内容,并绘制预测波动性的变化图,如图5-2所示。
图5-2 加入大盘指数后预测波动性随时间的变化图
第一个文件maofeng1.py实现的ARCH模型没有使用大盘指数特征,而第二个文件maofeng2. py实现的ARCH模型使用了大盘指数特征。比较这两个模型的损失值和性能,可以看出以下几点。
第一个模型的损失值(Loss)在训练过程中逐渐减小,最终趋近于1.069562862353439e-16,非常接近零。这表明第一个模型在拟合股票收益率的波动性方面表现非常出色。
第二个模型的损失值在训练过程中迅速升高,最终达到了2046.394287109375,这是一个非常高的损失值。这表明第二个模型无法很好地拟合数据,性能不佳。
根据损失值的表现,第一个模型明显优于第二个模型。第二个模型的损失值上升可能是因为加入了大盘指数特征后,模型的复杂性增加,导致过拟合或其他问题。因此,如果目标是拟合股票收益率的波动性,并且不需要大盘指数特征,第一个模型是更好的选择,因为它在损失值和性能方面都表现出色。第二个模型的性能不佳,可能需要进一步调整和优化,以解决问题并提高其性能。
当然,也可以利用文件maotai_stock_data.csv和macroeconomic_data.csv中的数据制作贵州茅台的股价预测模型。编写文件maofeng3.py构建一个神经网络模型,用于预测股票收盘价,同时进行特征标准化和性能评估。模型的目标是尽量减小均方误差,以提高对股票价格的预测准确性。文件maofeng3.py的主要实现代码如下所示。
执行后会输出以下内容,并绘制真实股票收盘价和模型预测收盘价的可视化图。
根据上述输出结果可以看出,这个预测股价的神经网络模型在训练过程中的损失逐渐减小,表现出较好的收敛性能。同时,测试集上的MSE为2.31587815284729,这是模型在未见过的数据上的均方误差,可以用来衡量模型的性能。通常情况下,MSE值越小表示模型对测试集的预测越准确。因此,这里表明该神经网络模型对股票收盘价的预测具有较高的准确性。
模型的性能不仅仅取决于MSE,还取决于实际应用的背景和需求。在某些情况下,即使MSE较小,仍然需要进一步进行评估和调整,以确保模型在实际应用中的可靠性和稳健性。