一、引言
Dual Thrust系统,具体参见。详解程序化交易Dual Thrust策略-雪球
使用第n-1日(前天)以前N天的数据计算Range,第n-1日(昨天)的开盘价作为Open,第n-1日的收盘价或第n日(今天)的开盘价作为当前价与上界(BuyLine)进行比较。当股票突破上界,则认为该股票今天有较大行情,买入该股票。卖出与止损写的比较随意。
二、Dual Thrust策略介绍
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 + K1_Range
(5)SellLine = Open + K2_Range
2.构造系统
(1)当价格向上突破上轨时,如果当时持有空仓,则先平仓,再开多仓;如果没有仓位,则直接开多仓;
(2)当价格向下突破下轨时,如果当时持有多仓,则先平仓,再开空仓;如果没有仓位,则直接开空仓;
关键变量的意义如下图所示:
三、本策略思路
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)