hyperliquid交易记录中平均每笔收益率算法详解

平均每笔收益率算法详解

📊 算法概述

平均每笔收益率(Mean Return Per Trade) 是基于单笔交易收益率计算的核心指标,用于衡量交易策略的平均盈利能力,完全不依赖外部本金数据。

核心特点

  • ✅ 完全独立:每笔交易自给自足
  • ✅ 相对持仓价值:反映资金使用效率
  • ✅ 标准化指标:可跨账户、跨策略对比
  • ✅ 不受出入金影响:与账本记录无关

🎯 核心公式

基础公式

单笔交易收益率 = closedPnL / (|sz| × px)

参数说明

  • closedPnL: 该笔交易的已实现盈亏(单位:USD)
  • sz: 交易数量(可为正或负)
  • px: 交易价格(单位:USD)
  • |sz| × px: 持仓价值(名义价值,单位:USD)

平均收益率

平均每笔收益率 = Σ(单笔收益率) / 交易笔数

其中,只统计有 PnL 的交易(closedPnL ≠ 0)。


💡 算法原理

1. 为什么使用持仓价值而非本金?

传统方法的问题

基于本金计算

单笔收益率 = closedPnL / true_capital

问题

  1. 需要准确的本金数据(充值-提现+外部转入-外部转出)
  2. 账本记录可能不完整
  3. 本金可能为负(转出 > 转入)
  4. 受出入金操作影响

新方法的优势

基于持仓价值计算

单笔收益率 = closedPnL / (|sz| × px)

优势

  1. 每笔交易独立计算,数据自包含
  2. 不需要外部账本数据
  3. 反映真实的资金使用效率
  4. 符合金融行业标准(收益率 = 盈亏 / 投入资金)

2. 持仓价值的含义

持仓价值(Notional Value)

持仓价值 = |sz| × px

物理意义

  • 该笔交易占用的名义资金量
  • 在杠杆交易中,代表仓位大小
  • 是计算收益率的分母基础

示例 1:无杠杆交易

买入 10 个 ETH,价格 $2,000/个
持仓价值 = 10 × $2,000 = $20,000
平仓盈利 $500
收益率 = $500 / $20,000 = 2.5%

示例 2:10倍杠杆交易

用 $2,000 本金,10倍杠杆买入 10 个 ETH @ $2,000
持仓价值 = 10 × $2,000 = $20,000
实际占用本金 = $2,000(10倍杠杆)
平仓盈利 $500
收益率 = $500 / $20,000 = 2.5%

关键理解

  • 使用持仓价值计算的收益率是标准化的
  • 不受杠杆倍数影响
  • 可以直接对比不同杠杆策略的表现

3. 为什么取绝对值 |sz|?

交易数量 sz 的含义

  • sz > 0: 多头平仓(Close Long)
  • sz < 0: 空头平仓(Close Short)

使用绝对值的原因

  • 持仓价值应该是正数(代表资金量大小)
  • 无论做多还是做空,都使用相同的计算逻辑
  • 盈亏的正负已经体现在 closedPnL

示例

# 多头平仓
sz = 10, px = 2000, closedPnL = 500
持仓价值 = |10| × 2000 = 20000
收益率 = 500 / 20000 = 2.5%

# 空头平仓
sz = -10, px = 2000, closedPnL = 500
持仓价值 = |-10| × 2000 = 20000
收益率 = 500 / 20000 = 2.5%

🔬 算法实现

完整代码

def calculate_sharpe_ratio_on_trades(self, fills: List[Dict],
                                     risk_free_rate: float = 0.03) -> Dict[str, float]:
    """
    基于单笔交易收益率计算 Sharpe Ratio(不依赖本金)

    返回:
        - mean_return: 平均每笔收益率 ⭐
        - std_return: 收益率标准差
        - sharpe_ratio: 每笔交易的夏普比率
        - annualized_sharpe: 年化夏普比率
    """
    trade_returns = []
    trade_times = []

    # 步骤1: 遍历所有成交记录,计算单笔收益率
    for fill in fills:
        closed_pnl = float(fill.get('closedPnl', 0))

        # 只统计有PnL的交易
        if closed_pnl == 0:
            continue

        # 获取交易数量和价格
        sz = float(fill.get('sz', 0))
        px = float(fill.get('px', 0))

        # 计算持仓价值(名义价值)
        notional_value = abs(sz) * px

        if notional_value > 0:
            # 计算单笔收益率
            trade_return = closed_pnl / notional_value
            trade_returns.append(trade_return)
            trade_times.append(fill.get('time', 0))

    # 步骤2: 计算平均收益率
    if len(trade_returns) >= 1:
        mean_return = sum(trade_returns) / len(trade_returns)
    else:
        mean_return = 0

    # 步骤3: 计算标准差
    if len(trade_returns) >= 2:
        variance = sum((r - mean_return) ** 2 for r in trade_returns) / (len(trade_returns) - 1)
        std_return = math.sqrt(variance)
    else:
        std_return = 0

    # 步骤4: 计算 Sharpe Ratio(见夏普比率算法详解)
    # ...

    return {
        "mean_return": mean_return,      # ⭐ 平均每笔收益率
        "std_return": std_return,        # 收益率标准差
        "sharpe_ratio": sharpe_per_trade,
        "annualized_sharpe": annualized_sharpe,
        "total_trades": len(trade_returns)
    }

