预测市场赔率转概率的计算方法

2026年10月24日的示例中,价格 0.88 表示隐含概率为 88.0%。当一个问题所有结果的原始价格之和大于 1 时,把每个价格除以它们的总和。

使用 API 完成操作

在2026年10月24日的示例中,平台价格遵循的惯例是:每个结果的报价在 0 到 1 之间,单位是每 1 美元赔付对应的美元数。因此价格就是该结果的原始隐含概率。归一化要把这些价格放在一起使用,因为总和对应的是同一个问题的所有结果。

Narwhal 为每个结果返回一个已在各平台间综合的 probability,每个平台还有自己的 quotes。做任何计算之前,先确定你需要哪个字段:返回的概率可以直接读取,而原始结果价格则用 Python 示例中的换算。REST 和 MCP 共用同一个 API 密钥,所以使用你 Narwhal 账户中的密钥即可。

  1. 获取你的 API 密钥 获取一个免费密钥,并保存在名为 NARWHAL_API_KEY 的环境变量中。发送请求时,把密钥放在 Authorization: Bearer YOUR_KEY 请求头里。
  2. 读取问题 针对美联储2026年10月28日的决议,请使用 https://api.narwhalapi.com 上的 GET /v1/predictions/scalar/usa-fed-2026-10。综合结果读取各结果的 probability,想看平台自己的价格时则读取其 quotes。
  3. 读取赔率时附上日期 每个快照都带有 as_of。2026 年 10 月 24 日的快照,其 as_of 为 2026-10-24T00:00:00Z;请在从中取得的任何数字旁保留该日期。
  4. 需要时对原始价格做归一化 对于2026年10月24日的示例原始价格,先把同一问题所有结果的价格相加,再把每个价格除以这个总和。从原始价格出发时使用这个计算;Narwhal 返回的 probability 值之和已经是 1。
    Python:从原始价格到概率
    # A venue quotes each outcome as a price between 0 and 1 (cents on the dollar).
    # Narwhal returns the probabilities already
    # normalised, but if you start from raw prices you remove the overround yourself.
    yes_prices = {"cut": 0.05, "hold": 0.88, "hike": 0.10}  # example raw prices, sum 1.03
    total = sum(yes_prices.values())
    for outcome, price in yes_prices.items():
        print(
            f"{outcome:5} price {price:.2f}  implied {price:.1%}  "
            f"normalised {price / total:.1%}"
        )
    print("overround", round(total - 1, 2))

使用电子表格或手动计算

把同一问题所有结果的原始价格放进表格。对于2026年10月24日的示例,价格放在 B2:B4,并在第一个价格旁输入 =B2/SUM($B$2:$B$4)。把公式复制到其余价格旁,并将结果设为百分比格式。

美元符号能让公式复制时,总和始终固定在同一个区域。每一行用自己的价格作分子,用全部结果的价格作分母。归一化使用整个问题的总和,所以该区域要包含所有结果。

如果只想读一个问题而不做计算,请打开 Narwhal 预测页面,那里直接显示概率。当你手上是一组原始价格,想在原始报价旁边看到每一步除法的结果时,就用表格。

不同情况应选哪种方法

情况最合适的方法原因
在应用中查看单个问题读取 API 给出的概率已经做过归一化
来自其他来源的原始价格把每个价格除以总和这样就去除了超额部分(overround)
小数、分数或美式赔率先用公式换算,再归一化换算得到的是原始隐含概率

小数、分数和美式赔率

先选与赔率表示方式对应的公式。小数赔率 d 的隐含概率是 1/d。分数赔率 a/b 用 b/(a+b)。正的美式赔率 +X 用 100/(X+100),负的美式赔率 -X 用 X/(X+100),其中 X 是所报数字的绝对值。

在这些2026年10月24日的示例中,小数赔率 2.50、分数赔率 3/2 和美式赔率 +150 都表示 40.0% 的隐含概率;美式赔率 -200 表示 66.7%。请选择与你的报价格式相符的函数,并把返回值表示为百分比。

美式赔率函数接收带符号的报价,所以请保留其正负号。对于负的报价,函数在除法中使用它的绝对值。分数赔率函数分别接收分子和分母,请按分数赔率的顺序传入。

Python:从各种赔率格式到概率
def from_decimal(d):          # decimal odds, e.g. 2.50
    return 1 / d

def from_fractional(a, b):    # fractional odds a/b, e.g. 3/2
    return b / (a + b)

def from_american(x):         # American odds, e.g. +150 or -200
    return 100 / (x + 100) if x > 0 else -x / (-x + 100)

print(f"decimal 2.50   -> {from_decimal(2.50):.1%}")
print(f"fractional 3/2 -> {from_fractional(3, 2):.1%}")
print(f"American +150  -> {from_american(150):.1%}")
print(f"American -200  -> {from_american(-200):.1%}")

这些公式是逐个换算报价的。如果你有同一市场所有结果的赔率,就把它们的原始隐含概率相加,再把每一个除以这个总和。改变报价格式并不会去除超额部分,所以换算与归一化是两个独立的计算。

为什么价格之和会超过 100.0%?

价差和费用可能使买入每个结果的最优价格之和略高于全额赔付,这个多出来的部分就是超额部分(overround)。把每个原始价格除以所有结果的总和即可去除它,并把各结果表示为一组归一化的概率。

价格就是预测吗?

它是交易者愿意付出的价格,是市场隐含的概率,而不是保证。

需要再对 Narwhal 的数字做一次归一化吗?

不需要。返回的 probability 值之和已经是 1。需要某个问题的综合概率时,直接读取这些值即可。原始价格的计算只适用于原始报价,不要把返回的概率当成仍含超额部分的价格。

计算示例:换算原始结果价格

本示例中的数字来自2026年10月24日。

例如,原始价格为降息 0.05、维持不变 0.88、加息 0.10。相加得 1.03。用这个总和减去全额赔付 1,超额部分(overround)为 0.03,即 3 个百分点。

把每个价格除以 1.03,得到它在总和中的占比。原始隐含概率的百分比直接来自价格,归一化后的百分比则使用这个共同的分母。所有结果都要使用同一个分母,这样计算才包含全部价格。

结果原始价格原始隐含概率计算归一化后的概率
降息0.055.0%0.05 / 1.034.9%
利率不变0.8888.0%0.88 / 1.0385.4%
加息0.1010.0%0.10 / 1.039.7%

发布于。

后续步骤