Dual Thrust 是一个趋势跟踪系统,由 Michael Chalek 在 20 世纪 80 年代开发,曾被 Future Thruth 杂志评为最赚钱的策略之一。
Dual Thrust 系统具有简单易用、适用度广的特点,其思路简单、参数很少,配合不同的参数、止盈止损和仓位管理,可以为投资者带来长期稳定的收益,被投资者广泛应用于股票、货币、贵金属、债券、能源及股指期货市场等。
在 Dual Thrust 交易系统中,对于震荡区间的定义非常关键,这也是该交易系统的核心和精髓。Dual Thrust 系统使用 Range = Max(HH-LC,HC-LL)来描述震荡区间的大小。其中 HH 是 N 日 High 的最高价,LC 是 N 日 Close 的最低价,HC 是 N 日 Close 的最高价,LL 是 N 日 Low 的最低价。
具体说:
1、首先计算:
(1)N 日 High 的最高价 HH, N 日 Close 的最低价 LC;
(2)N 日 Close 的最高价 HC,N 日 Low 的最低价 LL;
(3)Range = Max(HH-LC,HC-LL)
(4)BuyLine = Open + K1Range
(5)SellLine = Open + K2Range
2.构造系统
(1)当价格向上突破上轨时,如果当时持有空仓,则先平仓,再开多仓;如果没有仓位,则直接开多仓;
(2)当价格向下突破下轨时,如果当时持有多仓,则先平仓,再开空仓;如果没有仓位,则直接开空仓;
关键变量的意义如下图所示

3、本策略思路
(1)当股票突破上界(Buyline),则认为该股票今天有较大行情,买入该股票。
(2)当股价两天内下跌 6%,或者三天内下跌 8%则卖出股票。
(3)根据大盘止损,如果大盘下跌超过 3%则空仓。
源代码
def init(context):
context.stocks = ['中证500']
update_universe(context.stocks)
def handle_bar(context, bar_dict):
#stocknum = 50
his = history(10, '1d', 'close')['000001.XSHG']
#print(his)
if his[9]/his[8]< 0.97:
if len(context.portfolio.positions)>0:
for stock in context.portfolio.positions.keys():
order_target_percent(stock, 0)
return
# 分配资金
#if len(context.portfolio.positions) < stocknum:
#Num = stocknum - len(context.portfolio.positions)
#Cash = context.portfolio.cash/Num
#else:
#Cash = context.portfolio.cash
# Buy
for stock in context.stocks:
#求出持有该股票的仓位,买入没有持仓并符合条件股票
position = context.portfolio.positions[stock].quantity
print(stock)
#print(position)
if position < 100:
High = history(3, '1d', 'high')[stock]
Low = history(3, '1d', 'low')[stock]
Close = history(3, '1d', 'close')[stock]
Open = history(3, '1d', 'open')[stock]
#logger.info(High)
HH = max(High[:2])
LC = min(Close[:2])
HC = max(Close[:2])
LL = min(Low[:2])
Openprice = Open[2]
#logger.info(HH)
#print(LC)
#print(HC)
#print(LL)
#print(Openprice)
# 使用第n-1日的收盘价作为当前价
current_price = Close[2]
print(current_price,'price')
Range = max((HH-LC),(HC-LL))
K1 = 0.9
BuyLine = Openprice + K1*Range
#print(BuyLine,'buyline')
if current_price>BuyLine:
order_target_percent(stock, 1)
# Sell
for stock in context.portfolio.positions.keys():
hist = history(3, '1d', 'close')[stock]
case1 = (1-hist[2]/hist[0])>=0.06
case2 = hist[1]/hist[0] <= 0.92
if case1 or case2:
order_target_percent(stock, 0)
收益图
