【vn.py】源码解析之布林通道(BollChannel)策略

article/2025/9/18 21:31:42

文章目录

        • Boll(布林线)指标
        • CCI(Commodity Channel Index)指标
        • 布林通道策略
        • 布林通道策略源码分析
          • 1、完整源码
          • 2、策略参数与变量
          • 3、策略执行逻辑

Boll(布林线)指标

布林线是一种金融衍生品价格走势图中常用的技术指标,由于其以上下两条线组成的带状区域显示,所以也称为布林带。带状区域的宽度随着价格的变动而变化,当价格幅度增大时,带状区域变宽;当价格幅度减小时,带状区域变窄。布林线在图形上表现为上中下三条线,其中,上下两条线可以分别看成是压力线支撑线,中间的线是N日的移动均线,通常情况下,价格的走势会在上下两条线之间。

Boll指标的计算如下:
1、计算N日收盘价的移动平均值MA
2、计算N日收盘价的标准差MD
3、计算上轨线UP=MA + K * MD
4、计算下轨线DN=MA - K * MD
通常,N常会选择20,K的选取会选择K=2,也可以根据策略运行的过程中进行调整。

CCI(Commodity Channel Index)指标

由于下面的vnpy中的策略引入了CCI指标,所以简单对CCI指标进行介绍。CCI指标也称为顺势指标。它是由唐纳德·蓝伯特(Donald Lambert)于20世纪80年代提出的,用于判断当前价格是否超出常态分布范围,同KDJ、RSI一样,也是用于判断超卖超买。但是不同于这些0-100范围限制的指标,CCI的范围是负无穷和正无穷之间,所以CCI对于短期内暴涨暴跌的股票或者期货可以进行更好的衡量与判断,所以很多短期策略都会用到CCI指标。

CCI指标的计算方法是:
1、计算当前的TYP(typical price) = (Low + High + Close) / 3
2、计算N周期的TYP的移动平均值MA
3、计算N周期的TYP的标准差MD
4、CCI = (TYP - MA) / (MD * 0.015)

布林通道策略

根据布林通道指标指定的策略有很多,主要还是基于价格与上中下轨道之间的关系制定的。例如,当利多利空消息已经出尽,此时股价幅度开始变小,也就是进入了盘整的情况下,此时通道会变窄,当价格波动超出了狭窄的通道上轨时,会预示着盘整结束后新的向上趋势的开始;当价格波动跌破狭窄的通道下轨时,会预示着盘整结束后新的向下趋势的开始。也有的布林通道策略是根据通道的形态制定的,例如上下轨之间的距离扩大形成的开口型喇叭口形态布林线和上下轨之间距离缩小形成的闭口型喇叭口形态布林线。还有的布林通道策略是通过跟其他指标如RSI、ATR、CCI或者KDJ指标进行结合,使得判断更加精准。

布林通道策略源码分析

在vnpy中也有实现一个基于布林通道的策略,其思想是上面的第三种,它是通过布林通道结合CCI以及ATR指标制定的。其中CCI指标用来超买超卖,ATR指标用来作为止损止盈,布林通道则作为日内突破的上下轨。

