96行代码玩转“布林强盗”策略(基于Ptrade)

乐游胡子
乐游胡子 任何事情都需要倾入热情。

0 People liked this article · 3653 views

老胡写在最开始

这两天,我 抽空用Ptrade写了一个布林强盗策略。该策略在衍生品市场久负盛名,大量趋势交易者长期使用它进行交易。很适合作为一个经典策略进行研究和复刻,我们通过学习和理解它的设计结构、思想,能够较深入地理解一个完整交易策略的出入场等多个方面,对提高策略整体理解力很有好处。


布林强盗策略 简介

布林强盗策略是一种备受推崇的趋势跟踪策略,它基于布林带原理设计。其核心思想是当价格移动到布林带的上轨或下轨附近后,预测价格将会回归到中轨,也就是将上轨作为压力位使用,下轨作为支撑位,用来判断市场走势的边界。布林强盗策略在实际操作中采用了一套规则。其中,价格超过X日移动平均线上方Y个标准差作为买进信号的标准,跌破X日移动平均线下方Y个标准差作为卖出信号的标准。持有头寸的时间每多一天,计算移动平均线的天数减一,但计算移动平均线的天数最小可以递减到Z,如果达到Z,则不再递减。这种策略还结合了自适应出场均线的概念,以提高交易效益。

布林强盗策略是一个中长线策略,适用于日线及以上的应用周期。它的表现与参数设置密切相关,投资者应根据自己的风险承受能力和交易经验,合理调整参数,以适应不同的市场环境。


我的写的这个布林强盗策略特点

特点一,入场部分

我采用了布林带原理,可以根据选定标的自身一段时间的波动程度来定义突破的边界,是一种动态的突破的方法,这种入场方式是一种非常典型的趋势策略方法, 布林强盗策略在十大经典策略中长期排名靠前,除了布林带的运用,我在策略中还增加了中长期日线均线的运用,相当于对策略的入场部分增加了趋势过滤,这里我算是简单做个示范动作 ,有兴趣的朋友可以考虑在这个部分进行深入研究调整成自己喜欢的过滤方法 ;

特点二,出场部分

我采用了三出场条件并行考量,既考虑了入场条件反转的情况,也考虑了跟踪止损,还考虑了极端情况下的保护性止损:

        A方面考虑了布林带下轨反向突破作为出场方法;

        B方面采用了自适应短期均线出场(自适应跟踪止损的一种方法);

        C方面考虑了以买入价格的百分比进行基础止损

特点三,多周期数据综合运用

策略使用1分钟的数据作为计算基础,结合了日线的数据作为辅助过滤,相当于是跨周期运用的一种范例。这种设计一方面考虑了Ptrade环境下的可回测性,另一方面考虑的实盘中对价格变化的追踪的敏感性(如果采用日线数据来回测最为简单,但是实际交易中很少会这么用,因为它太迟钝了,如果使用TICK数据虽然更加敏锐,但是回测就有比问题了);

特点四,自定义函数的运用

策略里采用了自定义日志记录小函数、跨日导出重要策略数据DF的小函数,对需要复用的一些功能函数化,可以使主体逻辑简洁明了;

特点五,基于实操的写法

熟悉我文章的朋友,知道我比较喜欢基于实操的场景来写东西。具体代码尽量简明实用,范例有考虑回测、实盘运行等方面。策略内细节较多,比如运用跨日判断来考虑,避免输出的内容超过65535行(超过一定值策略会报错),比如采用一些全局变量来控制打印日志频率避免人工检视的困难,比如大量注释关键操作,利于代码的阅读和理解。建议新手朋友可以仔细研究这些细节,必有裨益。当然,策略能不能盈利本身并不在我这里讨论的范围,因为一个策略最终能不能实盘盈利,需要考虑的因素非常多,比如所选标的是否适合,阶段性行情是否适合,入场出场的各种阈值设计是否合理,资金的管理和准备是否合适等等。


一个相对完善好用的策略相当于趁手的兵器,用好它将会成为你驰骋战场的好伙伴。


策略源码截图


回测日志打印截图


落地输出文件


输出的综合数据,图形化



List of attachments

范例006布林强盗.zip

57KB

58.58

线上付款

Published on 2024-03-25 16:52

Disclaimers:

This document is written by 乐游胡子 Original published on 百果量化交流平台 ,The copyright belongs to the author。

Log in,More exciting content waiting for you to find,Contribute wonderful answers,Participate in comment interaction

go Sign in! No accountgoregister

