PDF下载 下载

双均线策略(期货)

阅读 106255

双均线策略

1. 原理

均线的“前世今生”

均线,一个进行形态分析时总也绕不过去的指标。

均线最早由美国投资专家Joseph E.Granville(格兰威尔)于20世纪中期提出,现在仍然广泛为人们使用,成为判断买卖信号的一大重要指标。从统计角度来说,均线就是历史价格的平均值,可以代表过去N日股价的平均走势。

1962年7月,Joseph E.Granville在他的书中提出了著名的Granville八大买卖法则。只利用股价和均线即可进行择时,方法简单有效,一经提出,迅速受到市场追捧。尤其是其中的金叉和死叉信号,更是沿用至今。

Granville 八大法则其中有四条是用于判断买进时机,另外四条是用于判断卖出时机。买进和卖出法则一一对应,分布在高点的左右两侧(除买4和卖4以外)。法则内容如下所示:

买1:均线整体上行,股价由下至上上穿均线,此为黄金交叉,形成第一个买点。
买2:股价出现下跌迹象,但尚未跌破均线,此时均线变成支撑线,形成第二个买点。
买3:股价仍处于均线上方,但呈现急剧下跌趋势。当跌破均线时,出现第三个买点。
买4:(右侧)股价和均线都处于下降通道,且股价处于均线下方,严重远离均线,出现第四个买点。

卖1:均线由上升状态变为缓慢下降的状态,股价也开始下降。当股价跌破均线时,此为死亡交叉,形成第一个卖点。
卖2:股价仍处于均线之下,但股价开始呈现上涨趋势,当股价无限接近均线但尚未突破时,此时均线变成阻力线,形成第二个卖点。
卖3:股价终于突破均线,处于均线上方。但持续时间不长,股价开始下跌,直至再一次跌破均线,此为第三个卖点。
卖4:(左侧)股价和均线都在上涨,股价上涨的速度远快于均线上涨的速度。当股价严重偏离均线时,出现第四个卖点。
(部分资料来源于百度百科)


(图片来源于网络)

均线理论为什么有效?

Shiller(1981)在研究中发现,资产的长期价格呈现均值回复的特征,即从长期来看,资产的价格会回归均值。这也是均线理论被广泛应用的前提。

均线理论的缺陷

均线归根到底是一种平均值,平均值在应用过程中存在最大的问题就是其滞后性。当出现买入卖出信号时,最佳时机早已过去。举例来说,如果A股票最新价格出现了较大的涨幅,股价和均线都上涨,但均线的速度慢于股价上涨速度。此时,从形态上来看,金叉出现,为买入信号。次日,股价回调,股价下降的速度快于均线下降的速度,形成死叉,为卖点。这样一买一卖不仅没有盈利,反而出现亏损。

均线理论的改进

针对均线的缺点,市场上提出了各种各样的改进方法。

1.对均线的计算方法进行改正。

加权移动平均线是在移动平均线的基础上按照时间进行加权。越靠近当前日期的价格对未来价格的影响越大,赋予更大的权重;越远离当前日期价格,赋予越小的权重。

2.调整均线周期

利用不同周期均线得到的结果也不同。许多有经验的投资者发现,在不同的市场中,有些均线的效果显著优于其他周期均线。有些长线投资者还会将股价替换成短周期均线进行趋势判断。

2. 策略逻辑

第一步:获取数据,计算长短期均线
第二步:设置交易信号

当短期均线由上向下穿越长期均线时做空
当短期均线由下向上穿越长期均线时做多

回测数据: DCE.i1801的60s频度bar数据
回测时间: 2017-09-01 到 2017-09-30
回测初始资金:1000万

