构建交易系统(第 1 部分):量化方法
引言
一个持续盈利的交易系统依赖于三大核心支柱的相互作用:
- 胜率
- 风险回报比(RRR)
- 风险金额(通过仓位规模)
这三个变量是诸如利润因子、恢复因子及回撤等关键绩效指标的根本驱动要素。然而,许多交易者在评估其(自动化)交易系统的有效性时,错误地几乎只关注胜率,而忽视了 RRR 和仓位规模的关键重要性。
为了最终取得成功并在市场上保持活跃,交易者必须理解自身交易优势的构成 — 特别是其胜率、RRR 以及与这两个指标相对应的最佳仓位规模。
本文旨在通过将回测的统计结果融入蒙特卡洛模拟中,帮助交易者从长期角度评估其策略。这种方法能产生多种可能的结果,并为交易者提供额外的信心支持,帮助他们判断系统是应该继续使用、改进还是弃用。
期望值:盈利能力背后的数学原理
盈利能力通过期望值来量化,期望值是胜率(win-rate)和风险回报比(RRR)的函数。正期望值定义了一个盈利的系统;而负期望值则意味着长期失败,无论胜率看起来有多高。然而,即使期望值为正,仓位规模不当也可能使亏损扩大至无法挽回的程度。
本文涵盖以下内容:
- 盈利交易系统的数学基础
- 实现盈利所需的最低门槛
- 使用 Python 中的蒙特卡罗模拟验证策略性能
目标是为交易者提供一个框架,用于评估一个系统在统计上是否可行。例如,如果交易员的胜率没有超过给定 RRR 的最低要求阈值,那么无论回测结果看起来多么有希望,都不能指望获得长期盈利。
蒙特卡洛模拟允许交易者根据胜率、RRR 和仓位规模的不同组合,模拟数千种模拟结果。这使得在开始实时或历史回测之前,就能更好地优化策略。
对于已经有回测结果的交易者来说,模拟可以输入实际胜率、RRR 和仓位规模水平,以预测未来多次交易的潜在表现。这种统计洞察力使人们能更清晰地判断一个系统是否值得依赖,并增强人们的信心。
定义和数学概念
1.胜率
胜率是指在一定时期内,盈利交易占总交易量的比例,以百分比表示,或在给定时期内盈利交易的概率。在本文中,胜率用 P 表示。

例如:如果 100 笔交易中赢了 40 笔,则胜率为 40%。
2.风险回报比(RRR)
盈利(止盈)与风险(止损)之比:

示例:如果止盈为 100 点,止损为 50 点,则 RRR = 2。
3.仓位规模
仓位规模指的是每笔交易承担的风险资金量。计算方法如下:

示例:风险投入 200 美元,止损位 50 点,每点价格 10 美元。
仓位规模 = 0.4 手
4.期望值
期望值(用 Ev 表示)代表每笔交易的预期收益,计算方法如下:
![]()
Ev > 0:盈利系统(长期)
Ev < 0:无利可图的系统
实现盈利系统的最低胜率或 RRR 阈值
胜率与风险回报比之间存在相互依赖关系,这是一个数学事实。对于任何给定的胜率,要实现盈利,都需要一个最低的风险回报比。 同样,当已知风险回报比时,要盈利也需要一个最低的胜率。 仅凭高胜率并不能证明自动化系统的性能,除非它同时具有明确的风险回报比。
一个设有预定义止损和止盈设置的系统具有固定的风险回报比。如果相应的胜率低于最低要求,即使该系统能产生可能误导交易者的短期收益,也无法维持长期盈利能力。这往往会导致账户最终爆仓。
推导盈利能力条件
让我们深入探讨这个数学概念,以便更好地理解它。
根据期望值公式:
Ev =(win-rate*reward) - (1 - win-rate)*risk

对于一个盈利的系统来说,Ev > 0。
![]()
由公式 5 可知:
如果 RRR 已知,则盈利系统的最小胜率 (P) 可表示为:

如果胜率(P)已知,则盈利系统的最小相对回报率(RRR)为:

