量化编程,分钟K线数据重构,ATR自适应通道代码分享!

尝试用python搭建了这样一套交易系统,首先它把数据拆分重构,使用15分钟或者更低颗粒度的K线,重构成为1小时线或者半日线。然后在重构的K线上,搭建ATR自适应通道交易模型。

如果说后半部分模型开发是很多软件都可以做的,前半部分就并非如此了。我们要以每天中午12点,下午15点为切分点,把每天的时间序列切分成3段。

让我们从最简单的模型本体交易逻辑开始讲。

一、模型本体——ATR自适应通道

很多做期货动量交易的人都明白,通道突破类策略是典型的趋势策略,这类策略指导构建的交易模型也比较简单清晰,并且将标准差等波动率表达方式考虑到模型中,有助于提升绩效。这里说的提升绩效,一方面是通过通道的中轨确定大致方向,另一方面是通过标准差等波动率指标,确认通道宽度。

首当其中的就是布林带,这个经典指标已经几十年被使用,基本上没人敢说这套系统不能用,但是它毕竟太过于古老,需要改进,这是共识。

Img

典型的通道突破类策略是Aberration,实际上就是布林带,它被翻译理解为“失常、离开正路、越轨”等含义。该模型在均线上,构建了上下两个通道,通过波动率高低调节通道大小,如果价格突破上轨,就做多,如果价格突破下轨,就做空,价格回到中轨平仓,达到一定的自适应突破效果。

它的原理是这样:

// 中轨AverageMA,此处的Length是计算均线的窗口期
AverageMA = Average(Close1,Length);
// 价格序列的标准差
StdValue = StandardDev(Close1,Length);
// 上轨和下轨,此处的StdDev是标准差倍数
UpperBand = Avema StdDev StdValue;
LowerBand = Avema - StdDev 
StdValue;

今天的改进针对标准差部分,我们发现ATR比标准差更能够反应波动率的真伪,毕竟ATR采用的时间序列信息含量更高。

  标准差是一个统计工具,不再叙述。ATR概念由威尔德(J. Welles Wilder)1978年于《New Concepts in Technical Trading Systems》书中提出,它取一定时间周期内的价格波动幅度的移动平均值,和你看到的网络上的注解不同,它并不是主要用于研判买卖时机,也不是做什么反趋势指标,它能感知到波动率。

海通证券测试了ATR和标准差的性能差异,这四种情况虽然特殊,但是以极端方式,体现了标准差和ATR的区别。.

Img

图1,标准差的表现力更强,因为价格确实出现了波动幅度变化。

Img

图2,和研报观点相同,ATR可以稳定的保持着较高的水平,能对新的价格运行方向上的波动状态进行有效的刻画,但是标准差不行。

Img

图3,标准差在适应新趋势时又一次表现出对趋势逆转时波动率提升的错误描述,它在新趋势刚开始出现时先缓慢下降,此时很容易造成通道类突破系统做出错误判断。

Img

图4,很罕见的情况,但是ATR采用了最高最低价,而标准差没有,所以它对于波动率的分析显然错了。

所以,你知道的,我们要使用ATR改进布林带了,改进完的这套系统,应该被称作金肯特纳通道,网上会有很多资料,这里使用公众号量化投资训练营的结果,放出来一些测试,来体现两者的细微差距。

我们关闭掉模型中其他条件,仅以布林带或者说使用ATR为逻辑的Keltner Band作为开平仓条件进行测试。测试目标是螺纹钢RB000,2010年开始指数合约,沪深300指数2010年开始时间序列。频率都在1小时。

为了公平起见,参数统一为20周日ATR或者标准差。且为了得到均等的参数面绩效,我们令中轨周期参数Length在30~200之间波动,间隔5,。令Offset上下轨宽度参数在1~3之间波动,间隔0.5.。这样既可得到一个约180组绩效。

TOP组的意思是取按净利润排列,前30个绩效。

ALL组的意思是所有绩效。

Img


螺纹钢参数面测试结果

Img


沪深300参数面测试结果

经过测试发现,商品期货上性能差异不够明显,但是到了股指方面,ATR的优势进一步显现。这其中最核心的因素恰巧是交易次数,带来的绩效IR提升,这里我们定义的IR和信息广度有关,我们认为信号数量是对于绩效可信度的考察方式。

ATR通道,在螺纹钢和沪深300指数上,信号数量是标准差的1.14倍和1.05倍,且同时绩效略好,所以导致这里定义的绩效IR = 绩效*SQRT(交易次数)差别更显著。

该部分逻辑,使用python语言撰写效果如下:

# ATR计算  
        g.low = g.AM[IndexFuture].exportArray('low')[-g.TodayBar[IndexFuture]*g.Window-1:]
        g.high = g.AM[IndexFuture].exportArray('high')[-g.TodayBar[IndexFuture]*g.Window-1:]
        g.close = g.AM[IndexFuture].exportArray('close')[-g.TodayBar[IndexFuture]*g.Window-1:]
        # 为了防止ATR误算,如果出现大面积的空数据,则不计算ATR
        if 0 in g.close:
            pass
        else:
            g.ATR[IndexFuture] = talib.ATR(g.high,g.low,g.close, timeperiod = g.TodayBar[IndexFuture]*g.Window)[-1]
            print(g.ATR[IndexFuture])
            # 布林带计算
            g.MidLine = g.close[-g.Window*g.TodayBar[IndexFuture]:].mean()
            g.BollUp = g.MidLine   g.offset*g.ATR[IndexFuture]
            g.BollDown = g.MidLine - g.offset*g.ATR[IndexFuture]


            # 交易信号计算
            if g.close[-1] > g.BollUp:
                g.Cross = 1
            elif g.close[-1] < g.BollDown:
                g.Cross = -1
            else:
                g.Cross = 0

            #判断交易信号:布林带突破 可二次入场条件成立
            if  g.Cross == 1 and g.Reentry_long == False:
                g.Signal = 1
            elif g.Cross == -1 and g.Reentry_short == False:
                g.Signal = -1
            else:
                g.Signal = 0
            # 执行交易
            Trade(context,RealFuture,IndexFuture)
            # 运行防止充入模块
            Dont_Re_entry(context,IndexFuture,ins)
            # 计数器 1
            g.Times[IndexFuture]  = 1
  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值