1、完整源码
from vnpy.app.cta_strategy import (CtaTemplate,StopOrder,TickData,BarData,TradeData,OrderData,BarGenerator,ArrayManager,
)class BollChannelStrategy(CtaTemplate):""""""author = "用Python的交易员"boll_window = 18boll_dev = 3.4cci_window = 10atr_window = 30sl_multiplier = 5.2fixed_size = 1boll_up = 0boll_down = 0cci_value = 0atr_value = 0intra_trade_high = 0intra_trade_low = 0long_stop = 0short_stop = 0parameters = ["boll_window", "boll_dev", "cci_window","atr_window", "sl_multiplier", "fixed_size"]variables = ["boll_up", "boll_down", "cci_value", "atr_value","intra_trade_high", "intra_trade_low", "long_stop", "short_stop"]def __init__(self, cta_engine, strategy_name, vt_symbol, setting):""""""super(BollChannelStrategy, self).__init__(cta_engine, strategy_name, vt_symbol, setting)self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar)self.am = ArrayManager()def on_init(self):"""Callback when strategy is inited."""self.write_log("策略初始化")self.load_bar(10)def on_start(self):"""Callback when strategy is started."""self.write_log("策略启动")def on_stop(self):"""Callback when strategy is stopped."""self.write_log("策略停止")def on_tick(self, tick: TickData):"""Callback of new tick data update."""self.bg.update_tick(tick)def on_bar(self, bar: BarData):"""Callback of new bar data update."""self.bg.update_bar(bar)def on_15min_bar(self, bar: BarData):""""""self.cancel_all()am = self.amam.update_bar(bar)if not am.inited:returnself.boll_up, self.boll_down = am.boll(self.boll_window, self.boll_dev)self.cci_value = am.cci(self.cci_window)self.atr_value = am.atr(self.atr_window)if self.pos == 0:self.intra_trade_high = bar.high_priceself.intra_trade_low = bar.low_priceif self.cci_value > 0:self.buy(self.boll_up, self.fixed_size, True)elif self.cci_value < 0:self.short(self.boll_down, self.fixed_size, True)elif self.pos > 0:self.intra_trade_high = max(self.intra_trade_high, bar.high_price)self.intra_trade_low = bar.low_priceself.long_stop = self.intra_trade_high - self.atr_value * self.sl_multiplierself.sell(self.long_stop, abs(self.pos), True)elif self.pos < 0:self.intra_trade_high = bar.high_priceself.intra_trade_low = min(self.intra_trade_low, bar.low_price)self.short_stop = self.intra_trade_low + self.atr_value * self.sl_multiplierself.cover(self.short_stop, abs(self.pos), True)self.put_event()def on_order(self, order: OrderData):"""Callback of new order data update."""passdef on_trade(self, trade: TradeData):"""Callback of new trade data update."""self.put_event()def on_stop_order(self, stop_order: StopOrder):"""Callback of stop order update."""pass
2、策略参数与变量

策略中主要6个超参数和8个变量。

6个超参数的意义是:
1、boll_window:计算布林通道的窗口大小。
2、boll_dev:中轨标准差的倍数。
3、cci_window:计算cci指标的窗口大小。
4、atr_window:计算atr指标的窗口大小。
5、sl_multiplier:止损止盈的乘数。
6、fixed_size:开仓的手数。

8个变量的意义是:
1、boll_up:布林通道的上轨。
2、boll_down:布林通道的下轨。
3、cci_value:cci指标的值。
4、atr_value:atr指标的值。
5、intra_trade_high:日内交易的最高值。
6、intra_trade_low:日内交易的最低值。
7、long_stop:多头止盈止损。
8、short_stop:空头止盈止损。

    boll_window = 18boll_dev = 3.4cci_window = 10atr_window = 30sl_multiplier = 5.2fixed_size = 1boll_up = 0boll_down = 0cci_value = 0atr_value = 0intra_trade_high = 0intra_trade_low = 0long_stop = 0short_stop = 0parameters = ["boll_window", "boll_dev", "cci_window","atr_window", "sl_multiplier", "fixed_size"]variables = ["boll_up", "boll_down", "cci_value", "atr_value","intra_trade_high", "intra_trade_low", "long_stop", "short_stop"]
3、策略执行逻辑

不同于之前的策略,这次的策略的是基于15min K线级别的,所以在创建BarGenerator对象时需要传递15分钟bar级别的回调函数。策略也是需要10天的数据进行初始化。

    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):""""""super(BollChannelStrategy, self).__init__(cta_engine, strategy_name, vt_symbol, setting)self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar)self.am = ArrayManager()def on_init(self):"""Callback when strategy is inited."""self.write_log("策略初始化")self.load_bar(10)

由于这个策略是在15-min级别的数据上执行的,所以主要策略逻辑将不是在on_bar()函数里实现,on_bar()函数的作用是继续将推送的1-min数据合成为15-min数据,然后主要策略执行逻辑是在on_15min_bar()函数里实现的。这个策略的思想可以借鉴一下,为以后写其他时间周期级别的策略提供编写代码的思路。

    def on_bar(self, bar: BarData):"""Callback of new bar data update."""self.bg.update_bar(bar)

一开始同样也是取消上一笔没有成交的订单,然后将bar数据添加到ArrayManager当中。之后通过ArrayMangager对象am中的boll()以及cci()、atr()函数来调用底层的ta-lib接口来计算当前相应窗口下的布林上轨和下轨以及cci和atr指标的值。

    def on_15min_bar(self, bar: BarData):""""""self.cancel_all()am = self.amam.update_bar(bar)if not am.inited:returnself.boll_up, self.boll_down = am.boll(self.boll_window, self.boll_dev)self.cci_value = am.cci(self.cci_window)self.atr_value = am.atr(self.atr_window)

