介绍
指标
Aberration策略是一个使用「布林格通道Bollinger Band」为主轴的交易策略,不同的是它采用突破上下轨道线的进出方式,而非一般认知的通道内交易,。当行情向上突破UpBand时我们就买进,而突破DnBand时我们则执行卖出动作。出场则都是以中轴的标准移动平均价「Ave」交叉做为出场。使用参数为34天的移动平均与2个标准差(2 与-2)计算的上下通道
策略
- 使用布林带构建,UpBand(上轨)DowmBand(下轨) MidBand(中轨)
- 开仓
K线下穿下轨,开空仓
K线下穿下轨,开空仓- 平仓
最新价低于中线,多头清仓离场
最新价高于中轨,空头清仓离场
- 信号
两条均线形成死叉入场(快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 后查看