• 量化交易学习(11) Aberration策略


    介绍

    指标

    Aberration策略是一个使用「布林格通道Bollinger Band」为主轴的交易策略,不同的是它采用突破上下轨道线的进出方式,而非一般认知的通道内交易,。当行情向上突破UpBand时我们就买进,而突破DnBand时我们则执行卖出动作。出场则都是以中轴的标准移动平均价「Ave」交叉做为出场。使用参数为34天的移动平均与2个标准差(2 与-2)计算的上下通道

    策略

    1. 使用布林带构建,UpBand(上轨)DowmBand(下轨) MidBand(中轨)
    2. 开仓
      K线下穿下轨,开空仓
      K线下穿下轨,开空仓
    3. 平仓
      最新价低于中线,多头清仓离场
      最新价高于中轨,空头清仓离场
    • 信号

    两条均线形成死叉入场(快sma<慢sam)
    两条均线形成金叉平仓 (快sma<慢sam)

    回测策略

    • 参数
    ItemVale
    数据BNBUSDT_30m
    时间2017.11.11 - 2022.07.08
    布林周期30
    收益率-86.83654500000011 %
    • 结果

    • 资产变化
      在这里插入图片描述

    • 年华率
      在这里插入图片描述
      在这里插入图片描述

    优化策略

    参数

    ItemVale
    数据BNBUSDT_30m
    时间2017.11.11 - 2022.07.08
    布林周期10
    收益率109.68%

    结果

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    其他数据集

    {
        "策略名称":"Aberration策略",
        "运行时间":"48.84811166922251分钟",
        "数据源":"D:\\work\\git\\TaderTools\\static\\data\\BNBUSDT_1h.csv",
        "收益率":"165.19129958199989 %",
        "参数":{
            "period":10.988958005280155
        }
    }
    {
        "策略名称":"Aberration策略",
        "运行时间":"48.84811166922251分钟",
        "数据源":"D:\\work\\git\\TaderTools\\static\\data\\BNBUSDT_1h.csv",
        "收益率":"165.19129958199989 %",
        "参数":{
            "period":10.988958005280155
        }
    }
    {
        "策略名称":"Aberration策略",
        "运行时间":"53.700539533297224分钟",
        "数据源":"D:\\work\\git\\TaderTools\\static\\data\\ETHUSDT_1h.csv",
        "收益率":"23.414935799999988 %",
        "参数":{
            "period":10.548191341467344
        }
    }
    {
        "策略名称":"Aberration策略",
        "运行时间":"8.078422665596008分钟",
        "数据源":"D:\\work\\git\\TaderTools\\static\\data\\ENSUSDT_1h.csv",
        "收益率":"8.427070899999999 %",
        "参数":{
            "period":112.53414200758499
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    代码

    策略代码

    import setting
    from strategy import *
    
    
    class AberrationStrategy(bt.Strategy):
        params = dict(
            period=30,  # 周期
            is_log=False
        )
    
        def log(self, txt, dt=None):
            if self.p.is_log:
                dt = dt or self.datas[0].datetime.date(0)
                print('%s,%s' % (dt.isoformat(), txt))
    
        def __init__(self):
            # 记录交易订单
            self.order = None
            # boll上轨
            self.top = bt.indicators.BollingerBands(period=self.p.period).top
            # boll下轨
            self.bot = bt.indicators.BollingerBands(period=self.p.period).bot
            # boll中轨
            self.mid = bt.indicators.BollingerBands(period=self.p.period).mid
    
            # 当前价格
            self.price = self.data.open
    
        def get_buy_unit(self):
            """
            每次交易购买的数量
            :return:
            """
            size = self.broker.getcash() / self.data.high[0] * 0.25
            if size == 0:
                size = 1
            return int(size)
    
        def next(self):
            # 如果订单为处理完成 继续处理
            if self.order:
                return
            # 没有持有仓位
            if not self.position:
                size = self.get_buy_unit()
                # K线下穿下轨,开空仓
                if self.price[0] > self.top[0]:
                    self.order = self.buy(size=size)  # 买入
                # K线下穿下轨,开空仓
                if self.price[0] < self.bot[0]:
                    self.order = self.sell(size=size)
    
            elif self.position.size > 0:
                # 在多头情况下,平仓条件
                if self.price[0] < self.bot[0]:
                    # 最新价低于中线,多头清仓离场
                    self.close()
            elif self.position.size < 0:
                # 在空头情况下,平仓条件
                if self.price[0] > self.top[0]:
                    # 最新价高于中线,空头清仓离场
                    self.close()
    
        def notify(self, order):
            if order.status in [order.Completed, order.Canceled, order.Margin]:
                if order.isbuy():
                    self.log('执行买入, %.2f' % order.executed.price)
                    self.order = None
                elif order.issell():
                    self.log('执行卖出, %.2f' % order.executed.price)
                    self.order = None
    
    
    def create_aberration_strategy(params=None):
        c = create_cerebro()
        if params is None:
            c.addstrategy(AberrationStrategy)
        else:
            c.addstrategy(AberrationStrategy,
                          period=int(params["period"]))
        return c
    
    
    if __name__ == '__main__':
        file_name = "ETHUSDT_30m.csv"
        path = setting.date_root_path + "\\" + file_name
        # 获取数据
        data = get_data(path)
        # # 优化策略
        space = dict(
            period=hp.uniform('period', 10, 500)
        )
        # op = Optimizer(data=data, space=space, create_strategy_func=create_aberration_strategy)
        # params = op.run()
        # # 对策略进行可视化分析
        # show_strategy(data, create_aberration_strategy, params=params, is_show=True)
        # 其他数据集的表现
        batch_optimizer(create_aberration_strategy, space=space,is_send_ding_talk=True)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99

    总结

    根据这个策略,表现不是十分亮眼,一看就是亏钱的策略,目前策略设置离场条件有问题,平仓位置的设置优化空间还是十分大的。

  • 相关阅读:
    五、hdfs常见权限问题
    初学Vue(全家桶)-第19天(vue3):计算属性、监视属性、vue3生命周期
    C++模拟OpenGL库——图形学状态机接口封装(一):用状态模式重构部分代码及接口定义
    GaussDB(分布式)实例故障处理
    PMP考试通关宝典-敏捷专题
    软件版本(release、stable、lastest)的区别
    js中高级部分知识点总结第二篇
    Windows 10 布置IP安全策略
    k8s集群安装——(二)部署Tomcat运行,扩容,删除
    06 tp6 的数据更新(改)及删除 《ThinkPHP6 入门到电商实战》
  • 原文地址:https://blog.csdn.net/weixin_43688870/article/details/126191429