分享

一个短线日内交易策略 - R-Breaker

 量化布道者 2020-05-11

R-Breaker是一种短线日内交易策略,该策略已经在市场上存活了二十年之久,尤其当指数波动较大时,该策略表现越好,根据S&P至2011年底的统计,R-Break也多次名列前十,由于进入榜单的交易系统业绩并不稳定,尤其是一年业绩榜单,时常会发生变化,因此模型的稳定性和一致性其实比短期排名更加关键,杂志给出了长期来看一致性最好的十大交易模型,其中就包括 R-Breaker 等模型,它们的业绩不一定总是能排进前十名的榜单,但长期以来具有较高的一致性。

0_1587973766392_360截图20200427154851568.jpg

资料来源:https://blog.csdn.net/The_Time_Runner/article/details/88762963

策略逻辑:日内突破与反转会获得盈利

策略内容

根据前一个交易日的收盘价、最高价和最低价数据通过一定方式计算出六个价位,从大到小依次为:

突破买入价、观察卖出价、反转卖出价、反转买入、观察买入价、突破卖出价。以此来形成当前交易

日盘中交易的触发条件。

追踪盘中价格走势,实时判断触发条件。具体条件如下:

突破:

在空仓条件下,如果盘中价格超过突破买入价,则采取趋势策略,即在该点位开仓做多。

在空仓条件下,如果盘中价格跌破突破卖出价,则采取趋势策略,即在该点位开仓做空。

反转:

持多单,当日内最高价超过观察卖出价后,盘中价格出现回落,且进一步跌破反转卖出价构成的支撑线时,采取反转策略,即在该点位反手做空。

持空单,当日内最低价低于观察买入价后,盘中价格出现反弹,且进一步超过反转买入价构成的阻力线时,采取反转策略,即在该点位反手做多。

设定止损条件。当亏损达到设定值后,平仓。

资金管理:一次买入一手

风险控制:无

源代码

# coding=utf-8

from __future__ import print_function, absolute_import

import pandas as pd

from gm.api import *

from datetime import datetime

"""

R-Breaker是一种短线日内交易策略

根据前一个交易日的收盘价、最高价和最低价数据通过一定方式计算出六个价位,从大到小依次为:

突破买入价、观察卖出价、反转卖出价、反转买入、观察买入价、突破卖出价。以此来形成当前交易

日盘中交易的触发条件。

追踪盘中价格走势,实时判断触发条件。具体条件如下:

突破

在空仓条件下,如果盘中价格超过突破买入价,则采取趋势策略,即在该点位开仓做多。

在空仓条件下,如果盘中价格跌破突破卖出价,则采取趋势策略,即在该点位开仓做空。

反转

持多单,当日内最高价超过观察卖出价后,盘中价格出现回落,且进一步跌破反转卖出价构成的支撑线时,采取反转策略,即在该点位反手做空。

持空单,当日内最低价低于观察买入价后,盘中价格出现反弹,且进一步超过反转买入价构成的阻力线时,采取反转策略,即在该点位反手做多。

设定止损条件。当亏损达到设定值后,平仓。

选用了SHFE的rb2010 在2019-10-1 15:00:00 到 2020-04-16 15:00:00 进行回测。

注意: 

1:为回测方便,本策略使用了on_bar的一分钟来计算,实盘中可能需要使用on_tick。

2:实盘中,如果在收盘的那一根bar或tick触发交易信号,需要自行处理,实盘可能不会成交。

3:本策略使用在15点收盘时全平的方式来处理不持有隔夜单的情况,实际使用中15点是无法平仓的。

"""

# 策略中必须有init方法

def init(context):

    # 设置交易品种

    context.symbol = 'SHFE.rb'

    # 设置止损点数

    context.stopLossPrice = 50

    # 获取当时的主力合约

    startDate = datetime.strptime(context.backtest_start_time, '%Y-%m-%d %H:%M:%S').date()

    continuous_contract = get_continuous_contracts(context.symbol, startDate, startDate)

    context.mainContract = continuous_contract[0]['symbol']

    # 订阅行情

    subscribe(continuous_contract[0]['symbol'], frequency='60s', count=1)

    schedule(schedule_func=algo, date_rule='1d', time_rule='8:50:00')

