第四章:经典量化策略集锦(第四篇:进军交易系统,从 Dual Thrust 中学“趋势”)

导语: “趋势”这个字眼,大家肯定不陌生,炒股票的老股民天天口里说着 “趋势为王”, 


那么今天我们向大家介绍一个趋势跟踪交易系统:Dual Thrust ,其简单明确,适用度广。 






一、趋势跟踪系统阐述 






Dual Thrust 的由来 






    Dual Thrust 是一个趋势跟踪系统,由Michael Chalek 在20 世纪80 年代开发,曾被 


Future Thruth 杂志评为最赚钱的策略之一。Dual Thrust 系统具有简单易用、适用度广的特点, 


其思路简单、参数很少,配合不同的参数、止盈止损和仓位管理,可以为投资者带来长期稳 


定的收益,被投资者广泛应用于股票、货币、贵金属、债券、能源及股指期货市场等。 






Dual Thrust 交易系统介绍 






    在Dual Thrust 交易系统中,对于震荡区间的定义非常关键,这也是该交易系统的核心 


和精髓。Dual Thrust 系统使用 Range = Max(HH-LC,HC-LL)来描述震荡区间的大小。其中 


HH 是N  日High 的最高价,LC 是N  日Close 的最低价,HC 是N  日Close 的最高价,LL 是 


N  日Low 的最低价。 






第一步:计算Dual Thrust 的 Range 值 






1.N 日High 的最高价HH, N  日Close 的最低价LC 


2.N  日Close 的最高价HC ,N  日Low 的最低价LL 


3.Range = Max(HH-LC,HC-LL) 






第二步:计算Dual Thrust 上下轨 






1.BuyLine = Open+K1*Range 


2.SellLine = Open-K2*Range 






第三步:交易系统 (考虑到A 股市场无法做空) 






(1)当盘中价格向上突破上轨时,做多。 


(2)当盘中价格向下突破下轨时,清仓。 




----------------------- Page 84-----------------------


参考下图: 






    本篇内容以沪深300 指数为例,来向大家展示Dual Thrust 交易系统。以下是两个注意点: 


     


    1.计算 Dual Thrust 的 Range 值时,N 取 1,即通过昨天的开高低收数据来计算出Range 


值。 


    2.K1 与K2 保持不对称性,介于 A 股市场大牛大熊轮回切换,且指数长期向上,因此取 


K1=0.8 ,K2=2 。 






     以下为策略实现的基本信息: 






    策略实现难度:2 


    实现过程中所需要用到的API 函数,ps:通过 MindGo 量化交易平台 API 文档快速掌握: 






 需要用到的API 函数              功能 






before_trading_start()    定时运行函数,每个交易 日9.00 运行 






handle_data()             定时运行函数,按交易 日或按分钟运行 






set_benchmark()           设置基准指数 






get_price                 获取历史行情数据  




----------------------- Page 85-----------------------


二、代码示意图 






三、编写释义 






    注意本策略需分钟运行,考虑到分钟运行时运行速度较为关键,因此一些必要的数据: 


例如策略中的 Range 值,应该是盘前计算完毕,盘中直接使用,开盘价也只需要开盘第一分 


钟获取即可。如果盘中每分钟运行需要消耗较多的时间,则该策略实际运行时会错失下单价 


位。  




----------------------- Page 86-----------------------


四、最终结果 






策略回测区间:2014.01.01-2018.01.31 


回测资金:10000000 


回测频率:分钟 


回测结果:红色曲线为策略收益率曲线,蓝色曲线为对应的基准指数收益率曲线 




----------------------- Page 87-----------------------


策略源代码: 






import pandas as pd  


import numpy as np  


#================初始化函数============================== 


def initialize(account): 


    g.stock = '000300.SH' #设置交易标的为沪深300 指数 


    g.openprice = 0 #记录每天开盘价 


    g.Range = 0#记录每天的Range 值 


    #确定当天的买入价和卖出价 


    g.buyprice = 0  


    g.sellprice = 0 


    #上突破系数 


    g.k1 = 0.8 


    #下突破系数 


    g.k2 = 2 


    pass 


#================盘前运行================================== 


def before_trading_start(account, data): 


    date = get_last_datetime().strftime('%Y%m%d') 


    #获取Range 值 


    g.Range=dual_thust(g.stock,date) 


#==============盘中运行================================ 


def handle_data(account, data): 


    date=get_datetime().strftime('%H%M%S') 


    if date == '093100': 


        g.openprice=history(g.stock, ['open'], 1, '1m', False, 'pre', is_panel=1)['open'].iloc[0] 


        g.buyprice=g.openprice+g.Range*g.k1 


        g.sellprice=g.openprice-g.Range*g.k2 


    if len(list(account.positions))==0: 


        close=history(g.stock, ['close'], 1, '1m', False, 'pre', is_panel=1)['close'].iloc[0] 


        if close>g.buyprice: 


            order_target_percent(g.stock,1) 


    if len(list(account.positions))>0: 


        close=history(g.stock, ['close'], 1, '1m', False, 'pre', is_panel=1)['close'].iloc[0] 


        if close<g.sellprice: 


            order_target(g.stock,0) 


    pass 


#============Range 值计算======================= 


def dual_thust(stock,date): 


    price = get_price(stock,None ,date ,'1d',['close','open','low','high'], False,'pre', 1 ,is_panel=0) 


    hc = price['high'].iloc[-1]-price['close'].iloc[-1] 


    cl = price['close'].iloc[-1]-price['low'].iloc[-1] 


    Range = max(hc,cl) 


    return Range 




----------------------- Page 88-----------------------
阅读更多

更多精彩内容