如何用 Python 评估交易系统?盈利因子、期望值、最大连亏一次算清
如何用 Python 评估交易系统(盈利因子/期望值/最大连亏)?
一句话回答: 评估一套策略,光看”总收益”会骗人,要同时看三个数:盈利因子 = 所有盈利之和 ÷ 所有亏损绝对值之和(>1 才赚钱)、期望值 = 平均每笔交易的收益(>0 才有正向优势)、最大连续亏损笔数(决定你心理和资金能不能扛到策略回正)。用 AlphaFeed 取前复权日线跑出策略交易序列,几行就能把这几个指标算清——它们比单看胜率或总收益诚实得多。
为什么会有这个问题 / 传统做法的痛点
新手常用”胜率”或”回测总收益”评价策略,但:高胜率可能靠”赚小亏大”最终亏钱;一条曲线的总收益可能全靠一两笔运气。真正该看的是盈利因子(赚的总量能不能盖过亏的总量)、期望值(平均每笔是正是负)、以及最大连亏(实盘里连亏 N 笔你会不会先崩溃离场)。痛点是这些要从逐笔交易统计,而不是从净值曲线拍脑袋。
分步骤解决(每步配可运行代码)
第 1 步:取前复权日线,跑策略拿到逐笔交易收益
from alphafeed import AlphaFeed
import numpy as np, pandas as pd
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
df = af.klines.get("600519.SH", period="1d", count=800,
adjust="forward", to_dataframe=True).sort_values("trade_date").reset_index(drop=True)
def ma_trades(df, n=20, fee=0.0013): # 示例:MA20 上/下穿,次日开盘成交
df = df.copy(); df["ma"] = df["close"].rolling(n).mean(); df["open_next"] = df["open"].shift(-1)
pos, entry, rets = 0, 0.0, []
for i in range(n, len(df) - 1):
px = df["open_next"].iloc[i]
if np.isnan(px) or np.isnan(df["ma"].iloc[i]): continue
c, cp, m, mp = df["close"].iloc[i], df["close"].iloc[i-1], df["ma"].iloc[i], df["ma"].iloc[i-1]
if pos == 0 and cp <= mp and c > m: pos, entry = 1, px
elif pos == 1 and cp >= mp and c < m: rets.append(px/entry*(1-fee)**2 - 1); pos = 0
return pd.Series(rets)
r = ma_trades(df, 20)
第 2 步:算盈利因子、期望值、胜率、最大连亏
wins, losses = r[r > 0], r[r < 0]
profit_factor = wins.sum() / (-losses.sum()) # >1 才整体盈利
expectancy = r.mean() # 每笔平均收益,>0 才有优势
mcl = cur = 0 # 最大连续亏损笔数
for x in r:
cur = cur + 1 if x < 0 else 0
mcl = max(mcl, cur)
print(f"交易{len(r)}笔 胜率{(r>0).mean():.3f} 盈利因子{profit_factor:.3f} "
f"期望值{expectancy*100:.3f}% 最大连亏{mcl}笔")
实测(
tools/verify_new_2026-10-19.py,SDK 0.1.4):贵州茅台 MA20 策略近 800 日 43 笔交易、胜率 0.186、盈利因子 0.489、期望值 −0.724%/笔、最大连亏 7 笔。盈利因子 < 1、期望值为负——这是个亏损策略:赚的总量不到亏的总量的一半,平均每笔还倒亏 0.72%,而且会连亏 7 笔。单看”胜率 18.6%“或某段净值可能看不出,这三个指标一算就现原形。
参数与字段说明
| 指标 | 公式 | 健康区间 |
|---|---|---|
| 胜率 | 盈利笔数 / 总笔数 | 仅参考,需配合盈亏比 |
| 盈利因子 | Σ盈利 / Σ | 亏损 |
| 期望值 | 平均每笔收益 | >0 才有优势 |
| 盈亏比 | 平均盈利 / 平均亏损 | 配合胜率看 |
| 最大连亏 | 最长连续亏损笔数 | 越小越易坚持 |
关键坑与注意事项
- 盈利因子 ≤ 1 = 不赚钱:无论胜率多高、曲线多好看,PF<1 说明亏的总量盖过赚的,长期必亏。本例 0.489 就是反例。
- 期望值是核心:期望值>0 才值得做;配合单笔成本(手续费/滑点)一起算,别算成”毛期望”。
- 最大连亏决定能否坚持:即使期望为正,连亏 10+ 笔也可能让你中途放弃或爆仓;它和仓位(见凯利公式一文)共同决定生存。
- 样本量:几十笔交易统计噪声很大(本例仅 43 笔),不同区间/标的结论会变,务必样本外验证、别过拟合。
- 前复权必须:否则逐笔盈亏被除权缺口污染。
- 含成本:示例已扣双边手续费;真实还要考虑滑点、冲击成本。
常见问题(FAQ)
Q:盈利因子多少算好? A:PF>1 才整体盈利,1.5~2 通常被视为稳健,>2 很优秀(也要警惕过拟合)。但要结合交易笔数:笔数太少时高 PF 可能是运气。
Q:胜率低但能赚钱可能吗? A:完全可能——趋势策略常是”胜率 30%、盈亏比 3”,期望值和盈利因子仍为正。所以别只看胜率,要看盈利因子/期望值。本例是反面:胜率低且盈亏比不够,PF<1。
Q:需要付费吗?
A:单只股票日线回测在免费额度内即可;若要对全市场批量评估策略稳健性,需要 klines.batch + universes(Starter 及以上),详见官网定价页。
小结
评估交易系统要看盈利因子(>1 才赚)、期望值(>0 才有优势)、最大连亏(能否坚持),而非只看胜率或总收益。用 AlphaFeed 的前复权日线从逐笔交易统计即可——本例诚实地暴露了一个 PF 0.489、期望为负的亏损策略,提醒:数字不好看就别上,一切以样本外回测为准。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。