关键步骤详解

步骤1: 计算单笔收益率

for fill in fills:
    closed_pnl = float(fill.get('closedPnl', 0))

    # 过滤开仓交易(只统计平仓)
    if closed_pnl == 0:
        continue

    sz = float(fill.get('sz', 0))
    px = float(fill.get('px', 0))

    # 持仓价值 = |交易数量| × 价格
    notional_value = abs(sz) * px

    if notional_value > 0:
        # 单笔收益率 = 盈亏 / 持仓价值
        trade_return = closed_pnl / notional_value
        trade_returns.append(trade_return)

数据验证

  • 检查 closedPnl 是否为 0(过滤开仓交易)
  • 检查 notional_value 是否 > 0(避免除零错误)

步骤2: 计算平均值

mean_return = sum(trade_returns) / len(trade_returns)

数学公式

mean_return = (r₁ + r₂ + ... + rₙ) / n

其中:

  • rᵢ = 第 i 笔交易的收益率
  • n = 交易总笔数

步骤3: 计算标准差

variance = sum((r - mean_return) ** 2 for r in trade_returns) / (len(trade_returns) - 1)
std_return = math.sqrt(variance)

数学公式(样本标准差):

variance = Σ(rᵢ - mean)² / (n - 1)
std_return = √variance

注意

  • 使用 n-1 而非 n(贝塞尔校正)
  • 这是样本标准差,更适合有限样本

📈 实际应用案例

案例 1: 完美策略

交易记录

Trade 1: sz=10,  px=2000, closedPnl=500   → 收益率 = 500/(10×2000)  = 2.5%
Trade 2: sz=5,   px=1800, closedPnl=360   → 收益率 = 360/(5×1800)   = 4.0%
Trade 3: sz=8,   px=2200, closedPnl=440   → 收益率 = 440/(8×2200)   = 2.5%

平均每笔收益率

mean_return = (2.5% + 4.0% + 2.5%) / 3 = 3.0%

解读

  • 平均每笔交易盈利 3.0%(相对持仓价值)
  • 策略具有正期望(mean > 0)
  • 表现稳定(标准差较小)

案例 2: 波动策略

交易记录

Trade 1: sz=10,  px=2000, closedPnl=1000  → 收益率 = 1000/(10×2000) = 5.0%
Trade 2: sz=5,   px=1800, closedPnl=-450  → 收益率 = -450/(5×1800)  = -5.0%
Trade 3: sz=8,   px=2200, closedPnl=880   → 收益率 = 880/(8×2200)   = 5.0%
Trade 4: sz=12,  px=1900, closedPnl=-570  → 收益率 = -570/(12×1900) = -2.5%

平均每笔收益率

mean_return = (5.0% - 5.0% + 5.0% - 2.5%) / 4 = 0.625%

标准差

variance = [(5-0.625)² + (-5-0.625)² + (5-0.625)² + (-2.5-0.625)²] / 3
         ≈ 18.23
std_return = √18.23 ≈ 4.27%

解读

  • 平均每笔盈利 0.625%(正期望)
  • 波动性较大(标准差 4.27%)
  • Sharpe Ratio 较低(收益/风险比不理想)

案例 3: 真实数据(测试地址)

地址: 0x67e4d5c95fdd024d136d520b3432ad0f94ed5081

分析结果

平均每笔收益率: 15.82%
收益率标准差:   8.89%
交易笔数:       35 笔
胜率:           100.00%

