这篇写给想用数据和 AI,在预测市场上做系统性交易的人。不讲“某人是天才”的故事,只讲一条可以复制的路径:从公开成交里提出假设,用统计检验把它杀死或留下,最后交给一个设好额度、不需要你逐笔确认的程序去跑。

先讲清它和永续合约那套的区别:直接照抄指标公式,会亏钱。
三条铁律。一,事实是代码算的,不是模型说的:概率、流动性、结算规则必须来自可复现的计算,LLM 可以给建议,不能给数字。二,缺数据就跳过:字段缺失、规则读不懂、结算源不明,不猜,直接排除。三,跳过是终局:同一个样本反复调参直到“通过”,等于自己给自己发奖。
价格就是概率。一个二元市场有 YES 和 NO 两种份额,价格在 0 到 1 之间,价格约等于市场隐含概率。以 c 买入 1 份 YES,结算为 YES 得 1 美元,否则得 0。买在 0.30,赢了是 +233%,输了是 −100%。没有杠杆、没有强平、没有资金费,但也没有“下一根 K 线”给你翻身。
有没有优势,只看一个式子:edge = p − c,EV(每投入 1 美元)= p / c − 1。p 是你估计的真实概率,c 是市场价。edge 大于 0 才值得下注,但还不够,扣掉滑点、gas、资金被锁到结算的时间成本之后,还剩多少?
仓位用二元版凯利:f* = (p − c) / (1 − c),实战只取 0.25 × f*。为什么只取四分之一?因为 p 是你估的,估错的时候,全凯利会把你打穿。
三个和合约完全不同的地方:止损——价格跌,可能意味着概率真的变低了,也可能只是流动性空了,先判断“信息变了”还是“报价变了”,再决定动不动;波动——概率有上下界,越接近 0 或 1,绝对波动必然收敛,所以要在 logit 空间里算波动,不是直接算价差;时间——每个仓位都有到期日,锁 30 天赚 2%,年化约 24%,锁 1 天赚 2%,年化约 730%,同样的 edge,资金效率差 30 倍。
数据层:Polymarket 有什么可读。大致三套接口:市场元数据(问题、结算规则、到期时间、token 列表)、订单簿与报价(盘口、买卖价、历史价格)、公开成交(谁、方向、份数、价格、时间)。第一步永远是打印一条真实返回,不要凭记忆写解析器,先请求一条,print 出字段,再写代码。字段对不上就停下。接口和费率都可能变,以你交易当日的官方文档为准。
公开成交里的四个坑:一,部分成交,一张大单会被拆成很多条记录,不合并,就把一个决策数成了十几次独立决策;二,对冲单,有人在同一个事件里同时买 UP 和 DOWN,这类成交不代表方向观点,要剔除或标记;三,maker / taker,主动吃单和被动挂单的信息含量完全不同,能区分就区分,不能就在假设里写明;四,结算后的成交,结果已判定后仍有零星成交,必须从特征里切掉,否则就是泄漏。
从公开成交里找假设,而不是抄策略。假设必须写成这个形状:在下,之后,未来内,的条件概率显著高于市场当前定价。时间类:临近结算 48 小时内,价格对新闻反应过度,原因在流动性薄、注意力集中、被迫平仓;状态类:概率在 0.15–0.35 区间时,动量延续性更强,中间区间定价最模糊;行为类:单笔大额吃单后 1 小时内有跟随,原因是信息不对称。每个假设都要写下“如果错了会看到什么”,写不出来的,不是假设,是愿望。

