2026年10月24日的示例中,价格 0.88 表示隐含概率为 88.0%。当一个问题所有结果的原始价格之和大于 1 时,把每个价格除以它们的总和。
使用 API 完成操作
在2026年10月24日的示例中,平台价格遵循的惯例是:每个结果的报价在 0 到 1 之间,单位是每 1 美元赔付对应的美元数。因此价格就是该结果的原始隐含概率。归一化要把这些价格放在一起使用,因为总和对应的是同一个问题的所有结果。
Narwhal 为每个结果返回一个已在各平台间综合的 probability,每个平台还有自己的 quotes。做任何计算之前,先确定你需要哪个字段:返回的概率可以直接读取,而原始结果价格则用 Python 示例中的换算。REST 和 MCP 共用同一个 API 密钥,所以使用你 Narwhal 账户中的密钥即可。
- 获取你的 API 密钥 获取一个免费密钥,并保存在名为
NARWHAL_API_KEY的环境变量中。发送请求时,把密钥放在Authorization: Bearer YOUR_KEY请求头里。 - 读取问题 针对美联储2026年10月28日的决议,请使用
https://api.narwhalapi.com上的GET /v1/predictions/scalar/usa-fed-2026-10。综合结果读取各结果的probability,想看平台自己的价格时则读取其quotes。 - 读取赔率时附上日期 每个快照都带有
as_of。2026 年 10 月 24 日的快照,其as_of为2026-10-24T00:00:00Z;请在从中取得的任何数字旁保留该日期。 - 需要时对原始价格做归一化 对于2026年10月24日的示例原始价格,先把同一问题所有结果的价格相加,再把每个价格除以这个总和。从原始价格出发时使用这个计算;Narwhal 返回的
probability值之和已经是 1。# 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%。请选择与你的报价格式相符的函数,并把返回值表示为百分比。
美式赔率函数接收带符号的报价,所以请保留其正负号。对于负的报价,函数在除法中使用它的绝对值。分数赔率函数分别接收分子和分母,请按分数赔率的顺序传入。
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.05 | 5.0% | 0.05 / 1.03 | 4.9% |
| 利率不变 | 0.88 | 88.0% | 0.88 / 1.03 | 85.4% |
| 加息 | 0.10 | 10.0% | 0.10 / 1.03 | 9.7% |
发布于。