资深工程师教你如何在股市中用量化交易看见未来

标签: 编程技术 股票 | 发表时间:2015-10-08 14:15 | 作者:techug
出处:http://www.vaikan.com

编者按:本文来自点融网旗下微信公众号点融黑帮(微信号:DianrongMafia),授权 36 氪发布。作者程司雷,现任点融贷款业务团队软件工程师。曾在美国国家仪器有限公司、兴业银行总行科技部工作多年。

如何能在风云变幻的金融市场获得稳定的收益,如何在追涨杀跌中克服人性的贪婪和恐惧,一直是无数个人投资者们津津乐道的话题。人工交易无疑能够创造神话,但即便如《股票大作手回忆录》中杰西·利佛莫尔这样的华尔街传奇人物,也在巅峰过后走向没落,最终向自己扣动了扳机。而大部分散户更是难逃八亏一赚一平宿命。

那么广大爱好投资的程序猿们,该怎么利用强大的技术实力,通过程序化交易来为自己创收呢?

1. 量化交易的本质

交易就是通过买卖赚取差价来实现盈利。所谓量化交易(程序化交易、算法交易)就是通过某种固定的程式获取一个预期收益的概念。也许很多人都有过一卖就涨,一买就跌的切身经历,或者听信各路专家、神棍的分析,在下跌之初永远满怀” 希望 “,希望马上就要开始反弹,结果越套越深,在稍有盈利时就开始” 恐惧 “,恐惧自己的纸上富贵会化为乌有,结果早早卖出,错过了后面的几倍行情。尽管看了很多交易方面的” 心灵鸡汤 “,但还是无法克服情绪波动对交易带来的影响。

Image title

首先交易的目的是为了赚钱,而不是进进出出的乐趣,管住自己的手很重要。那么你能够计算出自己的人工交易所能达到的收益预期吗?不能,因为大部分的人工交易都是情绪化的,没有纪律可言,也就无从谈起收益预期。量化交易因为有固定的交易系统,什么时候执行什么操作指令都有着严格的规定,因此可以把自己的交易算法带到过去数年的历史交易数据中,计算出该交易算法在历史中的盈利水平(为了避免幸存者偏差,应当包含已经退市的股票数据)。

这里有一个基本的假设,那就是历史数据能够指导未来。就像经济学假设所有的经济活动参与者都是理性人一样,这是一个用于简化问题的假设。有句名言叫” 华尔街没有新鲜事物 “,该假设的现实依据是人性的不曾改变,一百年前赌徒的恐惧和贪婪,和今天市场里面的恐惧和贪婪,其实并没有什么两样。所以我们有理由相信基于历史交易数据回测出的预期收益率。另外一个假设是在完全的自由市场中,价格的走势已经反映了基本面、政策面等所有信息,我们只需要专注于价格的波动。

这个预期收益率有什么意义?它的本质是你的交易系统未来盈利水平的数学期望。数学期望意味着它是一个均值或者说期待值,它不代表你的下一次交易就能获得这个收益,你也可能亏损。数学期望意味随着你交易次数的越来越多,你的收益率就会趋向于该期望值。

需要注意的是要让你的交易系统避免” 破产风险 “。” 破产风险 “是一个赌场上的概念,指的是某一把下注太多赔光了所有,导致提前出局。我们要做的是能够在场内活下来继续交易,因为我们相信交易次数越多,收益越趋向于交易系统的期望值。

2. 一个量化交易系统是怎么创建的呢?

首先来看一下一个交易系统必须要包括哪些基本要素:买入信号、买入仓位、止损价位、加仓价位和数量、卖出价位。这些要素缺一不可,完整的构成了一个交易系统。

Image title

买入信号——用来告诉你在什么价格买入什么投资标的,常见的买入信号有:20 天均线突破信号、长短期均线交叉信号、通道突破信号、支撑与阻力线突破信号、MACD 金叉等技术突破信号。需要指出的是,不要过于迷信这些信号,它们只是一些概率统计上的指标,并不代表指标出现后市场一定按照指标描述的那样走。如果觉得固守某种价值投资的理念,如低市盈率,或者是信奉某个技术指标的买卖信号就以为能够百战百胜,那岂不是小学生也能赚钱。这些只是让你有了某种概率上的优势而已。这些信号也可以想积木一样组合进你的交易系统。当然还可以加入一些过滤器以过滤一些虚假突破的噪声信号。

买入仓位——指的是你首次建仓的仓位大小,它是资金管理的一部分。你应当仔细思量仓位的大小,避免” 破产风险 “的到来。我们常常听到的一句话 “斩断亏损,让利润飞”,就是指在仓位管理中要尽量做到小亏大赚。虽然我们拥有了概率上的优势,但是我们也无法保证每一次出手都是正确的。这就要我们在建仓时先买入比较小的头寸,一旦发生亏损便认错出局,防止小亏变成大亏。这里的亏损认定就是看是否触及了买入时所设定的止损线。割肉是很困难的事情,意味着对自己的否定,自己打脸总是让人不舒服,但我们要想想自己是来赚钱的,而不是为了证明自己。