解读

  • 极优秀的交易策略
  • 平均每笔盈利 15.82%
  • 无亏损交易(100% 胜率)
  • 波动性可控(标准差 < 平均收益率)

📊 指标解读

平均每笔收益率的含义

数值范围 评级 说明
> 10% 🟢 极优秀 非常高的盈利能力
5% - 10% 🟢 优秀 良好的盈利能力
2% - 5% 🟡 中等 正期望策略,可接受
0% - 2% 🟡 偏低 正期望但盈利能力弱
< 0% 🔴 负期望 策略长期亏损

与其他指标的关系

1. 与胜率的关系

高平均收益率 + 高胜率 → 🟢 极优秀策略

示例: mean = 15.82%, win_rate = 100%

高平均收益率 + 低胜率 → 🟡 高风险高回报策略

示例: mean = 10%, win_rate = 30%
说明: 偶尔大赚,经常小亏

低平均收益率 + 高胜率 → 🟡 稳健但盈利能力弱

示例: mean = 1%, win_rate = 80%
说明: 经常小赚,偶尔大亏

2. 与标准差的关系

Sharpe Ratio 公式

Sharpe = (mean_return - risk_free_rate) / std_return
  • 平均收益率越高 → Sharpe 越高(收益增加)
  • 标准差越小 → Sharpe 越高(风险降低)

理想比例

mean_return / std_return > 2.0  (优秀)
mean_return / std_return > 1.0  (良好)
mean_return / std_return < 0.5  (偏低)

3. 与盈亏因子的关系

Profit Factor = 总盈利 / 总亏损

  • 平均收益率 > 0 → 不一定 Profit Factor > 1
  • Profit Factor > 1 → 不一定 平均收益率 > 0

示例

Case 1: mean = 5%, PF = 2.0
- 策略盈利,风险收益比良好

Case 2: mean = -2%, PF = 0.8
- 策略亏损,需要优化

Case 3: mean = 10%, PF = 1.2
- 策略盈利,但波动较大

🎯 优化建议

如何提高平均每笔收益率?

1. 提高盈利交易的收益率

  • 优化止盈策略
  • 增加持仓时间(趋势延续)
  • 提高杠杆倍数(谨慎)

2. 降低亏损交易的损失

  • 严格止损纪律
  • 减少冲动交易
  • 优化入场时机

3. 提高胜率

  • 优化入场信号
  • 避免逆势交易
  • 改进技术指标

4. 降低波动性(提高 Sharpe)

  • 分散交易品种
  • 减少仓位大小
  • 避免过度杠杆

🔍 常见问题

Q1: 为什么不使用账户总盈亏除以交易次数?

:那样计算的是平均每笔绝对盈亏,单位是美元,无法跨策略对比。

示例

策略A: 本金 $10,000, 平均每笔盈利 $100
策略B: 本金 $1,000,  平均每笔盈利 $50

哪个更好?无法判断!

但如果看收益率:
策略A: 平均每笔 1%  ($100 / $10,000)
策略B: 平均每笔 5%  ($50 / $1,000)

显然策略B更优秀!

Q2: 杠杆会影响平均每笔收益率吗?

:不会!这正是使用持仓价值的优势。

示例

无杠杆: 用 $10,000 买 5 个 ETH @ $2,000
- 盈利 $500
- 收益率 = $500 / (5 × $2,000) = 5%

10倍杠杆: 用 $1,000 买 5 个 ETH @ $2,000
- 盈利 $500
- 收益率 = $500 / (5 × $2,000) = 5%

两者收益率相同!

Q3: 平均每笔收益率能预测未来吗?

:不能直接预测,但可以作为策略评估的重要参考。

使用建议

  1. 结合其他指标综合评估(Sharpe、Max Drawdown、胜率)
  2. 关注收益率的稳定性(标准差)
  3. 需要足够的样本量(建议 > 30 笔交易)
  4. 定期回顾和调整策略

Q4: 如何判断平均收益率是否可靠?

可靠性检查清单

✅ 交易笔数 > 30(统计学最小样本量)
✅ 时间跨度 > 3 个月(避免偶然性)
✅ 市场环境多样(牛市、熊市、震荡)
✅ 标准差/平均值 < 2.0(波动可控)


📚 相关算法

本指标是以下算法的基础:

  1. 夏普比率算法 (夏普比率算法详解.md)

    • 使用 mean_return 和 std_return 计算 Sharpe Ratio
  2. 最大回撤算法 (最大回撤算法详解.md)

    • 使用单笔收益率构建累计收益率曲线
  3. 累计收益率算法 (累计收益率算法详解.md)

    • 使用单笔收益率进行复利计算

