统计套利之经典指标(一):指数移动平均

+3 投票

均线理论是当今应用最普遍的技术指标之一,它帮助交易者确认现有趋势、判断将出现的趋势、发现过度延生即将反转的趋势。详见百科:http://baike.baidu.com/link?url=gaNxzT46i66Lw54Zbd3ZWAa_uCcOM9nY-bK7iWSYb62uYY5NJYDRo0JepO7OJa1Y3y5Y3NxvtjLaeewsKENJx_

指数移动平均是在该指标的基础上应用统计方法对其做了平稳性处理,股票价格(时间序列)只有在(强)平稳时才能从历史数据中获得其数字特征(如均值,方差)。

操作方法以及理论如下:(注:该方法在高频交易中效果较佳(中心极限定理能保证收益率为正),这里就用的日线数据看个大概)

1,获得N期股票收盘价(这里N取25天)

2,指数化处理EMA=sum(k*p(k))/(2(N*N+1)),p(k)是历史第k天股票的价格

3,平稳处理x=EMA/P(N),p(N)是当日价格,这里用当日收盘价

4,检验x是否为平稳过程(这里略了~~)

5,设定阈值,这里选取0.94和1.06作为x的阈值:如果x<0.94则买入持有,x>1.06则卖出,以下策略为全仓买卖,具体操作中可每次设置仓位

下面是代码:


def init(context):
    context.stocks="sha-601318"
    universe.append(context.stocks)
    context.bench_mark="sha-600498"
    context.slippage=0.003
    context.s1="test"
    context.N=25
    context.cy=0
def handle_data(context,data):
    stock=context.stocks
    n=context.N
    price=data[stock].close
    y=history(context.N,"close")[stock]
    y=y[0:context.N]
    EMA=0
    for i in range(context.N):
        EMA=(i+1)*y[i]+EMA
    EMA=EMA/((n*n+n)/2)
    x=EMA/price
    record("x",x)
    cash=context.portfolio.cash
    num=int(cash/(100*price))
    if x<0.94 and context.cy==0:
        order(stock,+num*100)
        context.cy=1
        log.info("%s BUYing~%s shares"%(data.dt,num))
    if x>1.06 and context.cy==1:
        order_target(stock,0)
        context.cy=0
        log.info("%s Selling~%s "%(data.dt,stock))    
    


 

下面是用sha-601318回测的效果:可以看出该方法在追涨杀跌中很有效,x对每次大涨大跌反应灵敏,最大回撤控制的也不错,感兴趣的可以重新调整其他参数和股票

最新发帖 4月 5, 2016 分类:高级策略进阶 | 用户: piyejingjing (2,810 分)
重新分类 4月 6, 2016 用户:maserati

1个回复

0 投票

另一种指数加权的方式是将代码第18,19行换成


 EMA=math.pow(y[n-i-1]*((m-1)/(m+1)),i)+EMA
 EMA=2*EMA/(m+1)

该方法的优点是EMA能更快速收敛,具体细节以后再讨论~
最新回复 4月 5, 2016 用户: piyejingjing (2,810 分)
...