双均线策略–量化交易经典之作(附Python完整代码)

引言

随着金融市场的不断发展和技术进步的推动,量化交易作为一种数据驱动、模型化决策的交易方式,已经成为现代金融市场不可或缺的一部分。双均线策略,作为量化交易策略中的一种,其简洁性、直观性和易于实现性使其在投资者中广受欢迎。本文旨在深入探讨双均线策略的原理、实现方式以及在期货市场中的应用,并对其进行稳健性分析。

一、双均线策略原理

双均线策略的核心在于利用两条不同周期的均线来捕捉市场趋势。短期均线通常代表市场的短期波动,而长期均线则反映市场的长期趋势。当短期均线上穿长期均线时,被视为市场可能进入上升趋势的买入信号;而当短期均线下穿长期均线时,则被视为市场可能进入下降趋势的卖出信号。

二、策略实现步骤

  1. 数据获取与均线计算:首先,需要获取历史交易数据,并计算所选周期的短期和长期均线。例如,可以选择20周期和60周期的均线作为参考。

  2. 交易信号设置:根据均线的交叉情况设置交易信号。当短期均线上穿长期均线时,生成买入信号;当短期均线下穿长期均线时,生成卖出信号。

  3. 回测与优化:在历史数据上进行回测,评估策略的表现,并根据回测结果调整策略参数。例如,可以尝试调整均线周期、手续费率和滑点比率等参数,以优化策略性能。

  4. 双均线策略完成代码(Python代码)

# coding=utf-8from __future__ import print_function, absolute_importfrom gm.api import *import talib'''本策略以SHFE.rb2101为交易标的,根据其一分钟(即60s频度)bar数据建立双均线模型,短周期为20,长周期为60,当短期均线由上向下穿越长期均线时做空,当短期均线由下向上穿越长期均线时做多,每次开仓前先平掉所持仓位,再开仓。注:为了适用于仿真和实盘,在策略中增加了一个“先判断是否平仓成功再开仓”的判断逻辑,以避免出现未平仓成功,可用资金不足的情况。回测数据为:SHFE.rb2101的60s频度bar数据回测时间为:2020-04-01 09:00:00到2020-05-31 15:00:00'''def init(context):    context.short = 20                                             # 短周期均线    context.long = 60                                              # 长周期均线    context.symbol = 'SHFE.rb2101'                                 # 订阅交易标的    context.period = context.long + 1                              # 订阅数据滑窗长度    context.open_long = False                                      # 开多单标记    context.open_short = False                                     # 开空单标记    subscribe(context.symbol, '60s', count=context.period)         # 订阅行情def on_bar(context, bars):    # 获取通过subscribe订阅的数据    prices = context.data(context.symbol, '60s', context.period, fields='close')    # 利用talib库计算长短周期均线    short_avg = talib.SMA(prices.values.reshape(context.period), context.short)    long_avg = talib.SMA(prices.values.reshape(context.period), context.long)    # 查询持仓    position_long = context.account().position(symbol=context.symbol, side=1)    position_short = context.account().position(symbol=context.symbol, side=2)    # 短均线下穿长均线,做空(即当前时间点短均线处于长均线下方,前一时间点短均线处于长均线上方)    if long_avg[-2] < short_avg[-2] and long_avg[-1] >= short_avg[-1]:        # 无多仓情况下,直接开空        if not position_long:            order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell, position_effect=PositionEffect_Open,                        order_type=OrderType_Market)            print(context.symbol, '以市价单调空仓到仓位')        # 有多仓情况下,先平多,再开空(开空命令放在on_order_status里面)        else:            context.open_short = True            # 以市价平多仓            order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell, position_effect=PositionEffect_Close,                         order_type=OrderType_Market)            print(context.symbol, '以市价单平多仓')    # 短均线上穿长均线,做多(即当前时间点短均线处于长均线上方,前一时间点短均线处于长均线下方)    if short_avg[-2] < long_avg[-2] and short_avg[-1] >= long_avg[-1]:        # 无空仓情况下,直接开多        if not position_short:            order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy, position_effect=PositionEffect_Open,                         order_type=OrderType_Market)            print(context.symbol, '以市价单调多仓到仓位')        # 有空仓的情况下,先平空,再开多(开多命令放在on_order_status里面)        else:            context.open_long = True            # 以市价平空仓            order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy,                        position_effect=PositionEffect_Close, order_type=OrderType_Market)            print(context.symbol, '以市价单平空仓')def on_order_status(context, order):    # 查看下单后的委托状态    status = order['status']    # 成交命令的方向    side = order['side']    # 交易类型    effect = order['position_effect']    # 当平仓委托全成后,再开仓    if status == 3:        # 以市价开空仓,需等到平仓成功无仓位后再开仓        # 如果无多仓且side=2(说明平多仓成功),开空仓        if effect == 2 and side == 2 and context.open_short:            context.open_short = False            order_volume(symbol=context.symbol, volume=1, side=OrderSide_Sell, position_effect=PositionEffect_Open,                         order_type=OrderType_Market)            print(context.symbol, '以市价单调空仓到仓位')        # 以市价开多仓,需等到平仓成功无仓位后再开仓        # 如果无空仓且side=1(说明平空仓成功),开多仓        if effect == 2 and side == 1 and context.open_long:            context.open_long = False            order_volume(symbol=context.symbol, volume=1, side=OrderSide_Buy, position_effect=PositionEffect_Open,                         order_type=OrderType_Market)            print(context.symbol, '以市价单调多仓到仓位')if __name__ == '__main__':    '''    strategy_id策略ID,由系统生成    filename文件名,请与本文件名保持一致    mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST    token绑定计算机的ID,可在系统设置-密钥管理中生成    backtest_start_time回测开始时间    backtest_end_time回测结束时间    backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST    backtest_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='2020-04-01 09:00:00',        backtest_end_time='2020-05-31 15:00:00',        backtest_adjust=ADJUST_NONE,        backtest_initial_cash=10000000,        backtest_commission_ratio=0.0001,        backtest_slippage_ratio=0.0001)

