方法论

AHR999 的计算方法

本数据集中的每个字段 —— ma200ahr999quantile5y —— 都由开源 TypeScript 每日从 Binance BTCUSDT 日 K 重新计算。本页给出确切的公式、常数与窗口规则,任何数值都可手工复现。

输入

  • 价格来源。Binance 公开端点 GET /api/v3/klines,参数 symbol=BTCUSDTinterval=1d。每根日 K 只保留收盘价 —— 本仓库不转发原始 OHLCV 数据。
  • 回填起点。2017-08-17,Binance 为 BTCUSDT 提供的最早日 K。
  • 截止。今日 UTC − 1 天,即最后一个完整收盘的 UTC 日。当日 UTC 是未完成的 K,会让 quantile5y 在日内抖动。

常数

名称取值作用
GENESIS2009-01-03BTC 创世区块日期;币龄锚点。
MA_WINDOW200ma200 的滚动窗口。
FIT_A5.84log-log 拟合公允价曲线的斜率。
FIT_B−17.01拟合曲线的截距。
QUANTILE_MIN_OBS365报告 quantile5y 前所需的最少有效 AHR 观测数。
QUANTILE_WINDOW1825观测足够后的滚动窗口大小(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_dahr999_d 在最近有效 AHR 值窗口(含当前值)中的经验排名

quantile5y_d = count(window 中 v : v ≤ ahr999_d) / window.length

窗口取决于到目前为止有多少个有效 AHR 观测:

有效观测数窗口windowKindquantile5y
< 365insufficient_samplesnull
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.84FIT_B = −17.01MA_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 仓库