今天是 :
您的位置: 网站首页 > AI量化 >

    经典的期货量化交易 双均线策略(期货)

    阅读次数:     发布时间:2024-06-18 01:53:00

     

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

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

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


    (图片来源于网络)

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

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

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

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

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

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

    回测数据: SHFE.rb2101的60s频度bar数据
    回测时间: 2020-04-01 到 2020-05-31
    回测初始资金:3万

     

    1. from __future__ import print_function, absolute_import
    2. import talib
    3.  
    4.  
    5. 本策略以SHFE.rb2101为交易标的,根据其一分钟(即60s频度)bar数据建立双均线模型,
    6. 当短期均线由下向上穿越长期均线时做多,每次开仓前先平掉所持仓位,再开仓。
    7. 回测数据为:SHFE.rb2101的60s频度bar数据
    8. '''
    9.  
    10.  
    11. context.short = 20 # 短周期均线
    12. context.symbol = 'SHFE.rb2101' # 订阅交易标的
    13. context.open_long = False # 开多单标记
    14. subscribe(context.symbol, '60s', count=context.period) # 订阅行情
    15.  
    16.  
    17. # 获取通过subscribe订阅的数据
    18. # 利用talib库计算长短周期均线
    19. long_avg = talib.SMA(prices.values.reshape(context.period), context.long)
    20.  
    21. position_long = context.account().position(symbol=context.symbol, side=1)
    22. # 短均线下穿长均线,做空(即当前时间点短均线处于长均线下方,前一时间点短均线处于长均线上方)
    23. # 无多仓情况下,直接开空
    24. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell, position_effect=PositionEffect_Open,
    25. print(context.symbol, '以市价单调空仓到仓位')
    26.  
    27. else:
    28. # 以市价平多仓
    29. order_type=OrderType_Market)
    30. # 短均线上穿长均线,做多(即当前时间点短均线处于长均线上方,前一时间点短均线处于长均线下方)
    31. # 无空仓情况下,直接开多
    32. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy, position_effect=PositionEffect_Open,
    33. print(context.symbol, '以市价单调多仓到仓位')
    34.  
    35. else:
    36. # 以市价平空仓
    37. position_effect=PositionEffect_Close, order_type=OrderType_Market)
    38. def on_order_status(context, order):
    39.  
    40. status = order['status']
    41.  
    42. side = order['side']
    43.  
    44. effect = order['position_effect']
    45.  
    46. if status == 3:
    47.  
    48. # 如果无多仓且side=2(说明平多仓成功),开空仓
    49. context.open_short = False
    50. order_type=OrderType_Market)
    51. # 以市价开多仓,需等到平仓成功无仓位后再开仓
    52. if effect == 2 and side == 1 and context.open_long:
    53. order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy, position_effect=PositionEffect_Open,
    54. print(context.symbol, '以市价单调多仓到仓位')
    55.  
    56.  
    57. '''
    58. filename文件名,请与本文件名保持一致
    59. token绑定计算机的ID,可在系统设置-密钥管理中生成
    60. backtest_end_time回测结束时间
    61. backtest_initial_cash回测初始资金
    62. backtest_slippage_ratio回测滑点比例
    63. run(strategy_id='strategy_id',
    64. mode=MODE_BACKTEST,
    65. backtest_start_time='2020-04-01 09:00:00',
    66. backtest_adjust=ADJUST_NONE,
    67. backtest_commission_ratio=0.0001,
    68. 4. 回测结果与稳健性分析

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

      根据上表可以看出,对于不同的标的、回测期、均线周期,双均线策略的收益情况差异较大。即使相同标的、相同均线周期,不同回测期收益情况也会出现较大差异。在应用时要注意风险管理,避免出现短期过拟合现象。 <p style="box-sizing: border-box; margin-top: 0px; margin-right: 0px; margin-left: 0px; color: rgb(51, 51, 51); font-family: " microsoft="" yahei",="" helvetica,="" "meiryo="" ui",="" "malgun="" gothic",="" "segoe="" "trebuchet="" ms",="" monaco,="" monospace,="" tahoma,="" stxihei,="" 华文细黑,="" stheiti,="" "helvetica="" neue",="" "droid="" sans",="" "wenquanyi="" micro="" hei",="" freesans,="" arimo,="" arial,="" simsun,="" 宋体,="" heiti,="" 黑体,="" sans-serif;="" font-size:="" 15.4px;="" margin-bottom:="" 0px="" !important;"="">注:此策略只用于学习、交流、演示,不构成任何投资建议。