首页>文档>Python>【Python 入门策略(四)】 DualThrust

【Python 入门策略(四)】 DualThrust

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)当价格向下突破下轨时,如果当时持有多仓,则先平仓,再开空仓;如果没有仓位,则直接开空仓;

关键变量的意义如下图所示

【Python 入门策略(四)】 DualThrust

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)

收益图

【Python 入门策略(四)】 DualThrust
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