🔗 代码位置

函数: ApexCalculator.calculate_sharpe_ratio_on_trades()
文件: apex_fork.py
行数: ~1138-1192

调用链:

main.py
  └─ analyze_user_trading()
      └─ ApexCalculator.analyze_user()
          └─ ApexCalculator.calculate_sharpe_ratio_on_trades()
              └─ mean_return  ⭐

📖 参考资料

  • 数学基础: 统计学中的样本均值和样本标准差
  • 金融理论: 现代投资组合理论(MPT)
  • 行业标准: 收益率 = 盈亏 / 投入资金(名义价值)

算法文档版本: v2.0
创建时间: 2026-02-04
作者: Claude Sonnet 4.5

Read more

跑步的技巧(滚动落地)

“滚动落地(rolling contact / rolling foot strike)”不是一种教条式的“脚法”,而是一种 让冲击沿着整只脚、整条后链逐级传递的落地机制。 它的核心不是“你先用哪儿着地”,而是: 你的脚落地之后,冲击是不是像轮子一样滚过去,而不是像锤子一样砸下去。 这就是滚动落地的本质。 一、什么叫“滚动落地”? 你可以把它理解成两种完全不同的落地方式: 1. 砸地(撞击式) 脚像锤子一样拍到地上: * 要么后跟先砸 * 要么前掌先戳 * 冲击集中在一个点 * 一个结构瞬间吃掉大部分载荷 结果就是: * 后跟砸 → 膝盖难受 * 前掌戳 → 前脚掌磨烂 * 都不是长跑友好模式 这叫 撞击式着地(impact strike)。 2. 滚地(滚动式) 脚像轮胎一样“滚”过地面: * 不是某一点硬砸 * 而是外侧中足先轻触 * 再向前滚到前掌 * 最后从大脚趾蹬离

By SHI XIAOLONG

AMI的优越性

世界模型(World Models)的具体例子 如下,我按类型分类,便于理解。每类都附带实际实现、演示效果和应用场景。 1. Yann LeCun / Meta 的 JEPA 系列(最直接对应“世界模型”概念) 这些是 LeCun 主张的非生成式抽象预测世界模型代表。 * I-JEPA(Image JEPA,2023) 输入一张图像,模型把不同区域(context 和 target)编码成抽象表示,然后预测 target 的表示(不在像素级别重建)。 例子:给定一张遮挡了部分物体的图片,模型能预测“被遮挡物体的大致位置和属性”,构建对物体持久性和空间关系的理解。 这是一个“原始世界模型”,能学习物理常识(如物体不会凭空消失)。 * V-JEPA / V-JEPA 2(Video JEPA,

By SHI XIAOLONG

什么是:“世界模型(World Models)”

世界模型(World Models) 是人工智能领域的一个核心概念,尤其在 Yann LeCun 等研究者推动的下一代 AI 架构中占据中心位置。它指的是 AI 系统在内部构建的对现实世界的抽象模拟或内部表示,让机器能够像人类或动物一样“理解”物理世界、预测未来、规划行动。 简单比喻 想象你闭上眼睛也能“看到”房间里的物体会如何移动、碰撞或掉落——这就是你大脑里的世界模型。AI 的世界模型就是类似的“数字孪生”(digital twin)或“内部模拟器”:它不是简单记住数据,而是学习世界的动态、因果关系和物理直觉(如重力、物体持久性、遮挡、因果等)。 为什么需要世界模型? 当前主流的大型语言模型(LLM) 擅长处理文本(统计模式预测),但存在根本局限: * 缺乏对物理世界的真正理解 → 容易“幻觉”、无法可靠规划。 * 样本效率低 → 人类/

By SHI XIAOLONG

K线周期可配置化设计方案

K线周期可配置化设计方案 1. 背景与目标 当前 Beta 套利策略的 K 线周期硬编码为 "1h",分散在多个文件中。需要: 1. 将 K 线周期从 1h 改为 2h 2. 提取为环境变量 BETA_ARB_KLINE_INTERVAL,使其可在 .env 中配置 2. 影响范围分析 2.1 需要修改的文件(共 6 个) 文件 硬编码位置 修改内容 src/trading/config.py BetaArbConfig dataclass 新增 kline_interval 字段,

By SHI XIAOLONG