“趋势”这个字眼,大家肯定不陌生,炒股票的老股民天天口里说着“趋势为王”,那么今天我们向大家介绍一个趋势跟踪交易系统: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-K2Range
第三步:交易系统(考虑到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