
为什么程序化交易必须带上止损
做股票和期货的人,只要把交易交给程序,就得明白一件事:你写的代码再聪明,也扛不住一次极端行情。止损不是给策略上枷锁,是给你账户买保险。没有止损的程序化交易,就像开车不系安全带,平时没事,一出事就是大事。
期货自带杠杆,股票遇到连续跌停也跑不掉。程序化交易的优势是纪律,止损就是纪律里最关键的一环。
固定比例止损
这是最直接的方式。每笔交易亏损达到账户总资金的某个百分比就平仓。
# 期货固定比例止损示例
stop_loss_pct = 0.02 # 2%
entry_price = 3500
current_price = 3430
if (entry_price - current_price) / entry_price >= stop_loss_pct:
close_position()
股票同样能用,只是股票没有杠杆,固定比例可以设得宽一点,比如5%到8%。期货因为杠杆放大,2%到3%就够了。

这种方式的毛病是太死板。行情波动大的时候,2%可能只是正常震荡,你被扫出去之后行情又回来了。波动小的时候,2%又太宽,亏得比该亏的多。
ATR动态止损
ATR叫平均真实波幅,它衡量的是最近一段时间价格平均波动多少。用ATR来设止损,相当于让市场自己告诉你该留多少空间。
# ATR止损
atr = ta.ATR(high, low, close, timeperiod=14)
stop_distance = 2 * atr
stop_price = entry_price - stop_distance
期货和股票都适用。ATR大,止损就宽,ATR小,止损就窄。这样不会因为行情突然变活跃就被轻易打掉。
ATR止损的好处是自适应。坏处是当ATR突然飙升,你的止损会被拉得很远,单笔亏损可能超出预期。所以最好加一个最大亏损上限,双重保护。
时间止损
时间止损不看价格,看持仓时间。一笔单子进去之后,如果N根K线或者N天内没有达到预期盈利,直接平掉。
# 时间止损
bars_held = current_bar - entry_bar
if bars_held >= 10 and profit < 0:
close_position()
股票做短线,时间止损特别有用。你买入的逻辑是三天内启动,三天没动,逻辑就失效了,留着也是占用资金。期货日内交易,时间止损可以防止在震荡里反复被割。
时间止损不关心你亏多少,只关心你耗了多久。资金是有时间成本的,尤其是在期货里,保证金被占用就没法开新仓。
跟踪止损
跟踪止损是让止损线跟着价格往有利方向移动,但绝不后退。
# 跟踪止损
highest_price = max(highest_price, current_price)
trailing_stop = highest_price - 2 * atr
if current_price <= trailing_stop:
close_position()
股票趋势交易常用跟踪止损。比如你买了一只股票,它从10块涨到15块,跟踪止损线可以从9块慢慢提到13块。价格掉到13块以下,自动卖出,利润落袋。
期货趋势策略也离不开跟踪止损。杠杆放大了利润,也放大了回撤。跟踪止损能让你在趋势里吃到大段利润,趋势反转时及时离场。
跟踪止损的难点是回撤容忍度。回撤设小了,一个正常回调就把你震出来。回撤设大了,利润回吐太多。可以用ATR的倍数来动态调节,也可以用固定百分比,看策略性格。
组合止损才是实战选择
单一止损方式都有短板。实战里更靠谱的做法是组合使用。
固定比例止损做底线,防止单笔亏损失控。ATR止损做日常防护,适应市场波动。时间止损淘汰无效持仓,提高资金效率。跟踪止损保护利润,让盈利奔跑。
期货程序化交易里,我会把固定比例止损设成最后一道防线,ATR止损作为主要触发条件。股票程序化交易里,时间止损和跟踪止损搭配使用,效果更好。
止损方式没有绝对好坏,关键看你的策略逻辑和品种特性。趋势策略适合跟踪止损,震荡策略适合固定比例或时间止损。套利策略的止损又不一样,看的是价差而不是绝对价格。
容易踩的坑
止损设得太紧,交易成本会吃掉利润。期货还有滑点,止损单触发时成交价可能更差。
止损设得太松,单笔亏损可能超过预期,连续亏损几次账户就伤筋动骨。
最怕的是不止损。程序化交易最大的优势是纪律,你手动干预把止损撤了,就等于把优势扔了。
写在最后
程序化交易的止损方式,核心就一句话:控制单笔亏损,让策略活到盈利的时候。固定比例、ATR、时间、跟踪,四种方式各有适用场景。股票和期货因为杠杆和波动特性不同,参数需要分别调整。回测的时候把止损逻辑加进去,看看最大回撤和盈亏比的变化,比拍脑袋定参数靠谱得多。