JoinQuant量化课堂 发布于2016-07-25
回复 67
浏览 40405
340
**导语**:我们经常在抓反弹时感觉像在抓一只刺猬,不知道该怎么下手。左侧交易会不会买在半山腰?右侧交易会不会进场太晚?什么时候买入真是让人头疼。切莫苦恼,你完全可以通过历史数据统计判断反弹的时机。本文就将抛砖引玉地介绍一种简单的统计方法,它不能保证抓反弹次次成功,但可以让你对多错少,累积起来就是真实的收益!
$ $
```
作者:肖睿
编辑:宏观经济算命师
本文由JoinQuant量化课堂推出,难度为进阶(上),深度为 level-0。
```
本文是量化课堂的[《均值回归入门》](https://www.joinquant.com/post/1608?f=study&m=algorithm)的进阶版,并且用到[《指标效果的统计分析》](https://www.joinquant.com/post/2086)一文中的统计方法。
$ $
#### **动机**
我们先回顾一下均值回归的基本概要:
**股票的价格会以它的均线为中心进行波动。也就是说,当标的价格由于波动而偏离移动均线时,它将调整并重新归于均线。那么如果我们如果能捕捉偏离股价的回归,就可以从此获利。**
在入门篇文章里我们尝试了一个非常简单的均值回归策略,也发现了相应的问题:那就是无法准确判断何时买入,也缺乏买在半山腰之后的处置机制。本篇要讲的是,统计历史数据中价格偏离所对应的反弹幅度,选择胜率最高的偏离度作为入场信号。
$ $
#### **波动大小的相对性**
在入门篇文章中我们粗略地以价格和均线的偏差作为买入的评估标准,但它有一个弊端,那就是忽略了股价波动的相对性。假如股票 A 在一段时间里每天振幅 3%,股票 B 在同样一段时间里每日振幅 0.5%,今天我们发现 A 和 B 的股价都和均线偏离了 2%,我们认为那支的偏离更显著呢?是 B 对吧。
举实例来说。下图是某支股票的 60 分钟线,中间紫色曲线为股价的 5 日均线。可以看出在蓝色线段标明的时间里,股价波动平缓。在两个粉色箭头处,股价比均线分别高 4.1% 和低 5.9%。这些波动较前段时间更为剧烈,可以告诉我们股价发生了偏离。
![1.png][1]
再看下图,这是同一支股票在另一段时间的 60 分钟线。这段时间里价格波动幅度大,在粉色箭头的位置,价格和均线的差距分别为5.3% 和 5.1%,但我们不将其视为显著的价格偏离。
![2.png][2]
那么我们该如何测量近期波动幅度的大小呢?这就要涉及到统计学中的标准差概念。
$ $
#### **标准差**
标准差(standard deviation),通常用小写希腊字母 $\sigma$(sigma,读“西格玛”)表示。通俗地讲,一组数据的标准差就是这组数据离均值的普遍差距。
假设 $x_1,x_2,…,x_n$ 是我们观测到的一组数据,这组数据的均值是 $\mu=(x_1+x_2+⋯+x_n)/n$
标准差的计算公式为
\[ \sigma=\sqrt{\frac{(x_1-μ)^2+(x_2-μ)^2+⋯+(x_n-μ)^2)}{n}} \]
这里 $x_t-\mu$ 计算的是第 $t$ 项数据和均值的差值。将这 $n$ 项差值的平方取了平均,再算出平方根,我们得到的是这组数与均值偏差的一个标准。如果这组数据的波动较大,那么 $\sigma$ 相应也会较大;相反的,如果这组数据波动小,那么 $\sigma$ 会更接近零。
举例来说,假设我们有一组数据 $A=(1,0,0,0,0-1,0,0,0,0)$,如下
![3.png][3]
它的平均值是 $0$,标准差是
\[\sigma =\sqrt{\frac{(1-0)^2+(-1-0)^2)}{10}}=\sqrt{1/5}\approx 0.45\]
这时如果下一项出现的数据是 $x_{11}=1$,可以算出它和均值的差是 $(1-0)/σ\approx 2.23$ 倍标准差,可以被视为是一个较大的波动。
在另一种情况里,假设我们的数据是 $B=(1,-1,1,-1,1,-1,1,-1,1,-1)$,如下图
![4.png][4]
可以直观地看出波动较大。这组数据同样是均值等于 $0$,它的标准差是
\[ \sigma =\sqrt{\frac{(1-0)^2+(-1-0)^2+⋯+(-1-0)^2)}{10}}=\sqrt{1}=1\]
明显比数据 $A$ 的标准差更大。这时如果出现新的数据 $x_{11}=1$,由于它和均值的差距等同于标准,我们不认为它是一个很大的波动。
有了这个概念,我们可以构造一种利用标准差来测量当日股价波动幅度的方法。取过去 $N$ 天收盘价,并取其标准差 $\sigma$,设今日股价为 $P$ 并且 $N$ 日均线值为 $\text{MA}_N$,计算
\[ \rho =\frac{P-\text{MA}_N}{σ} \]
这个值得含义是,相较过去 $N$ 天的价格,今日股价与均值的偏差为 $\rho$ 倍的标准差。如果绝对值 $|\rho|$ 比较大,我们判定今日价格波动比历史波动更为突出;反之,如果 $|\rho|$ 比较小,我们判定今日的波动很普通。嗯,这个 $\rho$ 嘛,为了方便起见,作者就自行起一个名字吧,就叫它“$N$ 日偏离倍数好了”。
好,可以合理地判定波动大小了,那么应该如何利用这些信息判断何时入场呢?
$ $
#### **偏离倍数和赢输的统计**
我们没法凭空预测偏离倍数在多大的情况下价格会反弹,也不能盲目地认为偏离倍数越高越好。我们干脆穷举,对历史上所有的偏离倍数(范围),统计其后后股价的走势,然后将胜率最高的偏离倍数视为入场信号,在其出现时买入。
接下来的统计方法请参阅量化课堂文章[《指标效果的统计分析》](https://www.joinquant.com/post/2086)。
按照文中的思路,我们要计量的指标是上一节中介绍的 $N$ 日偏离倍数 $\rho$。另外,我们只记录 $\rho<-1$ 的情况,因为如果 $\rho≥-1$,那说明价格偏离不大,则不构成回归信号。
我们将要统计的结果进行如下判定:设定观测输赢的天数 $T$,止盈的 $\sigma$ 倍数 $u$,止损的 $\sigma$ 倍数 $d$。如果在未来的 $T$ 天里,股价先上涨 $\sigma\cdot u$,则记作“赢”;先下跌 $\sigma \cdot d$,则记作“输”;如果 $T$ 天股价都没离开这个区间,则记作“平”。
以某股票从 2006 年到 2016 年的数据为例,统计结果如下:
![5.png][5]
通过直接看图可估测出 $\rho$ 在 $2.3$ 到 $3.0$ 的区间里胜率很高。我们再通过[文章中](https://www.joinquant.com/post/2086)取最佳指标区间的算法获取一个胜率最高的偏离倍数区间。这里,我们想选定一个区间宽度 $w$,并在以上统计中计算一个宽度为 $w$ 的横轴区间($w$ 个连续竖条),需要它的胜率(绿色区域总和除以红色区域总和)是最高的。当然,还需要设置一个最小数据比 $\theta$,区间内的数据量必须高于总数据量的 $\theta$ 倍,不然区间内的统计缺乏可信性。
我们设置参数:区间宽度 $w=5$,最小数据比 $\theta=0.05$。通过计算,得到区间 $[-2.6,3.1]$,区间中的数据如下:
![6.png][6]
其中赢 $(5,7,4,3,8)$ 次,输 $(1,4,2,3,2)$。计算出输赢率为
\[\frac{5+7+4+3+8}{1+4+2+3+2}=\frac{27}{12}\]
也就是说,根据历史统计,如果当偏离倍数在 $-3.1$ 和 $-2.6$ 之间时买入该股票,输赢的预期是 $27$ 赢比 $12$ 输,当然,还有 $2$ 次平局。
$ $
#### **策略和回测**
其实策略的主要部分已经完成,只要加上对资金和仓位的管理,就可以构成一个可运行的策略。这里我们就构建一个很简单的方案。
设定如上一节所述每的参数:均线天数 $N$,统计输赢天数 $T$,止盈倍数 $u$,止损倍数 $d$,区间宽度 $w$,和最小数据比 $\theta$。每交易日执行以下操作:
一、全仓卖出应当止盈或止损的股票,或持有超过 $T$ 天的股票;
二、执行上一节的统计方法来更新每一支股票的最佳偏离倍数区间;
三、如果空仓,选定任意一支偏离倍数在最佳区间内的股票并全仓买入,如果所有股票都不符合则空仓。买入时记录止盈线 $u$ 倍 $σ$ 和止损线 $d$ 倍 $σ$,并设置如果 $T$ 日内未触碰止盈或止损线,也全部卖出。
来看一看回测结果。以下回测使用的股票池只包含 1 或 2 支标的股,这样便于看出策略对于个股发出的信号。文章最后的策略代码只适用于小规模的股票池;对于更大的股票池,信号会更加密集,因此需要调整每支股票的持仓量并且分别止盈止损,读者可以自行进行修改,或等待量化课堂未来的文章。另外,我们的回测从 2011 年开始,这样保证回测开始时就有一定的历史数据储备。
首先是股票 002013 的回测,使用参数 $N=30$,$T=30$,$u=d=1$,$w=4$,$\theta=0.05$,回测结果如下。
![7.png][7]
策略在震荡市中产生比较稳定的收益,并保持比较小的回撤。在牛市中完全不产生信号,因此没有半点反应,倒是在股灾之后稳稳地抓好了反弹,在短期内获取大量收益。
还使用同样的参数,我们看 002230 的回测。
![8.png][8]
同样是在震荡市中表现良好,但在股灾中抓反弹一度失利,不过后期在弥补损失之余获得了更高的收益。
观看回测最下方的“每日买卖”图可看出这个策略产生的信号和交易实则不多,在股票池里放入多支股票的话可以轮回抓取反弹,产生叠加的收益。比如,下图是将上面两支股票的作为标的回测,对比的指数是沪深300。
![9.png][9]
$ $
#### **结语**
嗯,我们看看啊…总结就是三点。首先是均值回归核心思路:
**价格偏离均线太多就会弹回来**
然后是,我们怎么判断偏离多少呢?
**价格减去均线除以历史波动的标准差可以丈量偏离的程度**
判断入场的话…
**利用历史统计的偏离倍数对应的输赢率判断入场时机**
最后还要指出,本篇文章旨为抛砖引玉,展示一种思路。文中的统计方法比较粗糙,策略也比较简单。想要在实战中应用的话,还需要进一步拓展、打磨并结合其他的方法,才能构造出一套成熟的交易策略。量化课堂未来的文章会在此策略上升级改进,结合凯利公式进行动态的仓位调整,敬请期待。
$ $
#### **函数和变量说明书**
函数说明书
![函数说明书.png][10]
全局变量说明书
![全局变量说明书.png][11]
$ $
```
本文由JoinQuant量化课堂推出,版权归JoinQuant所有,商业转载请联系我们获得授权,非商业转载请注明出处。
v1.1,2016-08-11,添加统计分析文章链接
v1.0,2016-07-25,文章上线
```
[1]: https://image.joinquant.com/ff6d71f4752fc465aa452afab74f83ce
[2]: https://image.joinquant.com/c3ae8807afaa16feaa9aaec7b85e7a12
[3]: https://image.joinquant.com/c658a9cef9e5fc372b67bea60ecc023c
[4]: https://image.joinquant.com/338c310ce1e88c904f347492a5eb82bc
[5]: https://image.joinquant.com/bda337ef91e4fc6bc138ff7463a72e74
[6]: https://image.joinquant.com/ee22eff3127eeb1ffdfe739c3a77cf93
[7]: https://image.joinquant.com/dc579655dac1235f201be55a4765f3a6
[8]: https://image.joinquant.com/f856d34b102930c83818d3b0dc8d0f01
[9]: https://image.joinquant.com/c68c5052212f2f56ec307bd0d2e5dde6
[10]: https://image.joinquant.com/666b0fdcc11fbcd3df54d690b60d9270
[11]: https://image.joinquant.com/785f067ec2fa8c49c81b0ab863fb6c53
评论
这个均值回归很好,接近实战了,动手改改试试。
2016-07-26
学习! 代码结构很厉害的样子!
2016-07-26
@michaeljrqiu 这个是示例策略啊,教程那种,想要更高alpha 自己克隆了改改哇 :)
2016-07-26
先射箭后画靶,是不是有过优的可能,如果没有是不是更适用于Beta系数高的股票,例如小市值
2016-07-27
@天罗子 回测时调整的参数都是通过动态统计回测日**之前**的数据计算的,所以没有未来函数,也不会有过优的情况。这个策略更适用于走势比较稳定,历史统计会重演的股票,所以不是特别适用于小市值。
2016-07-27
@JoinQuant量化课堂 我怎么感觉这个就是boll布林线的原理了
2016-07-29
哈哈,这就是我想要的,感谢!
2016-07-30
@鸟人 是的,和布林线很像。但是布林线的区宽是固定倍数的 $\sigma$,这个策略里是通过胜率统计来动态调整的,所以适应性会更强。
2016-07-30
g.security 中的g是平台自带的库吗?这个能不能下载安装带pycharm?
2016-07-31
@marquis007 g 是可以自己定义的全局变量。
2016-08-02
@JoinQuant量化课堂 是平台自带的函数吗?这个函数有包吗?
2016-08-02
@marquis007 你看一下API帮助不就都知道了嘛~~
2016-08-02
挑了几只股票测试了一下,效果有些惨不忍睹啊。
2016-08-04
@mm139 是的!我们只是提供一种思路嘛,肯定不能直接拿来用
2016-08-04
写的真好,简单易懂。好喜欢,聚宽加油
2016-08-07