如何利用backtrader进行突破交易策略的量化回测

科技   2024-08-09 21:40   浙江  

插播:现在下载我们自己开发的 想读APP,阅读、学习文章更简单,点击查看想读安装使用说明。

以本文为例子,摘要如下:

01
引言

突破交易策略是一种受到交易者广泛采用的技术分析方法,特别是在金融市场中寻找明显的入场和出场点。这种策略基于一个核心前提:当资产价格超越之前设定的关键阻力或支撑水平时,通常会引发显著的价格运动,从而提供交易机会。突破可能预示着趋势的开始或现有趋势的加速,因此,它吸引了各种风格的交易者,包括日内交易者、摆动交易者以及趋势追随者。

成功的突破交易不仅依赖于识别这些关键水平的能力,还需要对市场情绪和动态有敏锐的洞察力。交易者需要评估突破的质量,并且在决定跟随还是反对突破动向时,必须考虑到成交量、历史价格行为和市场上的其他技术信号。此外,有效的风险管理策略——包括设定明确的止损点和合理的盈利目标——是实现突破交易成功的关键因素。

随着金融科技的进步,越来越多的交易者利用算法和自动化工具来优化他们的突破交易策略,以提高执行速度和精确度,从而增加在高度竞争的市场中获利的机会。在本文中,我们将深入探讨突破交易的各个方面,包括策略的构建、关键参数的设定、以及如何通过回测验证策略的有效性。

02
突破交易策略概述

突破交易策略是金融市场中常用的一种技术分析手段,尤其适用于寻找显著的市场动态变化和利用这些变化进行交易的机会。以下是关于如何实施和优化突破交易策略的几个关键点:

(1)策略核心:利用价格突破
突破交易策略的核心在于监测并利用证券价格超过历史上定义的支撑或阻力水平的情形。这种价格行为通常预示着强大的市场动力和潜在的趋势转变,为交易者提供进入市场的机会。例如,如果一个股票价格突破了长期的阻力水平,这可能表明市场情绪的积极变化,交易者会寻求在确认突破后买入股票。

(2)技术工具的应用:验证和执行
成功的突破交易不仅需要识别潜在的突破点,更关键的是要使用适当的技术工具来验证这些突破信号的真实性和强度。交易者常用的工具包括成交量指标和动量指标(如相对强弱指数RSI或移动平均收敛/发散MACD)。这些工具帮助交易者评估突破的强度和可能的持续时间。例如,一个有效的突破通常伴随着成交量的显著增加,这提供了额外的信号确认。

(3)风险管理:设定止损和目标价格
在任何交易策略中,尤其是在突破交易中,合理的风险管理是至关重要的。交易者需要设定明确的止损点,以防止潜在的市场逆转导致重大损失。同时,设定利润目标也同样重要,这可以通过预先计算突破点至关键支撑或阻力水平的距离来实现。例如,如果交易者在价格突破阻力水平后进场,他们可能会设置止损在该阻力水平之下的一定比例处,同时设定目标价格在下一个重要阻力水平之前。

(4)持续监控和策略调整
市场条件是多变的,有效的突破策略需要不断地调整和优化以适应这些变化。交易者应持续监控其交易位置和市场趋势,适时调整其交易策略。这包括在市场波动或经济数据发布时重新评估持仓,调整止损和利润目标。例如,在重大经济事件发生后,原有的支撑和阻力水平可能不再有效,需要根据新的市场信息调整交易策略。

(5)学习和适应
成功的交易者不断学习市场动态和自身策略的表现。通过分析过去的成功与失败,交易者可以更好地理解哪些策略在特定市场条件下效果最佳。此外,参与相关的培训和研讨会,以及与其他交易者的交流,都是提升交易技能和策略有效性的好方法。

03
策略量化回测

以下是一个简单的突破交易策略的Python代码示例,使用了pandas进行数据处理和backtrader库来执行回测。这个策略基于简单的价格突破规则,当价格超过过去一定天数的最高价时买入,低于过去一定天数的最低价时卖出。

import qstock as qs
import backtrader as bt
import pandas as pd
# 创建策略
class BreakoutStrategy(bt.Strategy):
    params = (
        ('lookback_days'20),  # 突破检测的回溯天数
    )

    def __init__(self):
        # 追踪过去价格的最高值和最低值
        self.highest = bt.indicators.Highest(self.data.close, period=self.params.lookback_days, plot=False)
        self.lowest = bt.indicators.Lowest(self.data.close, period=self.params.lookback_days, plot=False)

    def next(self):
        cash = self.broker.get_cash()
        value = self.broker.get_value()
        size = cash // (self.data.close[0] * 100) * 100
        if self.data.close[0] > self.highest[-1]:
            # 价格突破最高值,买入信号
            if not self.position:
                self.buy(size=size)
        elif self.data.close[0] < self.lowest[-1]:
            # 价格突破最低值,卖出信号
            if self.position:
                self.close()