当持有空仓时,需要记录当前bar的最高价和最低价。如果cci指标的值大于0,则以布林通道的上轨价位开出一手多头停止单;如果cci指标的值小于0,则以布林通道的下轨价位开出一手空头停止单。

        if self.pos == 0:self.intra_trade_high = bar.high_priceself.intra_trade_low = bar.low_priceif self.cci_value > 0:self.buy(self.boll_up, self.fixed_size, True)elif self.cci_value < 0:self.short(self.boll_down, self.fixed_size, True)

当持有多头仓位的时候,从之前存储的最高价位和当前bar的最高价位中选取最大的,并且将之前的最低价位设置为当前bar的最低价位。然后通过atr指标和sl_multiplier参数来设置止损止盈的价位,并以这个价位进行平仓卖出;当持有空头仓位的时候,从之前存储的最低价位和当前bar的最低价位中选取最小的,并且将之前的最高价位设置为当前bar的最高价位。然后通过atr指标和sl_multiplier参数来设置止损止盈的价位,并以这个价位进行平仓买入。

        elif self.pos > 0:self.intra_trade_high = max(self.intra_trade_high, bar.high_price)self.intra_trade_low = bar.low_priceself.long_stop = self.intra_trade_high - self.atr_value * self.sl_multiplierself.sell(self.long_stop, abs(self.pos), True)elif self.pos < 0:self.intra_trade_high = bar.high_priceself.intra_trade_low = min(self.intra_trade_low, bar.low_price)self.short_stop = self.intra_trade_low + self.atr_value * self.sl_multiplierself.cover(self.short_stop, abs(self.pos), True)

http://chatgpt.dhexx.cn/article/456goDyK.shtml

相关文章

量化交易——传统技术分析布林通道BollingerBands的原理及实现

布林通道 布林通道线是根据统计学的标准差来计算的&#xff0c;其具体可由上中下三条曲线展示。其中上下两线分别代表上升压力线和下降支撑线&#xff0c;故而可以根据K线图是否突破布林曲线来判断较好的买卖节点。三条曲线计算方法如下&#xff1a; 中轨线(MID)收盘价的M日移…

Lyndon的量化修炼之路——布林通道优化策略(二)

策略参数优化 //期市妖风大&#xff0c;小心被刮飞。本文不构成任何实质性建议&#xff0c;也不对任何依此进行的交易结果负责参数优化几乎是优化每一个量化交易策略的必经之路&#xff0c;对于参数优化的基本方法已经在双均线优化策略中介绍过&#xff0c;再次不多做介绍&…

【Python量化】布林带策略

文章目录 一、计算布林带三、构建策略&#xff0c;计算持仓头寸序列和买卖信号序列四、计算策略收益五、绘制交易信号 此文章首发于公众号&#xff1a;Python for Finance 链接&#xff1a;https://mp.weixin.qq.com/s/CJR2gwXkkzFRavZ8I98qdw 布林带&#xff08;BOLL&#x…

Lyndon的量化修炼之路——布林通道优化策略(一)

//期市妖风大&#xff0c;小心被刮飞。本文不构成任何实质性建议&#xff0c;也不对任何依此进行的交易结果负责经过某位大佬的提醒&#xff0c;原来大白有另外的含义&#xff0c;侵权了侵权了&#xff08;原谅我孤陋寡闻&#xff09;&#xff0c;所以还是简单点好。 我也不知…

现货黄金指标精讲(布林通道)

现货黄金的特点在于可以多空双向交易&#xff0c;如果投资者能精通一到两种的技术分析手段&#xff0c;必定能大幅提高交易的成功率。布林通道指标不仅能揭示金价运行的趋势&#xff0c;还能提供清晰的买卖信号&#xff0c;帮助长、中、短线的投资者提高交易决策的质量。 一、布…

布林通道 Bollinger Bands——非炒股向个人学习笔记

有一组数据&#xff0c;大多数是以时间序列的数据&#xff0c;如年、月、日为度量的某指标变化。&#xff08;上图的绿线不用管&#xff09; 布林通道的作用是描述数值的近期波动程度&#xff0c;具体表现就表现在轨道的收窄与拓宽上。 一、基本概念 作图需设定的变量&#x…

eclipse安装教程与使用教程

第一首先在电脑的浏览器中输入“eclipse官网”。 然后在网页中点击进入eclipse的官方下载网站。 2 第二然后再点击页面右边的“download”。 在弹出的页面下面点击“download packages”。 3 第三然后在下面找到“eclipse IDE for java developers”的选项。 在选项右边有…

eclipse基础实用教程

