全文链接:https://tecdat.cn/?p=37326
原文出处:拓端数据部落公众号
量化投资可以带来不菲的回报,但缺乏丰富的知识却难以实现。统计质量管理的思想通俗易懂,且对于市场相对稳定的股市有监控作用。结合历史股票数据和统计质量管理的思想,对数据作合适的处理并设计合理的控制图是十分关键的。本文将通过展示如何用基于BC变换的EWMA控制图对顺丰控股股票分析,并结合一个Python神经网络、Lasso回归、线性回归、随机森林、ARIMA股票价格时间序列实例的代码数据,为读者提供一套完整的实践数据分析流程。
解决方案
任务/目标
根据历史股票数据,设计控制图并运用控制图监控股票价格变换并给投资建议。
数据获取
原数据为 2019 年 12 月 2 日到 2021 年 2 月 26 日之间顺丰控股股票的交易日期(trade_date)、股票代码(ts_code)、开盘价(open)、最高价(high)、最低价(low)、收盘价(close)、前一日收盘价(pre_close)、涨跌额(change)、涨跌幅(pct_chg)、成交量(volume)、成交额(amount)及换手率(turnover_rate)。以上均通过tushare网站的数据接口运用python获取。以下则均用R语言实现。
数据预处理
首先,对原始数据进行筛选,保留了研究所需数据,计算了振幅(%)指标,删除了多余及缺失数据。接着是对各指标之间的相关性进行了分析及可视化处理,发现除开盘价以外,其他指标之间均有相对较高的相关性,但是相关性最高的是开盘价与成交额之间(图略)。最后是给出研究区间内顺丰控股股票的收盘价走势(前复权)以及研究区间内的K线图和交易量图(图略)。
数据转换及检验
运用主成分分析方法对数据进行处理,得到综合得分数据。由于控制图对于分布的要求,进一步做正态检验,包括图示法、偏度峰度检验以及非参数检验法,最终得到综合数据不服从正态分布的结论。
因此,对综合得分进行Box-Cox 正态变换,得到变换后的得分数据,经检验满足正态性。
运用历史数据设计控制图
对于上述得到的变换后的得分,设计基于BC变换的EWMA控制图。接着,对2020年10月9日至2021年2月26日股票的数据进行相同的主成分分析及正态变换后,运用控制图对综合得分进行监控,并给出相应的投资建议。
在此项目中,最终依据控制图给出的初步投资建议如下图所示,其中绿色的点代表加仓或持有建议,而红色的点代表减仓或平仓建议:
更进一步,此项目还针对不同的投资者给出了个性化建议,如少加仓多减仓(只有价格连续下降才考虑减仓,而对于价格上升则宽松一些)以减少风险、多加仓少减仓(在低价位时多加仓,只有价格升高到一定水平后才考虑减仓)以提高收益率等。
此项目给出的初步投资建议最终的收益率变化(上),以及无策略收益率变化(下)如下所示:
同时,本策略给出的个性化投资策略最终收益率为23.88%、29.69%、47.7%。由此可以看出,此项目的策略是可以获得回报的。
当然,本项目所给出的策略仅供参考,所给出的收益率也是理论上的,并没有考虑实际交易中的各种问题。不过,此项目给出了运用统计质量管理进行投资的可实现想法,具有实际意义。
接下来我们一个实例包含代码和数据来演示如何用神经网络、Lasso回归、线性回归、随机森林进行股票价格预测。
神经网络、Lasso回归、线性回归、随机森林对大型科技股价格预测
数据选择
该数据集包括 14 家不同科技公司的每日股价和交易量,包括苹果 (AAPL)、亚马逊 (AMZN)、Alphabet (GOOGL) 和 Meta Platforms (META) 等
数据导入
数据的时间序列可视化
-
-
-
unique_symbols = stock['stock_symbol'].unique()
-
colors = ['red', 'blue', 'green', 'purple', 'grey', 'brown', 'cyan', 'magenta', 'yellow', 'black', 'orange', 'pink', '#ADD8E6', '#90EE90']
-
color_palette = {symbol: colors[i % len(colors)] for i, symbol in enumerate(unique_symbols)}
显示 2010 年至 2023 年股票调整后收盘价的时间序列的折线图。每只股票都由一条不同颜色的线表示,股票代码列在右侧的图例中。这些线显示了股价随时间推移的波动,一些股票显示出显着的增长
探索性数据分析
缺失值
数据集中没有缺失值。('stock_symbol'、'date'、'open'、'high'、'low'、'close'、'adj_close'、'volume')中的每一列都有等于条目总数的非空计数,即 45,088。因此,每列的缺失值百分比为 0.0%,确认数据集是完整的,没有缺失数据。
对图
配对图是一个图表网格,显示每个股票变量(如开盘价和收盘价)与其他变量的关系。对角线上是直方图,显示每个变量出现不同值的频率。对角线的散点图显示了两个变量之间的趋势或模式,例如整个数据中最高价和最低价的比较情况。
-
-
-
numerical_data = stock[['open', 'high', 'low', 'close', 'adj_close', 'volume']]
相关热图
热图显示了不同股票市场变量之间的密切关系,例如开盘价和收盘价。深绿色方块表示非常强的关系,开盘价、最高价、最低价、收盘价和调整后的收盘价都是如此,它们都非常相似。成交量与这些价格的关系不大,如棕色方块所示。
异常
数据集中的异常值可以在每个数值股票列的箱线图中发现,例如开盘价、最高价、最低价、收盘价和调整后的收盘价,以及成交量。描述性统计量显示的值远高于或低于平均值,表明这些是异常值。
数据预处理
数据清理
由于没有缺失值,因此我们不会执行任何插补技术,如均值或中位数插补或基于模型的方法,也不会删除具有缺失值的行/列。
删除异常值
stock_cleaned = remove_outliers(stock, columns_to_check, z_score_threshold)
预测分析
对于我们的预测分析,我们开发了一种综合方法,利用四种不同的机器学习模型,每种模型都因其在预测结果方面的独特优势和能力而被选中。这些模型包括:
- 线性回归:评估自变量和因变量之间线性关系的基础模型。
- 套索回归:线性回归的扩展,包含 L1 正则化,有助于特征选择和减少过拟合。
- 随机森林回归:一种集成学习方法,它使用多个决策树,通过平均结果来生成更准确、更稳健的预测。
- 多层感知器 (MLP):一类前馈人工神经网络,可以对输入和输出之间的复杂非线性关系进行建模。
通过利用这些模型的多种方法,我们旨在提高预测分析的准确性和可靠性。
线性回归
在线性回归代码中,我们使用一个模型来预测基于其他市场因素(“开盘价”、“最高价”、“最低价”、“收盘价”)的股价(“adj_close”)。该模型使用部分数据进行训练,然后进行测试以查看其预测新数据的程度,表明它通常准确,均方误差为 92.29,R 平方约为 96.8%。最后,我们用图查看预测价格和实际价格之间的差异,注意模型在哪些方面没有完美预测。
model = LinearRegression()
第一张图显示了预测的股票价格与实际价格的比较情况,大多数点位于一条线上,表明预测准确性良好。第二张图显示残差,即实际值和预测值之间的差值;点分散在零线周围,在预测中显示一些误差。第三张图是一个直方图,它告诉我们不同残差发生的频率,大多数接近于零,这表明许多预测接近实际值。
套索回归
在套索回归代码中,我们创建了一个模型,该模型不仅可以预测股票价格,还可以通过减少变量的数量来简化模型,如果某些变量对预测没有多大帮助(这是通过“alpha”值完成的,它控制着这种简化的强度)。该模型的准确率略低于基本线性回归,R 平方约为 96.82%。然后,我们使用散点图和直方图根据实际价格和误差(残差)检查预测。
第一张图将实际股票价值与 Lasso 模型预测的股票价值进行了比较,显示了沿线的紧密聚类,表明预测良好,但存在一些价差。第二张残差图显示了预测值和实际值之间的差异,点集中在零线附近,但对于较高的值,则存在一些较大的偏差。第三张图显示了这些差异的分布,主要以零为中心,这表明预测通常接近实际值,尽管有一些明显的例外。
随机森林回归
在随机森林模型代码中,我们使用一组决策树来预测股票价格,与单个决策树相比,这通常会导致更准确和稳定的预测。该模型显示均方误差为 75.59,R 平方误差为 97.4%,表明其预测与实际值非常接近。我们使用绘图直观地将预测值与实际值进行比较,并分析预测误差(残差)。
第一张图显示了随机森林模型的实际股价与预测股价,大多数点都接近黑线,表示预测准确。第二张图显示了残差,即预测值和实际值之间的差异,散布在水平线周围,对于较高的值,存在一组较大的误差。第三张图是残差直方图,显示大多数预测都非常准确,峰值在零附近,但也有一些更大的误差离零更远。
多层感知器 (MLP)
在多层感知器模型代码中,我们使用一种具有两层处理的神经网络来预测股票价格,网络通过其层“学习”复杂的模式。该模型的均方误差约为 97,R 平方得分约为 96.7%,这意味着它非常擅长做出与实际数据相匹配的预测。我们使用几个图来检查预测值与实际值的比较情况,并查看预测误差,即残差。
第一张图显示了神经网络模型对实际和预测股票价值的比较,主要是沿着这条线,这意味着预测是好的。第二个图是一个残差图,它显示了预测中的一些误差,特别是对于较高的值,因为它们偏离了零线。第三张图是一个直方图,在零附近急剧达到峰值,表明大多数预测接近实际值,但也有一些误差离零更远。
使用 ARIMA 模型进行时间序列预测
该代码准备股票市场数据,并使用 ARIMA 模型预测每只股票的未来调整后收盘价。首先,它将 2023 年初之前的历史数据分开以训练模型。然后,它按日期和股票代码对数据进行分组,选择每个月的最大调整收盘价。对于每只股票,它都会根据历史数据拟合 ARIMA 模型,并使用它来预测 2023 年未来 12 个月的收盘价,并在历史数据旁边用图表显示这些预测。
-
model = ARIMA(dataf_max_pivot[symbol], order=(5,1,0))
-
model_fit = model.fit()
关于分析师
在此对 Xiaoyan Wang 对本文所作的贡献表示诚挚感谢,他在华东师范大学完成了统计学的本科学位,专注统计领域。擅长 R 语言、Python 、数据分析、数理金融 。