基于线性回归的 Polymarket 气温预测基线模型

0xbobaaa 发布于 2026-04-26 阅读 222

这篇文章讨论了如何用线性回归结合正态分布,给 Polymarket 上的全球温度异常预测市场建立一个可交易的基线模型。作者使用 NASA GISTEMP 的月度历史数据,先用 1970 年后的 April 数据拟合趋势,再用残差标准差把单点预测转成各价格桶的概率分布,并据此计算与市场报价之间的正期望值。文章进一步指出,单纯线性趋势会高估当前温度桶,因为 ENSO(厄尔尼诺/拉尼娜)对月度异常影响很大,因此需要加入 ENSO 修正、Ridge 回归和更快的外部数据源来提升模型效果。

Image

NASA 每个月都会发布全球温度异常值数据,最早可追溯到 1880 年。Polymarket 围绕这项数据开设了一个包含六个区间的市场。在这两者之间,有一个可以用线性回归加正态分布干净解决的问题。下面是在一个真实市场上的完整流程:Polymarket 上的 2026 年 4 月温度升幅(ºC)。成交量 136k,领先区间为 1.15–1.19ºC,占 48%,预计在 5 月 10 日左右结算。Python,30 行,开放数据。

1. 市场

Image

Polymarket 上的 2026 年 4 月温度升幅市场。成交量 $136k,流动性 $12K。结算依据是 NASA GISTEMP 的 GLB.Ts+dSST.txt 表中 "Apr" 列、"2026" 行的数据。

六个区间,对应相对于 1951–1980 基线的 ºC 异常值。当前领先区间为:1.15–1.19ºC,占 48%。其余概率分布在相邻的 1.10–1.14 和 1.20–1.24 区间。宽尾部(<1.10 和 >1.29)则处于价外。

交易者的任务是:计算你自己对全部六个区间的概率分布,并找出市场在哪些地方与你的判断不一致。

2. 数据

Image

NASA GISTEMP v4 陆海温度指数,表示相对于 1951–1980 基线的异常值。该文件是开放的,每月中旬更新,格式是一个普通表格,包含 Year、Jan、Feb、...、Dec 列。

对于 4 月市场:筛选出 "Apr" 列。你会得到一个从 1880 年到 2025 年、共 146 个点的序列。这就是训练集。

有一个注意事项:NASA 经常会将发布时间推迟 1–2 周,尤其是在 GHCN v4 尚未收到某些国家报告时。Copernicus ERA5 和 JRA-3Q 通常发布得更早,并且与 GISTEMP 的相关性在 0.95 以上。谁先看到最新月份的数据,谁就已经先行建仓了。

3. 基线:线性回归

Image

最简单的模型:

y = m·x + b

选择能够最小化平方误差和的系数。通过正规方程可以闭式求解,一步完成。

  • m — 每年的升温速率,单位 ºC/year
  • b — 序列的截距

这个模型在概念上做的事很简单:画一条穿过点云的直线,使均方误差最小。仅此而已。

4. 先画图,再拟合

Image

在拟合之前,先把点画出来。可以看到三个阶段:

  • 1880–1940:基本平稳,约在 -0.3 ºC
  • 1940–1970:缓慢上升
  • 1970–至今:稳定的线性趋势,伴随 ±0.1–0.2 ºC 的噪声

如果用全部 146 个点去拟合一条直线,就会系统性低估当前水平;因为它把寒冷的 20 世纪和温暖的 21 世纪平均在了一起。这会压低右侧区间的定价。

两个实用修正:

  • 只使用 1970 年之后的窗口训练
  • 用二次项或指数项替代直线

第一种更简单,也不会增加参数。在 1970 年之后的数据上,4 月异常值大约以 0.02 ºC/year 的速度增长——这就是斜率 m。

5. 从点到分布

Image

回归只会返回一个数——μ,也就是期望值。市场交易的是区间,这意味着你需要知道它落入每个区间的概率。

计算残差:residuals = actual − μ_predicted。取这些残差的标准差 σ,并假设误差围绕预测值服从正态分布。

那么对于任意区间 [a, b]:

P(a≤y≤b)=Φ((b−μ)/σ)−Φ((a−μ)/σ)

其中 Φ 是标准正态分布的 CDF。

输出结果就是:覆盖全部六个 Polymarket 区间的完整概率分布。其总和恰好等于 1。

6. Edge:一个具体计算

Image

4 月市场中,1.15–1.19ºC 区间的交易价格为 48c(隐含概率 48%)。

假设你的模型在修正后给出 P(1.15–1.19) = 56%。

以 $0.48 买入 Yes 份额。收益如下:

  • 如果该区间命中:+$0.52(你收到 $1,买入成本为 $0.48)
  • 如果没有命中:-$0.48

期望值:

EV = 0.56 × 0.52 + 0.44 × (−0.48) = +0.08

等价的简写:

EV = model_probability − market_price = 0.56 − 0.48 = 每份 +0.08

