又是一夜凌晨三点,鹏城的夜色还未褪去。
林晨坐在书房里,屏幕上同时运行着三个Python脚本。左边是期货模拟盘的实时数据流,中间是股票实盘账户的持仓监控,右边则是可转债小资金实盘的收益曲线。房间里只有键盘敲击声和主机风扇的低鸣。
他已经连续工作了十六个小时。
这不是因为焦虑,而是因为一种近乎痴迷的专注——他终于意识到了单一策略的致命缺陷。
“代码可以骗人,但逻辑不会”。林晨喃喃自语,这是他最近常挂在嘴边的话。
上周五,A股市场经历了一次毫无征兆的风格切换。他开发的基于均线突破的股票趋势策略,在连续盈利两周后,突然遭遇了三天回撤,单日最大回撤达到了2.8%。虽然总收益仍是正的,但这个波动幅度让他后背发凉。
更让他警觉的是期货模拟盘的表现。同样的趋势跟踪策略,在螺纹钢期货上表现优异,但在原油期货上却连续止损。市场在不同的时间尺度、不同的品种上,呈现出完全不同的“性格”。
“一个策略打天下,那是赌徒,不是交易者”。林晨在笔记本上写下这句话。
他开始系统性地研究量化交易中的多策略组合理论。核心思想很简单:没有任何一种策略能在所有市场环境下都赚钱。趋势策略在震荡市中会反复止损,均值回归策略在单边行情中会踏空甚至亏损。但如果将多种策略组合在一起,就能在不同市场环境下保持相对稳定的收益。
“就像一支球队”,林晨在脑海中构建着比喻,“需要有前锋、中场、后卫。趋势策略是前锋,负责在趋势明确时攻城拔寨;均值回归是中场,负责在震荡市中控制节奏、创造机会;网格交易是后卫,通过高频小额交易构建安全垫”。
理论清晰了,接下来是技术实现。
林晨首先着手开发趋势跟踪策略的升级版。他不再满足于简单的均线突破,而是引入了三重时间框架确认:日线判断大趋势方向,60分钟线寻找入场时机,15分钟线进行精细点位选择。同时加入了ATR(平均真实波幅)动态止损——市场波动大时止损放宽,波动小时止损收紧。
def trend_strategy(symbol, df_daily, df_hourly, df_15min):
# 日线趋势判断
daily_trend = if df_daily[close].iloc[-1] > df_daily[ma20].iloc[-1] else down
# 小时线寻找入场
if daily_trend == :
# 寻找小时线回调至支撑位的机会
entry_condition = (df_hourly[close] > df_hourly[ma10]) &
(df_hourly[close] < df_hourly[ma10] * 1.02)
else:
# 寻找小时线反弹至阻力位的机会
entry_condition = (df_hourly[close] < df_hourly[ma10]) &
(df_hourly[close] > df_hourly[ma10] * 0.98)
# 15分钟线精确入场
if entry_condition.any:
# 使用ATR计算动态止损
atr_value = df_15min[atr].iloc[-1]
stop_loss = df_15min[close].iloc[-1] - 2 * atr_value if daily_trend == else df_15min[close].iloc[-1] + 2 * atr_value
return entry_signal, stop_loss
写完这段核心逻辑,林晨活动了一下僵硬的脖子。窗外天色已经开始泛白,鹏城湾的方向隐约透出晨光。
第二个策略是均值回归。这适用于震荡市场,核心思想是“价格总会回归均值”。林晨选择了布林带(Bollinger Bands)作为主要工具——当价格触及布林带上轨时做空,触及下轨时做多,回归中轨时平仓。
但单纯的布林带策略容易在强势单边行情中被套。林晨加入了两个过滤条件:一是波动率过滤,只有在布林带宽度(代表波动率)处于历史中位数以上时才触发交易,避免在窄幅震荡中频繁交易;二是趋势过滤,只有当大周期趋势不明确(比如日线在布林带中轨附近震荡)时,才启用均值回归策略。
“这样就能避免在强势上涨趋势中,因为价格触及上轨而盲目做空”。林晨解释给自己听。
>>>点击查看《AI时代:码农的涅盘重生》最新章节