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