跳到正文
布林带 BOLL:轨道不是支撑压力,带宽才是它真正说的那句话
进阶指标2026-09-0120分钟阅读

布林带 BOLL:轨道不是支撑压力,带宽才是它真正说的那句话

目录(11 节)
  1. 写在前面
  2. 一、定义:它在回答什么问题
  3. 二、数学本质:轨道是结果,带宽才是那句话
  4. 三、三个实现细节坑
  5. 四、参数:20 和 2 是哪来的
  6. 五、它能干什么(三个用法,按价值排序)
  7. 六、实测:四个结果
  8. 七、失效场景(请比第五节读得更用力)
  9. 八、代码
  10. 九、三个你该自己跑一遍的实验
  11. 十、三句话结论

写在前面

行情软件上打开布林带,你大概率会听到两句话。

第一句:

"价格碰到上轨了,超买,该空了。"

第二句:

"布林带收口了,憋了这么久,马上要变盘,准备好抓一波。"

这两句话都错,但错的方式不一样:第一句把一条会跟着价格移动的线当成了固定的墙;第二句把一条真实存在的规律,方向记反了。

第二句尤其值得说。"挤压之后必有突破"不是凭空编的——它背后确实站着一条经得起检验的市场规律,只是那条规律的结论和这句话正好相反。

先说最反直觉的那个数:

在这批数据上,带宽挤到自身最低的那一档之后,接下来一个月出现"大行情"的概率,比随便挑一天还低——7.1% 对 10%。

而这个指标真正有用的那一部分,恰恰是几乎没人看的那个数。


一、定义:它在回答什么问题

布林带(Bollinger Bands),由 John Bollinger 在上世纪 80 年代初提出。三条线:

线算法
中轨收盘价的 20 日移动平均
上轨中轨 + 2 × 标准差
下轨中轨 − 2 × 标准差

标准差(σ)算的是这 20 个收盘价,围着它们自己的平均值散得有多开。

所以一句话定义:

布林带回答的是:最近这 20 天,价格围着自己的均线晃得有多开。

请注意这句话里有什么、没有什么。

  • 有:"晃得有多开"——这是一个关于离散程度的描述
  • 没有:任何关于"贵不贵"、"该涨该跌"的信息

中轨就是 MA(20)。它的滞后有多少天、为什么均线永远只能事后跟随、"MA 拐头可能跟今天完全无关"——这些均线族自己的数学性质上一篇已经讲透了,本篇一个字都不重复,你把那篇的结论直接搬过来用就行。

本篇的地盘是上下那两条线,以及它们之间的距离。


二、数学本质:轨道是结果,带宽才是那句话

2.1 这个指标只有两个自由度

三条线看起来是三个数,其实只有两个:

上轨=中轨+kσ下轨=中轨−kσ\text{上轨} = \text{中轨} + k\sigma \qquad \text{下轨} = \text{中轨} - k\sigma

中心在哪儿(中轨),和它有多宽(σ)。 上下轨不是两个独立的判断,它们是同一个宽度的两个端点。

而"中心在哪儿"这一维,已经完全由均线决定了——那是上一篇的地盘。

剩下给布林带自己的,只有"宽度"这一维。

所以:

布林带上下那两条线,不是两条边界,是同一个数的两个端点。那个数叫带宽,它才是这个指标真正说的那句话。

2.2 带宽是这个指标里唯一能跨品种比大小的读数

带宽的定义:

带宽=上轨−下轨中轨=2kσMA\text{带宽} = \frac{\text{上轨} - \text{下轨}}{\text{中轨}} = \frac{2k\sigma}{MA}

k = 2 时,它就是 σ/MA 的 4 倍——一个没有单位的比值。

这一点很值钱。ATR 那一篇专门写过:螺纹钢的 ATR 是"多少元/吨"、黄金的是"多少元/克",绝对值横着比毫无意义,必须先除以价格变成 ATR% 才可比。

布林带的带宽天生就是除完的。 实测这 30 个品种的带宽中位数:

