1. 引言
量化投资是指利用数学模型方法和计算机技术进行投资决策,通过大数据分析、数学统计模型和计算机算法等手段,系统性地筛选股票,执行交易策略[1]。量化投资的一大优势在于,其利用数学模型和计算机算法,处理海量数据,能够自动、客观、及时地进行投资决策和交易,规避了人作为交易者会被情绪波动、人性弱点、反应时间等因素影响的情况。量化投资有五个关键步骤——寻找数据、数据处理与分析、制定选股策略、搭建编程模型、进行交易[2],交易同时包括选择交易股票、确定交易时点和交易量这三个关键点。
本文利用聚宽量化平台(JoinQuant)所提供的量化环境,以上海证券交易所和深圳证券交易所(以下简称沪深)的历史股票数据为依据,利用Python编程语言搭建具有多样化指标的选股模型,在沪深市场上进行回测交易,验证所构建的选股策略是否有效。
2. 文献综述
投资分析主要有基本面分析与技术分析两类,前者主要基于企业的经营状况,如对资产负债表的分析、财务状况的分析、国家政策的导向性等,仍然依靠于决策者的主观判断;后者通过研究股票的价格图表和各种技术指标来预测价格趋势和交易信号,如K线图的分析、移动平均线的分析、MACD的分析等,能够较为客观的帮助投资者进行投资决策。
量化投资作为现代金融发展的一种重要投资决策方法,受益于计算机技术的深度运用,能够通过复杂的数据分析程序与算法,基于股票的各类技术指标,进行更为复杂与深层次的技术分析,从而能够在瞬息万变的市场中抓住投资机会,实现超额收益。
国外的量化投资策略研究起源早,成果丰厚。早在20世纪初期,法国学者Bachelier就提出随机游走假说用来描述股票价格的变化与布朗运动存在某种程度的关联[3],他由此提出了股票价格随时间变化的模型,被认为是量化投资的起点。1952年,Markowitz提出了著名的均值–方差组合模型,将数学、统计学的方法运用到投资组合的管理当中,对量化投资的发展具有深远影响[4]。William Sharpe、Jan Mossin等人随后基于Markowitz的模型提出了CAPM资本资产定价模型,用以分析资产的收益率与风险系数β以及系统性风险之间的关系[5]。1964年Fama又提出了有效市场假说,定义了不同的市场类型,帮助投资者理解市场价格的形成和波动[6]。1976年,Ross基于CAPM模型提出套利定价理论,指明了无风险套利与市场不均衡的情况[7]。这些量化投资理论都具有深远影响,为现代量化投资的发展奠定了坚实的基础。进入21世纪,Piotroski以企业财务报表为切入点,构建出多因子选股模型[8];Wesley提出基于动量的选股策略;Marcos则将机器学习的方法运用在选股预测上[9]。
国内的量化投资策略起步较晚,多集中在具体运用上。2017年李斌等设计了结合机器学习和量化指标的ML-TEA量化投资算法[10];2018年黄卿以支持向量机、神经网络模型对沪深300指数进行了预测[11];2019年邵新月等将机器学习引入基本面分析中,实现了较为稳定的月度收益[12];2020年鲁万波基于时变矩成分分析构建股票预测与量化投资策略[13]。2021以后,大量的结合机器学习的量化投资策略兴起,呈现出迅猛且持续的发展态势。
尽管机器学习的方法在量化投资中被广泛运用,但机器学习的可解释性仍比较弱,对于为何选择某只股票难以给出合理解释。本文则将视角聚焦在股票的基本面上,基于均线与K线两个指标,构建量化投资策略。
3. 选股策略
3.1. 指标选取
当前我国的股票市场受到政治环境、地缘经济、国际形势,生产环境等多方面多维度因素的影响,错综复杂的影响因素也让股票市场的波动难以通过单一指标或是简单的基本面分析进行预测。数个指标的结合和基本面的量化分析成为研究的热点,同时在股票市场的预测结果上具有较高的准确度和可信度。因此本文采用多指标技术量化的方法,将均线回归策略和K线形态捕捉策略结合,进行股票的选择与量化投资。
3.1.1. 均线指标
均线即移动平均线,Moving average简称MA,是指用统计分析的方法,将一定时期的证券价格加以平均,并把不同时间的平均值连接起来,形成一根MA,用以观察证券价格变动趋势的一种技术指标。常见的移动平均线有5天、10天、30天、60天、120天和240天的指标,其中5天与10天的短期移动平均线是短线操作的参照指标,称作日均线指标;30天和60天的是中期均线指标,称作季均线指标;120天、240天的是长期均线指标,称作年均线指标。
移动平均线是最为常用的选股参考指标,其只需要利用股票的历史数据进行平均计算,具有简单易算,可视化强,易于理解的特点,受到众多投资者的青睐。移动平均线将证券价格进行移动平均以后,可以很大程度的避免短期人为操纵对证券价格的影响,从而过滤掉市场噪音,捕捉证券价格深层次的走势[14]。因此,投资者可以通过比较股票移动平均线与股票自身价格大小,来判断股票价格的涨跌趋势,进一步确定买入与卖出的时点。
量化投资的一大特点就是通过对股票市场大量的数据分析,捕捉每一个信息点,进行高频交易。结合量化投资的这一特点,综合移动平均线的上述优势,本文计划将5天的短期移动平均线纳入量化投资策略,并采用均线回归的策略。
均线回归策略,具体来说,当股票价格低于5日均线的0.95倍时,从均线的平均性角度来看,当前股价已呈现下降的趋势,如果市场上并没有重大的利空信号,则说明当前股价的下降只是短暂性,未来的股价会上升回归平均水平。因此,股票价格低于5日均线的0.95倍,是一个买入信号。相反,当股票价格高于5日的1.05倍时,如果市场上不存在重大利好信号,说明未来股价会下降到平均水平,这是一个卖出的信号。
3.1.2. K线指标
K线技术分析法也是股票价格预测的一个常用方法。K线是一种通过图形化来表示股票价格走势的可视化方法,能够直观查看和研究股票价格的变化情况[15]。以日K线为例,一根日K线记录的是某只股票在一天内的价格变动情况,它记录了该股票当日的开盘价、收盘价、最高价和最低价的信息,同时也直观的反应了任意两个价格之间的差值。如果将每日的K线按时间顺序排列在一起,就组成了反映股票价格历史变化情况的数列,称为K线序列(K-line Series)。从K线序列的定义可以看出,每个K线包括了反映股票价格的四个统计指标,因此K线序列的实质是股票价格四元时间序列。
尽管“基于K线图形态确定买入卖出的策略是否可以获利”一直存在争议,但不可否认的是K线技术分析法是金融投资领域最典型也是最流行的分析方法。从时间序列角度来看,有研究认为时间序列具有两个重要特征,一是“历史信息会影响未来走势”即时间序列的过去值会影响将来值。二是“历史会经常重现”,一些特殊的时间序列在整个时间序列中会反复出现。这两个特征使时间序列相似性预测成为可能,由于K线序列实质上也是一种时间序列,这说明K线序列预测同样具有可能,可以通过捕获典型的K线形态,预测K线的未来走势,从而判断股票价格的涨跌。
现有的K线序列预测技术主要通过人工识别的方法进行,人们通过对股票K线图进行长期的观察与预测,总结出一些K线模式,如黎明之星、孕线、三只乌鸦、乌云盖顶等,并通过在股票市场中捕获这些K线形态进行股价预测。人工识别的方法具有简单易操作的特点,因而在股价预测中被大量采用。但由于人工识别的方法需要投资者自行去查找判断K线形态,往往需要大量的工作量,且仅能抓取小样本数据进行人工分析,往往会错失大量的投资机会。计算机技术的飞速发展,量化投资在股票市场的运用,一种新型K线形态捕捉策略应运而生——利用计算机对K线形态的自动化搜索。本文采用这种方法,在量化程序中事先对各种K线形态进行编程定义,并利用整个A股市场股票的大数据样本,自动搜索与捕捉符合条件的K线形态。
3.2. 策略制定
均线指标与K线指标都是非常经典且实用的股价预测指标,本文利用量化编程将二者结合起来,同时利用均线回归策略和K线形态捕捉策略,提高股价预测的准确性,确定买入与卖出的时机,具体策略如下:当探测到某支股票的股价低于5日均价的0.95倍,且捕获到所设定的K线呈上涨形态时就买入;当所持有的股票价格高于5日均价的1.05倍或者捕获到所设定的K线呈下跌形态时就卖出。
4. 编程模型构建
本文将设计的量化程序分为初始设定函数、开盘前运行函数、开盘时运行函数、收盘后运行函数四个部分。
4.1. 初始设定函数与收盘后运行函数
初始设定函数,主要包括设定成交量比例,参数设置为1,表示在交易中使用所有可用的交易量,即每个订单的交易量等于可用的总交易量。设定股票的交易手续费,买入股票的手续费率为万分之三,卖出股票的手续费为万分之三加上千分之一的印花税,每笔交易最低手续费为5元。设定持仓数量,最多同时持有5支股票。设定沪深300指数作为基准。开启动态复权模式,使用真实价格进行交易。收盘后运行函数主要用于记录当天所有的交易记录,记录每日的账户总资产。同时定义了一个过滤器函数,用来过滤停牌、ST、科创与新股类型的股票,尽可能排除特殊类型股票对策略产生的影响。
4.2. 开盘前运行函数
开盘前运行函数主要用来捕获满足上涨与下跌设定的K线形态。首先获取市场的可交易日,返回交易日列表,赋值给变量trd_days。调用函数get_all_securities获取可交易的,限制为交易日,并将返回结果的索引转化为列表,赋值给变量security_list。同时调用函数filter_special过滤出特殊的股票,赋值给变量stock_pool。下面使用一个for循环,遍历股票池中的每一只股票,并将遍历到的股票赋值给变量security。初始化各个变量,在后续的循环中将会被调用。调用函数获取股票的开盘价和收盘价,返回DataFrame格式的数据。从收盘数据DataFrame中提取收盘价列,赋值给变量Close,类似的,提取前一天、前两天、前三天的收盘价,并赋值给相应的变量。从开盘数据DataFrame中提取开盘价列,赋值给变量Open,类似的,提取前一天、前两天、前三天的开盘价,并赋值给相应的变量。最后,计算每天的收盘价与开盘价的差值,赋值给变量ClOp,类似的计算前一天、前两天、前三天的收盘价与开盘价的差值,并赋值给相应的变量。
下面是运用if函数去捕捉K线形态中的下跌与上涨形态。
4.2.1. “乌云盖顶”
使用Close [5]和Open [5]代表当前交易日和前一天的收盘价和开盘价,lag1Close [5]和lag1Open [5]代表前一天的收盘价和开盘价,通过当天收盘价小于当天开盘价,前一天收盘价大于前一天的开盘价,当天开盘价大于前一天的收盘价,当天的收盘价小于前一天收盘价与开盘价和的0.5倍,当天的收盘价大于前一天的开盘价的条件,判断是否满足“乌云盖顶”的条件,如果满足,变量Cloud被设置为1。同时检查最近三天的收盘价是否呈上升趋势,如果是,Trend_1被设置为1。将Cloud与Trend_1和的计算结果存储在字典g.Dark_Cloud中。
4.2.2. “黄昏之星 + 顶部岛形”
如果满足前两天的收盘价与开盘价之差大于等于8,前一天收盘价与开盘价之差的绝对值小于等于2,当天的收盘价与开盘价之差小于0,当天的收盘价与开盘价之差的绝对值大于等于前两天的收盘价与开盘价之差的0.3倍的绝对值,Shape_Dawn被设置为1,即捕捉到了黄昏之星。如果满足前一个交易日的开盘价大于当前交易日的开盘价,前一个交易日的开盘价大于前两个交易日的收盘价,前一个交易日的收盘价大于当前交易日的开盘价,前一个交易日的收盘价大于前两个交易日的收盘价,则将DOJI_Dawn设置为1。最后使用if函数检查最近三个交易日的收盘价,判断它们是否按降序排列,如果满足则将Trend_2设置为1,表示存在一个下降趋势。将上述结果存储在StarSig_Dawn的字典中。
4.2.3. 其他形态
同理,通过if函数判断股价是否满足其他K线形态的要求,如果满足,则设置对应的变量为1,并存储在对应的字典当中。K线形态捕捉策略中捕捉的下跌形态有“乌云盖顶”、“黄昏之星 + 顶部岛形”、“倾盆大雨”、“看跌吞没”、“三只乌鸦”、“顶部孕线”。捕捉的上涨形态有“红色四兵”、“底部孕线”。
4.3. 开盘时运行函数
开盘时运行函数通过衔接开盘前运行函数,导出满足K线形态的股票,形成待买与待卖的股票池,并引入5日均线作为第二个指标。使用for循环对待卖股票池中的每支股票进行循环,检查该股票是否存在于待卖的股票池中,或者它的当前价格是否大于1.05倍的5日移动平均线。如果满足两个条件之一,则发出清仓的指令,卖出股票。对于待买股票池中的每支股票,如果其当前价格低于其5日移动平均价的95%,并且有足够的现金,则执行买入指令。
5. 回测结果分析
5.1. 回测结果概述
首先对2022年1月1日到2022年12月31日这一整年的A股市场进行回测分析,结果见表1:
Table 1. Income profile
表1. 收益概况
策略 收益 |
策略年化收益 |
超额 收益 |
基准 收益 |
α |
β |
夏普比率 |
胜率 |
盈亏比 |
最大 回撤 |
索提诺比率 |
−6.65% |
−6.86% |
19.12% |
−21.63% |
−0.014 |
0.361 |
−0.538 |
0.478 |
1.085 |
16.75% |
−0.836 |
日均超额收益 |
超额收益最大回撤 |
超额收益夏普比率 |
日胜率 |
盈利次数 |
亏损次数 |
信息比率 |
策略波动率 |
基准波动率 |
最大回撤区间 |
0.08% |
14.63% |
0.687 |
0.488 |
32 |
35 |
0.673 |
0.202 |
0.203 |
2022/08/23 2022/12/30 |
从表1中看出,该策略收益为−6.65%,整体上处于亏损状态。但相较于沪深300指数基准收益为−21.63%,仍具有19.12%的超额收益,说明在整个股票市场处于低迷的情况下,相较于市场整体收益情况,该策略能够实现较高的超额收益。从胜率来看,策略胜率为0.478,共盈利32次,亏损35次,胜率水平较低,仅为47.8%。
5.2. 交易详情
Table 2. Transaction details table (part)
表2. 交易详情表(部分)
日期 |
标的 |
交易类型 |
成交数量 |
平仓盈亏 |
2022/1/26 |
雪人股份 (002639.XSHE) |
卖 |
−1200股 |
−5652 |
2022/4/22 |
空港股份 (600463.XSHG) |
卖 |
−1800股 |
−5058 |
2022/9/2 |
康强电子 (002119.XSHE) |
卖 |
−1300股 |
−4667 |
2022/3/14 |
九安医疗 (002432.XSHE) |
卖 |
−300股 |
3498 |
2022/7/7 |
京泉华 (002885.XSHE) |
卖 |
−700股 |
3906 |
2022/5/12 |
德赛电池 (000049.XSHE) |
卖 |
−600股 |
4278 |
表2展示了部分交易详情,包含了所有交易中亏损最大与盈利最大的三次卖出操作,最大亏损要大于最大盈利。该量化策略在2022年共交易138笔,其中买入71笔,卖出67笔,截止2022年12月31日,仍有4笔持仓未卖出。由于买入不计算盈亏,因此从卖出的盈利与亏损来看,67笔卖出订单中,盈利的有32笔,亏损35笔,盈利率为47.8%。盈利总额为56,680元,亏损总额为52,245元。从已经完成的67笔交易来看,实现净盈利4435元,除以本金100,000元,收益率为4.44%。从这一角度来看,该策略整体收益为负的原因是持仓股票未找到卖出时机,市价下跌所导致,而已完成出仓交易的股票,总的收益为正。
5.3. 个案分析
为分析引发亏损的具体原因,对亏损达到最大的一笔雪人股份,进行个案的分析,见图1。
Figure 1. Snowman shares January K chart
图1. 雪人股份1月份日K图
2022年1月14日以15.92元买入雪人股份1200股,2022年1月26日以11.21元卖出雪人股份1200股,共持仓12天。1月14日的前5日MA为16.758,15.92低于5日MA的0.95倍,10~14日的K线呈现“红色四兵”的形态,因此买入信号成立。1月26日的前5日MA为12.248,26日股价并没有高于5日均价的1.05倍,但21、24、25三日的K线呈现“三只乌鸦”的形态,因此卖出信号形成。
从雪人股份后续的K线来看,其一月份的股价一直呈现下跌趋势,但在下跌前呈现“红色四兵”的上涨信号,这应该是多方最后的“挣扎”。“三只乌鸦”形态出现在下跌的过程中,它并不是意味着下跌的开始,而是下跌的继续。总的来说这笔亏损的主要原因是买入信号存在问题,而卖出信号则阻止了进一步的亏损,并没有问题。
6. 优化与改进
6.1. 调整参数
均线回归策略所取参数为0.95与1.05,缩小股票可选范围,调整参数为低于5日MA的0.9倍买入,高于5日MA的1.1倍卖出。低于5日MA的0.9倍,当前股价偏离均价越大,则股价在未来回归均价的可能性也越大。同理,高于5日MA的1.1倍,股价在未来下跌的可能性也越大。调整这两个参数,缩小了股票的可选范围,也降低了交易的频次。
6.2. 回测结果
调整参数后,同样对2022年1月1日到2022年12月31日这一整年的A股市场进行回测分析,结果见表3。
调整后的收益率为2.04%,该策略实现了正的收益。具有30.21%的超额收益,相较于−21.63%的基准收益,调整参数后的策略具有较好的盈利能力。但从盈亏次数来看,仅仅盈利2次,亏损2次,说明在该条件下,能选择的股票数量很少,交易次数有限。表4给出了该策略在2022年内共进行的8笔交易。
Table 3. Income profile after adjusting parameters
表3. 调整参数后收益概况
策略 收益 |
策略年化收益 |
超额 收益 |
基准 收益 |
α |
β |
夏普 比率 |
胜率 |
盈亏比 |
最大 回撤 |
索提诺比率 |
2.04% |
2.11% |
30.21% |
−21.63% |
−0.012 |
0.025 |
−0.302 |
0.500 |
1.718 |
6.43% |
−0.423 |
日均超额收益 |
超额收益最大回撤 |
超额收益夏普比率 |
日胜率 |
盈利 次数 |
亏损 次数 |
信息 比率 |
策略波动率 |
基准波动率 |
最大回撤区间 |
0.12% |
13.76% |
1.311 |
0.541 |
2 |
2 |
1.173 |
0.063 |
0.203 |
2022/08/23 2022/08/29 |
Table 4. Trading details table after adjusting parameters
表4. 调整参数后交易详情表
日期 |
标的 |
交易类型 |
成交数量 |
平仓盈亏 |
2022/1/25 |
永太科技(002326.XSHE) |
买 |
600股 |
0 |
2022/2/7 |
永太科技(002326.XSHE) |
卖 |
−600股 |
312 |
2022/4/27 |
健民集团(600976.XSHG) |
买 |
500股 |
0 |
2022/5/9 |
健民集团(600976.XSHG) |
卖 |
−500股 |
4870 |
2022/7/7 |
海汽集团(603069.XSHG) |
买 |
600股 |
0 |
2022/7/27 |
海汽集团(603069.XSHG) |
卖 |
−600股 |
−468 |
2022/8/22 |
文一科技(600520.XSHG) |
买 |
1400股 |
0 |
2022/8/29 |
文一科技(600520.XSHG) |
卖 |
−1400股 |
−2548 |
7. 总结
本文构建了一种基于均线回归策略和K线形态捕捉策略相结合的选股模型,通过对2022年1月1日至2022年12月31日中国A股市场的回测验证,发现该模型总收益为−6.65%,但相较于沪深300指数的收益率,具有19.12%的超额收益。该选股模型在总体低迷的市场环境中,实现了相对较高的收益。经过对策略参数进行一定程度的调整,缩小选股范围后,该策略实现了2.04%的收益以及30.21%的超额收益,说明该量化投资策略具有一定的可用价值。