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

发布于:2023-01-28 ⋅ 阅读:(607) ⋅ 点赞:(0)

介绍

指标

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

策略

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

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

回测策略

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

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

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

优化策略

参数

Item Vale
数据 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
    }
}

代码

策略代码

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)

总结

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

本文含有隐藏内容,请 开通VIP 后查看