上个月给黄金的亚盘策略加了个波动率过滤器,用Python拉了过去半年的tick数据算ATR,想着把凌晨那种死水行情过滤掉,只做伦敦开盘后的第一波。逻辑很简单:ATR低于某个阈值就暂停开仓。结果跑了两周,凌晨的单子全被扫了,还是那种刚进场就被反手打止损的扫法,气得我半夜爬起来翻日志。
先说数据。我用的阈值是黄金亚盘时段ATR(14)的20日均值乘以0.8,回测里这个过滤能把胜率从41%拉到53%,看着挺美。但实盘第一周就发现不对劲:凌晨1点到3点之间,点差从平时的0.15扩到0.35,我的过滤器只看了价格波动,没把点差成本算进去。等于说行情没波动,但交易成本翻倍,EA照样在那些垃圾时段挂单,被扫是迟早的事。当时没听懂,现在明白了。我以为低波动=没机会,但外汇市场里低波动往往意味着流动性薄,薄流动性下的点差和滑点才是真正的杀手。我那个Python脚本只算了ATR,没算盘口深度,也没考虑亚盘时段黄金的报价源切换——有些流动性提供商在凌晨会缩量,报价跳一下就能触发止损。
后来怎么改的?我把过滤器从单一ATR改成三个条件同时判断:ATR低于阈值、点差大于0.25、盘口买卖量比低于0.6,三个里中两个就暂停开仓。另外把凌晨1点到4点单独设了个时间黑名单,不管波动率多少都不做。改完跑了一个月,凌晨被扫的次数从每周三四次降到零,代价是错过了两次亚盘的突发波动,但账户曲线稳多了。
说句实在的,用Python做过滤本身没错,错的是我把波动率当成了唯一变量。外汇这行,尤其是黄金这种品种,点差、流动性、报价源切换,哪个都比单纯的ATR更影响执行结果。代码写得再漂亮,如果没把交易成本嵌进去,回测和实盘就是两个世界。
你们有没有类似经历——写了个自认为很聪明的过滤器,结果被市场用更朴素的方式教育了?评论区聊聊,我看看是不是只有我这么干过。
补一句,后来我把点差也塞进过滤条件里了,逻辑改成ATR和点差比值低于阈值才停手,凌晨那波乱扫确实少了很多。你们要是也跑亚盘,记得别只盯K线波动,成本这东西才是真刺客。
先说数据。我用的阈值是黄金亚盘时段ATR(14)的20日均值乘以0.8,回测里这个过滤能把胜率从41%拉到53%,看着挺美。但实盘第一周就发现不对劲:凌晨1点到3点之间,点差从平时的0.15扩到0.35,我的过滤器只看了价格波动,没把点差成本算进去。等于说行情没波动,但交易成本翻倍,EA照样在那些垃圾时段挂单,被扫是迟早的事。
有个做量化多年的汇友跟我讲过一句话:过滤波动率之前,先过滤掉你自己对波动的幻想。
后来怎么改的?我把过滤器从单一ATR改成三个条件同时判断:ATR低于阈值、点差大于0.25、盘口买卖量比低于0.6,三个里中两个就暂停开仓。另外把凌晨1点到4点单独设了个时间黑名单,不管波动率多少都不做。改完跑了一个月,凌晨被扫的次数从每周三四次降到零,代价是错过了两次亚盘的突发波动,但账户曲线稳多了。
说句实在的,用Python做过滤本身没错,错的是我把波动率当成了唯一变量。外汇这行,尤其是黄金这种品种,点差、流动性、报价源切换,哪个都比单纯的ATR更影响执行结果。代码写得再漂亮,如果没把交易成本嵌进去,回测和实盘就是两个世界。
你们有没有类似经历——写了个自认为很聪明的过滤器,结果被市场用更朴素的方式教育了?评论区聊聊,我看看是不是只有我这么干过。
补一句,后来我把点差也塞进过滤条件里了,逻辑改成ATR和点差比值低于阈值才停手,凌晨那波乱扫确实少了很多。你们要是也跑亚盘,记得别只盯K线波动,成本这东西才是真刺客。
