写在前面
行情软件上打开布林带,你大概率会听到两句话。
第一句:
"价格碰到上轨了,超买,该空了。"
第二句:
"布林带收口了,憋了这么久,马上要变盘,准备好抓一波。"
这两句话都错,但错的方式不一样:第一句把一条会跟着价格移动的线当成了固定的墙;第二句把一条真实存在的规律,方向记反了。
第二句尤其值得说。"挤压之后必有突破"不是凭空编的——它背后确实站着一条经得起检验的市场规律,只是那条规律的结论和这句话正好相反。
先说最反直觉的那个数:
在这批数据上,带宽挤到自身最低的那一档之后,接下来一个月出现"大行情"的概率,比随便挑一天还低——7.1% 对 10%。
而这个指标真正有用的那一部分,恰恰是几乎没人看的那个数。
一、定义:它在回答什么问题
布林带(Bollinger Bands),由 John Bollinger 在上世纪 80 年代初提出。三条线:
| 线 | 算法 |
|---|---|
| 中轨 | 收盘价的 20 日移动平均 |
| 上轨 | 中轨 + 2 × 标准差 |
| 下轨 | 中轨 − 2 × 标准差 |
标准差(σ)算的是这 20 个收盘价,围着它们自己的平均值散得有多开。
所以一句话定义:
布林带回答的是:最近这 20 天,价格围着自己的均线晃得有多开。
请注意这句话里有什么、没有什么。
- 有:"晃得有多开"——这是一个关于离散程度的描述
- 没有:任何关于"贵不贵"、"该涨该跌"的信息
中轨就是 MA(20)。它的滞后有多少天、为什么均线永远只能事后跟随、"MA 拐头可能跟今天完全无关"——这些均线族自己的数学性质上一篇已经讲透了,本篇一个字都不重复,你把那篇的结论直接搬过来用就行。
本篇的地盘是上下那两条线,以及它们之间的距离。
二、数学本质:轨道是结果,带宽才是那句话
2.1 这个指标只有两个自由度
三条线看起来是三个数,其实只有两个:
中心在哪儿(中轨),和它有多宽(σ)。 上下轨不是两个独立的判断,它们是同一个宽度的两个端点。
而"中心在哪儿"这一维,已经完全由均线决定了——那是上一篇的地盘。
剩下给布林带自己的,只有"宽度"这一维。
所以:
布林带上下那两条线,不是两条边界,是同一个数的两个端点。那个数叫带宽,它才是这个指标真正说的那句话。
2.2 带宽是这个指标里唯一能跨品种比大小的读数
带宽的定义:
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 就是"价格离均线多远"除以"最近波动有多大",再挪到 0–1 之间。
它是一个标准化的乖离率,不是一个"位置"。而乖离率那一条已经写死过:乖离率大不大,在没说清是哪条均线之前,本身没有内容。
2.4 ⭐ 一个纯代数的上界:k 大过 4.25 的布林带,价格永远碰不到
这一段不用跑数据,一支笔就能推。
20 个数算出来的标准差,其中任何一个数偏离平均值多少个 σ,是有硬上界的:
n = 20 时,。(极值出现在"一个点离群、其余 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)。同一个名字,两个默认值。
差多少? 代数上是固定的:
样本口径的带子,永远宽 2.60%。
2.6% 听起来微不足道。但它落在"价格有没有出带子"这个是非题上,就不是 2.6% 了:
| 收盘价落在带外的天数 | 占比 | |
|---|---|---|
| 样本标准差(÷19) | 5468 | 10.77% |
| 总体标准差(÷20) | 6141 | 12.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 倍基线 |
两件事值得看:
- k 只改"多久响一次",不改"灵不灵"。 k 从 1.5 调到 2.5,触轨从 29% 掉到 3%,但挤压那一列一个字不动——因为 k 不改变带宽的排序,只改变它的倍数。("改参数改的不是灵不灵、是多久响一次"这句话是改参数那一条先说的,这里是第二次兑现。)
- 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 日 | 871 | 1.70% | 1.98% | 0.86 | 52.1% | 50.9% |
| 10 日 | 871 | 2.40% | 2.84% | 0.84 | 51.7% | 51.1% |
| 20 日 | 865 | 3.57% | 3.98% | 0.90 | 52.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 | 先摸到 −1ATR | 5 天内都没摸到 | |
|---|---|---|---|
| 全样本基线(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 | 最长 |
|---|---|---|---|---|
| 收盘价在上轨之上 | 1641 | 2 天 | 4 天 | 8 天 |
| 收盘价在下轨之下 | 1227 | 1 天 | 3 天 | 8 天 |
| %b ≥ 0.8(贴着上轨) | 3008 | 3 天 | 9 天 | 24 天 |
| %b ≤ 0.2(贴着下轨) | 2650 | 2 天 | 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.5 | 2681 | 0.403 |
| ATR 分位比带宽分位高 ≥ 0.5 | 1750 | 0.106 |
| 两个分位差不多 | 43855 | 0.200 |
差了将近四倍,而且指向非常干净:
带宽读高的日子,是价格一直朝一个方向走;ATR 读高的日子,是价格在来回晃。
机制不难理解:标准差量的是"这 20 个收盘价离它们的平均值有多远",一段每天涨 1%、日内几乎不动的平静上涨,价格会稳稳地离均线越走越远,σ 很大而 ATR 很小;反过来一段每天上下 3%、收盘却回到原地的剧震,ATR 很大而 σ 很小。
标准差不区分"走出去了"和"来回晃"。在它眼里,一段安静的单边上涨,和一段上蹿下跳,可以是同一个读数。
这不是布林带的 bug,是标准差这个量本身的性质。 它带来一条能直接用的结论:
带宽扩张,不一定是"波动变大了",它可能只是"价格走远了"。
结果四:"挤压"这个判断,取决于你拿多长的一段去比
同一天的带宽,在过去 250 天和过去 60 天里的分位,差 0.3 以上的日子占 13.4%。按"≤10% 分位算挤压"来判:
250 日口径判出的挤压,只有 64.3% 同时被 60 日口径认(反过来是 55.0%)。 三分之一的"挤压",换一个回看长度就不存在了。
⚠️ 这是RSI 那篇那条结论在另一个指标上的第二次出现:读数高不高取决于你拿多长的一段去比,而两个窗口都不是错的。⛔ 论证那篇做完了,本篇只补一句:
"带宽处在历史低位"这句话,在你说出"历史"有多长之前,是不完整的。
这批数据打几折
- ⚠️ 只有日线。 布林带在分钟级别上被用得同样多,本篇一个字都答不了那一层。
- ⚠️ 代表合约拼出来的序列,不是任何一个人真实持有过的东西(主连的问题前面写过)。净序列做过等比调整,但它仍是 1102 份合约接起来的。
- ⚠️ 前瞻窗口互相重叠(相邻事件的 20 日窗口盖在一起),所以本篇一个统计显著性都不报,只报中位数、占比和事件数。
- ⚠️ "大行情"的阈值是我自己定的(品种自身 20 日涨跌的 90 分位)。换阈值那 7.1% 会变,但换成 5% / 20% 分位之后是 0.70 / 0.75 倍,结论没动。
- ⚠️ 2019 年起,七年半。不覆盖更早的极端行情。
- ⚠️ 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 天,能改掉三分之一的结论。
下一篇:《凯利公式:那个"最优下注比例",为什么算出来的数你不敢用》——《米粒论道》的第四篇,接着仓位管理往下走。
⚠️ 风险提示 本文仅为期货知识分享与研究交流,不构成任何投资建议。文中所有参数、算例、代码与实测结果均为原理演示与历史统计,不构成任何交易参数推荐,历史数据不代表未来表现。期货交易具有高杠杆特性,可能导致本金全部损失甚至产生穿仓负债。文中涉及的规则、比例、时间等信息以各期货交易所官方最新公告为准。请通过正规期货公司开户,理性参与、独立决策、风险自担。


