正文回测曲线漂亮,实盘跑几周就开始回撤——很多人第一反应是策略逻辑失效了,于是反复改指标参数。但相当一部分问题不在开平仓逻辑,而在风控参数怎么写的。
同样的信号,用不同的手数算法、不同的止损口径,风险暴露可能差好几倍。下面这五处,是程序化交易里反复出现的问题,每一条都给出「现象—原因—改法」。
一、固定手数:手数是算出来的,不是设出来的
现象
策略里直接写死 Lots = 1,或者按「一手起步、赚了再加」的固定档位下单。
问题
固定手数只固定了「手」,没有固定「风险」。同样 1 手,止损 20 点和止损 200 点,亏损差 10 倍;账户 5000 美金和 50000 美金用同一个手数,风险占比差 10 倍。行情的波动是变的,账户净值也是变的,唯独手数不变,风险就在漂移。
改法:用能亏多少反推手数
公式只有一行:
举个具体数字(仅为公式演示):
- 账户 10,000 美金,单笔风险上限设为 1%,也就是最多亏 100 美金;
- 止损距离 50 点,每手每点价值 1 美金,那么每手止损被打会亏 50 美金;
下 2 手,止损被打,亏 100 美金,正好等于 1% 的上限,风险是被「锁定」的。
反过来看固定手数的问题:同样 10,000 的账户,如果固定下 5 手、止损 50 点,一次止损就是 250 美金,占账户 2.5%,是设定上限的 2.5 倍;把止损放宽到 200 点,同样的 5 手一次要亏 1000 美金,占 10%。策略没变,风险已经翻了几倍。
再补两条
- 算出理论手数后,再叠一层最大手数和最小手数做硬约束,防止极端参数下算出不合理的手数;
- 下单前检查可用保证金,避免手数算得没问题、但保证金不够导致部分成交或直接拒单。
二、多货币:三个直盘,其实是一个风险源
现象
策略同时跑 EURUSD、GBPUSD、AUDUSD,看起来做了品种分散。
问题
这三个货币对的报价里都有美元,且美元都在分母位置。同时做多这三个品种,本质上是同一笔「做空美元」的仓位下了三次。当美元走单边时,三个仓位会同步回撤,分散是名义上的,风险是叠加的。
改法:加一层相关性过滤
在开仓前计算品种间的相关系数(用近 N 根 K 线的收益率序列即可):
- 相关系数很高时,直接跳过这笔开仓,不同时持有同向的高相关品种。
这一层不改变信号本身,只是给「同时持仓」设了个闸门。
三、止盈止损:三个常见写法都有问题
坑一:固定点数
不管什么品种、什么波动环境,止损一律 30 点。结果是低波动时被正常噪声扫掉,高波动时止损形同虚设。
坑二:止损点数大于止盈
止损 50 点、止盈 20 点,盈亏比 0.4。这种设置下,盈亏平衡需要的胜率是 50 ÷ (50 + 20) ≈ 71.4%。也就是说,胜率不到七成,长期算下来是负期望。很多人把止盈设得近,是为了「提高胜率」,但胜率高不等于期望为正。
坑三:所有品种用同一套点位
黄金的 30 点和 EURUSD 的 30 点,不是一个数量级的概念。不同品种的波动尺度差得多,同一套点数总会有一边不合适。
改法
用波动率来定止损,而不是用固定点数:
- 以 ATR(真实波幅)为基准,止损设为 ATR 的若干倍,波动放大时止损自动放宽,波动收敛时自动收紧;
- 不同品种各自维护一套参数,参数随品种的波动特征走。
止盈可以用同样的方式定,也可以按盈亏比反推,但前提是盈亏比要和策略的实际胜率匹配,而不是拍一个好看的数字。
四、balance 和 equity 混用
现象
策略里用 AccountBalance() 计算风险和仓位。
问题
这两个值不是一回事:
- equity 是余额加上持仓的浮动盈亏,也就是此刻真实的自有资金。
举例:余额 10,000,当前持仓浮亏 2,000,此时 equity 只有 8,000。如果仍按 balance 的 1% 算风险,算出来是 100 美金,但相对真实资金 8,000 来说,这已经是 1.25%。浮亏越大,这个偏差越大。
对马丁、网格这类会逆势加仓的策略,影响更明显:账户浮亏时 equity 已经缩水,但按 balance 判断「还有加仓空间」,于是继续加,风险敞口被系统性低估。
改法
所有涉及风险比例、仓位上限、加仓间隔的计算,统一用 equity 作为分母。balance 只用来做统计和报表。
五、没有爆仓保护
现象
策略只管开仓和平仓,没有「整体亏损到某个程度就停手」的逻辑。
问题
单笔风控做得再好,遇到连续亏损或者极端行情,整体回撤仍然可能超出承受范围。缺少全局熔断时,程序会一直按信号下单,越亏越做。
改法
加一层账户级的熔断:
- 当 equity 相对高点回撤超过设定比例时,停止开新仓(已有仓位按既定规则处理);
- 这个比例不要拍脑袋,参考策略历史最大回撤,留出一定余量;
写在最后这五条不需要多高深的技术,都是「有没有想到」的问题。真正的差别在于:写策略的时候,是把风控当成一段必须补上的代码,还是当成一个和信号同等重要的模块。
如果手上已经有一个在跑的 EA,可以按下面的清单过一遍:
- 止损是按固定点数,还是按波动率(ATR 等)定的?
- 风险计算用的是 balance 还是 equity?
七条里能对上五条以上,说明风控这一层是认真做过的。
风险提示本文仅讨论程序化交易的技术实现与参数逻辑,不构成任何投资建议,也不涉及任何具体交易平台的推荐。金融市场存在风险,任何策略在任何市场环境下都可能出现亏损,文中出现的所有数值均为公式演示,不代表实际收益,也不构成收益预期。请根据自身情况独立判断。 |