止损线——不是一个一刀切的固定位置。简单的设定亏损 10%或者 20%作为止损线,可能会在上升趋势中因为 “震仓” 和 “洗盘” 而失去宝贵的头寸。止损线应当因时因地而异,它要根据投资标的最近的波动率和所持仓位的大小来综合计算。

任何一次的买入都是为了卖出,捂住股票上下坐电梯并不是我们想要的。类似买入信号,市场上也有一大堆的卖出指标来告诉你什么时候该卖了。挑选这些信号建立你的交易系统,并用历史数据进行回测,不断的调整参数优化预期收益率。(参数优化时不要对历史数据过度优化,那样会造成曲线的过度拟合,降低对未来数据的适应性)

记住:不要计较一城一池的得失,而要从概率的角度思考全局。有道是,不谋万世者,不足谋一时。

3. 交易系统的范例

一个特定的交易系统是在确定了上述系统要素后确定下来的。根据市场风格的不同,存在着各种各样的交易策略:趋势跟踪策略(趋势性的单边上涨或下跌的大牛市或大熊市)、套利策略(不同市场间的差价)、波动捕捉策略(震荡市场中的波段操作)等。下面以常见的趋势跟踪策略为例,简述一个交易系统的具体实现:

Image title

  • 3.1 系统初始化

首次启动系统时需要把沪深两市 2800 多支股票的全量交易数据导入数据库,并计算各支股票的统计数据,包括个周期的均线值、最近 20 天的最高价与最低价、波动率 N 值等。

波动率 N 的计算方法:

TR(波动幅度)= Max (H-L, H-PDC, PDC-L); 其中 H = 当日最高价, L = 当日最低价, PDC = 前一日收盘价

N (平均波动率)= (19 * PDN + TR)/ 20; 其中 PDN = 前一日N 值, TR = 当日波动幅度

  • 3.2 筛选突破信号

作为趋势跟踪策略,选择股价突破 20 个交易日内的最高价作为突破买入信号。为减少噪声信号,选取一个简单的均线系统作为过滤器:25 天均线大于 300 天均线的市场中只能做多,25 天均线小于 300 天均线的市场中只能做空。

  • 3.3 确定持仓量和加仓止损线

有了买入的标的和买入价格,接下来需要知道的是买多少,获利时怎么加仓,亏损时怎么止损。

买入量:为避免破产风险,必须使得买入的仓位不会造成巨大的损失。这里设定 买入量 = 一个头寸单位 = (总资金量 * 5%) / N 值,这保证了在该股票的平均波动水平下只会对你的总仓位最多造成 5%的损失;

加仓:价格每上行 1/2N, 加一个头寸单位,直到头寸上限;

止损:最新加仓的头寸单位价格 – 2N。

  • 3.4 退出(卖出价位)

主动的退出不同于止损,它是一个获利了结的概念。我们设定在一个持续获利的行情里面,你的仓位也已经达到上限,当股价跌破最近 10日 中的最低价,止盈卖出全部仓位,退出本次交易。

趋势跟踪策略意在捕捉大趋势的到来并加足筹码大赚一笔,其缺点是会存在假的突破趋势造成止损,好在止损所带来的亏损被限制在了很小的范围。另外严格的操作纪律和执行力才是交易系统取得超额收益的保证。

4. 相关技术

我们可以用自己喜欢的工具来实现你的交易系统,鉴于 Python 能够进行高效快速的开发和数据分析,在对实时性要求不高的数据采集、清洗加工和数据存储方面,Python 有着广泛的应用。

在数据获取方面,可以选择使用 TuShare、通联、万得等数据工具下载数据,其中 TuShare 提供 Python 接口获取历史行情数据、当日实时行情数据、基本面政策面数等,并能方便的把处理结果导入到各种数据库中。

5. 结语

代码就是生产力,让我们发挥自身的技术优势,告别小米加步枪的落后战力,用数据分析和机器运算来武装自己,残酷的市场中分得一杯羹。

相关 [工程师 股市 量化] 推荐:

资深工程师教你如何在股市中用量化交易看见未来

- - 外刊IT评论
编者按:本文来自点融网旗下微信公众号点融黑帮(微信号:DianrongMafia),授权 36 氪发布. 作者程司雷,现任点融贷款业务团队软件工程师. 曾在美国国家仪器有限公司、兴业银行总行科技部工作多年. 如何能在风云变幻的金融市场获得稳定的收益,如何在追涨杀跌中克服人性的贪婪和恐惧,一直是无数个人投资者们津津乐道的话题.