注意,bt_result的调用方法只有知识星球会员版的qstock才有。普通版的qstock可以结合backtrader系列专题文章撰写回测函数。

qs.bt_result('中国平安',start='2014-01-01',end='2024-06-03',strategy=BreakoutStrategy)

为了使突破交易策略更加复杂并增加更细致的风险管理规则,考虑从以下几个方面来改进我们的策略:

  • 加入移动平均线:使用移动平均线作为过滤器,只在价格位于长期移动平均线之上时买入,位于之下时卖出。

  • 增加止损和止盈:设置固定的或动态的止损和止盈点。

  • 加入成交量确认:使用成交量指标(如VWAP或简单的成交量比较)来确认突破的有效性。

  • 设置仓位大小:根据账户余额和预设的风险管理规则动态计算每次交易的仓位大小。


class EnhancedBreakoutStrategy(bt.Strategy):
    params = (
        ('lookback_days'20),
        ('printlog'False),  # 是否打印交易记录
        ('ma_period'60),   # 移动平均线周期
        ('stop_loss_percent'0.15),  # 止损百分比
        ('lot_size'100)  # 每次交易的股票数量
    )

    def log(self, txt, dt=None):
        ''' 日志函数,用于记录交易执行情况 '''
        dt = dt or self.datas[0].datetime.date(0)
        if self.params.printlog:
            print('%s, %s' % (dt.isoformat(), txt))

    def __init__(self):
        self.highest = bt.indicators.Highest(self.data.close, period=self.params.lookback_days, plot=False)
        self.sma = bt.indicators.SimpleMovingAverage(self.data.close, period=self.params.ma_period, plot=True)

        # 添加一个变量跟踪订单
        self.order = None

        # 添加初始值为0的止损价
        self.stop_price = 0.0

    def notify_order(self, order):
        if order.status in [order.Submitted, order.Accepted]:
            # 订单提交或接受状态不需要采取行动
            return
        # 检查订单是否已完成
        # 注意:当前的示例策略中不存在未完成的订单
        if order.status in [order.Completed]:
            if order.isbuy():
                self.log('买单执行, %.2f' % order.executed.price)
            elif order.issell():
                self.log('卖单执行, %.2f' % order.executed.price)
            self.bar_executed = len(self)

        elif order.status in [order.Canceled, order.Margin, order.Rejected]:
            self.log('订单取消/保证金不足/拒绝')
        # 订单处理完成后无订单挂起
        self.order = None

    def next(self):
        if self.order:
            return

        if not self.position:  # 如果手上没有头寸
            if self.data.close[0] > self.highest[-1and self.data.close[0] > self.sma[0]:
                # 突破最高价且价格高于移动平均线,买入信号
                self.log('买入信号, %.2f' % self.data.close[0])
                cash = self.broker.get_cash()
                size = int(cash / self.data.close[0] // self.params.lot_size) * self.params.lot_size
                self.order = self.buy(size=size)
                self.buyprice = self.data.close[0]
                self.stop_price = self.buyprice * (1 - self.params.stop_loss_percent)
        else:
            # 添加止损
            if self.data.close[0] < self.stop_price:
                self.log('触发止损, %.2f' % self.data.close[0])
                self.order = self.close()

调用回测函数,仍然以中国平安个股为例,回测结果显示,年化回报率从8.7%提升至11%,但最大回撤却从-30%变成-50%,其他指标变化不大。

qs.bt_result('中国平安',start='2014-01-01',end='2024-06-03',strategy=EnhancedBreakoutStrategy)

04
结语

在金融市场的浪潮中,突破交易策略提供了一种独特的途径,使交易者能够识别并利用关键价格水平的动态变化。本文通过简单的一个突破交易策略示例,本文基于backtrader进行了量化回测,并进行了适当优化,旨在让读者了解该策略的技术基础、实施的复杂性,以及有效管理风险的重要性。然而,成功的突破交易不仅需要精确的市场分析和严格的策略执行,还需要对市场心理有深刻的理解和应对。

尽管突破交易策略在许多情况下可以非常有效,但它并非没有局限性。这种策略往往依赖于明确的价格突破,可能会在市场波动性较低或缺乏清晰趋势的条件下表现不佳。此外,假突破的风险也不容忽视,这可能导致交易者在未实际形成趋势的情况下进入市场,从而遭受损失。因此,对于使用突破交易策略的交易者来说,深入理解市场条件并结合其他分析工具来验证突破信号的真实性,是至关重要的。

随着市场环境的不断演化和交易技术的进步,交易者必须持续学习和适应,以维持其竞争优势。将突破交易策略与实时数据分析、自动化工具和综合风险管理相结合,可以显著提高决策的质量和交易的成效。

大家有什么自动化办公需求,欢迎在评论区评论,下期,我就帮你实现办公自动化,让工作更简单。

加入我们


扫码加我微信,回复:AI阅读
一起迎接AI时代
简说Python
号主老表,自学,分享Python,SQL零基础入门、数据分析、数据挖掘、机器学习优质文章以及学习经验。
 最新文章