10分钟打造WonderTrader上的期货日内交易策略

10分钟打造WonderTrader上的期货日内交易策略

今天我们来用WonderTraderpython子框架wtpy来实际编写一个期货日内交易的策略。然后我们会先设定一组参数进行第一轮测试,再根据第一轮测试的结果,调整好参数以后,再进行第二轮测试。借此来演示一下wtpy中策略如何编写以及回测。

准备工作

或者直接下载whl文件到本地进行安装

阿里云镜像地址: mirrors.aliyun.com/pypi

pipy地址: pypi.org/project/wtpy/#

我们选用期货回测demo来作为基准的demo进行修改。

期货回测demo下载地址: github.com/wondertrader

我们直接使用demo中自带的股指期货主力合约5分钟数据进行回测,文件名为CFFEX.IF.HOT_m5.csv。为了提高测试效率,我们只选取最后近两个月时间的数据进行回测,具体为2019年9月10日到2019年10月31日。

股指期货主力合约2019年9月10日-2019年10月31日走势

2019年9月10日的开盘价为3976.2,2019年10月31日收盘价为3879.0,区间涨幅为-2.44%。

确定策略算法

我们选择比较经典的DualThrust作为我们策略的算法。一方面DualThrust流传了很久了,曾经有很多大机构都用这个模型获取到了足够多的收益;另一方面,DualThrust的算法复杂度比较低,比较适合我们作为演示策略来使用。


MAX(HH-LC,HC-LL),作为计算上下边界的基准值,用今日开盘价作为基准价,然后用上边界系数下边界系数,分别计算出上边界的价格和下边界的价格,当最新价突破上边界或者下边界的时候,就是我们发出信号的时候。 但是在策略的实现中,我们还需要考虑到已有持仓的时候如何处理,所以最终的策略逻辑如下:

策略实现

确定了策略的算法以后,我们需要确定策略模块的参数。参数的设置,要综合考虑策略本身的参数,以及模块使用的参数。最终我们确定了如下的参数:

from wtpy import BaseStrategy
from wtpy import Context

class StraDualThrust(BaseStrategy):

    def __init__(self, name:str, code:str, barCnt:int, period:str, days:int, k1:float, k2:float, isForStk:bool = False):
        BaseStrategy.__init__(self, name)

        self.__days__ = days
        self.__k1__ = k1
        self.__k2__ = k2

        self.__period__ = period
        self.__bar_cnt__ = barCnt
        self.__code__ = code

        self.__is_stk__ = isForStk

    def on_init(self, context:Context):
        code = self.__code__    #品种代码
        if self.__is_stk__:
            code = code + "Q"

        context.stra_get_bars(code, self.__period__, self.__bar_cnt__, isMain = True)
        context.stra_log_text("DualThrust inited")

    def on_calculate(self, context:Context):
        '''
        策略主调函数,所有的计算逻辑都在这里完成
        '''
        code = self.__code__    #品种代码
        
        # 交易单位,主要用于股票的适配
        trdUnit = 1
        if self.__is_stk__:
            trdUnit = 100

        #读取最近50条1分钟线(dataframe对象)
        theCode = code
        if self.__is_stk__:
            theCode = theCode + "Q"
        df_bars = context.stra_get_bars(theCode, self.__period__, self.__bar_cnt__, isMain = True)

        #把策略参数读进来,作为临时变量,方便引用
        days = self.__days__
        k1 = self.__k1__
        k2 = self.__k2__

        #平仓价序列、最高价序列、最低价序列
        closes = df_bars["close"]
        highs = df_bars["high"]
        lows = df_bars["low"]

        #读取days天之前到上一个交易日位置的数据
        hh = highs[-days:-1].max()
        hc = closes[-days:-1].max()
        ll = lows[-days:-1].min()
        lc = closes[-days:-1].min()

        #读取今天的开盘价、最高价和最低价
        lastBar = df_bars.iloc[-1]
        openpx = lastBar["open"]
        highpx = lastBar["high"]
        lowpx = lastBar["low"]

        '''
        !!!!!这里是重点
        1、首先根据最后一条K线的时间,计算当前的日期
        2、根据当前的日期,对日线进行切片,并截取所需条数
        3、最后在最终切片内计算所需数据
        '''

        #确定上轨和下轨
        upper_bound = openpx + k1* max(hh-lc,hc-ll)
        lower_bound = openpx - k2* max(hh-lc,hc-ll)

        #读取当前仓位
        curPos = context.stra_get_position(code)/trdUnit

        if curPos == 0:
            if highpx >= upper_bound:
                context.stra_enter_long(code, 1*trdUnit, 'enterlong')
                context.stra_log_text("向上突破%.2f>=%.2f,多仓进场" % (highpx, upper_bound))
                #修改并保存
                self.xxx = 1
                context.user_save_data('xxx', self.xxx)
                return

            if lowpx <= lower_bound and not self.__is_stk__:
                context.stra_enter_short(code, 1*trdUnit, 'entershort')
                context.stra_log_text("向下突破%.2f<=%.2f,空仓进场" % (lowpx, lower_bound))
                return
        elif curPos > 0:
            if lowpx <= lower_bound:
                context.stra_exit_long(code, 1*trdUnit, 'exitlong')
                context.stra_log_text("向下突破%.2f<=%.2f,多仓出场" % (lowpx, lower_bound))
                #raise Exception("except on purpose")
                return
        else:
            if highpx >= upper_bound and not self.__is_stk__:
                context.stra_exit_short(code, 1*trdUnit, 'exitshort')
                context.stra_log_text("向上突破%.2f>=%.2f,空仓出场" % (highpx, upper_bound))
                return

    def on_tick(self, context:Context, stdCode:str, newTick:dict):
        return