乐游胡子
2024-11-25 10:23
@6677 源代码第四行,那个就是申明了一个字符串常量,我用它作为路径使用的,你具体看下
6677
2024-11-14 17:19
@乐游胡子 老师你好!我对PTrade系统函数陌生,请指导如何修改路径常量?
乐游胡子
2024-11-12 10:26
@6677 猜你 路径常量没指定对
6677
2024-11-08 18:12
2024-11-08 18:03:53 开始运行回测, 策略名称: 布林测试 2024-08-02 15:00:00 - ERROR - 策略handle_data函数执行失败,错误原因:Traceback (most recent call last): File \fly_docker_py311/IQEngine/core/strategy/strategy.py\, line 188, in on_handle_data File \/home/fly/backtest/bfbceb3c-9db8-11ef-9d16-507c6f4b16dc/user_strategy.py\, line 43, in handle_data export_df(security, g.upper_band, g.lower_band, g.ma_short, g.ma_long, g.current_price, riqi_str) # 每次跨日就导出一次前日综合行情数据df ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \/home/fly/backtest/bfbceb3c-9db8-11ef-9d16-507c6f4b16dc/user_strategy.py\, line 95, in export_df df.to_excel(NOTEBOOK_PATH+ riqi_str+ \_\+ security[0:6]+ \_综合行情数据_布林策略.xls\,encoding=\utf-8\, index=True, header=True) # 导出DF ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \/usr/local/python3.11/lib/python3.11/site-packages/pandas/util/_decorators.py\, line 211, in wrapper return func(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^ File \/usr/local/python3.11/lib/python3.11/site-packages/pandas/util/_decorators.py\, line 183, in wrapper return func(args, kwargs) ^^^^^^^^^^^^^^^^^^^^^ File \/usr/local/python3.11/lib/python3.11/site-packages/pandas/core/generic.py\, line 2374, in to_excel formatter.write( File \/usr/local/python3.11/lib/python3.11/site-packages/pandas/io/formats/excel.py\, line 944, in write writer = ExcelWriter( # type: ignore[abstract] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \/usr/local/python3.11/lib/python3.11/site-packages/pandas/io/excel/_xlwt.py\, line 55, in __init__ super().__init__( File \/usr/local/python3.11/lib/python3.11/site-packages/pandas/io/excel/_base.py\, line 1313, in __init__ self._handles = get_handle( ^^^^^^^^^^^ File \/usr/local/python3.11/lib/python3.11/site-packages/pandas/io/common.py\, line 734, in get_handle check_parent_directory(str(handle)) File \/usr/local/python3.11/lib/python3.11/site-packages/pandas/io/common.py\, line 597, in check_parent_directory raise OSError(rf\Cannot save file a non-existent directory: \{parent}\\) OSError: Cannot save file a non-existent directory: \/home/fly/notebook/bolling\ During handling of the above exception, another exception occurred: Traceback (most recent call last): File \fly_docker_py311/IQEngine/core/strategy/strategy.py\, line 186, in on_handle_data File \fly_docker_py311/IQEngine/core/execution_context.py\, line 114, in __exit__ IQEngine.utils.exception.CustomException: Exception: Traceback (most recent call last): File /home/fly/backtest/bfbceb3c-9db8-11ef-9d16-507c6f4b16dc/user_strategy.py, line 43 in handle_data export_df(security, g.upper_band, g.lower_band, g.ma_short, g.ma_long, g.current_price, riqi_str) # 每次跨日就导出一次前日综合行情数据df --> context = security = \513050.SS\ --> history_price_mimute = close 2024-07-29 14:19:00 1.018 2024-07-29 14:20:00 1.018 2024-07-29 14:21:00 1.018 2024-07-29 14:22:00 1.019 2024-07-29 14:23:00 1.01 ... --> current_price = 0.993 --> history_price_day = close 2024-06-21 1.054
6677
2024-11-08 18:08
老师你好!应用了布林强盗代码,回测中一直出错,调整了多只股票和多种测试周期,都出现同样的错误提示,请问如何解决?
乐游胡子
2024-09-29 10:44
@1863919683 感觉应该是 路径常量对应问题,仔细检查一下绝对路径
fbhm835
2024-09-21 13:49
@1863919683 2024-09-02 10:48:00 - ERROR - 策略handle_data函数执行失败,错误原因:Traceback (most recent call last): File \fly_docker/IQEngine/core/strategy/strategy.py\, line 180, in on_handle_data File \/home/fly/backtest/cbe3e9b8-77db-11ef-b623-e484294816a4/user_strategy.py\, line 43, in handle_data export_df(security, g.upper_band, g.lower_band, g.ma_short, g.ma_long, g.current_price, riqi_str) # 每次跨日就导出一次前日综合行情数据df File \/home/fly/backtest/cbe3e9b8-77db-11ef-b623-e484294816a4/user_strategy.py\, line 95, in export_df df.to_excel(NOTEBOOK_PATH+ riqi_str+ \_\+ security[0:6]+ \_综合行情数据_布林策略.xls\,encoding=\utf-8\, index=True, header=True) # 导出DF
fbhm835
2024-09-21 13:48
怎么出现错误了
乐游胡子
2024-03-25 20:49
@1538346657 退出账号,退出浏览器,刷新试试先?
1538346657
2024-03-25 20:47
付了。下不来