最安静的四个带宽中位最不安静的四个带宽中位
白糖4.8%玻璃12.3%
沪铜4.9%焦煤13.4%
沪金5.2%燃料油13.8%
铝5.7%碳酸锂16.2%

(中间一档:螺纹钢 7.4%、甲醇 8.8%、沪银 9.8%、沥青 10.5%、原油 12.1%。)

沪铜和碳酸锂,同一个"20 日 2 倍标准差",宽度差了三倍多。 你在沪铜上看到带宽 12%,那是极端行情;在碳酸锂上看到 12%,那是它比平时还安静一点。

所以"这个品种现在的带宽是宽是窄",只有和它自己的历史比才有意义。 这是本篇后面所有实测的口径基础。

2.3 %b 不是位置,是乖离率

很多软件会给一个 %b(价格在带子里的百分比位置):

%b=P−下轨上轨−下轨=P−MA2kσ+12\%b = \frac{P - \text{下轨}}{\text{上轨} - \text{下轨}} = \frac{P - MA}{2k\sigma} + \frac{1}{2}

右边那个式子是恒等变形,不是近似。看清楚它是什么:

%b 就是"价格离均线多远"除以"最近波动有多大",再挪到 0–1 之间。

它是一个标准化的乖离率,不是一个"位置"。而乖离率那一条已经写死过:乖离率大不大,在没说清是哪条均线之前,本身没有内容。

2.4 ⭐ 一个纯代数的上界:k 大过 4.25 的布林带,价格永远碰不到

这一段不用跑数据,一支笔就能推。

20 个数算出来的标准差,其中任何一个数偏离平均值多少个 σ,是有硬上界的:

zmax⁡=n−1nz_{\max} = \frac{n-1}{\sqrt{n}}

n = 20 时,zmax⁡=4.249z_{\max} = 4.249。(极值出现在"一个点离群、其余 19 个挤在一起"的时候。)

含义:

你把 k 调到 4.25 以上,那两条轨就变成了摆设——价格永远碰不到。 不是因为行情不够猛,是因为二十个数里,一个数最多只能"离群"这么远。

(上面这个数用的是样本标准差——下一节讲为什么。换成总体标准差,上界是 √(n−1) = 4.359,略松一点。)

实测自检:这 51462 个品种日里,实际出现过的最大偏离是 3.997 个 σ——踩在上界下面,没有越界。

反过来看 k = 2 意味着什么:

默认的那两条轨,站在这个上界的一半都不到的地方。价格穿出去,是结构性的常态,不是异常事件。

这条推导的用处,在第六节的实测里会兑现。

📌 顺带说一句方法:能推导就不去跑数据。这一节和 2.2、2.3 全是恒等式,MACD 那篇和均线那篇的推导各示范过一次,本篇是第三次。跑出来的数字只能当自检,不能当发现。

2.5 ⭐⭐ 上轨会朝着价格走过来

这是布林带最容易被忽略、也最影响判断的一条性质:今天的价格,自己参与了今天这条上轨的计算——中轨里有它,σ 里也有它。价格冲得越猛,σ 被撑得越大,上轨抬得越高。

举个能自己按计算器验的例子:某品种前 19 天都收在 100,今天跳到 108。把这 20 个数代进公式:均值抬到 100.4,标准差从接近 0 变成 1.74,上轨落在 103.9。

价格跳了 8 个点,上轨自己也往上追了将近 2 个点。

上轨不是价格撞上去的东西,是价格自己撑起来的。

直接后果有两个,第六节都会量到:"突破上轨"这个事件本身被稀释了(它是一场追逐,而被追的那条线在跑);"触轨"最容易发生在刚从平静期出来的时候(那时轨道还没张开)。


三、三个实现细节坑

① 标准差是"总体"还是"样本"——差两行代码,差一成信号

同样 20 个数,算标准差时除以 20 还是 19,教科书上是两个不同的函数:总体标准差与样本标准差。

国内这批公式语言里,通行的写法是后者。 它们通常同时给两个函数——一个除以 N−1、一个除以 N——而布林带的标准写法用的是除以 N−1 的那个:

