AlphaFeed Blog

如何用 Python 评估交易系统?盈利因子、期望值、最大连亏一次算清

分析与指标 · 代码验证于 2026-10-19

如何用 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 才有优势
盈亏比平均盈利 / 平均亏损配合胜率看
最大连亏最长连续亏损笔数越小越易坚持

关键坑与注意事项

常见问题(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、期望为负的亏损策略,提醒:数字不好看就别上,一切以样本外回测为准。

相关链接:


免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。