1. 引言
随着各国经济联系日趋密切,全球的金融市场也呈现不同的态势,尤其是中国的股票市场,正以强劲的姿态发展。中国拥有着仅次于美国的股民数量,然而中国的股民素来被称为“韭菜”[1]。究其主因,股票行情信息纷繁复杂,往往散户会以远慢于金融市场震荡的速度,过早或过晚地抛售、买入股票,最终亏损被“割韭菜”或者接盘“垃圾股”成为冤大头[2]。如何对股票信息进行筛选和判断,提早发现单支股票的涨跌行情,对于散户或者投资机构来说十分重要。
股票量化交易早期主要依赖于简单的技术指标,例如移动平均线、相对强弱指标(RSI)、MACD等[3],一些统计模型计算能力有限,主要依靠人工进行数据分析和交易策略制定,策略简单,容易被市场噪音干扰,缺乏对市场风险的有效控制,交易频率较低[4]。
随着计算机技术和数据处理能力的提高,量化交易开始使用更复杂的统计模型,例如回归分析、因子模型等[5]。开始使用更高级的编程语言和数据库技术[6]。但是,随着高频交易开始出现,对数据质量和模型参数的依赖性较高,模型的有效性容易受到市场环境变化的影响,高频交易面临着技术风险和监管风险[7]。
综上所述,本文所使用的A2C算法能够自动学习最优的交易策略,而不需要人工设计复杂的规则[8];能够适应市场环境的变化,因为它能够不断地学习和调整策略[9];能够处理高维数据和时间序列数据,例如结合LSTM网络处理股票价格的时间序列特征[10]。
本文的组织结构如下:
第二节介绍了A2C算法模型的数据来源、环境与模型的结构、训练过程、模型的关键技术工作原理。第三节介绍了模型的训练,其中包括了:训练流程、评估指标、训练结果。最后在总结部分对本文的研究内容进行总结和模型改进的展望。
2. 基于A2C算法的交易模型创建及训练
2.1. 数据获取与预处理
本论文选择2022年12月1日至2024年9月30日阿里巴巴的股票信息作为数据研究对象。阿里巴巴作为中国互联网头部企业,其股票在美国纽交所上市。相比于A股市场的信息披露和监管力度,美国证券交易委员会(SEC)的监管力度更加严格和全面,吸引了全世界范围内的投资者,具有交易量大、流动性更好的优势,作为投资者买卖其股票降低了交易成本,也减少了对于最终盈利核算的影响。如图1所示,为2022-12-01至2024-9-30阿里巴巴股票信息。
Figure 1. 2022-12-01 to 2024-9-30 Alibaba stock information
图1. 2022-12-01至2024-9-30阿里巴巴股票信息
同时,选择了雅虎金融(Yahoo Finance)作为数据源。雅虎金融提供大量的金融数据包括:股票价格、交易量、财务报表数据等。相比较于其他数据提供商,雅虎金融大部分数据免费;数据通常以结构化的格式呈现——方便数据分析和处理;数据通常可以通过API接口获取。
使用“Pandas-Datareader”库的“Web.DataReader”函数获取在线数据,该函数将雅虎金融发送的JSON数据解析为Python对象,其交互过程如图2所示:
Figure 2. Data streaming acquisition process
图2. 数据流获取过程
2.2. 环境与模型的构建
本论文通过使用Python的Gym库为模型构建一个股票交易环境。Gym库的核心函数是gym.make (stocks-v0)。其中“stocks-v0”是“gym-anytrading”库注册的环境ID,表示要创建的是一个股票交易环境。创建好的环境会接收已经打包完成的股票数据集,该数据集包括了开盘价、最高价、最低价、收盘价、成交量等信息。数据传输完成后,环境进行规范化预处理,以便输入模型训练。该环境使用指定的股票数据(阿里巴巴)、数据范围(2022-12-01~2024-9.30)和窗口大小(每一次循环中模型训练的数据规模),如图3所示:
Figure 3. Environment creation
图3. 环境的创建
而模型的构建主要工作是对环境预处理好的数据进行接收、设置好训练的次数、选取合适算法和策略网络、确定好训练流程。
模型选取了Stable Baselines3库的A2C算法作为模型训练的核心算法,并辅助使用了MlpLstmPolicy网络结构进行策略的更新。
其中A2C算法指的是Actor-Critic,一种基于策略梯度(Policy Gradient)和价值函数(Value Function)的强化学习方法。它通过产生交易动作提前完成对股票的买入或者卖出,通过与实际股票的涨跌情况作对比,评判本次交易的结果是盈利还是亏损,并根据奖励(判断的结果)更新下一个阶段的行为,也就是下一阶段买入还是卖出,以得到更好的资金回报。
A2C算法会创建多个进程与环境进行交互,以收集更多的交易经验,这对于优化每一次的动作都能起到正向效果。如图4所示。
MlpLstmPolicy策略网络是多层感知器MLP和长短期记忆网LSTM。MLP能够辅助处理交易量、技术指标等不随时间变化的数据;LSTM则辅助处理价格序列等随时间而变动的因素,捕捉股票价格变化过程中的依赖关系,通过与MLP相结合形成MlpLstmPolicy策略网络,能够更好地为A2C算法更新策略,以得到更好的预期收益。
Figure 4. The working principle of A2C algorithm in multi-threading
图4. A2C算法多线程工作原理
3. 模型的训练
3.1. 训练流程
模型训练开始前,必须对模型的训练参数进行设置,主要是循环训练的次数(根据实际数据源的数量进行估计)、获取的窗口大小(一次抓取的数据规模)。
模型训练第一步:初始化。这个过程由Gym环境处理完成。这个处理过程隐含在“gym-anytrading”库中。
模型训练第二步:数据获取。前文所述,由环境会自动将打包完成的数据输入给模型。
模型训练第三步:决策网络。该步骤负责生成一个交易策略,以A2C算法为核心辅以MlpLstmPolicy策略网络生成一个决策。该决策是动态存在,在设定的最大训练次数之前,每一次完整的训练都会根据奖励更新策略。
模型训练第四步:行动。即根据策略完成一次完整的股票买入或者卖出。在预期中该行动应该是股票的高点卖出,低点买入。
模型训练第五步:奖励。奖励本质是上一次交易动作产生的后果,后果可能为正向或负向。根据一次决策完成一次行动,将行动结果与股票的数据进行比对,即可知道该行为产生的后果。
模型训练第六步:更新策略。由第五步的后果,回到第三步,调整策略,该过程由算法自主学习完成。更新策略后使用新策略继续完成第三步到第六步。
模型在执行循环往复的训练次数后结束。其流程图如图5所示。
3.2. 评估指标
股票交易模型的最终评估指标以收益率为准。本模型引入MATLAB以构建可视化的图表,最终的收益率和决策过程会生成散点图,散点会落在股票的实际涨跌线上,以进行对比。
如图6所示,在没有任何算法训练的情况下,Gym环境内自行交易的结果。
Figure 5. Training flowchart
图5. 训练流程图
Figure 6. Chart of transactions in the system without training
图6. 无训练状态下系统的交易图
在该图6中,红点表示卖出行为,绿点表示买入行为。由于第一次进行数据训练不会产生买入和和卖出行为,因此最开始的一段曲线上并无散点。
分析图中的散点图可知,在没有算法的情况下,自主交易存在混乱的情形,在持续走高的趋势中连续买入,在持续走低的趋势里卖出的行为却寥寥无几。根据股票常识易知,假如阿里巴巴股票在2021-12-01至2024-09-30两年间的股票走势总体降低,那么连续买入的操作(图6中绿点占据大部分比重)最终结果将是亏损,同时根据图中最终的收益显示为:“Total Profit” = 0.579032可知,其收益率小于1,即最终余额约只有本金的58%。
而阿里巴巴股票的总体趋势图也验证了这一次结果必然是亏损的,如图7所示:
Figure 7. Alibaba stock trend chart
图7. 阿里巴巴股票涨跌趋势图
3.3. 训练结果
由3.2可知,一个无算法的股票交易模型最终的结果是亏损的,下文将展现运用算法模型的训练结果。
在经过3.1的训练步骤之后,该模型的训练结果比较于无算法状态下的收益率有了较为明显的进步。如图8所示:
Figure 8. Initial training behavior trajectory and return rate
图8. 初步训练行为轨迹与收益率
在图8中,收益率为1.058710,大于1,交易模型有了预期的效果。但是约5.87%的盈利率有待提高。实际的股票交易中还有手续费等相关费用,所以现实的收益率依然大打折扣。且观察其行为轨迹能看出模型的行为较为单一保守,几乎所有行为都是卖出股票,受益于阿里巴巴的股票整体呈下跌趋势,因此总体比较什么也不做或者连续买入是获利的。
考虑到模型的优越性与训练次数(时间)和观察窗口有关,提高训练次数并扩大观察窗口,得到了更加理想的结果。如图9所示:
Figure 9. Adjusted parameters behavior trajectory and return rate
图9. 调整参数后的行为轨迹与收益率
观察图9可知收益率为1.177118,最终盈利率率约达到了17.71%。根据图中的散点轨迹能够发现,买入和卖出的操作在未知实际涨跌的情况下跟预期(高点卖出,低点买入)大致吻合。这说明调整参数起到了正向的效果,最终是盈利的。
同时,17.1%的盈利率远高于美联储的存储利率,意味着投资者运用了本模型,将本金用于阿里巴巴股票的量化交易远大于储蓄利息,运用了A2C算法的交易模型训练成功。
4. 总结和展望
本论文通过Python库工具包抓取阿里巴巴两年内的股票数据,使用Gym库创建了一个股票交易的环境,将数据封装进算法模型训练,训练需要一定的GPU资源,本项目通过谷歌的COLAB笔记提供的GPU完成训练,最终得到了一个基于A2C算法的股票交易模型。该模型利用A2C算法的行为-评价体系,对过往行为结果进行反复的评价后对策略进行往复的调整,优化行为,最终根据训练结果验证了该模型的有效性。本论文存在一些可以改进的地方,例如:能够尝试在数据处理环节,运用对数据优化的算法,对数据进行筛选,提高模型的运行速度;实际上股民的手里不可能单一持股,因此模型可以为用户添加搜索指定股票并下载其数据的功能,用户能够对多支的股票进行训练,得到针对不同股票的不同模型。
展望本论文提出的算法模型,本文的提高工作可以着眼于对收益率的提高和行为的稳定性。第一:由于影响股票涨跌存在诸多因素,因此可以根据本论文内容设置两个股票模型。其中,A模型对股票的数据进行训练,B模型以A模型的行为和收益率为数据基础,再结合影响股票的宏观政策、突发事件、市场变动等外界要素融合进行训练,最终得到一个更加贴合现实情况的交易模型。第二:考虑到两年内的数据并不具备代表性,对于一支股票而言,全面综合地考察其表现需要追溯到上市伊始的数据,因此增加数据量和扩大每一次的数据观察窗口也是提高模型性能的途径,当然这也对训练的硬件和时间提出了更严格的要求。第三:本论文训练的是上市于美股的阿里巴巴股票,不同股市的股票具备不同的涨跌规律,为了更加全面和客观,亦可挑选中国的A股及港股股票进行训练。