BOLL_UP : MA(CLOSE,20) + 2*STD(CLOSE,20);
BOLL_DN : MA(CLOSE,20) - 2*STD(CLOSE,20);

⚠️ 但"通行"不等于"所有",尤其当你是从写代码那一侧过来的:常用数值库的默认值正好分踞两边(一个默认除以 N,另一个默认除以 N−1)。同一个名字,两个默认值。

差多少? 代数上是固定的:

σ样本σ总体=2019=1.0260\frac{\sigma_{\text{样本}}}{\sigma_{\text{总体}}} = \sqrt{\frac{20}{19}} = 1.0260

样本口径的带子,永远宽 2.60%。

2.6% 听起来微不足道。但它落在"价格有没有出带子"这个是非题上,就不是 2.6% 了:

收盘价落在带外的天数占比
样本标准差(÷19)546810.77%
总体标准差(÷20)614112.09%

673 天的差别,占了信号总数的 12.3%。 每八个"突破轨道"里,有一个只是因为你和别人用了不同的那一版标准差。

⚠️ 这已经是本号第四次撞上同一件事(前三次分别在条件单、交易编码生效时点、RSI 的平滑方式上)。规律是同一条:

凡是各家厂商自行实现的东西,都不存在"业内一般是怎样"。

本篇全部用样本口径(÷19),因为那是这批公式语言里布林带的标准写法。

但我不会把它写成"业内都这样"——我只能告诉你:你得自己对一遍,然后始终用同一个。⚠️ 尤其当你一边看软件的图、一边用代码复现的时候:那两边的默认值很可能不是同一个。

② 价格口径:收盘价还是结算价

持仓量四象限那篇立过一条规矩,本号后来每一次带实测都在用:

测账户上的事(盯市盈亏、保证金)用结算价;测价格序列自身的统计性质用收盘价。

布林带算的是收盘价的离散程度,属于后者,本篇全部用收盘价。 用结算价对照跑过一遍:带外占比 11.39%(收盘价口径 10.77%),方向一致、量级也一致。

③ 主连接缝:这一次有个好消息,也有个坏消息

好消息,可以从代数上说死:带宽是一个"尺度不变量"——把整条序列乘一个常数,σ 和 MA 同比例缩放,两者之比一个字都不变。所以只要你的主连做过等比复权,带宽就是干净的。

(MACD 那篇用的是等差平移,那对它是对的——它的部件全是线性的。对带宽而言,等比才是那个不改动它的操作。)

坏消息:软件里默认那条主力连续合约大多数没做过任何调整,换月那天的价差会原样进入这 20 个数,把 σ 撑大一截。实测拿它和等比调整过的净序列各跑一遍同一套挤压判据:

880 个 vs 873 个挤压信号,±2 个交易日容差内对不上 467 个——错配率 26.6%。

⚠️ 这个 26.6% 不能拿去和 MACD 那篇的 9.6%、RSI 那篇的 20.3% 比大小:三者的信号定义不同、品种池也不同。能拿走的是量级,不是排名。


四、参数:20 和 2 是哪来的

20:大致对应一个月的交易日。5/10/20 的来历写过,5/10/20/60/250 这套数确实对得上交易日历——比 MACD 那套 12/26/9 诚实,但它仍然是日历数,不是市场数。

2:来自正态分布——±2σ 应该盖住 95.4%。

而这个 95% 在期货上从来没成立过。

收盘价在上轨之上6.32%
收盘价在下轨之下4.45%
合计在带外10.77%
正态假设下应该是4.55%

教科书说 95% 的价格落在带内,这批数据上是 89%。 差出来的那 6 个百分点,是"价格突破布林带"这件事被高估的全部程度。

为什么?三个原因叠在一起:日收益本来就尖峰厚尾(极端值比正态多得多);σ 是拿滚动的 20 个样本估出来的、不是真值;再加上 2.5 那条——今天的价格自己参与了 σ 的计算。

改参数会怎样(同一批样本):

