基于历史K线数据比较的量化选股方法及其系统分享

第0章 引言

 


最近量化交易火起来了。

前段时间看了一本书《乌合之众》,讲的是大众心理学。其实股市的本质就是大众心理博弈,通过买卖行为对外表现出股价的涨跌,股价波动反映的是一段时间内股市中的人对市场的看法和行动,所以股市就是历史的不断重复,在特定时间,特定条件下表现出特定的走势。

 

有一个经典理论叫做“预言的自我实现”,是大众心理博弈的典型例子,非常有意思。

 

预言的自我实现由罗伯特·默顿提出,由图式引发的自我实现预言,即使自己的预期成真的预言。

 

“他们访问了一所公立小学,告诉老师他们将用一种名为‘哈佛技能获得变化实验’的方法来准确地预测他们的学生中哪些将会成为‘天才’。当然,其实并不存在这种测试方法,研究者随机挑选了这些‘天才’小学生。这个研究显示,老师的预期充当着自证预言的作用。毕竟,这些学生之间的唯一区别只存在于老师们的头脑中。果不其然,在学年末学生们参加一个智力测试时,被视为是‘天才’的孩子(得到了老师很高的期许)比他们的同学表现出更明显的智力增长。”

 

还有一个例子就是当年奥巴马竞选总统成功对中国股市的影响。

 

“下午1点整,奥马股份未见大动作,澳柯玛突然异动,一笔2004手的买单迅速将其股价从4.85元拉升至4.95元,一分钟后,连续几笔大买单再将股价推高至5.03元,澳柯玛从2分钟前的跌幅近2%瞬间逆袭变成涨幅1.6%。”

 

“2008年,早在美总统大选开始前的10月17~22日,澳柯玛就连续出现三个涨停。就在奥巴马当选的第二个交易日——11月10日,澳柯玛再次涨停,此后11月14日、12月8日,澳柯玛又出现两次涨停。”

 

真是令人啼笑皆非的故事啊!但仔细想来,股票不就是用来炒的吗,不编个故事,怎么炒?一切都风平浪静,怎么炒?

 

再转移到对股票本身的思考上来,股票的对外表现最直接的就是K线了,最早接触的K线理论,想必一些耳熟能详的说法:“缺口必补”、“一阳吞三阴”、“红三兵”等经典K线形态。其实际上不也是一种心理暗示吗?当然,这些理论在股市发展初期的确有一定的预测准确性,但放到现在来说,有些早就过时,或者单靠这些理论生搬硬套,绝对赚不了钱,这也是经典K线理论的局限性所在。

 

“一千个观众就有一千个哈姆雷特”,对于一根根K线来说,每一根K线在每个炒股人的心理都是一种暗示,而符合大部分人(或者符合掌控大部分资金)的人预期或预想的K线走势,就是这支股票的发展规律---这里用规律而不是绝对发展方向,很好理解,方向可能向下,也可能向上,可能有曲折,这些方向走势形成一套套的模式,逐渐形成一种潜在的“预言的自我实现”,通俗地说,就是一旦形成这种K线,V线的组合,那么这支股票的走势就可以被预测,相当一部分人会认为股价会按照这种走势发展下去,当这部分人数量,资金规模达到量级后,走势确立,“预言”就实现了。当然这些模式不是一成不变的,会随着时间、市场、市场主流观点而演化和发展。

 

有人会说,中国是政策市,股价规律难以捉摸。但从我看来,政策的存在并无大碍,政策本身也是一种规律,政策的产生,政策的利用,以及政策的影响,反映在股价上同样是一种模式,在程序化的挖掘模式下,并不会感知到政策的存在,程序化的搜索方式并不关心这些,并且少数特殊模式会被自动过滤而不被挖掘,只有符合大部分人预期的并且频繁出现规律才会浮出水面并被捕捉到。我们的目标就是找出这些规律,并总结归纳成“套路”供人们参考。

 

如何用计算机程序捕捉上面的规律?如何在当前市场前提和背景下,挖掘出一段最为流行的K线形态模型,并试图将其再运用到股价预测中去,就是需要完成的任务,当然这种挖掘需要基于海量数据的比较,这将面临一系列问题,涉及到计算模型,计算方法,以及巨大的计算量等等,这种做法可以算作一种模式简单的量化分析方式。

 

基于这个想法,试图做出一个系统,动态地找出有共性的K线形态模型,并通过一段时间的观察,来证实上述观点。

系统目标如下:

1)输入1为所有历史股票的所有时间K线大集合。

2)输入2为一段K线组合,将这段K线组合与输入1进行滑动窗口匹配,根据特定算法,找出与输入1走势最为相似的前N个K线组合。

3)根据最为相似的N组组合的后续走势,预判输入1中K线的后续走势。

 

举个实例来说,选取一支股票X最近5天的日线走势(即输入2),根据搜索,在所有股票K线集合中(即输入1)搜索到与之最相似的10支股票K线走势,假设其中这10只股票中有9只第六天上涨,按最简单的思维,我们有理由相信,如此大概率的相似程度可以认为这种K线组合在当下可以认为是一种既定的模式,所以推断出股票X第6天的走势有很大概率是一条阳线。

 

计算逻辑和道理很简单,现实中遇到的问题是:

1)输入2的K线组合的选取,现实中有无数种选取方式,如何选择?

2)比较算法的实现,如何定义两根K线的相似度,如何确定参数?算法如何实现?

