【量化小讲堂-Python量化入门16】完整策略框架:以均线策略
本文原由作者于2016年8月3日首发于人大经济论坛,整理如下。
引言:
本系列帖子“量化小讲堂”,通过实际案例教初学者使用python、pandas进行金融数据处理,希望能对大家有帮助。
【所有系列文章汇总】请点击此处
微信:xbx_laoshi,量化交流Q群(快满):438143420,有问题欢迎交流。
文中用到的A股数据可在www.yucezhe.com下载,这里可以下载到所有股票、从上市日起的交易数据、财务数据、分钟数据、分笔数据、逐笔数据等。
完整策略框架:以均线策略为例
策略框架
应很多同学的要求,本篇文章介绍如何从头到尾的编写一个策略框架。一个完整的策略框架主要包含以下三个部分:
产生买卖信号的策略。
根据买卖信号生成资金曲线。
根据资金曲线计算策略评价指标。
其中第一部分是最重要的。本文用最简单的均线策略作为示范,关于均线策略的详细内容可以看之前的文章【量化小讲堂 - python & pandas技巧系列】使用python计算移动平均线。第二、第三部分是通用部分,在大家熟悉框架之后,可以将第一部分修改为自己的策略,其他部分直接复用。
第一部分:产生买卖信号的策略,以均线策略为例
说到均线大家应该都不陌生,均线应该是股市技术分析中最简单的一个指标了,就是股价在一段时间的平均值,一般是指移动平均线。例如,5日均线就是最近5个交易日股票的收盘价之和除以5。均线最早是由著名的美国投资专家Joseph E.Granville于20世纪中期提出来的,由于其简单容易理解的特点,成为当今应用最普遍的技术指标之一。基于均线本身的趋势性和稳定性,出现了很多利用均线的不同形态来产生买卖信号的策略。
本文采用的均线策略的具体规则为:
当短期均线上穿长期均线时,视为买入信号,以第二天开盘价全仓买入;
当短期均线下穿长期均线时,视为卖出信号,以第二天开盘价全仓卖出。
可见下图示例:
第二部分:根据信号生成资金曲线
在产生买卖信号后,可以据此生成每天的仓位。实际操作中可以不用每次都全仓买卖,本文为了方便,每次买卖都是全仓买入或者卖出。所以仓位只有0和1两种状态,1表示满仓,0表示空仓。由于本文以个股为例,所以出现买卖信号后的第二天开盘可能会出现涨停或跌停的情况,当出现涨跌停时当天不进行买卖操作,仓位和前一天的仓位保持一致。有了每天的仓位之后,就可以计算出每日涨跌幅、资金曲线。
第三部分:根据资金曲线计算策略评价指标
根据资金曲线可以计算相应的统计指标来判断这个策略的好坏。关于指标的相关内容可以参考之前的一篇文章【量化小讲堂 - Python、Pandas系列】如何判断一个策略的好坏?。
实战
一、选择标的股票并计算复权后的价格
假设我们选择万科A(sz000002)作为考虑的目标股票(程序中可以通过修改股票代码任选一只个股),为了数据的真实可靠,本文重新计算了复权后的开盘价和收盘价,后面计算均线和涨跌幅都以复权后的数据为基础。
二、判断所选股票的上市天数
接着,为了回测结果的可靠性,本文在执行均线策略之前会先判断该股票上市至今的交易天数,默认的交易天数下限是500天(可以自行设置),即如果该股票交易天数小于500,则不运行策略。
三、产生买卖信号
所选股票确定之后就是计算短期和长期均线了,本文默认采用的是5日移动平均线和60日移动平均线(在程序中是参数,也可以自行设置),当5日均线大于60日均线时,给出买入信号;当5日均线小于60日均线时,给出卖出信号,两者相等时维持之前的信号判断。
四、根据信号产生资金曲线
根据上一步产生的买卖信号,可以得到每天的仓位。有了每天的仓位之后,就是计算资金曲线的日涨跌幅了。在这一步,本文为了尽量接近真实的投资情况,考虑了手续费和成交的滑点。默认的手续费为双边千分之2,默认的滑点为双边千分之1(在程序中为参数,可自行设置)。具体的计算过程参见程序代码的注释。
在得到资金曲线每天的涨跌幅之后,可以计算出资金曲线。本文在计算回测资金曲线的时候,从它上市250个交易日(在程序中为参数,可自行设置)之后才开始计算,并且最早不早于2006年1月1号(在程序中为参数,也可自行设置)。
五、根据资金曲线计算统计指标
在得到资金曲线之后,本文计算了最近250个交易日(在程序中为参数,可自行设置)的股票和策略的累计收益率以及每年(月,周)的股票和策略收益,并计算了股票和策略相应的年(月,周)的胜率进行比较。
为了直观的看出采用均线策略后实际的交易情况,本文还记录了每次交易(一买一卖视为一次交易)的盈亏情况以及股票同期的涨跌幅,并计算了与交易相关的一些指标,包括交易次数、最长持有天数、每次平均涨幅、单次最大盈利和亏损、年均买卖次数、最大连续盈利次数和最大连续亏损次数。
最后,本文计算了该均线策略在回测期间的年化收益和最大回撤,并和股票的年化收益及最大回撤做了一下对比。
程序
要运行均线策略,需要某只股票的历史交易数据,在www.yucezhe.com可以下载到所有股票历史至今的数据。如下图所示,每一行是每一天的数据:
数据有以下的字段:
【code】股票的代码,上证股票以sh开头,深证股票以sz开头
【date】交易日期
【open】开盘价
【high】最高价
【low】最低价
【close】收盘价
【change】涨跌幅,复权之后的真实涨跌幅,保证准确
【volume】成交量
【money】成交额
【traded_market_value】流通市值
【market_value】总市值
【turnover】换手率,成交量/流通股本
【adjust_price】后复权价,复权开始时间为股票上市日,精确到小数点后10位
下面是代码的截图,代码里面有详细的注释,有问题可以留言,附件中有程序的源码,回复即可下载。
本文以万科A为例,将数据下载下来,运行代码,可以看到在万科A这只股票上运用均线策略的回测结果。
首先是最近250天股票和策略的累计涨跌幅:
这有助于我们直观的了解策略在最近一段时间的表现情况,从数据来看,均线策略在15年的效果好像不怎么样,还不如直接持有万科的股票,不过本文目的主要是教大家如何从头到尾用python编写一个完整的策略,均线策略只是为了方便作为例子,大家也可以开发其他一些更好的策略。
接着是过去每年、每月、每周股票和策略的收益对比:
从结果可以看出,该均线策略的年胜率和股票一样,为60%,月胜率低于股票的月胜率但周胜率却略高于股票本身。
接下来是每次交易的收益情况和同期的股票涨跌幅,每次交易是盈利还是亏损和同期股票的收益正负密切相关。
然后是账户交易的各项指标的统计。
从结果可以看到,对万科这只股票采用均线交易策略的话,从它上市至今一共交易了98次,最长的持有天数为248天。单次交易的最大盈利为176.16%,赚了一倍多,而单次最大亏损为-19.84%,平均每次交易的收益大概为7.75%。1年内平均交易次数差不多为4次,交易频率比较低,最大连续盈利4次,但最大连续亏损也达到11次之多,这可能对大部分人来说有点无法忍受。
最后是在回测期间(2006年1月1号之后)策略和股票的年化收益及最大回撤。策略的年化收益为37.7%,超过了股票本身的年化收益32.9%,最大回撤为-48.5%,远小于股票的最大回撤-79%,说明该策略总的来说效果还是不错的。大家可以试着选择其他股票或者修改均线策略的参数,再看看运行的效果如何。
以上就是构建一个完整策略的框架的整个过程,大家如果有其他的策略,只需要将第一部分信号产生方式改成自己的策略逻辑就可以进行回测了。
扫描下图二维码,加邢不行私人微信,获取文中附件、代码、数据的下载链接。
扫描上方二维码加邢不行微信,或直接添加微信号:xbx_laoshi关于《量化小讲堂》之后想看的内容,或者相关问题,可以加我微信xbx_laoshi、Q群(快满):438143420沟通。