参数落在带外挤压之后跟出大行情
BOLL(10, 2)6.32%0.69 倍基线
BOLL(20, 2)10.77%0.71 倍基线
BOLL(50, 2)14.05%0.77 倍基线
BOLL(20, 1.5)28.52%0.71 倍基线
BOLL(20, 2.5)2.76%0.71 倍基线

两件事值得看:

  1. k 只改"多久响一次",不改"灵不灵"。 k 从 1.5 调到 2.5,触轨从 29% 掉到 3%,但挤压那一列一个字不动——因为 k 不改变带宽的排序,只改变它的倍数。("改参数改的不是灵不灵、是多久响一次"这句话是改参数那一条先说的,这里是第二次兑现。)
  2. n 越大,价格反而越容易跑到带外(6.32% → 14.05%)。说得通的解释是窗口拉长后中轨落后更多、价格离它更容易走远,⚠️ 但本篇没有单独验过它——黑色系那篇立过规矩:讲得通的因果,没有证据就只并列、不连线。

五、它能干什么(三个用法,按价值排序)

用法一:读带宽,不读轨道(价值最高)

带宽是这个指标唯一在说话的部分,而且跨品种可比(2.2)。具体怎么用:把它换算成自己过去一年里的分位,得到一句"这个品种现在比自己平时安静还是剧烈"——它能告诉你现在适不适合用某一类方法,和 ATR 的第三个用法是同一件事。

⚠️ 但它不告诉你接下来会怎样。 第六节结果一整节都在说这件事。

用法二:把 %b 当乖离率用,别当位置用

%b = 0.9 的正确读法是"价格离均线 1.6 个标准差"(代入 2.3 那个恒等式即得),不是"价格在高位"。前者是可比的量,后者需要一个参照物——而 %b 手里没有。

("读数高不等于价格高,取决于你拿多长的一段去比"这件事,RSI 那篇的两个窗口已经正面量过,⛔ 本篇不重复论证。)

用法三:用带宽给仓位定档,不给方向定档

带宽处在自身高位 → 最近波动大 → 该开的手数更少。这就是 ATR 仓位归一化那个公式换了一种量法,⛔ 公式本篇不重述。⚠️ 但要看第七节③:这一档用哪个量,是有讲究的。


六、实测:四个结果

怎么测的

样本30 个品种 / 1102 份合约 / 51462 个品种日 / 2019-01-02 ~ 2026-08-05
数据公开日线(开高低收、成交量、持仓量、结算价)
代表合约每天取持仓量最大的那份
价格收盘价;净序列做等比调整,换月当天记 0 涨跌
参数BOLL(20, 2),样本标准差(÷19,见第三节①);ATR(14) Wilder 平滑
"自身历史分位"一律用滚动窗口(默认回看 250 个交易日),⛔ 不用全样本分位(那是前视偏差)
品种池事前定死的成交额排名,⛔ 不因为"某品种走势好看"增删一个

代码与完整口径在 code/36,一条命令可复现。

⚠️ 有两处我返工了,写在这儿比藏起来有用:

第一处,判据两边不等距。 第一版我测"上穿上轨之后 5 天里,先跌回中轨,还是先创新高",跑出来 75.0% 对 11.2%,数字漂亮、结论响亮。然后我发现它是假的——事件发生那一刻价格就在上轨附近,"再高一点"只要走一步,"跌回中轨"要走将近两个 σ。这个判据在开跑之前就已经偏了。 改成两边等距之后(见结果二),净效应从 64 个百分点缩到 6 个。

第二处,我把结论写在了看到数字之前。 补测"等它开口"那一档时,我顺手在脚本的输出里写好了一句"这一档幅度确实抬起来了"。跑完一看:没抬起来。 那四个字是我在看到数字之前写的。

结果一:挤压之后,大行情比平时更少

"挤压"的判据:带宽落到它自己过去 250 个交易日的最低 10%,且前一天还不在挤压中(只取进入那一天)。全样本 873 个事件。

往后看事件累计涨跌的绝对值·中位随便挑一天的基线倍数上涨占比基线
5 日8711.70%1.98%0.8652.1%50.9%
10 日8712.40%2.84%0.8451.7%51.1%
20 日8653.57%3.98%0.9052.9%51.4%