3. 策略代码

  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import
  3. from gm.api import *
  4. import talib
  5. '''
  6. 本策略以DCE.i1801为交易标的,根据其一分钟(即60s频度)bar数据建立双均线模型,
  7. 短周期为30,长周期为60,当短期均线由上向下穿越长期均线时做空,
  8. 当短期均线由下向上穿越长期均线时做多,每次开仓前先平掉所持仓位,再开仓。
  9. 回测数据为:DCE.i1801的60s频度bar数据
  10. 回测时间为:2017-09-01 09:00:00到2017-09-30 15:00:00
  11. '''
  12. def init(context):
  13. context.short = 30 # 短周期均线
  14. context.long = 60 # 长周期均线
  15. context.symbol = 'DCE.i1801' # 订阅交易标的
  16. context.period = context.long + 1 # 订阅数据滑窗长度
  17. subscribe(context.symbol, '60s', count=context.period) # 订阅行情
  18. def on_bar(context, bars):
  19. # 获取通过subscribe订阅的数据
  20. prices = context.data(context.symbol, '60s', context.period, fields='close')
  21. # 利用talib库计算长短周期均线
  22. short_avg = talib.SMA(prices.values.reshape(context.period), context.short)
  23. long_avg = talib.SMA(prices.values.reshape(context.period), context.long)
  24. # 短均线下穿长均线,做空(即当前时间点短均线处于长均线下方,前一时间点短均线处于长均线上方)
  25. if long_avg[-2] < short_avg[-2] and long_avg[-1] >= short_avg[-1]:
  26. # 以市价平多仓
  27. order_target_percent(symbol=context.symbol, percent=0, position_side=PositionSide_Long, order_type=OrderType_Market)
  28. print(context.symbol, '以市价单平多仓')
  29. # 以市价开空仓,需等到平仓成功后再开仓
  30. if context.status == 3:
  31. order_target_percent(symbol=context.symbol, percent=0.1, position_side=PositionSide_Short, order_type=OrderType_Market)
  32. print(context.symbol, '以市价单调空仓到仓位')
  33. # 短均线上穿长均线,做多(即当前时间点短均线处于长均线上方,前一时间点短均线处于长均线下方)
  34. if short_avg[-2] < long_avg[-2] and short_avg[-1] >= long_avg[-1]:
  35. # 以市价平空仓
  36. order_target_percent(symbol=context.symbol, percent=0, position_side=PositionSide_Short,order_type=OrderType_Market)
  37. print(context.symbol, '以市价单平空仓')
  38. # 以市价开多仓,需等到平仓成功后再开仓
  39. if context.status == 3:
  40. order_target_percent(symbol=context.symbol, percent=0.1, position_side=PositionSide_Long,order_type=OrderType_Market)
  41. print(context.symbol, '以市价单调多仓到仓位')
  42. # 用来获取委托汇报状态
  43. def on_order_status(context, order):
  44. context.status = order['status']
  45. if __name__ == '__main__':
  46. '''
  47. strategy_id策略ID,由系统生成
  48. filename文件名,请与本文件名保持一致
  49. mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  50. token绑定计算机的ID,可在系统设置-密钥管理中生成
  51. backtest_start_time回测开始时间
  52. backtest_end_time回测结束时间
  53. backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  54. backtest_initial_cash回测初始资金
  55. backtest_commission_ratio回测佣金比例
  56. backtest_slippage_ratio回测滑点比例
  57. '''
  58. run(strategy_id='strategy_id',
  59. filename='main.py',
  60. mode=MODE_BACKTEST,
  61. token='token_id',
  62. backtest_start_time='2017-09-01 09:00:00',
  63. backtest_end_time='2017-09-30 15:00:00',
  64. backtest_adjust=ADJUST_NONE,
  65. backtest_initial_cash=10000000,
  66. backtest_commission_ratio=0.0001,
  67. backtest_slippage_ratio=0.0001)

4. 回测结果与稳健性分析

设定初始资金100万,手续费率为0.01%,滑点比率为0.01%,得到的回测结果如下图:

策略整体收益率12.08%,同期沪深300收益率为0.16%,远远跑赢沪深300.最大回撤仅为3.51%。

为了探究该策略在不同回测期以及不同品种的适用情况,对策略进行调整。调整范围主要包括:标的、回测期、均线周期,调整结果如下表所示:

标的 回测期 均线周期 年化收益率 最大回撤
DCE.i1801 2017.09.01-2017.09.30 30/60 152.05% 3.51%
DCE.i1801 2017.10.01-2017.10.30 30/60 116.49% 4.06%
DCE.i1801 2017.11.01-2017.11.30 30/60 38.32% 4.41%
DCE.i1801 2017.12.01-2017.12.30 30/60 -94.02% 12.76%
DCE.i1801 2017.09.01-2017.09.30 10/60 -83.65% 13.29%
DCE.i1801 2017.09.01-2017.09.30 20/60 53.29% 4.42%
DCE.i1801 2017.09.01-2017.09.30 10/30 2.49% 5.60%
DCE.i1801 2017.09.01-2017.09.30 30/90 51.28% 4.29%
DCE.m1801 2017.09.01-2017.09.30 30/60 35.70% 2.51%
DCE.y1801 2017.09.01-2017.09.30 30/60 -58.52% 5.03%

根据上表可以看出,对于不同的标的、回测期、均线周期,双均线策略的收益情况差异较大。即使相同标的、相同均线周期,不同回测期收益情况也会出现较大差异。在应用时要注意风险管理,避免出现短期过拟合现象。

注:此策略只用于学习、交流、演示,不构成任何投资建议。

0 篇笔记