遭遇工程师

- Chrisoul - 槽边往事
谢谢大家的关心,几个小时前Google Plus恢复了我的帐号,看来暂时我还不用离开. 因为前一篇Blog的缘故,有些网友猜测是因为博文而使得我获释. 虚荣心让我想立即承认这一点,但是对不起,真的不是这样的,我的Blog并没有那么大影响力,尤其是在英文世界里. 而且,因为我上次张贴了一张人类进化谱系的漫画,我在国外驻京记者圈里成功赢得了“种族主义者”这一臭名昭著的称号,大概没有什么人愿意帮助一个黄种人中的“种族主义者”.

工程师效率

- - 后端技术 by Tim Yang
很好奇程序员这个群体这些年效率是变低了还高了,在社交媒体中,各个阶层的兴趣圈都有自己的段子手及内容帐号,段子手发的内容会让你笑cry,内容帐号发的内容可让你享受阅读的快感,这些快感会比写代码见效快. 写完一个模块的代码通常要一整天或者几天时间,代码调通运行没有问题才会体验到愉悦,而社交媒体只需要一些碎片时间就可以达到高潮.

知乎招募工程师

- oxygen - 知乎的博客
Python工程师  有两年以上软件开发经验. 至少一年 Python 开发经验. 对开源技术有强烈的兴趣和爱好,参与或向开发者提交过bug和patch. 热爱探索和钻研,熟悉文本挖掘、自然语言处理相关知识能使用C/C++独立实现复杂的算法结构熟悉开源搜索项目(Lucene,Sphinx等)极强的逻辑分析能力对开源技术有强烈的兴趣和爱好,参与或向开发者提交过bug和patch认为自己是技术geek有极强的责任感.

浅谈技术工程师的进步

- belltoy - caoz的和谐blog
本来发微博的,越说越多,算了,发篇博客把,说点工程师如何取得进步的问题,. 1:描述和记录问题要精确,数字化,“负载很高,连接很多,速度很卡”这种描述都是不对的,负载uptime值多少,连接数具体有多少,平时正常多少,高峰多少,访问延迟有多大,全部要数字化,而且要有问题状况下和平时的对比,养成这样的习惯,技术分析能力才会有进步.

工程师与会计 [幽默笑话]

- Liqun - 经典网文_来福岛爆笑娱乐网
  有三个工程师和三个会计一起去外地开会,上火车时三个会计买了三张车票,而三个工程师却只买了一张票,会计很不解,工程师说:“上了车你们就知道了”.   火车刚一开动三个工程师就挤进了一个厕所,列车员开始检票最后走到了厕所外边,她敲了一下门说:“检票”. 然后门开了一个小缝,从里面递出一张车票.   在外地开完会后在返回的时候会计们觉得工程师们的方法很不错于是也只买了一张车票,而这次工程师一张票也没有买,会计们又很不解,工程师还是说:“上了车你们就明白了”.

[北京]python工程师 - 创新工场

- Ken - python.cn.jobs
创新工场旗下旅游SNS网站团队招聘python工程师. 职位要求:1、两年以上软件开发经验.                     2、一年以上python开发经验.                     3、有强烈的责任感,对开源技术有强烈的兴趣和爱好,有创业兴趣.                     4、算法强大,有大规模数据处理经验优先.

SOPA、PIPA——工程师应该担心吗?

- - InfoQ cn
1月18日,与其他大约10,000家网站一起,wikipedia.org停止了他们的服务,以抗议美国立法机构对SOPA和PIPA的背书. 尽管投票最近被延迟,互联网社区仍需担心. 软件工程师可能认为:他们不会被这次立法所影响,特别是如果他们处于美国之外的话. 但是考虑到Big Data、云计算以及其他趋势,这么想可能很傻很天真.

Hadoop工程师成为热门职业

- mazhechao - Solidot
JP摩根大通总经理Larry Feinsmith在纽约举行的Hadoop World 2011会议上发表了主题演讲,公开声明高薪招聘精通Hadoop的软件工程师. Hadoop是一个顶级Apache开源项目,主要被应用于分析大数据集,被eBay、Facebook、Yahoo、AOL和Twitter等互联网公司广泛采用,今年微软、IBM和甲骨文也都纷纷拥抱Hadoop.

我眼中的工程师文化

- - ITeye博客
现在HR和猎头也懂得,挖程序员不能光讲钱和项目了,多少号称工程师文化的公司花开北京上海,可是到底什么是“工程师文化”. 有人说,什么文化就是什么说了算的意思,工程师文化就是工程师说了算. 也有人说,工程师文化就是自由上下班、松散管理,做喜欢的项目. 我想这依然是不恰当的,这些人只说出了工程师文化给工程师带来的权利,更何况这种对权利的认定还是片面的.