3、关键交易指标计算:胜率、盈亏比、最大回撤、夏普比率、平均持有期

交易记录摆在那,一堆数字,怎么看?

说白了,你得用几个关键指标来量化你的交易水平。光靠感觉「这周赚了」或者「最近亏了」,那是散户思维。我们做量化,要的是精确的数字。

我个人习惯,每次复盘必算这五个指标:胜率、盈亏比、最大回撤、夏普比率、平均持有期。它们就像体检报告里的几项核心数据,缺一不可。

3.1 胜率与盈亏比:交易的两面镜子

胜率,就是你赚钱的交易次数占总交易次数的比例。比如你做了100笔交易,赢了55笔,胜率就是55%。

但别高兴太早。胜率高不代表你赚钱。我见过有人胜率70%,最后账户却是亏的。为什么?因为亏的那30%单笔亏损巨大。

这就引出了盈亏比。它衡量的是平均每笔盈利与平均每笔亏损的比值。

核心公式:

盈亏比 = 平均盈利金额 / 平均亏损金额

期望收益 = 胜率 × 平均盈利 - (1 - 胜率) × 平均亏损

举个例子。你胜率40%,但盈亏比是3:1。那么期望收益 = 0.4 × 3 - 0.6 × 1 = 0.6。长期来看,你每冒1块钱的风险,能赚回0.6块。这比胜率60%、盈亏比0.5:1的策略(期望收益 = 0.6 × 0.5 - 0.4 × 1 = -0.1)要强得多。

我的经验: 别盲目追求高胜率。我早期做日内交易,胜率做到过70%,但盈亏比只有0.8,最后亏得怀疑人生。后来我调整策略,把胜率降到45%,盈亏比提到2.5以上,账户才开始稳定增长。

3.2 最大回撤:你的心理承受底线

最大回撤,就是从账户净值最高点,跌到最低点的最大跌幅。它反映的是你策略在最差情况下的亏损幅度。

举个例子。你账户从100万涨到150万,然后跌到110万,再涨到160万。那么最大回撤就是 (150 - 110) / 150 = 26.7%。

这个指标很重要。因为它直接决定了你能不能扛住。我曾经见过一个策略,年化收益50%,但最大回撤40%。说实话,没几个人能扛住40%的回撤。你想想看,账户亏了40%,你得赚66.7%才能回本。很多人就在回撤期割肉了。

避坑指南: 我曾经犯过一个错误,只看年化收益,不看最大回撤。结果实盘时遇到连续亏损,心态直接崩了。现在我给自己定了个规矩:最大回撤超过20%的策略,坚决不上实盘。

3.3 夏普比率:风险调整后的收益

夏普比率,说白了就是衡量你每承担一单位风险,能获得多少超额收益。

公式是:夏普比率 = (策略年化收益率 - 无风险利率) / 策略年化波动率

无风险利率一般用美国国债收益率,或者直接用0。波动率就是收益率的标准差。

夏普比率越高,说明策略在同等风险下赚得越多。一般认为,夏普比率大于1算不错,大于2算优秀,大于3就是顶级策略了。

我的标准: 我个人习惯,夏普比率低于0.8的策略,基本不考虑。因为这意味着你承担的风险,并没有换来足够的回报。

3.4 平均持有期:你的交易节奏

平均持有期,就是你持有一笔交易的平均时间。它反映了你的交易风格。

  • 平均持有期 < 1天:日内交易
  • 平均持有期 1-5天:短线交易
  • 平均持有期 5-20天:中线交易
  • 平均持有期 > 20天:长线交易

这个指标能帮你判断,你的策略到底适合什么频率。我见过有人做日内策略,结果平均持有期算出来是3天。这说明他根本没按计划执行,该止损不止损,该止盈不止盈。

3.5 用Python/Pandas一键计算

好了,理论讲完,上代码。我习惯用Pandas来处理交易记录,因为它的向量化操作太方便了。

假设你的交易记录长这样:

import pandas as pd
import numpy as np

# 模拟交易记录
data = {
    'trade_id': [1, 2, 3, 4, 5],
    'entry_date': ['2024-01-02', '2024-01-05', '2024-01-08', '2024-01-10', '2024-01-15'],
    'exit_date': ['2024-01-04', '2024-01-09', '2024-01-12', '2024-01-14', '2024-01-18'],
    'pnl': [500, -300, 800, -200, 1200],  # 每笔盈亏
    'capital': [100000, 100500, 100200, 101000, 100800]  # 每笔交易时的账户净值
}