幅度那一列全部小于 1。方向那一列贴着基线。

但"平均幅度"不是这句流言真正说的东西。它说的是"必有大行情"。所以我把这句话直接写进了判据里:

挤压之后 20 天,累计涨跌有没有超过这个品种自己"20 日涨跌"的 90 分位?

这个判据有一个好处:它的基线按定义恒等于 10%。所以跑出来的数除以 10%,就是"必有"这两个字值多少钱。

865 个挤压事件里,61 个跟出了大行情 = 7.1%。基线 10.0%。 0.71 倍。

分品种看:30 个里只有 8 个高于基线。

这还没完。 "一挤压就进"不是场内真正的用法——大多数教程教的是"等它开口"。只测前一种等于打稻草人,所以我补了一档:

先落进挤压,此后带宽分位首次回到 50% 以上的那一天(527 个事件):

结果
20 日累计涨跌绝对值仍是基线的 0.86 倍
跟出大行情9.9%(0.99 倍——回到基线,不是超过基线)
20 日上涨占比48.2%,基线 51.4%——比基线还低

为什么会这样? 我去找了旁证,而这个旁证正是这条流言的来源:

"波动率聚集"——大波动之后跟着大波动,平静之后跟着平静。

这件事场内人人见过,本号第一篇指标文章就提过,这一篇不去证明它,只标一个量级:

当前带宽处在自己的后 20 天的日收益标准差·中位
最低 10%1.08%
最高 10%1.65%
(全样本)1.28%

1.53 倍。 波动率确实聚集,量级就这么大。

而它预言的恰恰是"挤压之后更可能继续平静"。

"挤压之后必有突破"不是没有依据,它是把一条有依据的规律,方向记反了。

至于"等它开口"那一档为什么也没有超额——看清楚那个判据本身:带宽回到 50% 分位,意思就是"最近这 20 天价格已经离均线更远了"。

等你确认"开口",那一段行情已经走在你的判据里了。

结果二:上下轨不是支撑压力

"上轨是压力"这句话,可检验的形式是什么? 是"触轨之后,价格更倾向于向下离开"。

所以判据得两边等距:以事件当天的收盘价为原点,接下来 5 个交易日里,先摸到 +1 倍 ATR,还是先摸到 −1 倍 ATR。同一个单位,两个方向一样远。

而且基线也要用同一套判据算——⛔ 不能拿"50%"当基线,因为上下两边本来就不对称。

先摸到 +1ATR先摸到 −1ATR5 天内都没摸到
全样本基线(50416 天)44.4%41.6%14.1%
收盘价上穿上轨(1626 例)48.0%40.1%11.9%
收盘价下穿下轨(1224 例)40.6%46.0%13.4%

两头都指向"延续",不是"反转"。

  • 上穿上轨之后,先往上走一个 ATR 的概率更高,不是更低
  • 下穿下轨之后,先往下走一个 ATR 的概率更高,不是更低

⚠️ 但净效应要说清楚:上轨那一行两格差 7.9 个百分点,而全样本基线本身就差 2.8 个百分点。净出来的是 5 个百分点上下,不是一个大数。

而且这 6 个百分点不是一次赚钱的机会。 同一批事件的终点:

5 日涨跌中位5 日上涨占比10 日涨跌中位
上穿上轨后−0.03%49.1%(基线 50.9%)−0.25%
下穿下轨后+0.04%50.7%−0.15%

首达那张表说"更可能先往上冲一下",这张表说"五天之后回到原地"。 两句话不矛盾——它们说的一个是路径,一个是终点。

"沿着上轨走"到底有多长?

口径段数中位P90最长
收盘价在上轨之上16412 天4 天8 天
收盘价在下轨之下12271 天3 天8 天
%b ≥ 0.8(贴着上轨)30083 天9 天24 天
%b ≤ 0.2(贴着下轨)26502 天9 天26 天

⚠️ 两个口径都给了,因为它们回答的不是同一个问题。 场内说的"沿着上轨走"通常是贴着、不一定收在外面,所以严口径会低估它。