表1:给定 RRR 的最低胜率
| RRR | 最低胜率 |
|---|---|
| 1.0 | >50.00% |
| 1.5 | >40.00% |
| 2.0 | >33.33% |
| 2.5 | >28.57% |
| 3.0 | >25.00% |
从表 1 可以看出,如果一个系统的 RRR=1,那么它需要超过 50% 的胜率才能长期盈利。此外,如果一个系统的 RRR=3.0,那么它需要超过 25.00% 的胜率才能长期盈利。 从表 1 可以看出,随着 RRR 的增加,实现长期盈利所需的最低胜率会下降。只要系统的实际胜率高于该 RRR 对应的最低胜率,系统长期来看就有望盈利。
表2:给定胜率所需的最低 RRR
| P | 最低 RRR |
|---|---|
| 30% | >2.333 |
| 40% | >1.50 |
| 50% | >1.00 |
| 60% | >0.667 |
| 70% | >0.429 |
系统的胜率通常不为人知,除非使用具有明确 RRR 的历史数据对策略进行回测。表 2 给出了特定胜率下实现盈利所需的最小风险回报比。对于 30% 的胜率,风险回报比应大于 2.333,才能实现长期盈利。同样,对于 70% 的胜率,风险回报比必须超过 0.429,才能实现长期盈利。随着胜率的提高,所需的最低 RRR 值会降低。
这就是为什么交易者不应盲目追求高胜率而不考虑 RRR,反之亦然。
由于胜率仅仅是总盈利交易数与总交易数的比值,因此在得出其真实胜率结论之前,让系统运行足够长的时间以收集足够的交易数据至关重要。例如,一个自动化系统在 6 个月内仅执行 30 笔交易,其中 20 笔盈利,看似胜率高达 60%。然而,如果让同一系统(不做任何更改)在 18 个月内继续交易,执行 200 笔交易,其中 90 笔盈利,则胜率将降至 45%。系统完成的交易越多,胜率就越可靠、越具有代表性。
仓位规模和风险管理
用于确定仓位规模的金额通常以账户余额的百分比表示。这一数字至关重要,因为它决定了盈利的交易系统能否经受住最大回撤期,避免爆仓,并最终实现交易目标。
交易者往往为了追求快速获利而冒下账户中过大比例的风险,这甚至可能导致原本盈利的系统将他们的账户资金全部亏光。当这种情况发生时,交易者可能会责怪系统开发者,将该系统视为骗局。事实是:无论一个系统有多好或多么盈利,只要胜率不是 100%,它就会经历亏损。如果你冒的风险超出了你的账户承受能力,你将面临追加保证金的要求,如果无法获得额外资金来支持,账户资金甚至可能全部亏光。
在本节中,我们将探讨如何合理设置仓位 — 即保持在安全的风险范围内 — 以便在连亏的情况下也能坚持下去,并继续朝着盈利目标努力。这是稳健风险或资金管理的精髓。让我们深入了解一下其中的数学原理:
定义:
- f:每笔交易中当前账户风险的固定比例。
- RRR min = 1.50:最小风险回报比
- P = 0.40:胜率(40%)
成功交易的结果:
如果交易盈利,收益为 RRR * 风险金额
新余额 = 当前余额 + 1.50 * (f * 当前余额)
简化:
![]()
亏损交易的结果:
如果交易亏损,亏损金额即为承担的风险金额:
![]()
每笔交易的预期乘数:
结合公式 8 和 9,预期增长因子 E[factor] 为:
![]()
代入 P=0.4 并化简得:
![]()
解释:当 RRR min = 1.50 时,预期增长因子恰好为 1 ,这意味着没有长期增长(盈亏平衡)。
增长条件
RRR > RRR min: 当 RRR = 1.70
![]()
对于正增长(Ef > 1),f 必须满足
![]()
计算最优风险比例 (f)
为了达到目标,假设 Ef = 1.002:
![]()
由此可见,我们需要冒至少 2.5% 的账户余额的风险才能达到我们的目标。风险控制在 2.5% 以下,可以让账户随着时间的推移更加稳定地增长。这凸显了一个经常被忽视的重要概念:对于任何给定的胜率、RRR 和盈利目标的组合,每笔交易总有一个相应的最佳风险。
- 利润目标(P_target)
- 达到目标所需的交易次数 (x)
- 初始账户余额 (Ini_bal)
Ef 由复合增长方程导出

例如,给定以下情况:
- 利润目标(P_target)= 10000 美元
- 交易次数 (x) = 300
- 初始余额 (Ini_bal) = 1000 美元
代入数值后得到:

预期增长因子反映了您的交易风格 — 无论您是保守型交易者还是激进型交易者 — 因为它决定了为实现您的目标,每次交易所需的风险。
示例:
假设一个交易系统具有:
胜率 = 40%
风险回报比(RRR)= 1.7
交易员或自动交易系统的目标是通过 300 笔交易将 1000 美元变成 10000 美元。根据公式 12,每笔交易所需的风险 (f) 计算如下:

在这种情况下,交易者或自动化系统必须每笔交易至少承担 9.6% 的风险才能达到目标 — 这是一种极端激进的方法。
现在,如果达到目标所需的交易次数增加到 x= 700:

经过 700 次交易后,系统或交易策略会变得不那么激进,每次交易只需 4.1% 的风险即可达到相同的目标。
值得注意的是,胜率越高,RRR 越高,目标就越容易实现。
例如:如果 RRR=2.0(P=40%),则 Ef = 1 + 0.2*f,将 f 降低至 1.54%,Ef=1.0077
根据这个数学模型,我们可以得出结论:即使是盈利的系统,也需要同时优化期望收益和仓位规模。在下一节中,我们将通过蒙特卡洛模拟进一步说明这一点,以便从长远角度审视系统的潜力。
蒙特卡罗模拟
验证交易系统的长期稳健性取决于优化的 RRR、胜率和仓位规模。蒙特卡罗模拟将模拟数千个随机交易序列中可能出现的各种结果。需要优化的参数有:
- 胜率
- RRR
- 仓位规模
这将说明:
- 连败
- 最大回撤
- 预期回报路径
- 账户存续概率
然而,我们的目标是检查在不同情景下账户的预期收益和账户存续的概率。
蒙特卡罗模拟是使用 Python 编程语言构建的。
import numpy as np import matplotlib.pyplot as plt # Parameters win_rate = 0.40 reward_risk_ratio = 1.5 # 1.5:1 risk_per_trade = 1 # Risk $1 per trade (normalized) num_trades = 1000 # Total number of trades to simulate num_simulations = 1000 # Number of Monte Carlo simulations # Monte Carlo simulation equity_curves = []
我们使用 NumPy 库导入计算所需的数学函数、多维数组和矩阵,并将其赋值为 np。
我们还从 Matplotlib 的 pyplot 模块中导入绘图函数,用于绘制模拟结果,并为其指定了别名 plt。
然后我们初始化胜率、盈亏比、每次交易的风险、每次模拟的交易次数和迭代次数。结果存储在净值曲线中。迭代次数可根据用户偏好减少或增加。
for _ in range(num_simulations): equity = 0 curve = [equity] # Start curve with initial equity (0) peak = equity # Track peak equity for drawdown calculation # max_drawdown = 0 # Track max drawdown for this simulation for _ in range(num_trades): if np.random.rand() < win_rate: pnl = risk_per_trade * reward_risk_ratio else: pnl = -risk_per_trade equity += pnl curve.append(equity) equity_curves.append(curve) # Convert to numpy array for easier analysis equity_curves = np.array(equity_curves)
该模拟运行 1000 次迭代(每次 1000 笔交易),将结果存储在权益曲线中,并将其转换为 NumPy 数组以进行分析。
# Plot results plt.figure(figsize=(12, 6)) for i in range(min(num_simulations, 100)): # Adjust indexing if plotting against trade number (starts from 0) plt.plot(range(num_trades + 1), equity_curves[i], alpha=0.2, color='blue')
每次模拟的结果都以蓝色绘制并显示。
# Plot mean curve mean_curve = equity_curves.mean(axis=0) plt.plot(range(num_trades + 1), mean_curve, color='red', linewidth=2, label='Mean Equity Curve')
红线表示模拟结果的平均值。
plt.title(f'Monte Carlo Simulation: {num_simulations} Simulations, {num_trades} Trades Each\nWin Rate = {win_rate*100:.1f}%, R:R = {reward_risk_ratio}:1') plt.xlabel('Number of Trades') plt.ylabel('Equity (P&L)') plt.legend() plt.grid(True) plt.tight_layout() plt.show()
此部分处理绘图格式:标题、轴标签(x 标签、y 标签)和网格激活(grid=True)。
# Summary statistics # Final equity is now the last element of the curve, which has num_trades + 1 points final_equity = equity_curves[:, -1] mean_final_equity = final_equity.mean() median_final_equity = np.median(final_equity) std_final_equity = final_equity.std() percent_profitable = np.mean(final_equity > 0) * 100 print('mean_final_equity:',mean_final_equity, '\nmedian_final_equity:', median_final_equity, '\nstd_final_equity:', std_final_equity,'\npercent_profitable:', percent_profitable,'%')
最后一段代码计算并打印:平均最终净值、最终净值中位数、最终权益的标准差以及盈利模拟占比。
情景 A:胜率 40%、RRR 1.5 的交易策略在 1000 次模拟中的表现
在这种情况下,我们测试了一种胜率为 40%,风险回报比 (RRR) 为 1.5 的交易策略,每次模拟进行 1000 次交易。总共进行了 1000 次独立的模拟,以评估该策略的性能和风险特征。结果总结如图 1 所示,具体如下:
图 1
胜率为 40%,RRR 为 1.5 时的模拟结果如下:
| 统计数据 | 数值 |
|---|---|
| 平均最终净值 | 1.44 |
| 最终净值中位数 | 0.0 |
| 最终净值的标准差 | 37.91 |
| 盈利模拟的百分比 | 49.0% |
结果解读
1.平均最终权益:所有模拟结果的平均最终账户余额是初始净值的 1.44 倍。这表明,平均而言,该策略取得了适度的总体收益。然而,如图 1 所示,这一均值受到少数极端正向结果的影响显著。这些异常值的存在使平均值向上偏移,掩盖了不良结果的频率。
2.最终净值中位数:中位数结果为 0.0,表明至少一半的模拟结果导致资本完全损失。在至少 50% 的模拟中,账户被清空(可能余额降至 0 或保证金被追缴)。该策略具有极高的破产风险。一半的情景下,账户损失了全部资金,而另一半则产生了利润,这一分布偏斜程度足以将均值拉高至 1.44。这表明大多数结果都很糟糕,是风险不可持续的警示信号。
3.标准差:标准差为 37.91,凸显了结果的极端波动性和不可预测性。标准差相对于均值而言较大。大多数路径都集中在接近资金耗尽的区域,而少数极高收益的结果把均值拉升了。
4.盈利模拟的百分比:只有 49% 的模拟以盈利告终;因此,最终资产净值高于初始余额。在 51% 的模拟运行中,系统出现了亏损。这与中位数为 0.0 的结果相吻合,证实了亏损一旦发生,其影响将是灾难性的。
这些统计值反映了交易系统表现的几个关键特征:
- 系统不稳定:
尽管最终平均净值为正(1.44 倍),但这一结果是由几次“幸运”的高收益运行所驱动的。中位数为零清楚地表明,大多数运行表现都很糟糕 — 至少有 50% 的运行以账户爆仓告终。 均值与中位数之间的这种差异凸显了一个根本不稳定的系统 — 大多数运行表现非常差,而只有少数运行表现异常出色。
- 破产风险极高:
中位数为零表明,除非采取非常严格的风险控制措施,否则该策略极有可能导致账户爆仓。
- 高波动性:
与平均值(约 1.44)相比,标准差较大(约 37.9),这表明结果极为分散。有的很出色,有的很糟糕。 这种不一致性使得依靠这一策略获得稳定回报变得困难。
- 盈利能力弱:
尽管平均收益为正,但只有 49% 的运行最终盈利。尽管平均结果为正,但该系统并不可靠,因为一个稳定、可扩展的系统应具有更高比例的正结果。
方案 B:胜率 40%、RRR 1.7 的交易策略在 1000 次模拟中的表现
在情景 B 中,交易策略保持 40% 的胜率,但将回报风险比 (RRR) 提高到 1.70,并且每次模拟包含 1000 笔交易。 为了彻底评估性能和风险特征,进行了 1000 次独立的蒙特卡罗模拟。主要结果总结在图 2 中,具体如下:
图 2
以下是胜率为 40%,风险回报比为 1.7 时的模拟结果。
| 统计数据 | 数值 |
|---|---|
| 平均最终净值 | 80.0 |
| 最终净值中位数 | 80.0 |
| 最终净值的标准差 | 45.82 |
| 盈利模拟的百分比 | 96.7% |
结果解读
1.平均最终净值:在模拟期间,该策略使初始资本平均增长了 80 倍。这体现了非凡的复利潜力,并证实了该策略在这些条件下的强大盈利能力。初始余额平均增长 80 倍是一个出色的结果,表明该系统能够带来可观的收益。
2. 最终净值中位数:中位数结果也是初始资本的 80 倍,这意味着至少 50% 的模拟结果达到了或超过了这一水平。均值与中位数高度一致,表明结果呈对称分布,大多数模拟结果都集中在 80 倍回报率附近。这一结果不仅凸显了强劲的盈利能力,还表明模拟运行之间具有极佳的一致性。
3. 最终权益的标准差: 虽然 45.82 的标准差表明结果存在一定的波动性,但考虑到相当大的平均值,这种波动程度相对较小。标准差约为平均值的 57%,这表明虽然个别结果可能有所不同(例如,有些运行会产生 40 倍或 120 倍的回报),但大多数结果仍然集中在 80 倍的平均值附近。这反映出该系统具有可控的波动性和可靠的性能。
4.盈利模拟的百分比:令人印象深刻的是,96.7% 的模拟交易以盈利告终,仅有 3.3% 的模拟交易出现亏损。如此高的成功率表明该系统具有极高的可靠性和极低的破产风险。绝大多数交易都实现了盈利,这凸显了该策略在这些模拟条件下的稳健性。
这些统计值反映了交易系统表现的几个关键特征:
- 高盈利:
均值和中位数在 80 倍放大倍率下的一致性,以及结果的紧密聚集,表明在测试参数下,这是一个盈利能力强且稳定的系统。
- 破产风险低:
只有 3.3% 的模拟未能盈利,与之前的场景相比,该系统的可靠性有了显著提高,RRR 为 1.5。现在破产的风险极低。
- 可控波动率:
尽管绝对标准差看起来较大,但与非常高的回报相比,这一标准差是合理的。结果表明,虽然预期会有一些波动,但该系统始终能带来强劲的业绩。
- 对 RRR 的敏感性:
最引人注目的发现是,仅通过将 RRR 从 1.5 增加到 1.7,同时保持胜率在 40%,性能就得到了显著提升。这凸显了优化风险回报比的重要性,尤其是在胜率较低的策略中,即使是小幅调整也能极大地提高系统的稳定性和盈利能力。
结论
本分析通过数学计算和蒙特卡洛模拟清晰地证明,对于给定的胜率,优化 RRR 可以显著提高交易系统的盈利能力和稳定性。如我们的场景所示,即使保持 40% 的固定胜率,将 RRR 从 1.5 提高到 1.7,也能使系统从高度不稳定且存在重大破产风险的状态转变为持续盈利且账户失败概率较低的状态。
必须强调的是,如本文中的公式 6 和公式 7 所示,胜率与 RRR 之间存在固有的相互依赖关系。优化 RRR 的努力自然会影响有效胜率,反之亦然。至关重要的是,每个胜率都有一个相应的最小 RRR,必须超过该阈值才能实现长期盈利。例如,在 40% 的胜率下,系统必须超过 1.5 的 RRR 阈值才能持续盈利。
期望值可以进一步说明这一点:
当 RRR=1.5 时,期望值 = (0.4*1.50)- (0.6*1) = 0。这表明达到了盈亏平衡。这解释了均值与中位数之间为何存在极大差异。
当 RRR=1.7 时,期望值 = (0.4*1.70)- (0.6*1) = 0.08。期望值为正,盈利结果为 96.7%。
总之,通过适当平衡胜率和盈亏比,许多交易系统可以转化为持续盈利的策略。关键不仅在于取得较高的胜率,还在于确保 RRR 超过产生长期正期望所需的最低阈值。
当交易者同时设定止损和止盈时,系统的 RRR 就固定了。系统若要在回测期间盈利,其胜率必须超过该 RRR 所要求的最低胜率。本文提供了几个 RRR 值及其对应的最低胜率。对于其他组合,可以使用公式 6 和 7 来计算所需的盈利能力阈值。
为了评估长期可行性,交易者可以使用蒙特卡罗模拟,根据回测统计数据来模拟业绩。 通过使用回测统计数据(胜率、盈亏比、仓位规模)模拟数千种可能的交易序列,蒙特卡罗分析:
- 预测长期内成功/失败的概率。
- 判断结果是否依赖于运气或统计优势。
- 使交易者在投入资金前能够信任自己的策略或对其进行修改。
一个在模拟中持续产生积极结果的系统,能提供更高的置信度,使交易者能够信任自己的策略并保持自律。
最后,虽然本文重点讨论了期望值和 RRR 优化,但必须强调的是,仓位规模也是系统性能同样重要的支柱。如果没有健全的风险管理,即使是期望值为正的系统也可能失败。在下一篇文章中,我们将探讨如何应用最优仓位规模来提高系统韧性,并确保可持续的交易成功。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/18587
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
本文由网站的一位用户撰写,反映了他们的个人观点。MetaQuotes Ltd 不对所提供信息的准确性负责,也不对因使用所述解决方案、策略或建议而产生的任何后果负责。
通过套接字将 MetaTrader 的 Tick 信息从 MQL5 服务传输到 Python 应用程序
新手在交易中的10个基本错误
交易中的神经网络:摆脱特定数据依赖的时间序列泛化(结论)