def algo(context):

    # 检查主力和约,发生变化则更换订阅

    contractInfo = get_continuous_contracts(context.symbol, context.now.date(), context.now.date())

    if context.mainContract != contractInfo[0]['symbol']:

        context.mainContract = contractInfo[0]['symbol']

        subscribe(context.mainContract, frequency='60s', count=1, unsubscribe_previous=True)

        return  # 这一根bar不判断。

    # 获取历史数据

    data = history_n(symbol=context.mainContract, frequency='1d',

                         end_time=context.now, fields='high,low,open,symbol,close', count=2, df=True)

    high = data.high.iloc[0]  # 前一日的最高价

    low = data.low.iloc[0]  # 前一日的最低价

    close = data.close.iloc[0]  # 前一日的收盘价

    pivot = (high + low + close) / 3  # 枢轴点

    context.bBreak = high + 2 * (pivot - low)  # 突破买入价

    context.sSetup = pivot + (high - low)  # 观察卖出价

    context.sEnter = 2 * pivot - low  # 反转卖出价

    context.bEnter = 2 * pivot - high  # 反转买入价

    context.bSetup = pivot - (high - low)  # 观察买入价

    context.sBreak = low - 2 * (high - pivot)  # 突破卖出价

    context.data = data

def on_bar(context, bars):

    # 获取止损价

    STOP_LOSS_PRICE = context.stopLossPrice

    bBreak = context.bBreak

    sSetup = context.sSetup

    sEnter = context.sEnter

    bEnter = context.bEnter

    bSetup = context.bSetup

    sBreak = context.sBreak

    data = context.data

    # 获取现有持仓 返回的是一个list的各种合约的持仓对象 详见

    # https://www./docs/python/python_object_trade#Position%20-%20%E6%8C%81%E4%BB%93%E5%AF%B9%E8%B1%A1

    position_long = context.account().position(symbol=context.symbol, side=PositionSide_Long)

    position_short = context.account().position(symbol=context.symbol, side=PositionSide_Short)

    # 突破:

    if not position_long and not position_short:  # 空仓条件

        if bars[0].close > bBreak:

            # 在空仓的情况下,如果盘中价格超过突破买入价,

            # 则采取趋势策略,即在该点位开仓做多

            print(context.now)

            print("空仓,盘中价格超过突破买入价: 开仓做多")

            order_volume(symbol=context.mainContract, volume=1, side=OrderSide_Buy,

                         order_type=OrderType_Market, position_effect=PositionEffect_Open)  # 做多

            context.open_position_price = bars[0].close

        elif bars[0].close < sBreak:

            # 在空仓的情况下,如果盘中价格跌破突破卖出价,

            # 则采取趋势策略,即在该点位开仓做空

            print(context.now)

            print("空仓,盘中价格跌破突破卖出价: 开仓做空")

            order_volume(symbol=context.mainContract, volume=1, side=OrderSide_Sell,

                         order_type=OrderType_Market, position_effect=PositionEffect_Open)  # 做空

            context.open_position_price = bars[0].close

    #反转。

    else:  # 有持仓。

        # 开仓价与当前行情价之差大于止损点则止损

        if (position_long and context.open_position_price - bars[0].close >= STOP_LOSS_PRICE) or \

                (position_short and bars[0].close - context.open_position_price >= STOP_LOSS_PRICE):

            print(context.now)

            print('止损')

            order_close_all()  # 平仓

        # 反转:

        if position_long:  # 多头持仓

            if  data.high.iloc[1] > sSetup and bars[0].close < sEnter:

                # 多头持仓,当日内最高价超过观察卖出价后,

                # 盘中价格出现回落,且进一步跌破反转卖出价构成的支撑线时,

                # 采取反转策略,即在该点位反手做空

                print(context.now)

                print("多头持仓,当日内最高价超过观察卖出价后跌破反转卖出价: 反手做空")

                order_close_all()  # 平仓

                order_volume(symbol=context.mainContract, volume=1, side=OrderSide_Sell,

                             order_type=OrderType_Market, position_effect=PositionEffect_Open)  # 做空

                context.open_position_price = bars[0].close

        elif position_short:  # 空头持仓

            if data.low.iloc[1] < bSetup and bars[0].close > bEnter:

                # 空头持仓,当日内最低价低于观察买入价后,

                # 盘中价格出现反弹,且进一步超过反转买入价构成的阻力线时,

                # 采取反转策略,即在该点位反手做多

                print(context.now)

                print("空头持仓,当日最低价低于观察买入价后超过反转买入价: 反手做多")

                order_close_all()  # 平仓

                order_volume(symbol=context.mainContract, volume=1, side=OrderSide_Buy,

                             order_type=OrderType_Market, position_effect=PositionEffect_Open)  # 做多

                context.open_position_price = bars[0].close

    # 15点收盘全部平仓。

    if context.now.hour == 15:

        print(context.now)

        print('close all')

        order_close_all()

if __name__ == '__main__':

    run(strategy_id='d6b63b57-8826-11ea-b2b5-0a0027000006',

        filename='main.py',

        mode=MODE_BACKTEST,

        token='{{token}}',

        backtest_start_time='2019-10-1 15:00:00',

        backtest_end_time='2020-04-16 15:00:00')

最终回测结果:如下

声明:本文观点仅供交流探讨,不够成任何投资建议!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多