For fourteen consecutive days — May 19 through June 1 — the BV-7X oracle published NEUTRAL while every one of its sub-signals screamed bearish. Bitcoin fell 9.6% over that window. The model wasn't wrong. It wasn't even uncertain. It had a high-conviction, unanimous directional view the entire time — and a single line of risk-management logic refused to let it speak.
This is the post-mortem: what broke, what it cost, the fix, and — because I get asked this — exactly what the fix did and did not do to the numbers. No spin. The headline is not "we got more accurate." The headline is "we stopped going dark."
*Resolved 7-day windows only (6 of the 9 recovered SELLs have completed their horizon as of June 2). See the caveats section — these are not yet in the scored backtest.
1. The symptom: a flat line where a signal should be
The oracle computes one directional call per day at 21:35 UTC, pins it to IPFS, and attests it on Base. Every call carries four sub-signals — trend, momentum, flow, value — that vote, and a decision layer that turns the vote into BUY / SELL / HOLD. On May 19 the published calls went flat and stayed flat for two weeks.
Here is the tape. The line is BTC spot; each red dot is a day the model published NEUTRAL. The directional view underneath every one of those dots was SELL.
A 9.6% decline, called by no one — because the model that called it was muted. BTC: $76,959 → $69,585. Intra-window high $77,693.
2. The diagnosis: a model that worked, gated by logic that didn't
The first thing to rule out was a dead data feed or a crashed signal layer. It was neither. Every single day, the decision layer produced the same trace:
The model reached SELL. Then the SELL proximity gate — a risk filter that only lets sell signals fire when price is "close enough" to a reference moving average with a sane RSI — overrode it to HOLD. Every day. The gate exists for a good reason: historically, selling deep into an already-collapsed, far-from-mean market is a coin flip. But it had two coverage holes that, together, swallowed an entire regime.
Hole 1: the dead band
The gate had two branches. A structural-bear branch (for price more than 15% below the 200-day MA) and a normal branch (for price within 10% of it). Price that sat 10–15% below the MA fell through both — too far for normal, not far enough for structural — and defaulted to HOLD. A textbook off-by-one in threshold space.
Hole 2: the RSI floor
The normal branch also required RSI between 40 and 55. But a market in a confirmed downtrend is, by definition, oversold — RSI sat at a median of 32.6 across the streak. So even after closing the dead band, the normal branch still muted every bearish call whose RSI lived below 40. This was the bigger hole, and it's the one the first patch attempt missed.
The two holes mapped cleanly onto the data. Below: every day of the streak, its distance below the 200-day MA, its RSI, and which hole trapped it.
Bar width = distance below the 200-day MA (Jun 1 = −10.7%, the deepest). †Days with RSI below 30 are deliberately still held — that's the capitulation zone, where you don't want to initiate new shorts into a possible bottom.
3. What the silence cost
A signal product that goes dark for two weeks has a cost even if you can't book it as P&L: it's the track record you didn't build, the attestations you didn't write, the calls subscribers didn't get. And in this case the calls would have been right.
Of the nine days the fixed gate now fires SELL, six have completed their 7-day evaluation window as of June 2. All six were correct — price was lower seven days later, every time.
| Date | Dist MA200 | RSI | 7d ROC | Old | New | Realized 7d |
|---|---|---|---|---|---|---|
| May 19 | −5.5% | 40 | −4.7% | HOLD | SELL | −1.36% |
| May 20 | −4.6% | 34 | −2.5% | HOLD | SELL | −3.53% |
| May 21 | −4.2% | 35 | −4.5% | HOLD | SELL | −5.20% |
| May 22 | −6.2% | 40 | −4.0% | HOLD | SELL | −3.28% |
| May 23 | −5.2% | 33 | −2.1% | HOLD | SELL | −3.57% |
| May 24 | −5.2% | 36 | −2.3% | HOLD | SELL | −3.80% |
| May 27–Jun 1 | ≤−6.8% | 30–32 | <−3% | HOLD | SELL | pending |
| Resolved | 6 of 6 correct · avg realized | −3.46% | ||||
The opportunity cost, stated plainly
A correct, unanimous SELL signal was generated and then suppressed on 9 separate days during a −9.6% decline. On the six that have since resolved, the average 7-day move in the signal's direction was −3.46%. That is two weeks of correct, attestable track record the protocol simply did not publish.
4. The fix (v5.6.9)
Two changes, both in the SELL proximity gate. Both are exposed as tunable thresholds and mirrored exactly into the backtest engine, so the live model and the simulator can never silently disagree.
The second change is the load-bearing one. It says: when a death cross confirms a structural downtrend and price is actively declining, an oversold reading (RSI 30–40) is a reason to sell, not a reason to abstain. Below 30, the model still steps aside — that's the capitulation zone, where shorting the bottom is how you give back the whole trade.
5. Validation: the part where I refuse to oversell it
Here is the question a CEO should actually ask: "You loosened a risk filter. Did you just trade discipline for noise?" The answer, from a full-history backtest over 5,600 days (2011–2026), is no. The change is accuracy-neutral.
| Metric | Before (floor 40) | After (floor 30) | Δ |
|---|---|---|---|
| Overall accuracy | 63.04% | 63.01% | −0.03pp |
| BUY accuracy | 64.66% | 64.66% | 0.00pp |
| SELL accuracy | 57.49% | 57.36% | −0.13pp |
| SELL near MA200 | — | 62.4% | ≥58% floor |
| SELL far below MA200 | — | 59.4% | ≥58% floor |
| Actionable signals | 2,013 | 2,014 | +1 |
Read those last two rows carefully, because they're the whole story. Over thirteen years, loosening the floor changed the historical signal count by exactly one. The regime this fix targets — death cross, price hugging the MA, RSI stuck in the 30s — occurred on just 7 of 5,600 days (0.13%), and five of those seven are the streak we just lived through. The fix is, by construction, almost invisible to history and surgical to the present.
The honest caveat (because a quant who hides these gets fired)
The live streak is not yet in the scored backtest — those days haven't completed their 7-day forward window inside the dataset, so they're excluded from the 63.01% above. Strip them out and this exact regime has only ~2 historically resolvable instances, and the one out-of-streak case was a loss (0/1).
So I am not claiming statistical proof that these new SELLs are accurate. I'm claiming three things I can defend: (1) the change does not degrade overall accuracy on 13 years of data; (2) it is structurally contained — it requires a death cross, so it can never fire in a bull market; and (3) on the only live test so far it went 6/6. That is a moderate-confidence, low-downside, reversible change — it's a single env-overridable threshold. We re-evaluate once the streak resolves.
6. The governance footnote
Two smaller things shipped with v5.6.9, because a model is only as trustworthy as its paper trail:
- Version drift, closed. The previous fix attempt changed live logic but never bumped the version constant — so predictions were being stamped
5.6.8while running newer code. That's exactly the kind of silent drift that erodes an attestation's meaning. The stamp is now5.6.9, enforced by a test that ties the version constant to the changelog's LIVE row. - 13 new regression tests. The gate is now pinned at every boundary — the dead band, the RSI floor, the death-cross requirement, the capitulation guard. The bug that produced a 14-day blackout cannot silently return.
Every call BV-7X has ever made is on-chain, timestamped, and verifiable — including the fourteen that said NEUTRAL. We don't get to quietly delete an embarrassing fortnight; it's attested on Base forever. The only honest response to a public track record is to fix the machine in public and show the math. That's this post.
A model that abstains when it's certain isn't being cautious. It's being broken quietly. The fix wasn't to make it smarter — it was to stop muzzling it when it already knew the answer.
Verify every call yourself
The full prediction history — including the silent fortnight and the v5.6.9 calls — is attested on Base and queryable live.
Open the Terminal →连续十四天 —— 5月19日到6月1日 —— BV-7X 预言机持续发布 中性,而它的每一个子信号都在高喊看跌。在这段时间里,比特币下跌了 9.6%。模型没有判断错误,它甚至并不犹豫。整整两周,它都持有一个高确信、全票一致的方向性观点 —— 却被一行风控逻辑硬生生堵住了嘴。
这是一份事故复盘:哪里坏了、代价是什么、怎么修的,以及 —— 因为总有人问 —— 这次修复对数据到底做了什么、没做什么。不加修饰。重点不是"我们更准了",重点是"我们不再失声了"。
*仅限已结算的7日窗口(截至6月2日,9个恢复的卖出信号中有6个已走完周期)。详见下文"诚实的保留意见" —— 这些尚未纳入计分回测。
1. 症状:本该有信号的地方,是一条平线
预言机每天 UTC 21:35 计算一个方向性判断,固定到 IPFS,并在 Base 上链存证。每个判断包含四个子信号 —— 趋势、动量、资金流、估值 —— 投票,再由决策层把投票转化为 买入 / 卖出 / 持有。5月19日起,发布的判断变成平线,并持续了两周。
这是行情图。线是比特币现货;每个红点是模型发布"中性"的一天。而每个红点底下的真实方向观点,都是卖出。
一场 9.6% 的下跌,无人预警 —— 因为预警它的模型被静音了。比特币:$76,959 → $69,585,窗口内高点 $77,693。
2. 诊断:模型没问题,是堵它的逻辑有问题
首先要排除的是数据源中断或信号层崩溃。两者都不是。每一天,决策层都给出同样的轨迹:
模型得出了卖出。然后卖出邻近门控 —— 一个只有当价格"足够接近"参考均线、且 RSI 合理时才放行卖出信号的风控过滤器 —— 把它改写成了持有。天天如此。这个门控的存在有其道理:历史上,在一个已经崩盘、远离均值的市场里追空,胜率接近抛硬币。但它有两个覆盖漏洞,叠加在一起,吞掉了整整一个市场形态。
漏洞一:死区
门控有两条分支。一条结构性熊市分支(价格低于200日均线15%以上),一条正常分支(价格在均线10%以内)。而位于均线下方10–15%的价格,从两条分支中间漏了下去 —— 对正常分支太远,对结构性分支又不够远 —— 默认落入持有。教科书式的阈值"差一"错误。
漏洞二:RSI 下限
正常分支还要求 RSI 在 40 到 55 之间。但一个处于确认下行趋势的市场,从定义上就是超卖的 —— 整个连续期内 RSI 中位数为 32.6。所以即便堵上了死区,正常分支依然会静音掉所有 RSI 低于 40 的看跌信号。这才是更大的漏洞,也是第一次修补尝试漏掉的那个。
两个漏洞干净地映射到数据上。下图:连续期内每一天,其低于200日均线的距离、RSI,以及它被哪个漏洞困住。
条宽 = 低于200日均线的距离(6月1日 = −10.7%,最深)。†RSI 低于 30 的日子仍被刻意持有 —— 那是投降区,你不会想在可能的底部去开新空单。
3. 失声的代价
一个信号产品失声两周,即便无法记入损益表,也是有代价的:那是你没能建立的历史业绩、没能写下的存证、订阅者没能收到的判断。而这次,这些判断本会是正确的。
在修复后门控如今发出卖出的九天中,截至6月2日有六天已走完7日评估窗口。六个全部正确 —— 七天后价格更低,无一例外。
| 日期 | 距MA200 | RSI | 7日ROC | 旧 | 新 | 实现7日 |
|---|---|---|---|---|---|---|
| 5/19 | −5.5% | 40 | −4.7% | 持有 | 卖出 | −1.36% |
| 5/20 | −4.6% | 34 | −2.5% | 持有 | 卖出 | −3.53% |
| 5/21 | −4.2% | 35 | −4.5% | 持有 | 卖出 | −5.20% |
| 5/22 | −6.2% | 40 | −4.0% | 持有 | 卖出 | −3.28% |
| 5/23 | −5.2% | 33 | −2.1% | 持有 | 卖出 | −3.57% |
| 5/24 | −5.2% | 36 | −2.3% | 持有 | 卖出 | −3.80% |
| 5/27–6/1 | ≤−6.8% | 30–32 | <−3% | 持有 | 卖出 | 待结算 |
| 已结算 | 6/6 正确 · 平均实现 | −3.46% | ||||
把机会成本说白
在一场 −9.6% 的下跌中,一个正确、全票一致的卖出信号被生成、又被压制,共计9天。在已结算的六天里,信号方向上的平均7日波动为 −3.46%。这就是协议本可发布、却没有发布的两周正确且可存证的业绩。
4. 修复(v5.6.9)
两处改动,都在卖出邻近门控里。两者都以可调阈值暴露,并被精确地镜像进回测引擎,因此线上模型与模拟器永远不会悄悄地各执一词。
第二处改动才是承重的那一处。它说的是:当死叉确认了结构性下行、且价格正在主动走低时,超卖读数(RSI 30–40)是卖出的理由,而不是弃权的理由。低于30,模型依然让路 —— 那是投降区,在底部追空正是你把整笔交易吐回去的方式。
5. 验证:我拒绝夸大的那一部分
一个 CEO 真正该问的问题是:"你放松了一个风控过滤器。你是不是拿纪律换了噪声?"来自一个跨越 5,600 天(2011–2026)的全历史回测的答案是:没有。这次改动对准确率是中性的。
| 指标 | 之前(下限40) | 之后(下限30) | Δ |
|---|---|---|---|
| 整体准确率 | 63.04% | 63.01% | −0.03pp |
| 买入准确率 | 64.66% | 64.66% | 0.00pp |
| 卖出准确率 | 57.49% | 57.36% | −0.13pp |
| MA200 附近卖出 | — | 62.4% | ≥58% 下限 |
| MA200 远下方卖出 | — | 59.4% | ≥58% 下限 |
| 可操作信号数 | 2,013 | 2,014 | +1 |
仔细读最后两行,因为那就是全部故事。在十三年里,放松下限使历史信号数仅改变了整整一个。这次修复针对的形态 —— 死叉、价格紧贴均线、RSI 卡在30多 —— 仅出现在 5,600 天中的7天(0.13%),而其中五天正是我们刚刚经历的这段连续期。这次修复在构造上对历史几乎不可见,对当下却精准切中。
诚实的保留意见(因为隐瞒这些的量化分析师会被开除)
这段实盘连续期尚未纳入计分回测 —— 这些日子在数据集内还没走完7日前瞻窗口,所以不在上面的 63.01% 之中。把它们剔除后,这个确切形态在历史上仅有约 2 个可结算样本,且唯一的非连续期样本是亏损的(0/1)。
所以我并不声称这些新卖出信号准确性的统计证明。我声称的是三件我能站得住脚的事:(1)这次改动在13年数据上不降低整体准确率;(2)它在结构上是受限的 —— 它要求死叉,因此永远不会在牛市中触发;(3)在迄今唯一的实盘检验中它是 6/6。这是一次中等信心、低下行风险、可逆的改动 —— 它只是一个可由环境变量覆盖的阈值。等连续期结算后我们会重新评估。
6. 治理脚注
随 v5.6.9 一并上线的还有两件小事,因为一个模型的可信度不会超过它的存证记录:
- 版本漂移,已闭合。上一次修复尝试改了线上逻辑,却没有更新版本常量 —— 于是预测在运行更新代码的同时被打上了
5.6.8的戳。这正是那种侵蚀存证意义的静默漂移。版本戳现在是5.6.9,并由一个把版本常量绑定到变更日志 LIVE 行的测试来强制执行。 - 13 个新回归测试。门控现在在每一个边界都被钉死 —— 死区、RSI 下限、死叉要求、投降区保护。那个造成14天失声的 bug 不可能再悄悄回来。
BV-7X 做过的每一个判断都在链上、带时间戳、可验证 —— 包括那十四个说"中性"的。我们没法悄悄删掉一段尴尬的两周;它永远存证在 Base 上。对一份公开业绩唯一诚实的回应,就是当众修好机器、并把数学摆出来。这篇文章就是。
一个在确定时弃权的模型不是谨慎,而是在悄无声息地失灵。这次修复不是让它更聪明 —— 而是在它早已知道答案时,别再捂住它的嘴。