一句话规则:如果模型的 P > 以 cents 计的市场价格,那么买 Yes 的 EV 为正;反之则考虑 No。再减去手续费和滑点,就得到净 Edge。

7. 为什么仅靠基线现在还不够

Image

对 1970 年后的数据做朴素 LR,会得到 2026 年 4 月的 μ 大约在 1.30–1.40 ºC。这样会把大部分概率分布推到 1.20–1.24 区间及其右侧。

但市场把 1.15–1.19 交易在 48%。这意味着市场认为 μ 大概在 1.15–1.18 之间,比原始趋势给出的值更低。为什么?

ENSO。El Niño / La Niña 是全球温度异常值最主要的月度驱动因素。在相同的长期趋势水平下,El Niño 峰值与 La Niña 谷值之间的差距很容易达到 0.2 ºC。

现在正在发生什么(CPC discussion,2026 年 4 月 9 日):

  • Final La Niña Advisory + El Niño Watch
  • ENSO-neutral favored April-June(80% probability)
  • El Niño likely to emerge May-July(61% probability)

2026 年 4 月是走出 La Niña 后的第一个完整月份。残余冷却仍在压低异常值,而长期趋势则继续向上推动。没有进行 ENSO 修正的朴素 LR,会把右侧区间定价过高。

市场已经知道这一点。Edge 不在于回归本身,而在于你如何更准确地建模 ENSO 修正,以及你获取新数据的速度有多快——Copernicus ERA5、每周 Niño 3.4、每日 OISST。

8. Ridge regression:当你扩展规模时

Image

一旦你加入更多特征——二次项、滞后 Niño 3.4、CO₂ 水平、火山气溶胶——过拟合风险就会上升。模型会把过去拟合得过于完美,却在新数据上失手。

解决方法:Ridge Regression。

Loss = MSE + λ · Σβᵢ²

这是对系数大小施加惩罚。λ 通过交叉验证调参。在 146 个点、5–10 个特征的情况下,Ridge 比普通 OLS 更稳定——系数噪声更小,泛化能力更强。

替代方案包括:Lasso(L1,会把弱特征压到 0)、Elastic Net(两者结合)、带先验的 Bayesian regression。对于基线模型来说,Ridge 已经足够。

9. Python 骨架

import numpy as np
import pandas as pd
from scipy.stats import norm
from sklearn.linear_model import Ridge

## 1. GISTEMP:4 月异常值
df = pd.read_csv("GLB.Ts+dSST.csv", skiprows=1)
apr = df[["Year", "Apr"]].replace("***", np.nan).dropna()
apr["Apr"] = apr["Apr"].astype(float)

## 2. 在 1970 年之后训练
train = apr[apr["Year"] >= 1970]
X, y = train[["Year"]].values, train["Apr"].values

## 3. Ridge 拟合
model = Ridge(alpha=1.0).fit(X, y)
mu = model.predict([[2026]])[0]
sigma = np.std(y - model.predict(X))

## 4. ENSO 修正(可选,但对 2026 年 4 月至关重要)
## mu_adj = mu + beta_enso * nino34_lagged
## beta_enso 在(残差,滞后 3-6 个月的 Niño 3.4)上校准

## 5. 覆盖 Polymarket 区间的概率
buckets = [(-np.inf, 1.10), (1.10, 1.15), (1.15, 1.20),
           (1.20, 1.25), (1.25, 1.30), (1.30, np.inf)]
probs = np.array([norm.cdf(hi, mu, sigma) - norm.cdf(lo, mu, sigma)
                  for lo, hi in buckets])

## 6. 相对于市场价格的 Edge
market = np.array([...])  # 填入当前 Polymarket 价格
edge = probs - market
print(list(zip(probs.round(3), market, edge.round(3))))

完整模型不含 imports 只需 15 行。从这里开始,你可以继续加入:ENSO 修正、λ 交叉验证、对 2020–2025 年 4 月进行回测,以及计入手续费和滑点。

总结

线性回归加 Gaussian residuals:这是一个基线模型,它

  • 只需 30 行 Python 就能实现
  • 产出的是显式概率分布,而不是点预测
  • 可推广到 Polymarket 上任何按月的气候市场
  • 适用于任何拥有长期公开时间序列的场景

它不是一套完整策略——它只是起点。真正的 Edge,来自基线与 ENSO 模型、替代数据源以及严格仓位管理的结合。

但没有基线,就谈不上后续分析。如果你不知道回归会怎么说,你就不知道市场是否定价过高。

4 月市场大约在 5 月 10 日结算。5 月市场会在随后几周推出。同样的方法也适用于年度异常值、CPI,以及任何拥有长期公开时间序列的市场。

有人在气候市场上跑模型吗?你在基线之上又叠加了什么——ENSO、ERA5,还是别的自定义模型?

  • 原文链接: x.com/0xbobaaa/status/20...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

相关文章

0 条评论