1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 十大经典策略之一 - Dual Thrust策略(期货)

十大经典策略之一 - Dual Thrust策略(期货)

时间:2019-09-24 18:10:48

相关推荐

十大经典策略之一 - Dual Thrust策略(期货)

Dual Thrust是一个趋势跟踪系统,由Michael Chalek在20世纪80年代开发,曾被Future Thruth杂志评为最赚钱的策略之一。Dual Thrust系统具有简单易用、适用度广的特点,其思路简单、参数很少,配合不同的参数、止盈止损和仓位管理,可以为投资者带来长期稳定的收益,被投资者广泛应用于股票、货币、贵金属、债券、能源及股指期货市场等。

策略逻辑:日内突破可以获得盈利

策略内容:计算前N天的最高价-收盘价和收盘价-最低价。然后取这2N个价差的最大值,乘以k值。把结果称为触发值。在今天的开盘,记录开盘价,然后在价格超过上轨(开盘+触发值)时马上买入,或者价格低于下轨(开盘-触发值)时马上卖空。没有明确止损。这个系统是反转系统,也就是说,如果在价格超过(开盘+触发值)时手头有空单,则平空开多。同理,如果在价格低于(开盘-触发值)时手上有多单,则平多开空。

资金管理:一次买入一手

风险控制:无

源代码

# coding=utf-8from __future__ import print_function, absolute_importfrom gm.api import *"""Dual Thrust是一个趋势跟踪系统计算前N天的最高价-收盘价和收盘价-最低价。然后取这2N个价差的最大值,乘以k值。把结果称为触发值。在今天的开盘,记录开盘价,然后在价格超过上轨(开盘+触发值)时马上买入,或者价格低于下轨(开盘-触发值)时马上卖空。没有明确止损。这个系统是反转系统,也就是说,如果在价格超过(开盘+触发值)时手头有空单,则平空开多。同理,如果在价格低于(开盘-触发值)时手上有多单,则平多开空。选用了SHFE的rb 在-02-07 15:00:00 到 -04-15 15:00:00' 进行回测。注意: 1:为回测方便,本策略使用了on_bar的一分钟来计算,实盘中可能需要使用on_tick。2:实盘中,如果在收盘的那一根bar或tick触发交易信号,需要自行处理,实盘可能不会成交"""# 策略中必须有init方法def init(context):""" init函数是在策略开始运行时被调用,进行初始化工作的函数"""# 设置要进行回测的合约 合约名称写法详见 /docs/python/python_concept#44e233ec21d880c2# 或者可以在掘金终端的仿真交易中输入这个代码看是否查询的是需要的标的context.symbol = 'SHFE.rb' # 订阅&交易标的, 此处订阅的是上期所的螺纹钢 # 设置参数。context.N = 5context.k1 = 0.2context.k2 = 0.2# 订阅行情 第一个参数是标的, 第二个是时间周期,表示日线,第三个指指定设置count参数,表示需要的滑窗大# 详见 /docs/python/python_subscribe#15ad56f8be8519c0# 只需要最新价,所以只需要订阅一个, 如果用tick,次数太多,用一分钟线代替subscribe(symbols=context.symbol, frequency='60s', count=1)schedule(schedule_func=algo, date_rule='1d', time_rule='8:50:00')def algo(context):# 获取历史的n条信息,data是一个pandas的DataFrame详见# /docs/python/python_select_api#6fb030ec42984affdata = history_n(symbol=context.symbol, frequency='1d', end_time=context.now,fields='symbol,open,high,low,close', count=context.N + 1, df=True)# 获取当天的开盘价current_open = data.open.loc[0]# 去掉当天的实时数据data.drop(context.N, inplace=True)# 计算Dual Thrust 的上下轨HH = data.high.max()HC = data.close.max()LC = data.close.min()LL = data.close.min()range = max(HH - LC, HC - LL)context.buy_line = current_open + range * context.k1 # 上轨context.sell_line = current_open - range * context.k2 # 下轨def on_bar(context, bars):"""当init中subscribe订阅过的标的有新tick的时候,on_tick 会被调用,用来处理计算和交易下单逻辑详见 /docs/python/python_data_event#b198d6b609adb1d4:context 是在多个函数直接传递变量的全局变量,所有的数据都可以通过context来传递:tick 是当前触发on_tick的tick。参考/docs/python/python_object_data#29852bf1b0fd29bb"""# 取出订阅的这一分钟的barbar = bars[0]buy_line = context.buy_linesell_line = context.sell_line# 获取现有持仓 返回的是一个list的各种合约的持仓对象 详见# /docs/python/python_object_trade#Position%20-%20%E6%8C%81%E4%BB%93%E5%AF%B9%E8%B1%A1position_long = context.account().position(symbol=context.symbol, side=PositionSide_Long)position_short = context.account().position(symbol=context.symbol, side=PositionSide_Short)# 交易逻辑部分if bar.close > buy_line:if position_long: # 已经持有多仓,直接返回returnelif position_short: # 已经持有空仓,平仓再做多。order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,order_type=OrderType_Market, position_effect=PositionEffect_Close)order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,order_type=OrderType_Market, position_effect=PositionEffect_Open)else: # 没有持仓。order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,order_type=OrderType_Market, position_effect=PositionEffect_Open)elif bar.close < sell_line:if position_long: # 已经持有多仓, 平多再开空。order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,order_type=OrderType_Market, position_effect=PositionEffect_Close)order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,order_type=OrderType_Market, position_effect=PositionEffect_Open)elif position_short: # 已经持有空仓,直接返回。returnelse: #没有持仓。order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell,order_type=OrderType_Market, position_effect=PositionEffect_Open)if __name__ == '__main__':'''strategy_id策略ID,由系统生成filename文件名,请与本文件名保持一致mode实时模式:MODE_LIVE回测模式:MODE_BACKTESTtoken绑定计算机的ID,可在系统设置-密钥管理中生成backtest_start_time回测开始时间backtest_end_time回测结束时间backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POSTbacktest_initial_cash回测初始资金backtest_commission_ratio回测佣金比例backtest_slippage_ratio回测滑点比例'''run(strategy_id='strategy_id',filename='main.py',mode=MODE_BACKTEST,token='token_id',backtest_start_time='-02-07 15:00:00',backtest_end_time='-04-15 15:00:00',backtest_initial_cash=10000,backtest_commission_ratio=0.0001,backtest_slippage_ratio=0.0001)

最终回测结果

该策略在一个较短的回测期内获得了正的收益。

声明:本文观点仅供交流探讨,不构成任何投资建议,否则后果自负!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。