三、双均线策略在期货市场的应用

图片

以SHFE.rb2101合约为例,我们进行了双均线策略的回测。在回测期间,我们设置了初始资金为3万,手续费率和滑点比率均为0.01%。回测结果显示,策略整体收益率为5.75%,年化收益率达到39.15%,同期沪深300指数收益率为5.22%,策略表现优于沪深300指数。然而,我们也注意到最大回撤达到了10.32%,这表明在追求高收益的同时,也需要关注风险管理。

四、稳健性分析

为了测试双均线策略的稳健性,我们对不同标的、不同回测期以及不同均线周期进行了调整。结果显示,策略在不同条件下的表现差异较大。这说明双均线策略在应用时需要谨慎,避免过拟合,并结合市场环境进行适当的调整。

五、结论与建议

双均线策略作为一种经典的量化交易策略,在期货市场中的应用显示出其有效性。然而,由于市场的复杂性和不确定性,投资者在使用双均线策略时需要注意以下几点:

  1. 风险管理:投资者需要关注策略的最大回撤和波动率等指标,确保在追求高收益的同时,不会承担过高的风险。
  2. 参数调整:投资者需要根据市场环境和个人风险偏好,适当调整策略参数,如均线周期、手续费率和滑点比率等。
  3. 结合其他指标:为了提高策略的稳健性,投资者可以考虑将双均线策略与其他技术指标或量化模型相结合,形成多策略交易系统。
  4. 不断学习与优化:量化交易是一个不断学习和优化的过程。投资者需要持续关注市场动态和技术发展,不断完善自己的交易策略和工具箱。

总之,双均线策略作为一种简单而有效的量化交易策略,在期货市场中具有广泛的应用前景。然而,投资者在使用时需要注意风险管理、参数调整以及结合其他指标等问题,以确保策略的稳定性和可持续性。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/106050
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 5天前
下一篇 5天前

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注