同花顺Supermind量化交易 风险控制建模-趋势跟踪交易-Dual Thrust

174 阅读4分钟

“趋势”这个字眼,大家肯定不陌生,炒股票的老股民天天口里说着“趋势为王”,那么今天我们向大家介绍一个趋势跟踪交易系统:Dual Thrust,其简单明确,适用度广。

第四篇:趋势跟踪交易系统—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+K1Range
2.SellLine = Open-K2
Range

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

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

  参考下图:

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

   1.计算Dual Thrust的 Range值时,N取1,即通过昨天的开高低收数据来计算出Range值。
2.K1与K2保持不对称性,介于A股市场大牛大熊轮回切换,且指数长期向上,因此取K1=0.8,K2=2。

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

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

需要用到的API函数功能
before_trading()定时运行函数,每个交易日9.00运行
handle_bar()定时运行函数,按交易日或按分钟运行
set_benchmark()设置基准指数
get_price()获取历史行情数据

二、代码示意图

三、编写释义

  注意本策略需分钟运行,考虑到分钟运行时运行速度较为关键,因此一些必要的数据:例如策略中的Range值,应该是盘前计算完毕,盘中直接使用,开盘价也只需要开盘第一分钟获取即可。如果盘中每分钟运行需要消耗较多的时间,则该策略实际运行时会错失下单价位。

四、最终结果

策略回测区间:2021.01.01-2022.12.31
回测资金:10000000
回测频率:分钟
回测结果:红色曲线为策略收益率曲线,蓝色曲线为对应的基准指数收益率曲线

策略源代码:

In [ ]:

import pandas as pd 
import numpy as np
# 初始化函数,全局只运行一次
def init(context):
    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
#每日开盘前9:00被调用一次,用于储存自定义参数、全局变量,执行盘前选股等
def before_trading(context):
    date = get_last_datetime().strftime('%Y%m%d')
    #获取Range值
    g.Range=dual_thust(g.stock,date)
## 开盘时运行函数
def handle_bar(context, bar_dict):
    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(context.portfolio.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(context.portfolio.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

查看以上策略详情请到supermind量化交易官网查看同花顺Supermind量化交易 风险控制建模-趋势跟踪交易-Dual Thrust