hyperliquid交易记录中平均每笔收益率算法详解
平均每笔收益率算法详解
📊 算法概述
平均每笔收益率(Mean Return Per Trade) 是基于单笔交易收益率计算的核心指标,用于衡量交易策略的平均盈利能力,完全不依赖外部本金数据。
核心特点:
- ✅ 完全独立:每笔交易自给自足
- ✅ 相对持仓价值:反映资金使用效率
- ✅ 标准化指标:可跨账户、跨策略对比
- ✅ 不受出入金影响:与账本记录无关
🎯 核心公式
基础公式
单笔交易收益率 = closedPnL / (|sz| × px)
参数说明:
closedPnL: 该笔交易的已实现盈亏(单位:USD)sz: 交易数量(可为正或负)px: 交易价格(单位:USD)|sz| × px: 持仓价值(名义价值,单位:USD)
平均收益率
平均每笔收益率 = Σ(单笔收益率) / 交易笔数
其中,只统计有 PnL 的交易(closedPnL ≠ 0)。
💡 算法原理
1. 为什么使用持仓价值而非本金?
传统方法的问题
基于本金计算:
单笔收益率 = closedPnL / true_capital
❌ 问题:
- 需要准确的本金数据(充值-提现+外部转入-外部转出)
- 账本记录可能不完整
- 本金可能为负(转出 > 转入)
- 受出入金操作影响
新方法的优势
基于持仓价值计算:
单笔收益率 = closedPnL / (|sz| × px)
✅ 优势:
- 每笔交易独立计算,数据自包含
- 不需要外部账本数据
- 反映真实的资金使用效率
- 符合金融行业标准(收益率 = 盈亏 / 投入资金)
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: 平均每笔收益率能预测未来吗?
答:不能直接预测,但可以作为策略评估的重要参考。
使用建议:
- 结合其他指标综合评估(Sharpe、Max Drawdown、胜率)
- 关注收益率的稳定性(标准差)
- 需要足够的样本量(建议 > 30 笔交易)
- 定期回顾和调整策略
Q4: 如何判断平均收益率是否可靠?
可靠性检查清单:
✅ 交易笔数 > 30(统计学最小样本量)
✅ 时间跨度 > 3 个月(避免偶然性)
✅ 市场环境多样(牛市、熊市、震荡)
✅ 标准差/平均值 < 2.0(波动可控)
📚 相关算法
本指标是以下算法的基础:
-
夏普比率算法 (
夏普比率算法详解.md)- 使用 mean_return 和 std_return 计算 Sharpe Ratio
-
最大回撤算法 (
最大回撤算法详解.md)- 使用单笔收益率构建累计收益率曲线
-
累计收益率算法 (
累计收益率算法详解.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