一、引言

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)

results matching ""

    No results matching ""