字段规格
两种容器格式,两个并不共用字段表的平台。下面列的每一项都是你在文件里真的会遇到的列或键,按数据集分开。
两种格式
结算流与 K 线是 gzip 压缩的 CSV,带表头。市场事件流是 gzip 压缩的 JSONL——一行一个 JSON 对象,顺序就是帧到达的顺序。归档期不做任何重排。
结算流 —— CSV(Polymarket 侧)
prices、twap30s、twap60s 共用同样这五列。整个归档里只有这里同时带三个各自独立的时间戳。
| feed_ts_ms | 事件时间:上游给这条报价打的时间戳(UTC 毫秒) |
| value | 浮点价格,查询方便用 |
| full_accuracy_value | 只要 relay 发布,这里就是同一个价格的定点整数串(1e18)。要重算输赢就用这个,别用 value |
| server_ts_ms | 上游服务端发出的时间(UTC 毫秒) |
| recv_ms | 我们收到的时间(UTC 毫秒)。三个分开存,从不合并——延迟链路你可以自己量 |
市场事件 —— JSONL 的信封(Polymarket 侧)
book、price_change、best_bid_ask、last_trade_price 的每一行都带同样六个顶层键。注意这里是两个时间戳而不是三个,而且事件那个不叫 feed_ts_ms。
| slug | 这一帧属于哪个市场 |
| asset_id | 这一帧说的是哪个 outcome token。price_change 上为 null,因为那种行一次携带两侧的变化 |
| event_type | 与 dataset 同名 |
| event_ts_ms | 上游事件时间(UTC 毫秒) |
| recv_ms | 我们收到的时间(UTC 毫秒) |
| payload | 上游的消息体,按收到的样子保留 |
payload 里有什么,按数据集分
| book | bids 与 asks,各是一个 {price, size} 对象数组,另有 hash、market、asset_id、timestamp。一行只是一个 outcome token 的盘口快照(是哪个看信封的 asset_id),它的两侧档位都在这一行里。某一侧是空数组表示那一侧没有挂单,不是「这次没报」 |
| price_change | price_changes 是一个数组,每项带 hash、side、size、price、asset_id、best_ask、best_bid。两个 outcome token 出现在同一行里,这也是信封上 asset_id 为 null 的原因 |
| best_bid_ask | 针对某个 asset_id 的 best_bid、best_ask 与 spread。只有价格——这条流没有挂单量,深度仍要看 book 或 price_change |
| last_trade_price | 针对某个 asset_id 的 side、size、price、fee_rate_bps、transaction_hash |
markets —— 一个市场一行
元数据、strike,以及结算结果出现之后的结算。raw 键里是上游市场对象的原样副本,结算配置就在那里面。
| slug / asset / interval_sec | 身份与时长。interval_sec 的单位是秒 |
| condition_id / token_ids | 链上标识。token_ids 有两项,第一项是「涨」——这是实测定下来的,不是假设 |
| start_sec / end_sec | 市场窗口,单位是秒——不像事件流那样是毫秒 |
| resolved / outcome_prices | 结算结果。["1","0"] 表示 Up 赢,["0","1"] 表示 Down 赢。只有完整的二元对才有意义 |
| strike_value | 这一局的「要超越的价格」,是定点整数串(1e18)。无法诚实确定时为空,不会拿邻近 tick 猜 |
| raw | 上游市场对象按收到的样子保留,含 raw.cryptoMarketConfig——见市场怎么判定输赢 |
klines —— CSV
由结算流推导,所以是 OHLC,没有成交量列。ticks 数的是这个桶里有多少次结算更新,不是成交量。
| ts_ms | 桶的起点(UTC 毫秒) |
| open / high / low / close | 桶内价格 |
| ticks | 落在这个桶里的结算更新次数——是更新计数,不是成交量 |
Predict.fun 不共用上面这套字段
列名不同、档位形状不同、时间单位也不同。两个平台都订阅的话,把它们当成两种格式来处理,而不是一种格式多几个字段。
| prices(CSV) | price_feed_id、symbol、provider、publish_time、server_ts、price、recv_ms。publish_time 与 server_ts 的单位是秒,而 recv_ms 是毫秒;价格列叫 price,不叫 value |
| orderbook(JSONL) | market_id、category_slug、update_ts_ms、recv_ms、payload。payload 里 bids 与 asks 是 [price, size] 数组对——不是 Polymarket 那侧的 {price, size} 对象——另有 version、orderCount、lastOrderSettled、settlementsPending |
| markets(JSONL) | category_slug、asset、interval_label、market_id、price_feed_id、price_feed_symbol、price_feed_provider、condition_id、start_sec、end_sec、start_price、end_price、status。这里的价格是普通十进制字符串,不是 1e18 定点 |
拿它写结算校验之前有一件事要知道:status 记的是上游最后一次告诉我们的状态,而一个市场拿到 end_price 之后就不再被重读了。所以能说明 Predict.fun 市场已结算的字段是 end_price。
想专门看其中一类: Polymarket 盘口数据 · Chainlink 结算价数据 · Predict.fun 历史数据 · 与其他服务商的对比