基于人工智能算法(Resnet101)的投资策略
由ypyu创建,最终由ypyu 被浏览 628 用户
导语
说明:重要的事情说三遍,这是一篇付费策略的详细报告!这是一篇付费策略的详细报告!这是一篇付费策略的详细报告! 1为人,1为人工智能,二者结合如虎添翼。
AI在股市应用中的观点
最近几年随着深度学习不断的发展,人工智能成为了时下最热门的话题,深度学习在各个领域都有了很多重要应用,不少专业人员也在把人工智能引入到股票投资领域。这两年互联网上就出现了不少关于人工智能投资基金收益吊打专业投资基金经理的报道,然而事后的追踪报道也显示这些所谓的人工智能投资基金的收益只是在中短期内超越了纳斯达克、标普500指数而已,长期来看还是跑输这些指数。
深度学习目前主要有三大类方法:适合图像处理的卷积神经网络CNN、适合序列处理的LSTM以及对抗学习GAN。CNN是一种多层神经网络,擅长处理图像特别是大图像的相关机器学习问题,目前也是人工智能应用最为广泛的,在图像处理、视频监控等领域应用举不胜举。因为LSTM是具有记忆功能的神经网络,所以经常被用来处理具有连续性、关联性的序列问题,例如自然语言处理NLP、时间序列的预测分析,在股票投资研究中用的最多的也是LSTM网络。GAN是一种无监督的博弈学习获取特征的深度学习模型,目前GAN最常使用的地方就是图像生成,如超分辨率任务,语义分割,电子游戏等等。
深度学习的核心是特征学习,旨在通过分层网络获取分层次的特征信息,从而解决以往需要人工设计特征的重要难题。所以深度学习模型的成败就在于模型输入的特征,这也是为什么深度学习目前最重要的应用是图像处理领域和自然语言处理领域,因为不管是图像还是自然语言都是有固定特征和搭配的。只有给深度学习输入可识别的特征才能进行训练,现在很多把人工智能应用到量化领域的研究人员,上来就是把股票的一些相关数据导入模型训练,连人都看不出来的特征指望机器能发现其实是很难的,即使这些数据里面有人看不出来但机器能看出来的特征规律,但是在数据的其他噪声影响下也会在不断训练过程中被掩盖掉。
所以在采用深度学习进行人工智能方面的研究时,要始终坚信一条:**人能预测的,有算法加持会如虎添翼;人测不准的,用算法也比你强不了多少。人不行的,人工智能更不行。机器只是人类思维的具现,**而不是独立思考的个体,指望往里面扔一块废铁,能够炼出黄金,只能说被人工智能的宣传洗脑了。方向错了,爱因斯坦也找不到回家的路,这也是为什么马云一直喜欢称之为机器智能。机器只会遵照我们给的方向训练,而不会自己寻找新的方向,人错了,机器也不会在大数据中捞出过于有价值的东西。
综上所讲,**要想将人工智能算法应用于股票投资中,其核心还是人,人的思想,**构建策略的人必须对研究的市场有充分深刻且正确的认知。在下一节我们将讲述我们构建人工智能算法的逻辑思想,让投资决策如虎添翼。
逻辑推理
在构建深度学习模型输入特征之前,我们有必要探讨一下产生这样一个策略的逻辑推理过程, 只有强大的硬逻辑才能保证策略的鲁棒性和稳定性 。在A股市场只能通过做多的形式来赚钱,那么我们就要研究一下股票低买高卖能够盈利的共性特征。
从同一个股票不同时间下不同时间周期的走势图中,可以看出符合低买高卖的股票在最后的走势都是多头发散,在低位都是空头排列,仔细观察,在股价上涨了一段时间后多头排列,然后股价出现回调,接着又是一波快速上涨,那么我们就可以认定这个中间的回调是为了更快速的的上涨。但是在所谓的低位时空头排列,空头排列是不好掌控的,如果我们能够在这样的回调区域买入静待后面的快速上涨岂不是很不错的策略,同时也避免了追涨杀跌,降低了交易的风险。由此,我们得到了构建策略的第一个要素: 在上涨中继回调区间买入股票。
在股票走势中我们会经常提到一个主升浪的概念,波浪理论里主升浪的准确定义可以描述为:如果一个波浪的趋势方向和比它高一层次的波浪的趋势方向相同,那么这个波浪就被称为主升浪。翻译成大白话就是主升浪都说是在相对的高位展开,不相信的朋友自己翻遍A股所有股票就知道了,下图是我在写这篇文章的时候同花顺随便打开的股票,如下图标记的位置,敢问有谁见过股票在低位展开主升浪的吗?一轮行情中涨幅最大,上升的持续时间最长的行情为主升浪行情,主升浪起源于波浪理论中的第3浪,它是一轮行情中投资者的主要获利阶段,属于绝对不可以踏空。这样你就明白了为什么股票在低位那么墨迹,你持股半年,以为又如上次那样冲高会回落,结果在启动的最后卖出就大涨,就像庄家就差你那几万股似的。 股票总是在低位那么墨迹,在高位快速上涨,能走出这样走势的股票在先前一般都表现的比较强势,明显优于大盘。强势股不一定会走主升浪,但将走主升浪的个股一定是前期强势股。至此,为了更稳定快速的获利,可以得到我们构建策略的第二个要素:我们应该在相对的高位买入股票。
在上图主升浪行情中,还以上面的图来看,2015.11.3-2015.12.09期间,002427深南股份最多上涨了74.19%,而同期的上涨指数上涨了0.37%,可见个股的走势在这个时期是不受大盘影响的。其实翻阅A股历史长河,你会发现大部分股票的大幅上涨都不会跟随大盘的。这就是趋势的力量,资金推动的力量,开弓没有回头箭。在上涨趋势一旦确立了,就不要关心大盘,关心的是趋势运行时间的长短。最后得到我们构建策略的第三个要素:不考虑大盘,不择时!
**投资是一门不断做减法的哲学,当一个事件发生所需要的条件越多时,发生的概率就越低。**为了以更高的概率获得预期的收益,那么我们的策略就必须要足够的简单,限定条件足够少,这样策略也越稳定。综上,我们构建的策略为:不择时,在相对高位买入回调的强势股。这里的强势有两层含义:1.本身走势足够强势,2本身走势一般,但相对于指数来说是强势的。这样有个好处,在整个市场都很差的时候,策略是选不出可买入的股票的。要长期在股票市场存活下来,要尽可能少的做交易,股票交易必须赚多亏少,多赚少亏。每次交易赚的概率要大于亏的概率,赚的收益要大于亏的收益。所以最终的策略要满足多赚少亏。
俗话说:会买是徒弟,会卖才是师傅。在构建策略的时候,卖出策略跟买入策略一样重要。在我们的个股卖出策略中,规定如下:1.收益达到10%卖出;2.满足给定的卖出条件;3.持有最长时间达到1个月卖出。上述三个条件满足一个就卖出持有的股票。
训练深度学习模型
在确定了策略方法后,下一步就是如何来实现选股。这几年人工智能不断兴起,各个行业都在涌入、拥抱人工智能,当下人工智能最核心的技术基础就是深度学习。目前市面上能看到的基于深度学习的策略大多都是将股票数据看成有联系的序列,借助LSTM网络记忆能力,不断给LSTM网络喂入这些多维度的数据,希望能顺势预测出股票后期的走势。然而这些数据之间的特征联系并不清楚,过多的噪声并不能训练出具备操作能力的模型。因此,我们借助的是CNN网络,利用深度学习在图像处理方面的强大能力,通过给CNN模型输入我们确定的强势股的股票走势图,训练出可识别这些强势股的特征的模型。大致流程如下图。
我们将强势股分为2类(一开始的时候我们是分了3类的,但第3类在做了100多个训练样本之后发现上涨趋势并不稳定,所以去掉第3类,只保留2类强势股),每一类都有固定统一的可识别的特征。这样我们就将选股问题变成了分类问题,在用模型进行测试选股时,大部分股票是不在这两类里面的,所以我们在训练模型的时候还要准备负样本,负样本的多样性决定了模型最终分类的准确性。这样模型的输入数据就变成了三种类型,在制作训练样本时,考虑到卷积核采样的缘故,将图像的大小设成32的整数倍可以避免不必要的麻烦,我们都统一设成224*224的尺寸。为了保持训练样本的独立性,不与后续测试有重复的日期的股票出现,同时检验策略的时效性、适用性,在制作训练样本时,我们统一从1996年到2013年之间选择股票代码是000001-000996、600001-600999之间随机选取了100多只个股满足上述走势的走势图作为训练模型的样本。最终,我们制作了类别1样本373个,类别2样本433个,考虑到样本数量的均衡性对模型的影响和负样本的多样性,类别3(负样本)样本取了500个。在选择深度学习网络时,我们选择了Resnet101网络(深度学习相关的专业知识不在本篇文章的说明范围,需要学习的读者可以自行查找资料学习),Resnet101网络在各种图像分类任务中已经展现出良好的测试效果,并广泛应用于目标检测算法中。
下图是训练样本走势的一个示意图,每个类别(正样本)都有两个特征,特征1的位置就是买入股票的时间节点,但是特征2的位置是不固定的,如果在选股测试时同时检测这两个特征,那就需要遍历从特征2到特征1时刻的所有走势图,单一时间节点全市场检测的图像数量将从3600多张上升到近80万张,而且大部分图像的测试是资源浪费。 在检测选股时,图像是通过数据画出以后保存在计算机内存中,然后调用到GPU显存中,用训练好的Resnet101模型进行分类。在这整个过程中最耗费时间的是I/O数据读取输出,经过测试在同时检测分类两种特征时,对沪深A股所有股票单时间节点检测耗时4.5小时左右,同时模型的识别准确率也会下降只有87%左右,后续还要人工去除不正确的部分结果。所以,我们折中采用了更高效的办法,只识别特征1,只将特征1作为训练样本的特征,特征2采用人工识别,特征2采用人工识别还有两个用处将在后面讲到。通过调整训练参数,训练出来的特征1的Resnet101模型分类的准确率能到达97.2%,分类单节点全市场的股票耗时710秒左右。根据特征1分类识别出来的结果在数量上一般不会超过100个,同时因为模型分类结果并不能100%正确,需要人工删除部分不符合特征1的结果,并对剩下的进行特征2分类,整个过程可以在2分钟内完成,效率得到了大幅度的提升。
策略优化
利用训练好的Resnet101模型,按照上述方法分别对2014.1--2014.7、2015.6.5-2015.12.25、2016.1-2016.12、2017、2018这四年时间进行了检测识别。
在这4个时间区域内,大盘处于常说的熊市,指数收益分别为:-3.26%、-29.54%、-12.3%、6.56%、-24.59%。为了控制交易的频率,我们每周末测试一次,符合策略的个股分布如下面左图所示,中间的时间轴将收益按照0隔开,0轴上方的就是收益大于零。在统计个股收益率时,收益率大于10%但没有达到卖出策略条件2和条件3时,计算的是所能达到的最大收益,为了能更直观的展示分布我们剔除了为数不多的最大收益大于40%的个股,最大收益率不大于10%同时满足卖出策略条件2或条件3时,计算卖出时的收益率。从分布图可以看出,**在所有满足策略的股票中,收益率大于0的占比60.86%;在收益率大于0的股票中,收益大于10%的股票占比达78.9%;收益率为负的大部分在-10%-0之间,符合多赚少亏的要求。**同时我们在统计分析的时候还发现,在这些收益率为负的一些个股中,有接近三分之一在持有过程中最大收益是大于5%的。 虽然是在每周末测试一次,但是5年不到的时间里上述符合策略的股票数量达到了694个,为了提高资金利用效率减小交易费用有必要过滤掉一部分。既然是要过滤,那必然要增加限制条件,随着条件的增加策略的适用稳定性将会有所下降。为了让新增加的过滤条件对策略影响降到最小,选择的条件依然围绕策略中的强势股条件来构思,同时为了避免单限制条件的不稳定性,我们设计了三个条件融合打分过滤。通过观察可以发现,强势个股的涨跌跟指数的涨跌相关性不高,所以将个股与指数的相关系数作为一个限制条件,这里相关系数采用Spearman相关系数来计算,Spearman相关系数不需要数据满足正态分布。第二个条件是个股与指数强弱的对比,虽然通过上述模型选出来的是强势股,但是还是有少部分股票在整体走势上弱于或跟随大盘的。第三个条件是对回调部分走势资金流动情况进行量化计算,主要是将买卖盘进行向量化处理。符合一个条件就记为1,不符合记为-1,三个条件相加大于等于1则保留,小于1则删除。经过这样的处理后,可以得到上面右图的分布,符合条件的股票数量为467个,收益率大于0的占比68.23%;在收益率大于0的股票中,大于10%的股票占比达83.12%。
为了能够更清楚的看到筛选前后的对比,各时间周期的筛选前后对比如下,尽可能的少剔除个股数量,在剔除负收益样本的同时也剔除了正收益样本,我们将在后面测试筛选前后的收益对比。 2014.1--2014.7
2015.6-2015.12
2016.1-2016.12
2017.1-2017.12
2018.1-2018.12
资金使用管理
目前能看到的策略很少有关于资金使用管理方面的分析,然而如何合理的使用资金对策略的收益、风险也是至关重要的,所以我们有必要花很大的篇幅来研究资金如何使用。
为了控制交易频率,尽可能少的买卖股票,在收益没有达到10%之前,我们把卖股票时间都放在周五,也便于进行资金使用的最优化分析。对资金使用的优化是一个规划问题,所以我们要列出目标函数和约束条件。为了求解这个问题,需要定义一些辅助变量和矩阵。具体求解方法如下:
1、定义 c =max(t[i]) i = 1…m c表示单一时间段的最大可买入股票数,m表示最后时刻数,t[i]表示i时刻可买入的股票数量;
2、定义辅助矩阵 B[m][c][m + 2],其中B[i][j][k + 1] = 1,表示在时刻i购买的第 j 个股票,在时刻k仍然为持有状态。假设时刻i购买的第 j 个股票持有期为 3 个时段,那么 B[i][j][i + 1] = 1,B[i][j][i+ 2] = 1, B[i][j][i + 3] = 1。其他时段B[i][j][k] = 0。B[i][j][20]表示初始时刻,均置数为 0。B[m][c][m + 2],表示在 m 时刻结束后,是否将股票套现, 取值为 1,代表不套现,这笔金额不计入最后时刻的资金池。取值为 0 代表套现,本金和收益计入资金池;
3、定义每个股票的收益率a[m][c];
4、定义变量,每个时刻资金池金额P[m];
5、定义变量,每个时刻总投资额I[m];
6、定义变量,每个时刻单个股票投资额x[m];
7、定义变量,每个时刻总投资回报E[m],包含本金;
整个问题为最大化终期资金池金额 max P[m],约束条件
时刻 t 初期总投资额为I[t],因为c = max(t[i]),每个时刻的可买入股票数目不一定达到了c,(B[t][j][t]−B[t][j][t−1]) = 1代表有买入,(B[t][j][t]−B[t][j][t−1]) = 0代表此刻没买入,则: 时刻 t 末期获得的总收益为E[t],(B[u][j][t + 1] − B[u][j][t + 2]) = 1,表示时刻 u 投资的第 j 个股票,在时刻 t持有,时刻 t+1 不持有,即在时刻 t卖出了。时刻初为周一,时刻末为周五。 (B[u][j][t + 1] − B[u][j][t + 2]) = 0,意味着在时刻 t 没有卖出操作,可能是继续持有(1-1),可能是早就卖出了(0-0),可能是没有持有过(0-0),则: 那么每个时刻的期末资金池金额P[t]:
P[t] = P[t − 1] + E[t] − I[t] t= 2..m
P[1] = M+ E[1] − I[1]
为了保证现金流不断,那么:
P[t] − I[t + 1] ≥ 0 t= 1…m− 1 M≥ I[1]
在我们的策略中,每个股票买入收益率达到10%的可能性都是一样的,所以规定同一个时刻买入各个股票的金额是一样的,同时持有时间最长可能1个月,在持有股票的过程中会不断有资金被释放出来,下个周期的可利用资金即为P[i],规定下个周期的新加总投资为P[i-1]*v,v为资金使用的仓位,为保证资金池资金尽可能的利用,规定 0.5≤v≤0.9,同时我们还猜想到当第一笔投资收益是负的时,仓位加的过重会导致总体收益的下降,我们需要对第一笔投资仓位r的轻重对总体收益的影响风险进行计算分析。那单笔投资约束条件:
为了得到每个时刻末的资金总量,定义Z[t], 这样整个问题可以表示为: 以上约束条件中,只有仓位r和v是约束变量,其他都是中间变量,利用lingo软件对上述规划问题进行编程求解,大致如下图。 考虑到第一笔投资的特殊性,我们分别选了第一笔投资的6种不同情形进行计算分析,表中长短周期表示1周到4周不等,每种情形分别取了4个不同时间段的样本共计24组,不包括最后要分年度回测的时间段。 经过计算发现,**所有24组最终收益都与v正相关,v越大收益越大;**当第一笔投资收益为全负时,与r负相关,其余情况都与r正相关,限于篇幅仅展示两种类型各一张图片,x轴表示v,y轴表示r,左图是r负相关,右图是r正相关更直观的3D视角可以见动图。在所有情况下,收益都随着资金利用的仓位提高而增大,说明策略的稳定性和风险的可控。
风险是指投资中未来收益的不确定性,不确定性的程度越高,风险越大。由于投资的风险是在投资之后发生的,而投资者又希望投资前或投资时能够了解到投资风险,因此本策略中需要对投资风险进行分析。我们用收益的标准差σ来测度风险,标准差是方差的平方根,而方差是各种可能值相对于期望值离散程度的指标,由于各种可能收益的波动程度越大,方差的均值就越大,所以收益的方差$ σ^2$可以用来测度风险,方差越大,意味着风险越大。从上面的收益计算分析发现收益都是在v越大的时候越大,**因此在分析风险的时候我们将v固定在最大值0.9,只分析r对收益影响。**在对14-18年的可买入股票进行分析后,得到单时间节点只有一个可选股票的时候买入后亏损的概率是33%左右,因此我们在上面24组数组中选取了12组盈利和6组亏损来分析r对收益分布的影响,将每组的最大收益作为目标收益 这样我们就得到计算方差的公式: 根据计算结果可以拟合得到多项式: 如上图所示,对多项式求导即可求得收益风险比最高的r值,求导得r=0.594。第一次投资这种情形可以扩展到在买入当前时间节点的单股票前手中持仓为全现金的情形,至此我们就得到了最终的资金使用策略:当单时间节点可买入股票只有一个,并且买入股票前手中持有的是全现金,那么买入该时间节点的资金为0.594P[i],否者该时间节点的投资总额为0.9P[i]。
历史回测
至此,整个策略的选股策略、卖出策略、资金使用策略都已经完成,下面就需要对策略进行回测了。因为在选股时,**深度学习模型并不能保证100%正确,同时还需要人工筛选特征2,所以没有办法对策略进行量化框架下的自动回测。**我们采用的是,根据整个股票的历史时间和收益分布,通过lingo软件计算出在规定时间内的每个节点的资金使用量和总资金来进行回测。 我们将按照2014.1-2014.7、2015.6.5 - 2015.12.25、2016、2017、2018这5个时间段来测试,5个时间段的上证指数收益分别为:-3.26%、-29.54%、-12.3%、6.56%、-24.59%。假设初始资金都是300000,在不考虑交易费用和税费的情况下,通过计算得到五个时间段的收益分别为69.85%、53.14%、128.51%、181.92%、47.55%,资金曲线分别如下。如果考虑交易费用的话,佣金按万分之五计算收益率降为约66.72%、51.69%、108.2%、176.07%、43.40%。
为了验证之前减少交易频率是有效的,我们还测试了未删减可买入股票数量的各时间段的收益,分别到达44.98%、49.54%、70.87%、161.24%、40.97%,考虑交易费用后收益大约为42.12%、48.13%、66.33%、154.29%、36.28%,对比如下表。资金曲线如下。 \n \n 从表中可以看出,在过滤删减掉一部分可买入股票后收益有了提高,但是我们同时发现删减后整个交易额并没有大幅减少,相反略微变大了,同时不删减的收益也是相当可观的。
总结
在上篇博文我们提到过,回测曲线是可以通过不断调整参数来获得那个收益最好,回撤很小,基本45°角上行的那个最优曲线的。在我们的策略中,选股时是将股票的走势图图像作为选股依据的,不存在未来函数,回测时没有任何可调节的参数。为了体现策略不需要择时,我们在测试时都是挑选的大盘走势不好、微涨的时间段或年份,最后的结果表明我们的策略是能够稳定获得超额收益的。在我们的策略中,既然深度学习AI智能算法选股,也有人工检查特征,可以说是真正的人工+智能的策略。