严口径那一行有一个数值得单拎出来:

收盘价站上上轨之后,一半的情况第二天就收回去了。

(严口径下"上轨之上"只待 1 天的段占 50.0%。)

结果三:σ 和 ATR 都在量波动,但它们量的不是同一件事

这是本篇相对ATR 那篇的独有增量。

先看它们像不像:同一天的"带宽"和"ATR%",逐品种算秩相关——

中位 0.703(最低烧碱 0.539,最高锡 0.794)。

很高。但下面这一段才是重点。

把两者各自换成自己过去 250 天的分位,看同一天这两个分位差多少:

中位差 0.17,P90 差 0.49;差 0.3 以上的日子占 28.1%,差 0.5 以上的占 9.2%。

超过四分之一的日子,这两种量法给出的"现在算不算剧烈"是明显不同的答案。

那么分歧最大的日子长什么样? 我用一个叫"效率比"的量去看它们:

效率比 = 过去 20 天净走了多远 ÷ 这 20 天一共走了多少路。 一直朝一个方向走 → 接近 1;来回晃回到原地 → 接近 0。

那一天的情况天数效率比·中位
带宽分位比 ATR 分位高 ≥ 0.526810.403
ATR 分位比带宽分位高 ≥ 0.517500.106
两个分位差不多438550.200

差了将近四倍,而且指向非常干净:

带宽读高的日子,是价格一直朝一个方向走;ATR 读高的日子,是价格在来回晃。

机制不难理解:标准差量的是"这 20 个收盘价离它们的平均值有多远",一段每天涨 1%、日内几乎不动的平静上涨,价格会稳稳地离均线越走越远,σ 很大而 ATR 很小;反过来一段每天上下 3%、收盘却回到原地的剧震,ATR 很大而 σ 很小。

标准差不区分"走出去了"和"来回晃"。在它眼里,一段安静的单边上涨,和一段上蹿下跳,可以是同一个读数。

这不是布林带的 bug,是标准差这个量本身的性质。 它带来一条能直接用的结论:

带宽扩张,不一定是"波动变大了",它可能只是"价格走远了"。

结果四:"挤压"这个判断,取决于你拿多长的一段去比

同一天的带宽,在过去 250 天和过去 60 天里的分位,差 0.3 以上的日子占 13.4%。按"≤10% 分位算挤压"来判:

250 日口径判出的挤压,只有 64.3% 同时被 60 日口径认(反过来是 55.0%)。 三分之一的"挤压",换一个回看长度就不存在了。

⚠️ 这是RSI 那篇那条结论在另一个指标上的第二次出现:读数高不高取决于你拿多长的一段去比,而两个窗口都不是错的。⛔ 论证那篇做完了,本篇只补一句:

"带宽处在历史低位"这句话,在你说出"历史"有多长之前,是不完整的。

这批数据打几折

  1. ⚠️ 只有日线。 布林带在分钟级别上被用得同样多,本篇一个字都答不了那一层。
  2. ⚠️ 代表合约拼出来的序列,不是任何一个人真实持有过的东西(主连的问题前面写过)。净序列做过等比调整,但它仍是 1102 份合约接起来的。
  3. ⚠️ 前瞻窗口互相重叠(相邻事件的 20 日窗口盖在一起),所以本篇一个统计显著性都不报,只报中位数、占比和事件数。
  4. ⚠️ "大行情"的阈值是我自己定的(品种自身 20 日涨跌的 90 分位)。换阈值那 7.1% 会变,但换成 5% / 20% 分位之后是 0.70 / 0.75 倍,结论没动。
  5. ⚠️ 2019 年起,七年半。不覆盖更早的极端行情。
  6. ⚠️ 30 个品种是按成交额事前排定的,⛔ 不因为哪个品种走势好看而增删。

七、失效场景(请比第五节读得更用力)

① 带宽不回答方向

带宽扩张只说明"最近价格离均线更远了",它不说往哪边远。这和 ATR 的头号误用是同一个错误,只是换了一个指标的外衣。

② 轨道会朝价格移动,所以"突破"这件事本身是被稀释的

