从零开发股票量化交易策略(1)
来源:雪球App,作者: 量化投资小白,(https://xueqiu.com/9651220337/247340164)
1.我是怎么样接触到量化交易的。
2010年 上证指数 跟今天一样徘徊在3000点上下,我在同事的鼓动下进入到股市。
到今天为止已然过去十多年了,我在这期间交易过期货、期权和外汇。
2015年A股牛熊转换,我经历了千股跌停、千股涨停和股市熔断。
A股一直以来有牛短熊长的特色,绝大部分时间在区间内震荡或者盘整。
与绝大多数散户一样,我以前买卖股票基本上都是靠消息看感觉,自然是有亏有赚,根本逃脱不了7赔2平1赚的宿命。
靠消息的结果就是消息不可靠,很多消息都是庄家故意散播出来的,当散户看到所谓的利好消息,说不定就是配合主力出货的帮凶。
靠消息和看感觉选股,随意性很大,盈利和亏损的几率,长期算下来能够盈亏相抵就不错了。
靠基本面选股,不仅考验投资者对未来的判断能力,更需要长期坚持的耐力。如果选错股票的话,结果将会是血本无归,不仅仅浪费了巨大的时间成本,还会带来巨额的损失。
靠基本面选股的前提,就是判断能力这一条,就已经将很多人拒之门外。
靠技术面选股,需要投资者具备很高的水平。你想,每天复盘几千支股票,本身就是一件非常枯燥的事情,还要从中挑选出上涨的股票,更是费时费力,难上加难。即使再单纯的技术流,都要综合考虑一些基本面因素。
A股的历史一直在不断重演,历史总是在不断重复,金融市场尤其如此,从最早的郁金香泡沫到世纪初的互联网泡沫,再到这些年身边的 房地产 泡沫,金融衍生品的种种乱象,A股市场各种妖股概念层出不穷的,更是催生出了无数泡沫。
黑格尔有一句名言,人类从历史中吸取的唯一教训,就是人类不会吸取任何教训。A股每次行情从启动到结束,在很大程度上都有相似之处。
这是因为,在A股历史上很多股票的走势的确存在相似,或者称之为规律。只是这种规律,很难提炼出一个通用的选股模板,放之四海而皆准。每个人都从交易经验中不断试错,最后总结出属于自己的买卖方法,逐渐进化成为个人交易系统。
股票的本质就是数据,每天的开盘价、收盘价、最高价、最低价、成交量,这些都是数字,将这些数字组合起来就是行情走势。技术派选股的方法是通过看图来预测股票的未来走势,结合基本面或者交易经验,选择买入和卖出的时机。复盘股票非常耗费时间和精力,而且根本没法实现同时跟踪多支股票的走势。
我在这个时候老是想,有没有一种方法可以利用人的经验、计算机的效率,一起工作,给普通人提供辅助呢?
我大学时候的专业是计算机通信工程,毕业后也一直在信息化领域工作,算是有一定的技术基础,更重要的是,我比较爱琢磨和接触新的事物。
作为一名在市场顽强地生存多年的资深韭菜,用大量时间和金钱作为学费收获了经验教训。在这些年里,我一直尝试将这些方法与技术结合起来,使用计算机程序来分析股票辅助选股。
我这么做的目的有两个,一个是为了提高选股效率,第二个是轻松一点捕捉交易机会。
将技术和股票交易结合起来,完全是出于个人的兴趣,算是误打误撞进入了量化交易的领域,这一路摸索下来算是小有所成。
量化交易是什么?
说起量化交易,近年来有关它的消息算是火爆全网,特别是最近几年新发行的很多基金,会打着量化的招牌吸引投资者。
得益于他们的卖力宣传,还有新闻媒体不断的报道,量化交易给人一种神秘莫测高高在上的感觉,仿佛只要量化就肯定赚钱。
事实胜于雄辩。在量化交易领域,确实有大神级别人物存在,其中最有名的就是美国文艺复兴公司里被誉为量化投资之父的西蒙斯,一个号称用算法打败华尔街的人。
他所管理的大奖章基金,利用量化模型的威力,年化收益率排在首位,与巴菲特齐名。
关于量化交易的种种宣传和事实,让长年靠感觉,看研报来炒股的投资者们,不禁恍然大悟,原来投资炒股还可以用这么搞。所有的量化交易只是复杂程度不同,其实它们的原理和过程是非常类似的。
那么到底什么是量化交易呢?
量化交易就是从股票的数据中寻找规律,建立交易模型,替代人为的主观判断,用数学模型和计算机分析来实现的自动化交易。
量化交易的核心是交易模型,模型简单来说就是买卖规则,符合什么样的条件买入,符合什么的条件卖出,强调的是纪律性。
利用计算机技术执行设定的交易模型,从海量的股票数据中捕捉交易机会,当胜率较高就会触发自动交易信号。
量化交易虽然看上去很神秘,复杂程度也是千差万别,但是它们的基本原理是相通的,可以开始于股票的基本数据和选股指标。
依靠着这套量化策略,我现在每天的交易就变的简单起来。通过钉钉接收到交易信号,包括股票代码买入和卖出的价格建议,我根据当前盘面简单看一下股票的走势,决定买入还是卖出操作。
这不仅节省大量的时间和精力,而且交易的总体胜率比以往提高了很多。
每日收盘后利用量化策略复盘4000多支股票,找到符合条件的股票池,这样的股票池只有几十只股票,然后翻一遍是否有特别好的重点关注。
从我的实盘操作中越发感觉到,大道至简的魅力。其实,我们普通投资者不一定非要精通数学、统计学才可以做量化交易,当然如果有这方面的基础肯定会锦上添花。
对于普通人,我们也完全可以将投资经验固化为交易模型,然后利用计算机帮助承担那些重复性的、大量的数据分析和计算工作,以此提高效率和胜率。
本着这样的想法,我将交易经验中提炼出了一套量化策略,我将其命名为:一套基于30分钟级别和深度学习预测未来股价的完整的量化策略。这个量化策略完整地包括了模型、因子、程序和运行监控四个部分。
模型是基于从交易经验提炼出来的方法论,或者说是规则。
因子就是筛选条件,用来确定哪些股票当下符合了买卖条件,我们通常都是将多个因子组合起来使用,就是大家常常听说过的多因子模型。
程序是指使用Python编程将交易模型全部代码化,形成可以运行的计算机程序。
运行监控是指将量化策略运行之后,一方面要保证正常运行,另一方面是定期分析量化策略的盈亏情况,来决定是否调整和优化模型的相关参数。
接下来,我会完整地讲解“一个基于股票30分钟级别指标的量化模型”,在开发环境里进行代码编写和调试,最终形成一个可以用来实战的股票量化交易策略。
我会从什么是量化交易、量化策略的思路、规则设定、条件因子定义、程序代码的编写以及量化策略的运行优化等多个方面,分步骤地详细讲解这个量化策略的诞生过程。
这里面所有的内容都来源于实战,内容聚焦实用,贴近日常交易习惯,并且使用的也是当下流行的Python作为编程语言。
有了这个股票量化策略,你完全可以基于它进行交易操作。量化程序会按照模型设定的规则实盘运行,及时推送买入信号和卖出信号两类信号,其中买入信号会包括买入时间点、股票代码和建议的买入价格。
卖出信号分为止盈和止损两种,全部会以消息的形式推送卖出的时间、股票代码和建议的卖出价格。
同时,为了记录策略的运行历史,方便分析评估策略的盈亏情况,我们会将交易数据用网页的形式展示出来,提供给开发者甚至是开放给项目团队来监控、分析和优化这个量化策略,让量化策略的成长空间可以从个人走向团队,甚至是专业投资者的范围。
在这个股票量化策略的开发过程中,我们会用到一些开发工具,首先是Python的开发环境,我们使用最通用的开发平台:Anaconda和Pychram。
其次,是开源的Mysql数据库,包括数据库表的设计,通过Python来操作数据库进行增删改查。
还有,会用到一个量化交易包工具——Stockquant,里面包含了获取股票数据推送钉钉等常用功能。
为了监控和展示策略,需要将数据进行Web界面的展示,我们会开发一个具有简单登录和展示功能的小网站,使用的是轻量级的Web开发框架——web.py来实现。
最后,我们还需要了解神经网络原理,学会利用机器学习来预测股价的方法,使用的是谷歌公司的神经网络产品——Tensorflow2.1版本,Tensorflow是当前国内流行的人工智能机器学习框架。
除此以外,我们还会用到其他配套的一些小程序,这些我们会在后面做相应的讲解。
如果你是一名大学生,那么你可以学习到Python如何在实际案例中的应用,特别是Python在数据处理方面的独到之处。
如果你是一名股市投资者,那么你可以克隆出一个轻量级的量化策略,加入自己的思想,成为你投资路上的强大助手。
如果你想了解量化交易,那么你能从中学习到量化多因子策略的诞生实现过程,帮助你打开一扇职场新大门。
兴趣是最大的老师,且将Python技术应用到股票量化交易中,希望大家都能完整地感受量化交易实战,不虚此行。
下面,我们来准备量化策略的开发环境。
2.1安装Anaconda和配置Python3.7环境
我们使用Windows操作系统, 苹果 的MacOS系统在安装配置方面会有一些不同。
Anaconda是什么?Anaconda是非常好用的Python开发环境,它预装了很多开发组件,让开发者不用操心依赖问题,而且里面自带的conda工具可以很方便的安装各种组件。
下载地址使用官网,不过推荐从国内清华大学资源站下载,版本可以实用最新版本,推荐2020年python3.7版本即可,下载后双击安装包进入安装流程,一路点击下一步即可完成,注意如果想要更改安装位置的话可以自定义选择。
Anaconda安装完成之后会在硬盘上生成软件目录,下一步就是创建python解释器虚拟环境,conda是可以创建多个虚拟环境的。创建虚拟环境有三种方法,分别是anaconda的GUI软件界面,conda命令行和安装pycharm后使用pycharm来创建。我们这里使用conda命令创建虚拟的 env python运行环境。
从安装的程序中找到Anaconda Prompt,并且进入执行命令窗口,类似cmd,运行以下命令:
conda create -n environment_name python=X.X
XX是指定环境的名称以及python具体版本号。
conda info -e
查看当前已经有的虚拟环境有哪些,默认的前面会带有*号。
在Windows: activate your_env_name(虚拟环境名称)激活虚拟环境。
activate your_env_name
如果是linux的话,命令是:
source activate py36
conda remove --name your_env_name --all 删除一个已有的虚拟环境,命令行的截图如下。
在这里我们还可以通过修改源的方式来指定使用国内的清华大学源,这么做能让以后安装开发包的时候速度快很多。
conda env list 查看当前环境
source activate python37 激活环境
conda deactivate(同时也切换到另一环境)
配置pip的源为国内,提高速度,全局生效,这样不用每次pip安装的都是都要-i指定安装源了。
pip config set global.index-url
网页链接
pip config list # 查看源配置信息
2.2 安装Python开发工具-Pycharm
配置好anaconda之后,下面我们需要安装python的编程工具pycharm。
下载地址: PyCharm: the Python IDE for Professional Developers by JetBrains
我们个人使用的话选择免费社区版本就够用了。下载完成后和Anaconda一样双击安装,选择安装路径,一路下一步就可以完成安装了。
安装完成后,首次打开软件创建项目,我们要注意指定编译器,就是我们再anaconda中配置的解释器,指定以后就可以运行python程序了。
下面我们要掌握通过pip来安装组件的方法。
pip命令的格式如下:
安装:pip install pandas
卸载:pin unistall pandas
安装的时候如果需要的话,可以指定包的具体版本,比如pip install numpy==1.19.2就是安装numpy 的1.19.2版本。
除此之外,还可以用-i参数来指定安装源,pip和conda默认都是使用国外的源,速度慢下载耗时较长,还存在很多无法访问的障碍。
为了改善这种情况,我们就要用到-i参数指定国内的源,比如清华、阿里提供的源。使用-i参数指定源的地址即可,可以采用国内任何一个可用的源。
如果按照上文配置过源了,这里就可以不带参数,直接使用了。
pip install numpy==1.19.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
特殊情况,我们还可以使用pip命令安装本地whl库文件
我们需要事先将待安装的库文件下载到本地,比如将whl文件放到项目目录下,打开cmd,使用cd命令进入到项目的目录下,安装命令如下,示例:
pip install xx_Lib-0.1.18-cp37-cp37m-win_amd64.whl
关于pycharm和anaconda,我之前做过详细的安装教程,并且已经在作品的引用链接中添加了原文链接,大家如果在安装和配置的过程中遇到问题的话,可以找到教程来参考。
2.3 安装配置Mysql绿色版本的数据库
开发量化策略一定会用到自建数据库,对于量化机构来说是必然的选择,使用Mysql数据库有很多好处,最重要的是可以显著提高量化策略运行效率,
mysql是开源的轻量级的数据库。
可以将股票数据下载到本地存储。
可以提高查询数据的速度,让程序的运行效率更高。
量化交易因子必须存在数据库中,才能方便进行更新和实用。
存储一份完整的股票数据,是一笔宝贵的数据资产,可以基于它开发诸多应用。
因此,我们一定要学会安装Mysql数据库,并且掌握python操作数据库进行增删改查的基本操作。幸运的是,在windows系统下安装mysql并不复杂,而且python操作数据库操作也很简单。
数据库下载地址和版本选择。
安装过程非常的简单,只要将其解压到电脑的目录就可以了,记得一定要去配置一个系统变量,在计算机-高级-性能-变量中设置,其中的参数就是我们mysql本机的目录。
配置数据需要创建my.inf配置文件,设置用户名密码。在根目录下创建my.ini,此文件是初始化信息(默认mysql根目录不存此文件)。
下面,我们来执行安装命令将Mysql安装为服务并且设置为开机自启动,使用CMD命令来开启和停止Mysql服务。
到这里,mysql的服务就算安装完成了 。
windows下可以使用navicat软件访问和管理mysql数据库,关键信息就是IP地址、端口和账号,下面是软件访问数据库成功后的截图。
Python连接操作Mysql数据库的方法
第一步,安装pycharm的必要组件pymysql,使用pip一条命令就能完成安装。
pip install pymysql
第二步,连接和操作mysql数据库,连接数据库之前要导入pymysql包,定义数据库连接的必要信息,比如IP地址,账号以及数据库名称。
既然是数据库,那么就一定要提一下事务处理。数据库支持事务处理有一个前提条件,将Mysql数据库引擎设置为 innodb模式,而且具体表也必须是innodb模式。 只有数据库和表都支持事务的情况下才可以。
# 查看和修改mysql的信息
show engines;
# 其中Default的就是默认的引擎
# 修改表的引擎语句为innodb模式
ALTER TABLE 表名称 ENGINE = InnoDB;
2.4 安装Stockquant量化开发包
Stockquant是什么?它获取股票数据是开发股票量化策略的基础插件包.
Stockquant里面集成了获取股票数据的一些接口,包括历史数据、实时数据的接口,同时作者还提供了一个钉钉和邮件推送的接口,只需要修改以下参数就能使用。
Stockquant的安装方法,最简单的安装方法是在Pycharm的控制台里使用pip命令安装,只需要一条命令即可安装完成。
安装Ta-lib包,TA-lib是金融数据处理中非常重要的一个包,用来计算MACD,KDJ等指标,是一个必须安装的工具包,而且这个包只能选择离线方式安装,将下载好的文件放到项目根目录下,打开控制台,运行命令进行安装。
Stockqaunt测试获取股票数据。
我们来获取 贵州茅台 的历史数据,从2020年1月1日截止到今天的数据。数据的格式是pandas,写一段程序来测试一下:
运行后可以很快和正确的将股票的历史数据查询到,在控制台中打印出来,这说明我们的stockquant包安装没有问题。
2.5 安装Web开发框架
python中有几个有名的框架 ,有django这样功能强大的框架,也有flask、web.py这样轻量级的快速上手框架。其中,web.py是一个小巧灵活的框架,简单且功能强大,源代码很简短。
webpy的作者是Aaron H.Swartz,一位伟大的程序员,他在2013年1月11日自杀身亡,结束了短暂的26年生命。但是,作为一个开源项目,目前还是有很多开发者在持续更新。
关于Web.py的了解可以查看官方网站 https://webpy.org/ .官网真的是特别简单,像极了这个程序,主要内容就是功能介绍和例子cookbook。
进入pycharm控制台,输入pip命令来执行安装。
成功后如下面所示:
安装之后,就可以使用官网提供的示例验证是否成功。
理解web.py的工作过程:
第一步,用户输入网址,先由urls进行路由分配,就是用户输入的网址跳转到某个类方法来处理。网址/后面的字符串必须对应某个事先定义的某个类的方法,也会有个默认方法,就是上面都不带的时候由默认方法处理。比如/add, 主程序中必然有个类与之对应,类的名称就是urls可以定义的。
第二步,由这个类的方法负责进行具体逻辑的处理,处理的结果使用Render来retrun到某个web页面,或者seeother跳转到其它url,然后又是重复上面的过程。
第三步,跳转到具体页面时,可以带上参数,参数可以理解为需要展示的数据集或者某个处理的反馈结果。
第四步,html文件接收到参数(使用$def with(参数名))引用,由html页面和css负责排版来展示。
只有深刻理解了这个过程才能用好Web.py,当然后面我们编写展示用的html网页的时候会讲解。如果你想更系统的学习web.py的使用技巧,可以查看作品中提供的外链地址,里面通过一个例子详细展示了web.py框架的使用技巧。
2.6 如何用接口获取股票交易数据
股票数据分为历史数据和实盘数据。A股票有4000多支股票,数量庞大,每支股票又包含月线、周线、日线、60分钟、30分钟、15分钟、5分钟、1分钟多个级别的数据。
量化交易需要处理大量数据,如何快速地获取数据是非常重要的。你想,这么庞大的数据量,如果没有一个好的存储和处理方法的话,就无从谈起量化交易。
在现有的方法中,使用接口获得数据和使用本地数据库存储数据,是速度最快两种方法。所以,在前面的课程中,我们特别提到使用Mysql数据库来存放数据。
怎么样用接口获取数据:
上文中,我们演示了如何使用量化工具包stockquant来获取数据,其实我们也可以直接安装证券宝baostock工具包。具体的实用方法可以参考 baostock.com 官网的介绍。
现在我们使用接口来获取 贵州茅台 ,2022年1月1日,截止到2022年5月10日的数据。注意日线数据,周线数据和月线数据,除了要修改fre参数之外,数据字段也是不一样的。这一点要注意官方网站上的说明。
我们写一段程序执行,来获取数据,展示如下:
从上图中,我们可以看到成功获得了数据,注意一点的是:通过接口拿回来的数据都是pandas格式。
关于python如何操作pandas数据大家可以在各种平台上找到学习资料,我在这不详细介绍了。大家可以自行学习也可以在后面用到的时候再研究。
2.7 如何通过钉钉推送交易信息
交易机会有很强的时效性,必须第一时间通知到交易者。推送消息可以选择钉钉、微信、邮件、短信等多种方式。
推送到微信的话,目前微信不支持直接推送到微信联系人或者微信群,只能借助第三方公众号。
相比之下,钉钉则是可以直接推送到钉钉群里,这样团队成员就可以看到消息。邮件的及时性不高,用户需要配置邮件客户端来查看信息,相对来说比较麻烦。
短信方式需要购买套餐,因为防范垃圾短信的规定,平台大都是不支持发送长文本短信。
所以综合考虑之后,我们的选择的策略是推送交易信息推送到钉钉群里。下面我们演示操作过程。
第一步,在钉钉中新建一个群,可以选择群类别,给群起一个名字。添加webhook机器人,设置关键字,然后拷贝keyid。
第二步,修改config.json文件,将对应位置的代码替换为刚刚拷贝的代码。
第三步,代码实现,创建config.json文件,修改配置的代码字段。新建一个变量,赋值为需要发送的文本。实用Dingtalk函数发送,如果前面在钉钉群中设置了关键字,那么这里需要注意传递的参数文本,一定要以关键字开头,否则程序不会报错,很难查到问题所在。
第四步,运行代码后就可以在钉钉群消息中收到消息,具体的样式可以看下面图片。消息的内容可以自定义,将关键信息使用参数传递进去。
截止到目前,我们已经将股票量化策略的开发环境全部安装配置到位了。
接下来,我们将真正开始——基于30分钟级别选股和机器学习AI预测股价的量化策略的开发过程。