资深工程师教你如何在股市中用量化交易看见未来
编者按:本文来自点融网旗下微信公众号点融黑帮(微信号:DianrongMafia),授权 36 氪发布。作者程司雷,现任点融贷款业务团队软件工程师。曾在美国国家仪器有限公司、兴业银行总行科技部工作多年。
如何能在风云变幻的金融市场获得稳定的收益,如何在追涨杀跌中克服人性的贪婪和恐惧,一直是无数个人投资者们津津乐道的话题。人工交易无疑能够创造神话,但即便如《股票大作手回忆录》中杰西·利佛莫尔这样的华尔街传奇人物,也在巅峰过后走向没落,最终向自己扣动了扳机。而大部分散户更是难逃八亏一赚一平宿命。
那么广大爱好投资的程序猿们,该怎么利用强大的技术实力,通过程序化交易来为自己创收呢?
1. 量化交易的本质
交易就是通过买卖赚取差价来实现盈利。所谓量化交易(程序化交易、算法交易)就是通过某种固定的程式获取一个预期收益的概念。也许很多人都有过一卖就涨,一买就跌的切身经历,或者听信各路专家、神棍的分析,在下跌之初永远满怀” 希望 “,希望马上就要开始反弹,结果越套越深,在稍有盈利时就开始” 恐惧 “,恐惧自己的纸上富贵会化为乌有,结果早早卖出,错过了后面的几倍行情。尽管看了很多交易方面的” 心灵鸡汤 “,但还是无法克服情绪波动对交易带来的影响。
首先交易的目的是为了赚钱,而不是进进出出的乐趣,管住自己的手很重要。那么你能够计算出自己的人工交易所能达到的收益预期吗?不能,因为大部分的人工交易都是情绪化的,没有纪律可言,也就无从谈起收益预期。量化交易因为有固定的交易系统,什么时候执行什么操作指令都有着严格的规定,因此可以把自己的交易算法带到过去数年的历史交易数据中,计算出该交易算法在历史中的盈利水平(为了避免幸存者偏差,应当包含已经退市的股票数据)。
这里有一个基本的假设,那就是历史数据能够指导未来。就像经济学假设所有的经济活动参与者都是理性人一样,这是一个用于简化问题的假设。有句名言叫” 华尔街没有新鲜事物 “,该假设的现实依据是人性的不曾改变,一百年前赌徒的恐惧和贪婪,和今天市场里面的恐惧和贪婪,其实并没有什么两样。所以我们有理由相信基于历史交易数据回测出的预期收益率。另外一个假设是在完全的自由市场中,价格的走势已经反映了基本面、政策面等所有信息,我们只需要专注于价格的波动。
这个预期收益率有什么意义?它的本质是你的交易系统未来盈利水平的数学期望。数学期望意味着它是一个均值或者说期待值,它不代表你的下一次交易就能获得这个收益,你也可能亏损。数学期望意味随着你交易次数的越来越多,你的收益率就会趋向于该期望值。
需要注意的是要让你的交易系统避免” 破产风险 “。” 破产风险 “是一个赌场上的概念,指的是某一把下注太多赔光了所有,导致提前出局。我们要做的是能够在场内活下来继续交易,因为我们相信交易次数越多,收益越趋向于交易系统的期望值。
2. 一个量化交易系统是怎么创建的呢?
首先来看一下一个交易系统必须要包括哪些基本要素:买入信号、买入仓位、止损价位、加仓价位和数量、卖出价位。这些要素缺一不可,完整的构成了一个交易系统。
买入信号——用来告诉你在什么价格买入什么投资标的,常见的买入信号有:20 天均线突破信号、长短期均线交叉信号、通道突破信号、支撑与阻力线突破信号、MACD 金叉等技术突破信号。需要指出的是,不要过于迷信这些信号,它们只是一些概率统计上的指标,并不代表指标出现后市场一定按照指标描述的那样走。如果觉得固守某种价值投资的理念,如低市盈率,或者是信奉某个技术指标的买卖信号就以为能够百战百胜,那岂不是小学生也能赚钱。这些只是让你有了某种概率上的优势而已。这些信号也可以想积木一样组合进你的交易系统。当然还可以加入一些过滤器以过滤一些虚假突破的噪声信号。
买入仓位——指的是你首次建仓的仓位大小,它是资金管理的一部分。你应当仔细思量仓位的大小,避免” 破产风险 “的到来。我们常常听到的一句话 “斩断亏损,让利润飞”,就是指在仓位管理中要尽量做到小亏大赚。虽然我们拥有了概率上的优势,但是我们也无法保证每一次出手都是正确的。这就要我们在建仓时先买入比较小的头寸,一旦发生亏损便认错出局,防止小亏变成大亏。这里的亏损认定就是看是否触及了买入时所设定的止损线。割肉是很困难的事情,意味着对自己的否定,自己打脸总是让人不舒服,但我们要想想自己是来赚钱的,而不是为了证明自己。
止损线——不是一个一刀切的固定位置。简单的设定亏损 10%或者 20%作为止损线,可能会在上升趋势中因为 “震仓” 和 “洗盘” 而失去宝贵的头寸。止损线应当因时因地而异,它要根据投资标的最近的波动率和所持仓位的大小来综合计算。
任何一次的买入都是为了卖出,捂住股票上下坐电梯并不是我们想要的。类似买入信号,市场上也有一大堆的卖出指标来告诉你什么时候该卖了。挑选这些信号建立你的交易系统,并用历史数据进行回测,不断的调整参数优化预期收益率。(参数优化时不要对历史数据过度优化,那样会造成曲线的过度拟合,降低对未来数据的适应性)
记住:不要计较一城一池的得失,而要从概率的角度思考全局。有道是,不谋万世者,不足谋一时。
3. 交易系统的范例
一个特定的交易系统是在确定了上述系统要素后确定下来的。根据市场风格的不同,存在着各种各样的交易策略:趋势跟踪策略(趋势性的单边上涨或下跌的大牛市或大熊市)、套利策略(不同市场间的差价)、波动捕捉策略(震荡市场中的波段操作)等。下面以常见的趋势跟踪策略为例,简述一个交易系统的具体实现:
- 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. 结语
代码就是生产力,让我们发挥自身的技术优势,告别小米加步枪的落后战力,用数据分析和机器运算来武装自己,残酷的市场中分得一杯羹。