把一件修好的小事写出来,因为它的失败形态值得记一笔:整条链路没有抛过一次异常、没有打过一条警告,日志里只有「本轮开始采」这句报喜,而数据一行都没进库。
发生了什么
机会列表会同时扫 U 本位和币本位两个市场,而取资金费率历史走的是 U 本位接口 UsdFuturesApi.ExchangeData.GetFundingRatesAsync。
拿一个币本位合约(例如 BTCUSD_PERP)去问这个接口,返回的是一页空数据,而且 Success 仍然是 true。不抛异常,不报警告。
于是每一轮采集都重复同一个循环:币本位合约被当成「还没有费率历史的新交易对」接纳一次,白打一次接口,一行存不下;下一轮因为它仍然没有历史,再次被当成新的接纳进来。
线上 19 个 _PERP 合约就这样循环了很久。FundingRateTicks 表里 _PERP 的行数是 0,而日志每 15 分钟准时报一次「本轮开始采」。
它还在花别人的预算
这才是真正要修的理由。
每轮冷启动有一个上限(配置项 FundingRateMaxColdStartsPerTick),本质上是个名额。名额被这十几个永远采不到的合约占着,真正等着补历史的交易对每轮就要多等一次。
所以修复点放在取名额之前,而不是放在存盘那一步——挡在存盘只是少写一行,挡在取名额之前才把名额还回去。

判据为什么按交易对形状认
币本位合约的代码带下划线(BTCUSD_PERP),据此识别。这条判据两边都得钉死:
- 放松一格,
ETHUSDC、AAVEUSDC、ADAUSDC这些 USDC 本位的合约会被一起挡掉。它们是实实在在采得到的,库里有历史。挡掉之后不会报错,只会让页面上那几个币显示成「最近没有行情」——又是一个不报错的故障。 - 收紧一格,币本位就漏回来了,循环照旧。
被挡掉的个数并进原有那句「本轮开始采」里,不单开一条日志。币本位是个长期状态,为它单开一条等于把刚删掉的刷屏换个说法加回来。
关于 USDC 本位和 U 本位的费率差别,我们单独统计过:34 对合约里有 33 对是 USDC 那张更高。
修完之后库里是什么样
截至 2026-10-08 06:00 +08:00,资金费率库累计 1,029,262 期结算记录、覆盖 534 个标的,最早一期回溯到 2020 年 1 月 1 日。
其中有两年以上连续历史的只有 BTC 和 ETH 两个,各 7,416 期——其余标的绝大多数是 2025 年 8 月之后才开始采的。这一点在读任何「逐年趋势」时都要先确认:拿一年的历史去画六年的走势是无中生有,所以走势图上只放这两个标的。
为什么把这种事公开写
因为这类故障恰恰是最该被外部看见的一类。
报错的故障会自己叫出来。不报错的故障——接口返回空但状态成功、循环重试却永远不落盘、日志只报开始不报结果——只能靠有人去对账才发现。一个声称有多少期历史数据的平台,它的数字可不可信,取决于有没有人在做这件事。
这也是我们把可核验的那几项摊开写的原因:余额、逐笔交易明细、持仓、收益走势、认购记录、提现进度,投资者都能自己查。查得到的才算数。
相关变更
同一批里还有一项:下一期费率预测的展示补了一行实测命中率。预测这件事的成绩单我们此前公开过,11,472 次预测的结果就摆在那篇里——现在这个数字直接跟在预测旁边,不用翻文章。
数据来源:故障描述与修复方式来自本项目代码仓库的提交记录(2026-09-17,涉及 FundingRateSymbolScope、FundingRateCollectorJob 及对应单元测试)。库规模数字来自后端逐期结算快照,截至 2026-10-08 06:00 +08:00。