2.5 讲过机制,结果二给了量级:一半的"站上上轨"第二天就收回去。

⚠️ 更要紧的是它对回测的影响:如果你写一个"收盘上穿上轨就开多"的规则,你要清楚上轨这个门槛不是固定的——它在被价格自己推着走。这类信号的数量对参数极其敏感(k 从 2 调到 2.5,触轨从 12% 掉到 3%)。

③ σ 会把"走远了"读成"波动大"

结果三那一条。这一条直接影响用法三:

  • 如果你要的是"这个品种最近每天大约走多大幅度"(用来定止损宽度、定手数)→ 该用 ATR,因为它量的就是这个
  • 如果你要的是"价格最近偏离中枢有多远"→ 带宽

⛔ 拿带宽去当止损宽度的依据,会在单边缓涨的行情里给你一个过宽的止损——那一段的真实日波幅其实很小。

④ 正态那个 95% 在期货上不成立

实测 89%。差出来的 6 个百分点全部落在尾部,而尾部正是你最需要它准的时候——期货上还多一层:极端行情里可能根本没有对手盘让你成交。

⑤ 三条线不是三个证据

上轨、中轨、下轨全部由同一个中轨和同一个 σ 算出来,它们同时"发出信号"不构成三重确认。

(均线越多越像投票那句更狠:均线越多,看起来越像一场投票,其实全场只有一个人在说话。布林带是那句话的极端版——全场只有一个人,还站着三个位置。)

⑥ 另外四条,往期已经写透,这里只挂链

它对布林带同样成立出处
中轨的滞后就是均线的滞后读中轨时必须把那篇的结论一起带上均线族的数学本质
"触上轨 = 超买"的问题不在布林带,在"超买"这两个字"太多了"需要一个参照物,而这类读数手里没有RSI 与超买超卖
主连不干净、单合约不够长⚠️ 而布林带因为"分位"要回看 250 天,对序列长度的要求比 MACD 还高主连那条两难
指标画在屏幕上,成交发生在盘口上尤其当你打算在"突破上轨"那天追进去MACD 那篇的最后一条

⑦ 它不回答仓位

而在期货上,这一条比前面六条加起来都要命。带宽告诉你"最近晃得开不开",它不告诉你该开几手——能保护你的从来不是止损单,是仓位。


八、代码

计算部分写成只依赖收盘价序列的纯函数,不绑定任何数据源。

import math

def boll(px, n: int = 20, k: float = 2.0, ddof: int = 1):
    """布林带。px 为按时间升序的收盘价列表。
    返回 (mid, up, dn, bw, pb),前 n-1 个元素是 None。

    ddof=1 → 样本标准差(除以 n-1),**默认,对应公式语言里 STD 的写法**
    ddof=0 → 总体标准差(除以 n)
    ⚠️ 两边差 2.60%,落到"出没出带子"这个是非题上是一成多的信号,见第三节①。
       ⛔ 别照搬数值库的默认值 —— 常用的那两个库,默认值正好一边一个。
    """
    m = len(px)
    mid = [None] * m; up = [None] * m; dn = [None] * m
    bw = [None] * m;  pb = [None] * m
    for i in range(n - 1, m):
        w = px[i - n + 1: i + 1]
        mu = sum(w) / n
        sd = math.sqrt(sum((x - mu) ** 2 for x in w) / (n - ddof))
        mid[i], up[i], dn[i] = mu, mu + k * sd, mu - k * sd
        if mu > 0:
            bw[i] = 2 * k * sd / mu          # 带宽:无量纲,跨品种可比
        if sd > 0:
            pb[i] = (px[i] - mu) / (2 * k * sd) + 0.5   # %b:标准化的乖离率
    return mid, up, dn, bw, pb

def rolling_rank(xs, look: int = 250):
    """每一天:这个值在**它自己过去 look 天**里的分位(0–1)。

    ⛔ 一定要用滚动窗口,不要用全样本分位 —— 后者是前视偏差,
       它偷看了未来才知道"今天算不算低"。
    """
    out = [None] * len(xs)
    for i, v in enumerate(xs):
        if v is None:
            continue
        w = [x for x in xs[max(0, i - look + 1): i + 1] if x is not None]
        if len(w) < look // 2:               # 样本不够就不给分位
            continue
        out[i] = sum(1 for x in w if x < v) / (len(w) - 1)
    return out

