又是一夜凌晨三点,鹏城的夜色还未褪去。
林晨坐在书房里,屏幕上同时运行着三个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)作为主要工具——当价格触及布林带上轨时做空,触及下轨时做多,回归中轨时平仓。
但单纯的布林带策略容易在强势单边行情中被套。林晨加入了两个过滤条件:一是波动率过滤,只有在布林带宽度(代表波动率)处于历史中位数以上时才触发交易,避免在窄幅震荡中频繁交易;二是趋势过滤,只有当大周期趋势不明确(比如日线在布林带中轨附近震荡)时,才启用均值回归策略。
“这样就能避免在强势上涨趋势中,因为价格触及上轨而盲目做空”。林晨解释给自己听。
第三个策略是网格交易。这是最“机械”的策略,也是林晨以前最看不上的——“太没技术含量了”。但现在他明白了,策略没有高低之分,只有适用与否。
网格交易的核心是在某个价格区间内,设置等间距的买入和卖出挂单。比如某只股票当前价格10元,设定网格间距5%,那么就在9.5元挂买入单,在10.5元挂卖出单。价格跌到9.5元就买入,涨到10.5元就卖出,赚取这5%的差价。
林晨选择将这个策略应用于可转债。因为可转债具有“下有保底”的特性,在面值附近下跌空间有限,非常适合网格交易。他编写了一个自动挂单脚本,对持仓的几只可转债进行网格管理。
class Gridtrader:
def __init__(self, symbol, center_price, grid_width=0.05, grid_num=5):
self.symbol = symbol
self.center = center_price # 网格中心价
self.width = grid_width # 网格间距比例
self.num = grid_num # 向上和向下的网格层数
def generate_grids(self):
grids = []
for i in range(-self.num, self.num+1):
price = self.center * (1 + i * self.width)
if i < 0:
grids.append({price: price, typebuyqty: 100})
elif i > 0:
grids.append({price: price, typesellqty: 100})
return grids
三个策略独立开发完成后,真正的挑战来了:如何整合?
林晨在架构设计上花了整整两天时间。他设计了一个“策略调度器”,核心逻辑是根据市场状态动态分配资金权重。
第一步,市场状态识别。他编写了一个状态分类器,根据过去20个交易日的波动率、趋势强度、成交量变化等指标,将市场分为四种状态:强势上涨、强势下跌、宽幅震荡、窄幅震荡。
第二步,策略权重分配。在强势上涨趋势中,趋势策略分配到70%资金,均值回归策略20%,网格交易10%;在宽幅震荡中,均值回归策略分配到60%,趋势策略20%,网格交易20%;在窄幅震荡中,网格交易分配到50%,均值回归30%,趋势策略20%。
第三步,动态调整。每周末进行一次状态重评估和权重再平衡。
“这就像自动驾驶系统”,林晨在代码注释中写道,“根据路况(市场状态)自动切换驾驶模式(策略权重)。直道加速(趋势策略),弯道减速(均值回归),堵车时跟车(网格交易)”。
系统整合完成的那个下午,林晨泡了一杯浓茶,坐在电脑前启动了回测。
他选择了过去三年的数据,涵盖牛市、熊市、震荡市各种行情。回测结果让他屏住了呼吸。
单一趋势策略:年化收益率18.7%,最大回撤32.4%,夏普比率0.86。 单一均值回归策略:年化收益率15.2%,最大回撤25.8%,夏普比率0.79。 单一网格交易策略:年化收益率12.5%,最大回撤15.3%,夏普比率0.92。
而多策略组合:年化收益率21.3%,最大回撤降至18.2%,夏普比率提升至1.24。
“成了”。林晨长长地吐出一口气。
最大回撤从32.4%降到18.2%,这是质的飞跃。在投资中,控制回撤比追求高收益更重要——因为50%的回撤需要100%的收益才能回本,而20%的回撤只需要25%的收益就能恢复。
夏普比率从不到1提升到1.24,意味着每承担一单位风险,获得的收益补偿更高了。
更重要的是,收益曲线变得平滑了。在单一策略大幅回撤的时期,多策略组合因为其他策略的盈利而抵消了部分损失,整体曲线呈现出“小步快跑、稳步向上”的态势。
林晨将新系统部署到实盘。股票账户的7万资金,他分配了3万给趋势策略,1.5万给均值回归,0.5万给网格交易。期货模拟盘和可转债实盘也做了相应调整。
一周后,效果开始显现。
周一,市场震荡,趋势策略小幅亏损,但均值回归策略盈利,网格交易赚取了几个价差,整体账户微涨0.3%。
周三,市场突然上涨,趋势策略抓住了突破机会,单日盈利1.8%,均值回归策略因为趋势过滤没有触发交易,网格交易正常运作,整体账户大涨2.1%。
周五,市场冲高回落,趋势策略部分止盈,均值回归策略在回调中低吸,网格交易在波动中赚取差价,整体账户再涨0.7%。
一周下来,账户总收益3.1%,最大单日回撤只有0.5%。这个波动水平,林晨晚上终于能睡得着了。
周末,他算了一笔账:如果按周化3%的收益(年化约165%),7万本金半年就能翻倍。但理智告诉他,这只是理想情况,实际市场会有更复杂的表现。
不过多策略组合带来的安全感是真实的。就像在海上航行,以前只有一艘船,风浪大了随时可能翻;现在是一个舰队,即使一艘船受损,其他船还能保持编队继续前进。
夜深了,林晨关掉电脑。书房窗外,鹏城湾的灯光倒映在海面上,连成一片璀璨的光带。
他想起两个月前被裁员时的绝望,想起面试web3公司时的挫败,想起自学AI时的孤独。那些时刻,他从未想过自己会坐在家里,构建一个能自动赚钱的系统。
技术改变命运——这句话以前听起来像鸡汤,现在成了他亲身验证的真理。
但林晨清楚,这只是开始。多策略组合提升了系统的鲁棒性,但资金规模依然是瓶颈。7万本金,即使年化50%,一年也只有3.5万收益,远不足以支撑家庭开支,更别说实现财富自由。
“需要更多资金,或者……”林晨看着屏幕上平滑上升的收益曲线,“找到放大收益的方法”。
这个念头在他脑海中盘旋,像一颗等待破土的种子。