特征工程:把直觉变成列。概率动量要在 logit 空间算:z = ln(p / (1 − p)),ROC_logit(n) = z_t − z_(t−n)。直接在概率上算 ROC 会被两端压缩:0.90 到 0.95 和 0.50 到 0.55,看起来都是 5 个百分点,信息量差很远。波动用 ATR 的概率版:ATR_z(n) = 过去 n 期 |Δz| 的均值,用途和合约里的 ATR 一样,过滤噪音,只对超过 k 倍 ATR_z 的变动做反应。Aroon 看多久没创新高:Aroon_Up(n) = 100 × (n − 距最高 p 的周期数) / n,Aroon_Down 同理,Aroon_Osc = Aroon_Up − Aroon_Down,一个市场长时间不再创新高,往往意味着信息已被定价完,剩下的只有时间衰减。
预测市场专属特征:剩余时间,edge 要被年化,临近结算波动塌缩;订单簿不平衡,(买方深度 − 卖方深度) / 总和,比价格更早反映压力;价差,直接吃掉你的 edge;成交活跃度,每小时笔数与份数,是流动性幻觉的照妖镜;结算源模糊度,规则文本是否含主观判断,这是事件风险,模型学不到;事件内一致性,同一事件所有结果的概率之和,偏离 1 就是结构性机会或数据错误。
把假设写成规则:四张表。入场:概率区间 0.15 ≤ p ≤ 0.85,两端流动性差;动量 ROC_logit(6) 为正;噪音过滤,最近变动超过 0.8 × ATR_z(14);趋势,p 在 EMA(p, 50) 之上;流动性,盘口深度至少是计划仓位的 10 倍;剩余时间不少于 2 小时,留出退出窗口。出场:目标或结算,全平;动量反转,ROC_logit 翻负且幅度超过 ATR_z,全平;移动止损,logit 空间从峰值回撤 k 倍 ATR_z,全平;时间止损,剩余时间不足且未朝有利方向走,平掉释放资金;结构恶化,盘口深度骤降或价差走阔,减仓或全平。仓位:基础 0.25 × 凯利,单笔上限为资金的一个固定百分比,冲击上限不超过盘口该侧深度的 20%,相关性上限为同一事件所有仓位合并计算敞口,熔断为日或周回撤触发阈值后停止开新仓。记档:信号、成交、跳过、状态,四张表缺一不可,跳过的那张最有价值,它记录了你没亏的钱。
回测:八个会让你自欺的陷阱。结算泄漏:用最终结果构造特征,任何结算时刻之后才可得的信息都不能进特征;幸存者偏差:只抓已结算市场,等于只看到活下来的样本,要用当时可见的宇宙;流动性幻觉:用中间价成交,真实是薄盘口加冲击成本,必须用买一卖一加深度限制;部分成交:限价单不一定成交,纸面要模拟“挂着没成交”,否则收益凭空变好;时间戳不对齐:链上时间、API 时间、本地时间,统一到 UTC 再对齐;费用假设错误:费率政策会变,写死一个记忆里的数字最危险;结算规则误读:预言机、结算源、争议窗口,模型学不到,必须人工读规则文本;多重检验:测了 200 组参数挑最好的那个,它的夏普是假的。
检验协议:怎么证明它不是巧合。阈值扰动:ROC(6) 换 ROC(4) 和 ROC(8),0.8 ATR 换 0.6 和 1.0,一碰就碎的优势是拟合;消融测试:一条一条关掉规则,关掉后表现不变,这条规则没用,删掉;状态分层:按剩余时间、概率区间、波动水平分桶,集中在一桶是可解释,均匀分布反而可疑;成本压力:滑点翻倍、成交概率打七折、gas 乘二,还能活,才算活;样本外:按时间切分,训练段和测试段之间留隔离期,滚动向前验证。概率校准是预测市场独有的、也是最重要的检验:Brier = mean((p_pred − outcome)²),再看校准曲线,你预测 0.6 的那些交易,是不是真的赢了 60%?预测市场交易的本质是概率预测,不是价格预测,校准错了,动量再漂亮也没用。最后做显著性校正:测了 N 次,就把门槛除以 N,或用 deflated Sharpe,否则你会发现“优势”遍地都是。
资金管理:让赢家复利,让亏损缩小下一注。仓位 = min(0.25 × f*,单笔上限,盘口深度 × 0.2,相关性剩余额度),按当前余额算,不按起始余额算,赢了下一次更大,亏了自动变小。同一事件合并敞口,五个相关市场各 10%,就是 50% 押在一个叙事上。结算前主动降仓,信息已定价、资金效率下降,占着仓位就是占着机会成本。熔断要在开仓之前就写进代码,不是在亏钱之后才想起来。

