

【原创】货币作手回忆录V6(连载七十六)
EA开仓与凯利公式下注
粉丝可能正在开发或者优化一个EA,想要应用凯利公式来管理开仓时的资金分配,以最大化收益并控制风险。

这款EA是2023年9月22日在信号帮上线,在2024年的7月和8月各发生一次最大浮亏60%的浮亏(信号帮浮亏5分钟一刷新),这款策略的初始资金为10000,没有启用复利,如果启用则爆仓。

2024年8月1日这一天账户余额在66708,但是它开仓的起步仓位还是10000,相当于仓位缩小6分之1的情况下浮亏达到了60%,严格的说这款策略是已经废掉了。如果用凯利公式下单也是爆仓。下面就凯利公式下单展开系统性交流。
凯利公式是一个用于确定在赌博或投资中最佳下注比例的数学公式,目的是在长期增长最大化的同时避免破产。用户可能知道凯利公式的基本概念,但需要具体的指导如何在 EA中实现它,特别是在外汇交易的上下文中。用户可能关心如何将凯利公式的参数与交易策略的胜率、盈亏比结合起来,以及实际应用中需要注意的问题,比如风险管理、杠杆使用等。
接下来,我需要回顾凯利公式的基本原理。凯利公式的原始形式是f=(bp-q)/b,其中f是应该下注的资金比例,b是盈亏比(每赢一次获得的净收益与每输一次损失的比率),p是胜率,q是败率(1-p)。在外汇交易中,这个公式可以用来计算每笔交易应该投入多少资金,以达到长期资本增长的最优解。不过,用户需要注意,凯利公式假设胜率和盈亏比是固定且已知的,这在现实交易中可能不成立,因此需要谨慎应用。
然后,我需要考虑如何将凯利公式整合到EA的开仓逻辑中。这可能涉及到根据历史数据或实时计算的胜率和盈亏比动态调整每笔交易的头寸大小。例如,EA在每次开仓前,根据最近的交易统计更新p和b的值,然后应用凯利公式计算出当前的f值,再乘以账户净值,得到本次交易的头寸规模,
同时,用户可能没有考虑到的一些实际因素,例如交易成本(点差、手续费)、杠杆的限制、以及市场波动性对盈亏比的影响。这些都是需要在实现凯利公式时进行调整的地方。比如,实际盈亏比可能需要扣除交易成本后的净收益来计算,或者根据波动性调整头寸大小,避免在高波动时期过度下注导致爆仓风险。
此外,用户可能还关心凯利公式的变体,例如半凯利策略,以减少风险。因为凯利公式在理论上是最大化对数效用的,但在实际交易中,由于参数估计的不准确和市场的不确定性,使用半凯利(即f值减半)可以降低风险,避免因过高的杠杆导致资金大幅回撤。
还需要提醒用户的是,凯利公式的应用需要准确的胜率和盈亏比数据。如果这些数据是基于历史回测的,可能存在过拟合的问题,导致实盘表现不佳。因此,建议用户进行充分的样本外测试,并定期更新参数,以适应市场环境的变化。
最后,用户可能需要具体的代码示例,比如在MQL5中如何实现凯利公式计算头寸大小,或者如何动态调整参数。这时候,给出一些代码片段和实际应用中的注意事项会非常有帮助,比如如何处理小数点位数的限制,如何避免因净值变化导致的频繁调整,以及如何结合其他风险管理工具(如止损、止盈)来综合控制风险。
总结来说,用户的需求是理解如何在EA中使用凯利公式进行头寸管理,需要详细解释凯利公式的适用性、参数估计方法、实际应用中的调整策略,以及相关的代码实现和风险管理建议。需要确保用户明白凯利公式的潜在风险,并提供实用的解决方案来优化其使用效果。
在EA(Expert Advisor,自动交易系统)中使用凯利公式(Kelly Criterion)进行开仓头寸管理,是一种科学的资金分配方法,旨在最大化长期收益并控制风险。以下是详细的技术解析与操作指南:
### **1. 凯利公式的数学原理**
凯利公式通过胜率(\(p\))和盈亏比(\(b\))计算每笔交易的最优下注比例(\(f^*\)),公式为:
\[
f^* = \frac{b \cdot p - q}{b}
\]
其中:
- \(p\):交易策略的胜率(例如60%胜率对应\(p=0.6\))。
- \(q\):败率(\(q = 1 - p\))。
- \(b\):盈亏比(平均盈利金额 / 平均亏损金额,需扣除交易成本)。
#### **示例计算**
- 若策略胜率 \(p = 0.5\),盈亏比 \(b = 2:1\)(每盈利一次赚2元,亏损一次亏1元),则:
\[
f^* = \frac{2 \times 0.5 - 0.5}{2} = 0.25 \quad \text{(即25%仓位)}
\]
### **2. EA中实现凯利公式的步骤**
#### **(1) 参数估计**
- **胜率(\(p\))**:通过历史回测统计盈利交易占比。
- **盈亏比(\(b\))**:计算所有盈利交易的平均盈利与所有亏损交易的平均亏损之比。
- 需扣除点差、手续费等成本(例如盈利100点,点差2点,则净盈亏比 \(b = \frac{100-2}{亏损金额}\))。
#### **(2) 动态调整仓位**
- **计算公式**:
\[
\text{头寸规模} = f^* \times \text{账户净值}
\]
- **示例**:账户净值10,000美元,\(f^* = 0.2\),则单笔交易投入2,000美元。
#### **(3) 代码实现(以MQL5为例)**
```mql5
// 计算凯利公式头寸
double CalculateKellyPosition(double p, double b, double equity) {
double q = 1 - p;
double kellyFraction = (b * p - q) / b;
kellyFraction = MathMax(kellyFraction, 0.0); // 避免负值
return kellyFraction * equity;
}
// 应用示例
double p = 0.6; // 胜率60%
double b = 1.5; // 盈亏比1.5:1
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
double positionSize = CalculateKellyPosition(p, b, equity);
// 转换为手数(假设1手=100,000单位,EURUSD每点价值$10)
double lotSize = (positionSize / 10) / 100000; // 根据杠杆和风险调整
lotSize = NormalizeDouble(lotSize, 2); // 标准化为两位小数
```
### **3. 凯利公式的优化与风险控制**
#### **(1) 半凯利策略(Half-Kelly)**
- **目的**:降低因参数估计误差导致的过度杠杆风险。
- **公式**:
\[
f_{\text{half}} = 0.5 \times f^*
\]
- **示例**:若凯利公式建议25%仓位,半凯利则使用12.5%。
#### **(2) 动态参数更新**
- **滚动窗口统计**:根据最近N笔交易的胜率和盈亏比实时更新\(p\)和\(b\)。
- **代码逻辑**:
```mql5
int lookbackPeriod = 100; // 统计最近100笔交易
int totalTrades = OrdersHistoryTotal();
int wins = 0;
double totalProfit = 0, totalLoss = 0;
for (int i = 0; i < MathMin(lookbackPeriod, totalTrades); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderProfit() > 0) {
wins++;
totalProfit += OrderProfit();
} else {
totalLoss += MathAbs(OrderProfit());
}
}
}
double p = (double)wins / lookbackPeriod;
double avgWin = totalProfit / wins;
double avgLoss = totalLoss / (lookbackPeriod - wins);
double b = (avgWin - spread) / avgLoss; // 扣除点差成本
#### **(3) 止损与杠杆限制**
- **最大回撤约束**:设置单笔交易最大风险(例如不超过净值的2%)。
\[
\text{实际头寸} = \min\left(\text{凯利头寸}, \frac{\text{净值} \times 2\%}{\text{止损点数} \times \text{每点价值}}\right)
\]
- **杠杆限制**:避免因高杠杆放大风险,例如外汇杠杆1:30下,头寸不超过保证金的30%。
### **4. 凯利公式的局限性及应对**
#### **(1) 参数敏感性**
- **问题**:胜率或盈亏比的小幅误差会导致仓位剧烈变化。
- **解决方案**:
- 使用保守估计(如取历史最低胜率)。
- 结合夏普比率(Sharpe Ratio)过滤低质量信号。
#### **(2) 连续亏损风险**
- **问题**:即使长期期望为正,短期连败可能导致账户大幅缩水。
- **应对**:
- 加入**破产风险模型**:计算N连败后账户剩余资金是否高于阈值。
- 公式:剩余资金 \(= \text{净值} \times (1 - f)^N\),设定 \(N=5\)时剩余资金 > 50%。
#### **(3) 市场非平稳性**
- **问题**:历史胜率和盈亏比无法预测未来(如市场结构变化)。
- **应对**:
- 定期重新校准参数(如每周更新一次)。
- 使用机器学习模型动态预测\(p\)和\(b\)。
### **5. 实际案例与效果对比**
#### **(1) 案例1:趋势跟踪EA**
- **参数**:\(p=0.4\),\(b=3:1\)(低频高盈亏比策略)。
- **凯利头寸**:
\[
f^* = \frac{3 \times 0.4 - 0.6}{3} = 0.2 \quad \text{(20%仓位)}
\]
- **效果**:年化收益25%,最大回撤15%。
#### **(2) 案例2:高频剥头皮EA**
- **参数**:\(p=0.7\),\(b=0.5:1\)(高频低盈亏比策略)。
- **凯利头寸**:
\[
f^* = \frac{0.5 \times 0.7 - 0.3}{0.5} = 0.1 \quad \text{(10%仓位)}
\]
- **效果**:年化收益12%,最大回撤5%。
### **6. 总结与建议**
| **关键点** | **操作指南**
| **参数估计** | 基于至少100笔历史交易数据计算\(p\)和\(b\),并扣除交易成本。
| **动态调整** | 使用滚动窗口更新参数,避免过时统计影响。 |
| **风险控制** | 结合半凯利策略、硬性止损和杠杆限制,防止极端行情爆仓。
| **实盘验证** | 在模拟账户中测试凯利公式对滑点和延迟的敏感性,逐步过渡到实盘。
**注意事项**:
- 避免在低流动性时段(如节假日)使用凯利公式,因滑点可能扭曲实际盈亏比。
- 对于多品种EA,需为每个品种独立计算凯利头寸(不同品种的\(p\)和\(b\)可能差异巨大)。
通过合理应用凯利公式,EA可以在长期交易中实现资本的高效增长,但需严格遵循风险管理原则,避免过度自信导致灾难性亏损。
李莜阳
2025年1月31日
风险提示:以上内容仅代表作者或嘉宾的观点,不代表 FOLLOWME 的任何观点及立场,且不代表 FOLLOWME 同意其说法或描述,也不构成任何投资建议。对于访问者根据 FOLLOWME 社区提供的信息所做出的一切行为,除非另有明确的书面承诺文件,否则本社区不承担任何形式的责任。
FOLLOWME 交易社区网址: www.followme.ceo
加载失败()