Hyperliquid 胜率:盈利因子与期望值计算(2026)
用成交记录计算 Hyperliquid 胜率、盈利因子和期望值:公式、盈亏平衡胜率表、带日期的真实钱包示例和 Python 脚本。
简要结论:胜率是扣除手续费后盈利的已平仓交易所占的比例。在 Hyperliquid 上可以用公开的成交记录(fills)计算胜率,但结果很大程度上取决于你如何定义"一笔交易":每一笔平仓成交、每一个平仓订单,还是从空仓到空仓的完整回合。胜率本身也不能说明是否赚钱,需要同时看平均盈利、平均亏损、盈利因子和期望值,并且要记住资金费和未实现盈亏永远不会出现在已平仓交易里。在我们 2026 年 10 月 26 日的快照中,一个月度盈亏 +164 万美元的排行榜钱包,按平仓成交计算的胜率只有 36.8%,已实现交易基本持平。它的收益来自未平仓头寸和资金费。
"我在 Hyperliquid 上的胜率是多少?"听起来很简单。Hyperliquid 的界面会显示交易历史和盈亏,但不显示胜率,所以交易者要么把成交导出到表格,要么相信第三方给出的数字,却不知道它是怎么算的。本指南介绍相关公式、三种定义"交易"的方法(以及为什么结果不同)、需要用到的 Hyperliquid API 字段、一个带日期的真实示例,以及一个可对任何公开地址计算全部指标的简短 Python 脚本。不需要任何 API 密钥。
真正重要的四个指标
以下指标都基于已平仓交易,并使用扣除手续费后的净盈亏。
- 胜率 = 盈利交易数 ÷(盈利交易数 + 亏损交易数)。盈亏恰好为零的交易不计入。
- 平均盈利与平均亏损 = 总盈利 ÷ 盈利笔数,总亏损 ÷ 亏损笔数。两者之比就是盈亏比(R)。
- 盈利因子(profit factor)= 总盈利 ÷ 总亏损。大于 1.0 说明交易赚钱,小于 1.0 说明亏钱。
- 期望值(expectancy)= 净盈亏 ÷ 交易笔数,等于 胜率 × 平均盈利 − 败率 × 平均亏损,即平均每笔交易值多少美元。
把它们联系起来的是盈亏平衡胜率:平均亏损 ÷(平均盈利 + 平均亏损),也就是 1 ÷(1 + R)。胜率必须高于这条线才能赚钱。
| 盈亏比(平均盈利 ÷ 平均亏损) | 盈亏平衡胜率 |
|---|---|
| 0.5 | 66.7% |
| 1.0 | 50.0% |
| 1.5 | 40.0% |
| 2.0 | 33.3% |
| 3.0 | 25.0% |
这就是为什么 35% 的胜率可能非常出色,而 90% 的胜率可能是慢慢爆仓的方式:一切取决于盈利相对于亏损的大小。
在 Hyperliquid 上什么算"一笔交易"?
Hyperliquid 记录的是成交(fills),而不是交易。一个订单可能分成很多笔成交,一个头寸也可能通过几十个订单加仓和减仓。所以你必须选择一个单位:
- 平仓成交。每一笔减少头寸并带有
closedPnl的成交。最容易计算,也是看板最常用的方法,但噪音很大:一个订单拆成十笔成交就变成了十笔"交易"。 - 平仓订单。按订单 id(
oid)合并成交。更接近交易者的思维("我止盈了一次"),但分三个订单退出一个头寸仍算三笔交易。 - 完整回合(round trip)。从头寸由零开仓,到再次归零(或反手到另一方向)为止。这符合"一个想法,一笔交易"的理念,并且包含开仓成交的手续费,而前两种方法会忽略这部分。
三种方法都没错,但彼此不可比较。如果有人给出 Hyperliquid 胜率,先问他用的是哪种单位。评估自己的决策,完整回合通常最真实;检查执行质量,成交和订单更有用。
需要的 API 字段
所有数据都来自公开的 info 接口(POST https://api.hyperliquid.xyz/info):
userFillsByTime返回某地址在一段时间内的成交。每笔成交包含coin、side(B买,A卖)、sz、px、startPosition(成交前的持仓量)、dir(例如Open Long或Close Short)、closedPnl、fee和oid。每次响应最多 2,000 笔,需要按时间分页,并且通过这种方式只能获取最近的 10,000 笔成交。非常活跃的钱包几天甚至几小时就会达到上限。fee字段与closedPnl分开给出,需要自己相减得到净盈亏。负的手续费是挂单返佣。userFunding返回资金费记录。资金费不属于任何成交,所以基于成交计算的胜率会忽略它。每次调用最多返回 500 行,同样需要分页。clearinghouseState返回未平仓头寸及其unrealizedPnl,任何已平仓统计都不包含这一项。
如果你对这些字段还不熟悉,可以阅读我们的已实现盈亏(closed PnL)指南和未实现盈亏指南;如何导出交易历史介绍了如何把原始成交导入表格。
真实示例:同一个钱包,三个胜率
我们在 2026 年 10 月 26 日约 08:14 UTC 对 0x541e077ac38c56d7bf590924d249c60b0c80071d(Hyperliquid 公开排行榜上的一个钱包)运行了下面的脚本,统计此前 30 天。排行榜显示该月盈亏为 +1,636,619 美元(ROI 70%),账户价值约 135 万美元。该钱包在此期间有 1,947 笔成交,其中 1,924 笔为永续合约。以下盈亏均已扣除手续费。
| 单位 | 交易笔数 | 胜率 | 平均盈利 | 平均亏损 | 盈利因子 | 净额 |
|---|---|---|---|---|---|---|
| 平仓成交 | 917 | 36.8% | $515 | $299 | 1.00 | +$478 |
| 平仓订单 | 411 | 36.3% | $1,166 | $661 | 1.00 | +$478 |
| 完整回合(在统计期内开仓并平仓) | 12 | 41.7% | $1,333 | $1,008 | 0.94 | −$393 |
可以得出三点结论:
- 交易笔数从 917 变成 12,完全取决于定义。每笔交易的平均值也随之按同样比例变化,所以在不知道单位的情况下,不要比较不同工具给出的"平均盈利"。
- 平仓成交的数据与盈亏平衡公式吻合。平均盈利 $515、平均亏损 $299,盈亏平衡胜率为 299 ÷(515 + 299)≈ 36.7%。实际胜率为 36.8%,因此盈利因子为 1.00,已平仓交易只赚了 $478。
- 已平仓交易几乎解释不了当月的盈亏。同一期间,该钱包收到约 129,042 美元资金费(4,680 次支付),快照时其九个未平仓头寸(全部为空头)带有约 1,056,140 美元未实现盈亏。胜率看板会把它当成一个持平的交易者,而账户实际上赚了七位数。
这些数字是带日期的实时数据快照,你运行脚本时结果会不同。
Python 脚本:计算任意地址的胜率、盈利因子和期望值
脚本会分页读取 userFillsByTime,只保留永续合约成交(现货币种以 @ 开头),输出三种定义的结果以及按币种划分的完整回合统计。开仓发生在统计期之前的回合会被跳过,因为缺少开仓手续费和部分盈亏。脚本只发送少量轻量请求,远低于 API 速率限制。
import requests, time, collections
from datetime import datetime, timezone
API = "https://api.hyperliquid.xyz/info"
ADDRESS = "0x541e077ac38c56d7bf590924d249c60b0c80071d" # any public address, no keys needed
DAYS = 30
def fills_since(user, start_ms):
"""Page through userFillsByTime (max 2,000 rows per call, newest 10,000 reachable)."""
out, t = [], start_ms
while True:
batch = requests.post(API, json={"type": "userFillsByTime", "user": user,
"startTime": t, "aggregateByTime": True}, timeout=15).json()
if not batch:
break
out += batch
if len(batch) < 2000:
break
t = batch[-1]["time"] + 1
return out
def stats(pnls):
wins = [p for p in pnls if p > 0]
losses = [p for p in pnls if p < 0]
gw, gl = sum(wins), -sum(losses)
n = len(wins) + len(losses)
return {
"trades": n,
"win_rate": len(wins) / n if n else 0,
"avg_win": gw / len(wins) if wins else 0,
"avg_loss": gl / len(losses) if losses else 0,
"profit_factor": gw / gl if gl else float("inf"),
"expectancy": (gw - gl) / n if n else 0,
"net": gw - gl,
}
now = int(time.time() * 1000)
fills = sorted(fills_since(ADDRESS, now - DAYS * 86_400_000), key=lambda f: f["time"])
perp = [f for f in fills if not f["coin"].startswith("@")]
# 1) every closing fill counts as a "trade" (what many dashboards do)
closing = [f for f in perp if f["dir"].startswith("Close") or float(f["closedPnl"]) != 0]
per_fill = [float(f["closedPnl"]) - float(f["fee"]) for f in closing]
# 2) one closing ORDER = one trade (partial fills of the same oid merged)
by_oid = collections.defaultdict(float)
for f in closing:
by_oid[(f["coin"], f["oid"])] += float(f["closedPnl"]) - float(f["fee"])
per_order = list(by_oid.values())
# 3) round trips: a position that opens from 0 and returns to 0 (fees of every fill included)
# positions already open when the window starts are skipped (their entry is missing)
trips, open_pnl = [], {}
for f in perp:
c = f["coin"]
start = float(f["startPosition"])
signed = float(f["sz"]) * (1 if f["side"] == "B" else -1)
if start == 0:
open_pnl[c] = 0.0 # a new position starts here
if c not in open_pnl:
continue # opened before the window
open_pnl[c] += float(f["closedPnl"]) - float(f["fee"])
end = start + signed
if abs(end) < 1e-9 or (start > 0) != (end > 0): # flat again (or flipped side)
trips.append((c, open_pnl.pop(c)))
if abs(end) >= 1e-9:
open_pnl[c] = 0.0 # a flip opens the opposite side
per_trip = [p for _, p in trips]
print(f"{ADDRESS} last {DAYS} days fills={len(fills)} perp fills={len(perp)}")
if not fills:
raise SystemExit("no fills in this window")
first = datetime.fromtimestamp(fills[0]["time"] / 1000, tz=timezone.utc)
print(f"data from {first:%Y-%m-%d %H:%M} UTC" + (" (hit the 10,000-fill cap, window is shorter than asked)" if len(fills) >= 10_000 else ""))
for name, s in (("closing fills", stats(per_fill)), ("closing orders", stats(per_order)), ("round trips", stats(per_trip))):
print(f"{name:14} n={s['trades']:5} win rate {s['win_rate']:.1%} avg win ${s['avg_win']:,.0f} "
f"avg loss ${s['avg_loss']:,.0f} profit factor {s['profit_factor']:.2f} "
f"expectancy ${s['expectancy']:,.0f} net ${s['net']:,.0f}")
by_coin = collections.defaultdict(list)
for c, p in trips:
by_coin[c].append(p)
for c, ps in sorted(by_coin.items(), key=lambda kv: -len(kv[1]))[:5]:
s = stats(ps)
print(f" {c:8} trips={s['trades']:4} win rate {s['win_rate']:.1%} net ${s['net']:,.0f}")
扩展思路:按币种加上 userFunding 得到计入资金费的回合盈亏,用 dir 区分多空交易,或按持仓时长分组。刚接触 API?先看 Hyperliquid API Python 指南。
如何解读你自己的数据
- 高胜率、小盈利、少见的大亏损。常见于过早止盈或让亏损单继续扩大的策略。应关注平均亏损和回撤,而不是胜率。
- 低胜率、大盈利。趋势跟踪和突破交易的常态。只要扣除手续费后盈利因子高于 1 就没问题。
- 盈利因子接近 1.0。你的优势大约等于你的成本,此时手续费影响很大:参见 Hyperliquid 手续费指南和计入手续费与资金费的真实盈亏指南。
- 小样本会误导。只有 12 个回合时,一笔交易就能让胜率变动超过 8 个百分点。至少积累几十笔交易再下结论。
- 所有指标使用同一时间窗口。在同一期间比较胜率、资金费和未实现盈亏,否则数字对不上。
记录每笔交易的理由会让这些数字更有用;我们的 Hyperliquid 交易日志指南介绍了一个简单方法。
查看其他交易者的胜率
由于成交是公开的,你可以对任何钱包做同样的分析,包括排行榜交易者和 Smart Money 中的钱包。对他们的数据同样要谨慎:主要持仓、赚取资金费或做市的交易者,在不同单位和时间窗口下看起来差别很大。要看全貌,还应查看其盈亏曲线和未平仓头寸,这正是投资组合追踪器所展示的内容。
无需写代码即可追踪盈亏
Hyperfolio 是免费、只读的 Hyperliquid 追踪器。粘贴一个或多个地址,即可在一个页面查看盈亏、未平仓永续合约、未实现盈亏和最近成交,支持桌面和手机 PWA。它从不索要私钥或签名。如果你关注多个账户,请参阅如何追踪多个 Hyperliquid 钱包。
常见问题
Hyperliquid 会显示我的胜率吗?
不会直接显示。它显示交易历史和盈亏。你可以按上文方法,用公开 API 根据成交计算胜率。
Hyperliquid 上多少胜率算好?
没有统一标准。胜率必须高于你的盈亏平衡胜率,而后者取决于盈亏比:盈利和亏损大小相同时约为 50%,盈利是亏损两倍时约为 33%。
closedPnl 是否已扣除手续费?
手续费在每笔成交的 fee 字段中单独给出,因此脚本用 closedPnl 减去它得到净盈亏。开仓成交的 closedPnl 为零,但仍需支付手续费,只有完整回合方法会把它计入。
资金费会计入胜率吗?
如果用成交计算胜率,则不会。资金费单独支付,可通过 userFunding 查询。对长期持有的头寸,资金费可能超过交易盈亏,正如上面的例子。
什么是盈利因子?
已平仓交易的总盈利除以总亏损。盈利因子为 1.5 表示每亏 1 美元就赚 1.50 美元。
为什么不同工具显示的胜率不一样?
通常是因为它们对交易的计数方式不同(成交、订单或完整回合)、时间窗口不同,或是否计入手续费不同。在我们的例子中,同一个钱包有 917 笔平仓成交,但只有 12 个完整回合。
能查看巨鲸的胜率吗?
可以。Hyperliquid 的成交是公开的,脚本适用于任何地址。非常活跃的钱包可能触及 10,000 笔成交的上限,从而缩短可分析的时间窗口。
降低交易成本。如果你刚开始使用 Hyperliquid,可使用推荐码 HYPERFOLIO 享受 4% 手续费折扣(推荐码说明),然后在 Hyperfolio 中免费追踪你的盈亏、持仓和成交。
免费试用 Hyperfolio
实时追踪 Hyperliquid 投资组合,包含盈亏、Smart Money、Markets、Perp Calculator、多 venue 投资组合和推送提醒。
HYPERLIQUID
-4% fees在 Hyperliquid 交易 · 手续费 4% 折扣
Hyperfolio 是独立应用,免费使用,无需订阅。我们的资金来自 Hyperliquid 推荐、广告位和捐赠;非常感谢您通过我们的链接交易。
对您免费 · 让 Hyperfolio 持续运行
相关文章
Hyperliquid 清算地图:真实清算价位(2026)
用真实链上持仓而非估算热力图构建 Hyperliquid 清算地图。以 2026 年 11 月 2 日账户价值最大的 300 个账户为例,讲解如何解读清算集群与集中度,并附 Python 脚本。
指南Hyperliquid 最佳交易时间:按小时与星期(2026)
基于 672 根小时 K 线(2026 年 10 月 4 日至 11 月 1 日),按 UTC 小时和星期统计 Hyperliquid 上 BTC、ETH、HYPE、SOL 的成交量与波动率高峰,及其对滑点、止损和资金费率的影响,附 Python 脚本。
指南Hyperliquid 多空比:解读交易者持仓(2026)
为什么 Hyperliquid 全市场多空比永远是 1,如何用公开数据计算一组钱包的多空比,排行榜前 100 交易者的带日期案例,以及 Python 脚本。
指南Hyperliquid 夏普比率:风险调整后收益指南(2026)
用公开 portfolio 接口计算任意 Hyperliquid 钱包或金库的夏普比率和索提诺比率:充值提现陷阱、带日期的排行榜与 HLP 示例,以及 Python 脚本。
指南Hyperliquid 相关性与 beta:加密永续合约对冲指南(2026)
用公开 K 线 API 计算 Hyperliquid 的相关性和 beta:BTC、ETH、HYPE、SOL、XRP 和 DOGE 带日期的 30 日与 90 日矩阵、三个组合与对冲示例,以及 Python 脚本。
指南Hyperliquid 波动率与 ATR:止损、仓位与杠杆(2026)
用公开 K 线 API 自己计算 Hyperliquid 波动率:带日期快照中 BTC、ETH、HYPE、SOL、XRP 和 DOGE 的已实现波动率与 ATR,附止损、仓位和杠杆示例及 Python 脚本。