取数据(AKShare 为例,接口与列名可能随版本变化,以官方文档为准):

import akshare as ak

df = ak.futures_zh_daily_sina(symbol="rb2601")     # 单一合约,⛔ 不是主连
px = df.sort_values("date")["close"].astype(float).tolist()

mid, up, dn, bw, pb = boll(px)
bw_rank = rolling_rank(bw)                          # 带宽在自身历史里的分位

⚠️ 上面刻意取的是单一合约,不是主力连续。 理由在第三节③:未调整的主连会把换月价差算进 σ,本篇实测的错配率是 26.6%。 如果你一定要用主连,先做等比调整——带宽是尺度不变量,等比调整不会改动它。


九、三个你该自己跑一遍的实验

实验一:把你的软件和上面的代码对一遍

同一个品种、同一段区间,把软件画的上轨和 boll(px, 20, 2, ddof=1) 的结果放在一起,再换 ddof=0 算一遍。

你会看到:其中一条能对上,另一条差 2.6%。记住是哪一条,以后别再换。

⚠️ 这个实验我自己就栽过一次:本篇初版把默认取成了 ddof=0(顺手用了数值库那一边的默认),跑完才发现和公式语言里的 BOLL 对不上。第三节①讲的那个坑,我自己先踩了一遍。

实验二:把带宽和 ATR% 画在同一张图上

选一个走过明显单边行情的品种,把带宽分位和 ATR% 分位画成两条线,重点看它们分开的那几段——去翻那几天的 K 线,是不是结果三说的两种形态:带宽在上的地方是缓慢单边,ATR 在上的地方是宽幅震荡。

做完这个实验,"波动大"三个字对你就不再是一个笼统的词了。

实验三:把"挤压"的回看长度从 250 天改成 60 天

两套回看长度各自标出"带宽处在最低 10%"的日子,画在同一张图上。你会看到两组只有一半多重合。

然后问自己:你说"布林带收口了"的时候,心里那个"平时",到底是多长的一段?


十、三句话结论

1. 上下那两条线不是两条边界,是同一个宽度的两个端点。 位置那一维已经被中轨(也就是 MA(20))占满了,布林带自己只多说了一件事:宽度。

2. "轨道是支撑压力"和"挤压之后必有突破"都不成立,但错法不同。 前者把一条会跟着价格跑的线当成了固定的墙——实测触轨之后价格更倾向于延续,而且一半的"站上上轨"第二天就收回去;后者把一条真规律的方向记反了——波动率聚集预言的是"平静之后继续平静",实测挤压后跟出大行情的概率 7.1%,基线 10%。

3. 真正该看的是带宽,而且只能和它自己的历史比。 跨品种比绝对值没有意义(沪铜和碳酸锂差三倍多);而"和自己的历史比"里那个"历史"有多长是你自己选的——60 天还是 250 天,能改掉三分之一的结论。


下一篇:《凯利公式:那个"最优下注比例",为什么算出来的数你不敢用》——《米粒论道》的第四篇,接着仓位管理往下走。


⚠️ 风险提示 本文仅为期货知识分享与研究交流,不构成任何投资建议。文中所有参数、算例、代码与实测结果均为原理演示与历史统计,不构成任何交易参数推荐,历史数据不代表未来表现。期货交易具有高杠杆特性,可能导致本金全部损失甚至产生穿仓负债。文中涉及的规则、比例、时间等信息以各期货交易所官方最新公告为准。请通过正规期货公司开户,理性参与、独立决策、风险自担。

本文首发于微信公众号「米粒论期」 · 阅读原文

免责声明:本文仅供学习参考,不构成任何投资建议。期货交易存在风险,入市需谨慎。

本文涉及

文中提到的概念、品种和书目,都能在站内查到。

沪ICP备2026050790号-1