无人值守:把钱包交给程序,但不逐笔确认。全天候运行的前提是不打断你,但“不点确认”不等于“没有人把关”,把关的人从你换成了代码。两种授权模式,只该选第二种:每笔弹窗确认,10 美元一单点一次,等于手动挡装了个自动挡的壳;预授权信封,只设一次,机器人在运行时无权修改,五样东西——总资金、单笔上限、最大持仓数、日亏熔断线、市场白名单,信封之内它自由,信封之外一单也发不出去。
三层架构,谁都不能单独作恶:公开数据 → 特征 → 策略给“意图” → 风控闸门 → 本地签名器 → 交易所。策略能说“我想做这个市场”,不能决定金额;闸门能决定“能不能做、做多少”,不能发单;签名器能发单,不能决定发什么。关键在最后一句:LLM 的输出只能影响“要不要考虑”,不能直接决定“下多少、发给谁”。这样即使某条帖子或市场描述里藏了诱导文本,最坏结果也只是少做一笔,而不是清空钱包。
三重保险,默认绝对不发单:PAPER = True 纸面开关,ALLOW_LIVE = False 实盘开关,ALLOW_LIVE=1 环境变量,三处同时满足才可能发真单。少一处,走的是同一条链路、同样的日志,但一个字节都不上链。要把它误开成实盘,你得连错三次。
护栏清单,缺一条就别上真钱:资金隔离,专用热钱包,只放可全损额度;单笔上限,代码写死且在深度内;日周熔断,触线停开仓只许平;市场白名单,只做规则清晰的市场;Fail-closed,缺字段、报错、签名失败一律跳过,不重试下单;心跳,每轮写文件,超时告警;Kill switch,目录里出现 STOP 文件即停机;授权额度,只给必要 allowance 并定期核对。密钥是唯一不能妥协的一条:只放你机器的环境变量或系统钥匙串,不进代码、不进仓库、不进任何聊天记录。这个热钱包里的钱,从放进去那一刻就当作已经亏掉。签名由你那台机器完成,不需要任何第三方看到密钥。
无人值守的八种死法:missing_data 暴增,某个接口改了字段名,停,打印原始返回,改解析;401 / 404,凭证过期或接口改名,停,修凭证,别动策略;429 或非结构化返回,限流或被拒,该轮跳过,绝不重试到成功;盘口突然变空,流动性撤了,跳过,已有仓位按出场规则处理;心跳超时,进程死了或机器重启,看门狗拉起,先别急着恢复交易;重复下单,重试没有幂等键,用唯一 client order id 去重;磁盘写满,日志不轮转,按天切分,保留 30 天;结算时间算错,时区或夏令时,全部用 UTC。前四条都会让交易停下来,这是设计意图:宁可空跑,不可乱跑。
上台阶的顺序,不能跳:DRY-RUN 1 天,配置读通、日志正常、kill switch 能停;纸面 2 周,成交率与滑点符合预期,校准不崩;小额实盘 2 周,实现 edge 与纸面偏差可解释;加额度,只有前三段都稳,才谈扩大信封。跳过的部分,市场会用真钱教回来。
纸面交易:唯一诚实的验证。纸面不是“假装买了”,而是用真实盘口模拟你能拿到什么价:可成交份数取计划份数与挂单量的较小值,成交价用买一卖一,薄盘口滑点更差。每天记录信号数、成交数、成交率、平均滑点、实际与预期 edge 的偏差。纸面跑满两周且校准不崩,才有资格谈真钱。

监控看板:只放能改变决策的数字。校准误差,预测概率与实际命中率的偏离;实现 edge,实际成交价与信号时价格的差,持续为负就是警讯;成交率,骤降说明流动性变差;资金占用率,过高意味着机会成本;跳过原因分布,某一类突增,通常是上游数据变了,不是市场变了。
那篇流行文章里,三件不要照抄的事。一,把指标直接套在概率价格上,概率有界,越靠近 0 或 1 波动必然收敛,绝对幅度不可比,要换到 logit 空间;二,“回测通过就上实盘”,预测市场的失败大多不是策略失败,而是结算规则误读、流动性幻觉、资金锁死;三,把别人的收益数字当基准,转述的数字没有样本量、没有成本假设、没有可核验的数据源,不要拿它当目标,也不要拿它当证据。
30 天落地计划。D1–D5 数据:三张表加一条只读抓取,能复现任意一天的市场宇宙;D6–D10 特征:特征表加缺失率报告;D11–D15 基线:一个最笨的策略,先有对照;D16–D20 回测:净值曲线加成本压力版,八倍滑点下不死;D21–D25 检验:消融、分层、样本外、校准,四项全过;D26–D30 纸面:每日纸面日志,成交率与滑点符合预期;D31–D35 无人值守:常驻进程加心跳、告警、kill switch,杀掉进程能自恢复,拔网线不炸。每一天的结论都要落成文件,没写下来的,等于没做过,下周你会用记忆骗自己。
上线前的检查,缺一不可:STOP 文件建出来,程序能在一轮之内停下;拔掉网线,程序不崩、不乱发单;杀掉进程,任务计划或 systemd 能自动拉起;心跳超过 15 分钟没更新,你能收到告警;PAPER 模式下抓包确认零下单请求;ALLOW_LIVE 三处缺一处,仍然是纸面;白名单为空时,一单都不发;超限金额的意图被闸门拒绝并留日志;现金不足时返回 no_cash;日亏触线后只允许平仓;缺字段时返回 missing_data;重复提交有幂等键去重;日志按天切分,磁盘不会被写满;所有时间统一 UTC;热钱包里的钱是你确认可全损的额度;密钥不在仓库、不在除环境变量外的任何文件、不在任何聊天记录里;你亲手跑过一次完整链路,并看过决策日志。
整套流程里最贵的不是模型,是诚实:诚实记录跳过、诚实面对校准、诚实承认某个假设死了。一个能长期活下来的预测市场系统,通常不是最聪明的那个,而是最不肯骗自己的那个。而“全天运行”真正的意思不是“AI 一直醒着”,是信封设得足够小,小到程序犯任何错都不致命;预算足够清楚,清楚到你睡得好。做到这两点,你才可以不看它。