分形交易策略真的有效吗?基于Backtrader进行量化回测

01

引言

在复杂多变的金融市场中,投资者和交易者不断寻求高效且可靠的方法来预测市场趋势和作出交易决策。分形交易策略,作为一种基于数学分形理论的交易方法,近年来在股票市场上引起了广泛关注。这种策略不仅仅是一个技术分析工具,它深入挖掘市场数据的内在模式,试图捕捉市场波动中的重复模式

分形理论由著名数学家本诺特·曼德布罗特提出,其核心思想是在不同时间尺度下寻找市场价格行为的重复性。在A股市场,这种方法的应用显得尤为重要,因为市场不仅呈现出高度的波动性,而且还受到各种宏观经济政策、行业发展趋势和投资者情绪的影响。通过运用分形交易策略,交易者可以更好地识别和利用这些复杂模式,从而做出更为明智的投资决策。

然而,虽然分形交易策略在理论上具有吸引力,但在实际应用中需要谨慎对待。市场的随机性和不确定性要求交易者在应用此策略时,结合其他分析工具和风险管理方法,以确保策略的有效性和可靠性。

本文使用qstock获取A股数据,构建简单的分形交易策略,并基于backtrader进行历史回测,为大家学习分形交易策略提供参考。

02

分形交易策略简介

核心概念

(1)分形(Fractal):分形是一种复杂的几何形状,可以分割成数个较小且相似的部分。在交易中,分形指的是重复出现的价格模式或形状。

(2)分形模式:通常由五根连续的蜡烛图组成,其中第三根蜡烛图代表了局部的最高点或最低点。

(3)自相似性:分形的一个关键特性是自相似性,意味着无论在何种时间尺度下,市场行为中都有可能出现类似的分形模式。

交易策略应用
(1)识别交易信号:在分形交易策略中,一个完整的分形模式通常被视为潜在的交易信号。例如,向上的分形可能预示着价格上涨,而向下的分形可能预示着价格下跌。

(2)结合趋势线和其他指标:为了提高准确性,分形交易策略通常与趋势线、移动平均线、振荡指标等技术分析工具结合使用。

(3)风险管理:与任何交易策略一样,使用分形交易策略时,合适的风险管理至关重要。这包括设置止损点和合理的风险收益比。

分形交易策略的优点
(1)适用性广:分形模式在各种市场和时间框架中都可能出现。

(2)简单易懂:分形模式相对容易识别和执行。

(3)多功能:可以用于趋势交易、反转交易以及范围交易。

分形交易策略的缺点
(1)假信号:市场噪音和其他因素可能导致假的分形信号。

(2)需要确认:单一的分形模式通常不足以触发交易决策,需要其他指标进行确认。

(3)市场条件:分形模式在趋势明确或波动性高的市场中效果更好。在无方向或低波动性的市场中可能效果不佳。

在动态且多变的中国A股市场中,分形交易策略可以帮助投资者识别短期和中期的市场波动模式。然而,由于A股市场的独特性,如政策影响和市场情绪波动,投资者应结合市场的具体情况,灵活运用分形交易策略。

03

策略回测示例

下面使用日线数据,构建简单的分形交易策略,并基于backtrader框架进行历史回测,主要的策略逻辑为:

  • 分形高点:在一组连续的交易日(周期)中,如果某一天的最高价高于前几天和后几天的最高价,那么这一天就是一个分形高点。

  • 分形低点:在一组连续的交易日(周期)中,如果某一天的最低价低于前几天和后几天的最低价,那么这一天就是一个分形低点。

分形的周期数必须是奇数,以便能够找到中间的一天作为分形高点或低点。通常,周期数为5或7。

  • 买入信号:当价格突破一个分形高点时,生成一个买入信号。

  • 卖出信号:当价格跌破一个分形低点时,生成一个卖出信号。

完整Python代码如下:

import qstock as qs
import backtrader as bt
# 创建策略
class FractalStrategy(bt.Strategy):
    params = (
        ('period', 7),  # 分形周期(必须是奇数,通常为5或7)
    )

    def __init__(self):
        self.fractal_high = bt.indicators.Highest(self.data.high, period=self.params.period)
        self.fractal_low = bt.indicators.Lowest(self.data.low, period=self.params.period)

    def next(self):
        cash = self.broker.get_cash()  # 获取当前现金余额
        size = int(cash / self.data.close[0])  # 计算最大可买入数量
        size = (size // 100) * 100  # 只购买100股的整数倍

        # 检查是否涨停或跌停
        if self.data.close[0] >= self.data.close[-1] * 1.1:
            is_limit_up = True
        elif self.data.close[0] <= self.data.close[-1] * 0.9:
            is_limit_down = True
        else:
            is_limit_up = False
            is_limit_down = False

        # 分形买入条件
        if (self.data.high[-2] == self.fractal_high[-2] and self.data.close > self.fractal_high[-2] and not is_limit_up):
            self.buy(size=size)  # 使用全部资金买入,但避免涨停

        # 分形卖出条件
        if (self.data.low[-2] == self.fractal_low[-2] and self.data.close < self.fractal_low[-2] and not is_limit_down):
            self.sell(size=self.position.size)  # 卖出所有持仓,但避免跌停

上述策略代码模拟A股市场交易,首先计算可用资金和购买数量,只购买100股的整数倍。然后检查当前价格是否涨停(即当天价格比前一天高出10%,创业板和科创板的20%可以另行设置)。如果市场未涨停且满足分形买入条件(当前高点等于过去period天的最高点且当前收盘价高于这个最高点),则执行买入操作。同样的,在判断卖出条件时,先检查当前价格是否跌停(即当天价格比前一天低10%)。如果市场未跌停且满足分形卖出条件(当前低点等于过去period天的最低点且当前收盘价低于这个最低点),则执行卖出操作。

这个策略试图通过识别市场价格图表中的分形模式来捕捉趋势的转变点,同时考虑了市场的涨停和跌停情况,避免在这些极端情况下操作,增加了策略的现实适用性。策略里采用全部资金买入和卖出所有持仓的做法较为激进,这可能会导致较高的风险,当然这里仅供示例参考。值得注意的是,分形交易策略基于历史数据模式的重复性,但市场条件可能随时变化,因此需要谨慎应用。

上述示例策略没有包含止损或其他风险管理措施,实际应用时可能需要添加这些要素来控制风险,实际交易中还应考虑交易成本、滑点等因素。下面直接使用qstock的一行代码给出回测结果(注意,下面的bt_result函数只有知识星球版的qstock才有),本示例直接使用上证指数2000年至2023年的日线数据。

qs.bt_result(code='sh',start='20000101',end='20231212',strategy=FractalStrategy)

4e26e91b97679f80f8765eaddff4671f.jpeg

e28e5b5b85a3272a3b4379d7fbcdc5f9.jpeg

27644d567b342543a8d1aef73f56bc67.jpeg

82badf9d1dda50010621413b7eed1dd8.png

04

结语

分形交易策略,作为一种基于数学分形理论的交易方法,在A股市场的应用提供了一种独特而富有洞察力的视角。通过识别和利用市场价格图表中的重复模式,这一策略赋予交易者捕捉市场趋势和转变点的能力。然而,正如任何交易策略一样,分形交易策略并非没有风险。市场的不可预测性和复杂性要求交易者在应用此策略时保持谨慎,结合其他技术分析工具和稳健的风险管理措施。

在国内A股市场这样一个充满机遇与挑战的环境中,分形交易策略可以作为投资者决策工具箱中的一个有价值的工具。但投资者应意识到,没有任何策略能保证稳赚不赔,故而在追求收益的同时,更应注重风险控制,以保持持续和稳定的交易表现。未来,随着市场结构的演化和交易技术的进步,分形交易策略或将继续演变,为适应这个不断变化的市场提供更精细化的交易决策支持。

b788e57a96caa65c6e5a93864e4c1a3b.png

关于Python金融量化

a30771244201f93944a0cabcc084dddf.png

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取qstock源代码、30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、与博主直接交流、答疑解惑等。添加个人微信sky2blue2可获取八五折优惠。

932b5f2e73513ed2e5a668b5e2ebd261.jpeg

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值