一、打开eclipse&#xff0c;创建java文件 1.点击eclipse.exe文件 Workspace&#xff1a;&#xff08;这个是你写的代码存放位置&#xff0c;可以自己选择创建一个文件夹&#xff09; 2.新装的eclipse中在new里面未找到java project&#xff0c; 点击Open Perspective&#…

eclipse使用教程(图文)

很多人都知道要用eclipse来做java开发&#xff0c;但很多的新手朋友却不知道怎么下载和安装eclipse。下面给你介绍一下怎么下载和安装eclipse来用于自己的学习或者项目开发&#xff0c; 很多人都知道要用eclipse来做java开发&#xff0c;但很多的新手朋友却不知道怎么下载和安装…

Eclipse详细安装教程

Eclipse安装教程 前言一、Eclipse是什么&#xff1f;二、安装步骤1. Eclipse下载下载网址 2. Eclipse安装 前言 Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。 一、Eclipse是什么&#xff1f; Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言…

Eclipse最新最简最详细安装教程

Eclipse最新最简最详细安装教程 1、首先打开官方地址&#xff08;见下面&#xff09; Eclipse官方下载地址&#xff1a;点击打开官方链接 2、点击红箭头指向的红框中的“Download Packages”。 3、出现新的页面之后往下翻找到并点击红箭头指向的红色矩形的部分Eclipse IDE f…

Eclipse安装教程 ——史上最详细安装Java Python教程说明

Eclipse安装教程 ——史上最详细安装Java&Python教程说明 (Win7_64位 Eclipse 64位 JDK_8u131_64位 python2.7.8 PyDev5.7.0插件) 适用操作系统&#xff1a;Win7 64位 所需要的软件以及插件&#xff1a;Eclipse 64位、JDK_8u131_64位、python2.7.8、PyDev5.7.0插件 …

Eclipse 教程

Eclipse的使用 前言一、Eclipse的介绍二、下载与安装1.下载2.安装 三、基本使用步骤1.启动2.创建项目3. 创建包及class文件 四、一些使用技巧1. 快速生成构造方法2.自动补全3. 快速生成get-set方法4. 查找某变量所在位置,或者替换某变量的变量名5. 快速导入包6.合理利用eclipse…

视频消重处理,视频原创怎么做,视频处理软件

现在的新传媒行业&#xff0c;有很多小伙伴搬过来的视频都不太清楚怎么把它变成自己的视频&#xff0c;也就是消重&#xff0c;现在有一款工具可以达到这种消重原创&#xff0c;像某头条通过率在96%以上了 这是一个视频消重处理软件&#xff0c;现在给大家说说功能和页面 1&…

视频合成-moviepy

最近发现&#xff0c;公司在进行视频合成的时候&#xff0c;部分业务不是在客户端进行合成&#xff0c;而是在后端进行合成&#xff0c;让我有点惊讶&#xff0c;立马问开发要了代码&#xff0c;想要看看到底在后端如何处理的。 学习文档&#xff1a;https://blog.csdn.net/uc…

计算机图像视频处理

计算机图像视频处理 计算机视觉概论 计算机视觉概念 计算机图像处理&#xff0c;也即数字图像处理(Digital Image Processing)&#xff0c; 是指将图像信号转换成数字信号并利用计算机对其进行处理的过程&#xff0c;是通过计算机对图像进行去除噪声、增强、复原、分割、提取…

视频处理

1.视频处理 在视频压缩前后&#xff0c;对视频图像质量增强的操作视频编解码系统输出的图像主观质量不仅与压缩算法的性能有关&#xff0c;还受视频处理的影响压缩之前对视频的处理称作预处理&#xff08;Pre-processing&#xff09;压缩之后对视频的处理称作后处理&#xff0…

基于PythonOpenCv的视频图像处理

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…

openpose如何处理视频

openpose提供了官方的bin文件&#xff0c;可以通过shell直接处理视频&#xff0c; 此外还提供了一系列的demo文件&#xff0c;用于处理图片文件。 那如何修改官方的demo用来处理视频呢&#xff1f; 找了不少别人的教程都是通过 cv2.dnn.readNetFromCaffe(protoFile, weight…

使用python的视频处理

本文探讨的是使用python对视频进行如下操作&#xff1a; 将待处理的视频分割成帧对每一帧进行处理对处理后的帧合并得到最终的视频 为了方便接下去的实验过程&#xff0c;读者必须具备如下的工具&#xff1a; 1、依赖包python-opencv 2、借助工具ffmpeg import cv2 import …