第一轮回测

我们采用股指期货主力合约5分钟K线进行回测,每次读取50条历史K线,用最近30条K线计算上下突破的边界,上边界系数初步定为0.1,下边界系数也初步定为0.1

第一轮回测绩效概览

然后打开成交日志文件,查看成交明细

第一轮成交明细1

……

第一轮成交明细2

从上面的绩效报告可以看出,在这组参数下,时间从2019年9月10日到2019年10月31日下午收盘截止,总共产生了370笔交易,即完整的开平370个回合,换算成成交的话,就是740次成交。

虽然交易次数很多,但是收益却很不理想,2个月不到的时间,50w的资金,总共亏损了近10w,约20%。从上面的截图,我们可以看到,在最后一笔出场的时候,总盈亏是4,980.00,也就是说策略的逻辑到最后是盈利的,但是盈利的金额很小。让我们再看一下每天结算的资金情况。

第一轮资金结算报表

从上图我们可以看到,2个月的时间,佣金一共花费了104,775.82,所以账户总盈亏是-99,795.82。这样我们就可以大致得出一个结论:因为上下边界不够宽,所以有很多噪音信号,也触发了买卖的逻辑,从而导致买卖频繁,佣金过高,最终导致亏损

第二轮回测

根据上一轮的结果分析,我们需要把上边界和下边界拓宽,从而过滤掉一些噪声波动,减少信号个数。所以我们第二轮回测,将上边界系数改成0.5,将下边界系数改成0.3

第二轮回测绩效概览
第二轮成交明细
第二轮资金结算报表

从第二轮的绩效报告可以看出,当边界拓宽以后,交易信号减少到了14个回合,但是交易收益却达到了24,060.00,约为第一轮收益的5倍,而佣金却只有1,453.02元,比第一轮的佣金低了两个量级。最终累计收益也由第一轮的-19.96%提升到盈利4.31%,相对于-2.44%的基准收益率,相对收益率达到6.75%。(这个算法对不对?:orz:)

结束语

上面演示了在WonderTrader上构建一个期货日内交易策略的基本过程。回测稳定以后,策略就可以不作任何修改的直接放到实盘里去运行了。希望能够对大家有所启发。

WonderTrader是我们团队刚刚开源的量化交易平台。文档和demo方便还有待完善,期待有更多的人来使用并提出宝贵意见。

最后再打一波广告:

WonderTradergithub地址: github.com/wondertrader

WonderTrader官网地址: https://wondertrader.github.io

装修网蚌埠家居装饰简装家装卫生间精装纯中式风格装修bbc精装70小户型装修110平米三室一厅简装效果图衢州装修装饰客厅背景墙装修2万元最简单装修蓉城装饰公司暴发户装修风格简装口红是什么意思装潢公司工装重庆100平米简装多少钱白云区装修公司哪家好彩带怎么装饰教室十大ktv装修公司镜子怎么装饰房子装修市场价格装修如何找客源一共多少种装修风格3d装修效果图自己简装出租常熟市有名的装修公司装饰整装设计武汉方林装修公司东家装修普通农村房子装修内部家装app排行榜香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声汪小菲曝离婚始末卫健委通报少年有偿捐血浆16次猝死单亲妈妈陷入热恋 14岁儿子报警雅江山火三名扑火人员牺牲系谣言手机成瘾是影响睡眠质量重要因素男子被猫抓伤后确诊“猫抓病”中国拥有亿元资产的家庭达13.3万户高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了男孩8年未见母亲被告知被遗忘张家界的山上“长”满了韩国人?倪萍分享减重40斤方法许家印被限制高消费网友洛杉矶偶遇贾玲何赛飞追着代拍打小米汽车超级工厂正式揭幕男子被流浪猫绊倒 投喂者赔24万沉迷短剧的人就像掉进了杀猪盘特朗普无法缴纳4.54亿美元罚金周杰伦一审败诉网易杨倩无缘巴黎奥运专访95后高颜值猪保姆德国打算提及普京时仅用姓名西双版纳热带植物园回应蜉蝣大爆发七年后宇文玥被薅头发捞上岸房客欠租失踪 房东直发愁“重生之我在北大当嫡校长”校方回应护栏损坏小学生课间坠楼当地回应沈阳致3死车祸车主疑毒驾事业单位女子向同事水杯投不明物质路边卖淀粉肠阿姨主动出示声明书黑马情侣提车了奥巴马现身唐宁街 黑色着装引猜测老人退休金被冒领16年 金额超20万张立群任西安交通大学校长王树国卸任西安交大校长 师生送别西藏招商引资投资者子女可当地高考胖东来员工每周单休无小长假兔狲“狲大娘”因病死亡外国人感慨凌晨的中国很安全恒大被罚41.75亿到底怎么缴考生莫言也上北大硕士复试名单了专家建议不必谈骨泥色变“开封王婆”爆火:促成四五十对测试车高速逃费 小米:已补缴天水麻辣烫把捣辣椒大爷累坏了

装修网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化