3)计算量过大,A股近3000支股票,再按级别分5分钟,15分钟…,再乘以若干计算参数,经过测算,无法实现全部遍历,也就无法实现实时计算。

4)通常一个股票的走势离不开大盘环境,如何综合考虑外围环境?

 

最初是想验证自己的一些想法,只有核心的C程序。后来由于数据爬取的需要,逐渐编写完善了python脚本,将爬取到的数据实时存入数据库,再后来想要方便查看,干脆又写了页面程序,能够以图形化方式展现比较结果。

目前整套系统自动实时抓取数据,能够以准实时方式实现上述算法(在给定某个输入2的情况下),7*24小时自动运行,支持A股3200支股票的查询和分析,支持15分钟,30分钟,60分钟,1天,1周5种K线级别的分析。

 

系统分为数据抓取模块,入库模块,主分析模块,前端页面,django中间层五大模块。采用C、python、js三种语言,历时300人天工作量完成。

核心代码量大约为:

 

C                3.3万行

Python      0.5万行

Js               0.3万行

 

但是基于上面提到的现实中的一些问题,想要实现实时或准实时的K线形态模型的抓取、预测,甚至后续实现自动交易,还有许多工作要做,例如,是否可以考虑采用机器学习的方式结合流式数据处理模型,来做到实时计算。

 

就当前已经实现的系统来说,这里打算分享一下我的设计和实现思路,抛砖引玉,寻找志同道合者一起完善整个系统。

量化是金融交易系统后续发展的大方向,越来越多的国内外公司开始参与到其中,其中一定有值得我们去挖掘和发现的价值和惊喜。

 

==============分享目录=============

第0章:引言

 

第一章:.整体架构设计

                   整体模块示意图

 

第二章:C主程序

                   主程序框架及各类线程

                   初始化和数据加载

关键数据结构

比较线程

                   定时dump线程

                   主程序崩溃后的快速恢复

同时更新K线数据和查询的冲突解决

K线数据的批量动态补充

                  

第三章:爬虫模块

                   K线数据源的抓取

                   自动化爬虫结构设计

                   抓取失败后的数据自动补录

 

第四章:页面逻辑

                    Django框架

                   动态交互

                   K线动态绘制

                   页面的加密和混淆

 

第五章:中间层设计

                   PythonC混合编程和调用

                   页面Jsàdjangoàpythonàc之间的数据流传递和调用

                   利用共享内存实现Python前台和后台的数据传递

 

第六章:算法设计

                   K线群的滑动窗口比较方法

                   快速排序并不是万能的

                   一组排序数据的快速匹配算法

                   如何比较两根K线的相似度

 

第七章:测试

                   压力测试脚本

                   异常测试

                   攻击测试

 

第八章:改进和规划

                  

 

目前公开的测试地址为 www.kxtime.cn


 


=================================================================



 

第一章   整体架构设计

 

整体架构采用经典的BS架构来进行设计。

最初设计是考虑到效率和解析速度打算采用CS架构的,但是后来考虑如果发布到公网,采用客户端形式就有点落伍了,后来调研了一些页面控件,研究了K线画法,发现基本可以满足展示需求,于是果断改用BS的方式。


整体架构图如下:

 

基于历史K线数据比较的量化选股方法及其系统分享_第1张图片


主要模块组件如下:

1)外部internet主要是请求来源和数据来源,数据主要为每日股票K线数据,从internet抓取,准实时更新,延后时间大约为3分钟(可以配置)。

2)爬虫程序负责抓取上述股票数据。这里有两个爬虫系统,主要为防止数据源不稳定造成数据丢失。两个爬虫从不同的数据源抓取数据,两者同时运行,只取其中一个的数据,另一份备份。

3)web程序由前端nginx服务器,配合django,实现网页访问。Nginx处理静态文件,如js、css,以及用户生成的临时下载数据。Html模版存放于django的template目录下,实现与django的动态交互。

4)中间层负责将django的python请求转化为C程序的输入请求。采用python调用C api的方式,C中间层程序以lib.so动态库对python提供接口。C中间层程序负责将请求数据放入共享内存,主程序从共享内存读取数据并处理,处理完毕后将结果送回共享内存,再经由lib.so返还给django,最后发送回客户端页面展示结果。

5)数据库系统负责存储爬虫抓取的数据,主程序从实时读取新的数据并加载到内存中。

6)主程序实时更新3000支股票的K线数据,接受外部查询请求。主程序还负责将数据以二进制形式保存在磁盘,以便重启后快速从磁盘恢复数据。(3000支股票4年的15分钟、30分钟,60分钟,日线,周线数据如果全部从数据库加载,速度较慢,以二进制方式直接拷贝进内存速度很快)。

7)其它程序,例如监控程序,负责监控主程序,爬虫程序的健康状况,一旦进程挂死,将重启它们并记录日志。清理程序,负责定时清理用户临时下载数据,节省磁盘空间。

8)文件,包括股票历史csv文件,作为扩充时用。例如当前支持2014年至今的数据查询和分析,后续如果支持2014年之前的数据,只要将数据放置到指定目录下,主程序会自动读取并加载到内存中。(后续打算支持2010年至今的数据分析)。主程序的配置文件,主要记录了运行线程数,日志级别,dump目录,外部文件目录,临时目录,共享内存大小等等设置。

 


二〇一七年四月十三日 10:09:20@南京


你可能感兴趣的:(金融,数据分析,量化,股票,系统设计,金融)