输入
- 价格来源。Binance 公开端点
GET /api/v3/klines,参数symbol=BTCUSDT、interval=1d。每根日 K 只保留收盘价 —— 本仓库不转发原始 OHLCV 数据。 - 回填起点。
2017-08-17,Binance 为 BTCUSDT 提供的最早日 K。 - 截止。
今日 UTC − 1 天,即最后一个完整收盘的 UTC 日。当日 UTC 是未完成的 K,会让quantile5y在日内抖动。
常数
| 名称 | 取值 | 作用 |
|---|---|---|
GENESIS | 2009-01-03 | BTC 创世区块日期;币龄锚点。 |
MA_WINDOW | 200 | ma200 的滚动窗口。 |
FIT_A | 5.84 | log-log 拟合公允价曲线的斜率。 |
FIT_B | −17.01 | 拟合曲线的截距。 |
QUANTILE_MIN_OBS | 365 | 报告 quantile5y 前所需的最少有效 AHR 观测数。 |
QUANTILE_WINDOW | 1825 | 观测足够后的滚动窗口大小(5 × 365)。 |
逐步计算
对每个收盘价为 c_d 的 UTC 日 d:
1 · 200 日均价
ma200_d = mean(close[d-199 .. d])
若已观测的收盘价不足 200 个(含 d),则 ma200_d = null,所有下游字段均为 null,且 windowKind = "insufficient_samples"。
2 · 拟合公允价
拟合曲线把 BTC 视作以币龄锚定的资产,按距创世区块的天数索引:
coin_age_days_d = floor((d − GENESIS) / 1 天)
fitted_d = 10 ^ (FIT_A · log10(coin_age_days_d) + FIT_B)
= 10 ^ (5.84 · log10(coin_age_days_d) − 17.01)
3 · AHR999
ahr999_d = (c_d / ma200_d) · (c_d / fitted_d)
两个比值相乘:
- 动量 ——
c_d / ma200_d:当前价相对自身 200 日成本的高低。大于 1 表示高于定投成本,小于 1 表示低于。 - 币龄锚定的便宜程度 ——
c_d / fitted_d:当前价相对拟合长期轨迹的高低。
乘积把两个信号压缩成一个标量。各仪表盘上常见的经验阈值:
| 区间 | 档位 |
|---|---|
< 0.45 | 抄底区 · bargain |
0.45 – 1.20 | 定投区 · DCA |
1.20 – 3.00 | 谨慎区 · caution |
> 3.00 | 泡沫区 · bubble |
这些阈值是经验性的,不属于公式的正式定义。
4 · 5 年分位
quantile5y_d 是 ahr999_d 在最近有效 AHR 值窗口(含当前值)中的经验排名:
quantile5y_d = count(window 中 v : v ≤ ahr999_d) / window.length
窗口取决于到目前为止有多少个有效 AHR 观测:
| 有效观测数 | 窗口 | windowKind | quantile5y |
|---|---|---|---|
< 365 | — | insufficient_samples | null |
365 – 1824 | 截至当前的全部观测(扩张) | expanding | 报告 |
≥ 1825 | 最近 1,825 个观测(滚动) | rolling_5y | 报告 |
离散排名 vs. 插值
分位用的是离散排名 count(v ≤ current) / N,而非 numpy 默认的线性插值分位。理由:
- 九神社区的原始实现都用离散排名。
- 约 1,800 个观测下,排名分辨率 ≈ 0.00055 —— 已比对该数值的任何可操作解读都更细。
- 它含义清晰:「过去五年里有多大比例的时间比现在更便宜或一样便宜?」
你可以在首个非空分位行 2019-03-03 手工验证,那里 quantile5y = 78 / 365 = 0.2136986301369863,精确成立。
与其他实现的差异
vs. 九神原始公式
我们使用完全相同的常数(FIT_A = 5.84、FIT_B = −17.01、MA_WINDOW = 200、5 年分位)。仅有的、你需要知道的有意选择:
- 价格来源。Binance BTCUSDT。部分旧分析用 CoinMarketCap 或 OKX;它们在 2018 年前有分歧,但在 BTCUSDT 成交量占主导后收敛到 ≤ 0.1%。
- 显式窗口类型。暴露
windowKind,便于消费者过滤掉 365 至 1,825 的扩张窗口预热期。
vs. 9992100.xyz
9992100.xyz 是最流行的中文 AHR999 仪表盘。每日出现小幅分歧(AHR999 绝对值 ≤ 0.02)是正常的,因为它可能在不同的 UTC 邻近截止点更新,且其价格来源与收盘时间戳语义未公开。两个站点在任一天都应在档位上一致;不要去追不同实现之间的数值完全相等。
端到端复现
pnpm sync:backfill
pnpm export:csv
pnpm verify # 仓库检查点精确断言首个分位 / 滚动行
设置 AHR999_SOURCE_BASELINE_PATH=/path/to/ahr999-daily.jsonl 后,pnpm verify 会额外按行对比,相对误差容忍度 < 1e-9。不设置时,该命令仍会强制校验仓库内的检查点与数据集不变量。完整源码见 GitHub 仓库。