df = pd.DataFrame(data)
df['entry_date'] = pd.to_datetime(df['entry_date'])
df['exit_date'] = pd.to_datetime(df['exit_date'])

接下来,我们逐个计算:

3.5.1 胜率

win_rate = (df['pnl'] > 0).mean()
print(f"胜率: {win_rate:.2%}")

3.5.2 盈亏比

avg_win = df[df['pnl'] > 0]['pnl'].mean()
avg_loss = abs(df[df['pnl'] < 0]['pnl'].mean())
profit_loss_ratio = avg_win / avg_loss if avg_loss != 0 else np.inf
print(f"平均盈利: {avg_win:.2f}, 平均亏损: {avg_loss:.2f}")
print(f"盈亏比: {profit_loss_ratio:.2f}")

3.5.3 最大回撤

最大回撤需要用到账户净值的序列。这里我们模拟一个净值曲线:

# 模拟净值序列(假设每天更新)
nav = [100000, 100500, 100200, 101000, 100800, 102000, 101500, 103000]
dates = pd.date_range('2024-01-02', periods=len(nav), freq='D')
nav_series = pd.Series(nav, index=dates)

# 计算最大回撤
rolling_max = nav_series.cummax()
drawdown = (nav_series - rolling_max) / rolling_max
max_drawdown = drawdown.min()
print(f"最大回撤: {max_drawdown:.2%}")

3.5.4 夏普比率

# 计算每日收益率
daily_returns = nav_series.pct_change().dropna()
# 假设无风险利率为0
sharpe_ratio = daily_returns.mean() / daily_returns.std() * np.sqrt(252)
print(f"夏普比率: {sharpe_ratio:.2f}")

3.5.5 平均持有期

df['holding_days'] = (df['exit_date'] - df['entry_date']).dt.days
avg_holding_period = df['holding_days'].mean()
print(f"平均持有期: {avg_holding_period:.1f} 天")

3.6 把这些指标整合成一个函数

嗯,这里要注意。每次复盘都写一遍代码太麻烦。我习惯把它们打包成一个函数:

def calculate_trade_metrics(df, nav_series):
    """
    计算关键交易指标
    df: 交易记录DataFrame,包含'pnl', 'entry_date', 'exit_date'列
    nav_series: 账户净值序列
    """
    metrics = {}
    
    # 胜率
    metrics['win_rate'] = (df['pnl'] > 0).mean()
    
    # 盈亏比
    avg_win = df[df['pnl'] > 0]['pnl'].mean()
    avg_loss = abs(df[df['pnl'] < 0]['pnl'].mean())
    metrics['profit_loss_ratio'] = avg_win / avg_loss if avg_loss != 0 else np.inf
    
    # 最大回撤
    rolling_max = nav_series.cummax()
    drawdown = (nav_series - rolling_max) / rolling_max
    metrics['max_drawdown'] = drawdown.min()
    
    # 夏普比率
    daily_returns = nav_series.pct_change().dropna()
    metrics['sharpe_ratio'] = daily_returns.mean() / daily_returns.std() * np.sqrt(252)
    
    # 平均持有期
    df['holding_days'] = (df['exit_date'] - df['entry_date']).dt.days
    metrics['avg_holding_period'] = df['holding_days'].mean()
    
    return metrics

# 使用示例
metrics = calculate_trade_metrics(df, nav_series)
for key, value in metrics.items():
    print(f"{key}: {value:.4f}" if isinstance(value, float) else f"{key}: {value}")

3.7 知识体系图

为了让你更直观地理解这些指标之间的关系,我画了一张图:

交易复盘指标体系 胜率 赚钱交易占比 盈亏比 平均盈利/平均亏损 最大回撤 最大亏损幅度 夏普比率 风险调整后收益 平均持有期 交易节奏判断 五个指标相互独立,共同构成交易系统的健康检查 缺一不可,综合评估才能发现真实问题

这五个指标,就像汽车的五个仪表盘。胜率是速度表,盈亏比是油耗表,最大回撤是刹车距离,夏普比率是发动机效率,平均持有期是档位。你光看一个,开不了车。得五个一起看,才能知道你的交易系统到底行不行。

我的习惯: 每次复盘,我会把这五个指标打印出来,贴在显示器旁边。如果某个指标连续几周恶化,我就知道该调整策略了。别等到亏了一大笔才想起来复盘,那就晚了。


公众号:蓝海资料掘金营,微信deep3321