"虽有智慧,不如乘势;虽有镃基,不如待时。"
------《孟子·公孙丑上》
再聪明的人也拗不过大势;
再好的工具也得等对时机。
趋势型CTA的全部智慧藏在这八个字里------乘势、待时。
涨了就跟,跌了就走,不预测不较劲。

"追涨杀跌"居然是褒义词?
在股市里,"追涨杀跌"是骂人的话。
散户追涨杀跌,高位接盘、低位割肉,亏得一塌糊涂。所以大家都觉得,"追涨杀跌"是散户的坏毛病。
但你可能想不到------在期货市场,有一套专业的策略,核心逻辑就是"追涨杀跌",而且它还是CTA里最主流、最赚钱的一类。
它叫趋势跟踪(Trend Following)。
我第一次接触趋势跟踪的时候,也很困惑:"这不是散户的坏习惯吗?怎么成专业策略了?"
后来我想明白了:散户的"追涨杀跌"之所以亏钱,不是因为这个行为本身错,而是因为他们没有纪律、没有系统、没有风控。 他们追涨,是凭感觉追;杀跌,是被恐惧驱使着杀。而趋势跟踪策略的"追涨杀跌",是有明确规则、有严格风控、有仓位管理的。
同样是"追涨杀跌",一个是情绪,一个是系统。结果天差地别。
今天这篇,我就把趋势型CTA讲透。讲清楚它的收益到底从哪来、经典的策略有哪些、周期该怎么选,以及------它的资金曲线为什么长得那么"怪"。
Why:为什么趋势型CTA能长期赚钱?
一、趋势跟踪赚的是"人性的钱"
先回答一个根本问题:趋势跟踪为什么有效?
答案很简单:因为市场有"惯性",而人性有"惯性"。
价格一旦形成趋势,往往会延续。为什么?因为推动价格的那些因素(基本面、资金、情绪),不会一夜之间消失。而且,人在趋势里会自我强化 ------涨了,更多人买;更多人买,涨得更多。这就是"正反馈"。
趋势跟踪策略,就是搭上这个正反馈的顺风车 。它不预测趋势什么时候来,只在趋势出现后跟随,直到趋势结束。
二、趋势跟踪的收益来源:少数几笔大赚
这是理解趋势跟踪的核心 :
趋势跟踪的收益,不是均匀分布的,而是高度集中的。
你可能一年交易100次,其中60次是亏的(小亏),30次小赚,只有10次是大赚。而这一年的全部利润,就来自那10次大赚。
这就是所谓的"胖尾 "------少数几笔交易,贡献了绝大部分收益。
理解这一点极其重要。因为这意味着:
• 你会有大量的"小亏" ,这是正常的,是策略的成本。
• 你必须让利润奔跑 ,不能在赚了一点就跑(那是散户的通病)。
• 你必须在趋势结束后,果断止损 ,不能让"小亏"变成"大亏"。
三、为什么大多数人做不好趋势跟踪?
因为趋势跟踪极度反人性 。
人性的本能是:"截断利润,让亏损奔跑" ------赚了一点就想跑,亏了就想扛。而趋势跟踪恰恰相反:"截断亏损,让利润奔跑" 。
这两个字之差,是天壤之别。大部分人做不到"让利润奔跑",因为他们受不了"到手的利润又还回去"的心理折磨。所以他们赚一点就跑,然后在少数几笔本可以大赚的交易里,只赚了个零头。
结果就是:该赚的没赚到,该亏的照样亏。长期下来,必亏无疑。
What:趋势型CTA的经典策略有哪些?
趋势跟踪有很多种实现方式,但核心思路都一样:识别趋势、跟随趋势。 我讲三种最经典的。
一、双均线交叉(最经典)
原理 :用两条不同周期的均线,短均线代表近期趋势,长均线代表长期趋势。当短均线上穿 长均线(金叉),说明近期价格转强,做多;当短均线下穿 长均线(死叉),说明转弱,做空。
参数 :常见组合有5日/20日、10日/60日、20日/120日。参数越短,信号越灵敏(但假信号越多);参数越长,信号越迟钝(但更可靠)。
优点 :逻辑简单,容易实现,普适性强。
缺点 :在震荡市里会频繁发出错误信号("假突破"),导致反复小亏。
二、通道突破(唐奇安通道)
原理 :计算过去N天的最高价和最低价,形成一个"通道"。当价格突破 上轨(创新高),做多;跌破下轨(创新低),做空。
经典案例 :海龟交易法则,用的就是20日通道突破。价格突破过去20天最高点就买入,跌破过去10天最低点就卖出。
优点 :能抓住大趋势的起点(突破往往是趋势启动的信号)。
缺点 :突破可能是"假突破",突破后立刻回落,导致亏损。
三、动量指标(动量/ROC)
原理 :计算过去N天的涨跌幅(动量)。如果过去N天涨幅超过某个阈值,说明处于上升动量,做多;反之做空。
公式 :动量 = (当前价 - N天前价格) / N天前价格。
优点 :直接衡量"趋势的强度",简单直观。
缺点 :在趋势的末期,动量可能已经很强,此时入场容易买在顶部。
三种策略的对比
|--------|----------|----------|----------|
| 策略 | 核心逻辑 | 信号特点 | 主要风险 |
| 双均线交叉 | 均线金叉/死叉 | 滞后,平滑 | 震荡市假信号 |
| 通道突破 | 突破新高/新低 | 灵敏,抓起点 | 假突破 |
| 动量指标 | 涨幅超过阈值 | 直接,衡量强度 | 末期追高 |
一个重要的实践建议 :不要只用一种。可以把三种结合,或者用多个参数组合,来平滑信号。这叫"多信号共振 "。
How:趋势型CTA怎么落地?
一、周期选择:短、中、长三档
趋势型CTA的周期选择,决定了它的"性格"。
短周期(日内到几天) :
• 持仓时间:几小时到几天。
• 特点:交易频繁,对滑点和手续费敏感。
• 适用:流动性好、波动大的品种(如螺纹钢、原油)。
• 难点:噪音大,假信号多,对执行要求高。
中周期(几周到几个月) :
• 持仓时间:数周到数月。
• 特点:平衡了灵敏度和稳定性,是主流选择。
• 适用:大部分商品期货品种。
• 这是大多数CTA产品采用的周期 。
长周期(几个月到一年以上) :
• 持仓时间:数月以上。
• 特点:信号少、交易少、单笔盈亏大。
• 适用:大级别的宏观趋势。
• 难点:需要极强的耐心,横盘期可能长达半年。
怎么选? 我的建议是:新手从中周期开始 。短周期对执行和成本要求太高,长周期对耐心要求太高。中周期最好上手。
二、用代码实现双均线交叉策略
下面这段代码,帮你实现一个完整的双均线交叉策略,并输出资金曲线特征。每一行都有注释。
// python
============================================
双均线交叉趋势策略
功能:用双均线生成信号,计算收益和资金曲线
============================================
import numpy as np
第一步:参数设置
short_window = 10 # 短期均线周期
long_window = 60 # 长期均线周期
n_days = 500 # 回测天数
第二步:模拟价格数据(实际中替换为真实数据)
np.random.seed(7)
构造一个"有趋势"的价格序列:随机游走 + 一个中期趋势
trend = np.concatenate(
np.linspace(0, 0.15, 150), # 前150天:温和上涨
np.linspace(0.15, -0.05, 150),# 中150天:下跌
np.linspace(-0.05, 0.20, 200) # 后200天:上涨
)
noise = np.random.normal(0, 0.008, n_days) # 叠加噪音
log_returns = np.diff(trend) + noise1: # 日对数收益
price = 100 * np.exp(np.cumsum(np.insert(log_returns, 0, 0))) # 价格序列
第三步:计算双均线
ma_short = np.full(n_days, np.nan) # 初始化短期均线
ma_long = np.full(n_days, np.nan) # 初始化长期均线
for i in range(n_days):
if i >= short_window - 1:
ma_shorti = np.mean(pricei-short_window+1:i+1)
if i >= long_window - 1:
ma_longi = np.mean(pricei-long_window+1:i+1)
第四步:生成交易信号
1=持多仓, -1=持空仓, 0=空仓(初始)
signal = np.zeros(n_days)
for i in range(1, n_days):
需要两条均线都有效
if np.isnan(ma_shorti) or np.isnan(ma_longi):
continue
if ma_shorti > ma_longi:
signali = 1 # 短均线在上 → 做多
else:
signali = -1 # 短均线在下 → 做空
第五步:计算策略收益
用"昨天的信号 × 今天的收益"(避免未来函数)
strategy_return = np.zeros(n_days)
for i in range(1, n_days):
strategy_returni = signali-1 * log_returnsi-1
第六步:计算资金曲线
equity = np.cumprod(1 + strategy_return) # 累计净值
equity = equity / equity0 # 归一化到1
第七步:输出资金曲线特征
print("=" * 55)
print("【双均线趋势策略回测】")
print("=" * 55)
print(f"参数:短均线{short_window}日 / 长均线{long_window}日")
print(f"\n最终净值:{equity-1:.3f}")
print(f"累计收益:{equity-1 - 1:.1%}")
计算最大回撤
peak = np.maximum.accumulate(equity) # 历史最高净值
drawdown = (equity - peak) / peak # 回撤序列
max_dd = drawdown.min() # 最大回撤
print(f"最大回撤:{max_dd:.1%}")
计算胜率(统计每天的正收益比例)
win_days = np.sum(strategy_return1: > 0)
total_days = np.sum(strategy_return1: != 0)
print(f"盈利天数占比:{win_days/total_days:.1%}")
print("\n注意:盈利天数占比可能不到50%,")
print("但因为赚钱的时候赚得多,整体仍是正收益。")
逐行讲解:
• 第1步 :参数设置。10日/60日是经典的"中周期"组合。
• 第2步 :构造模拟价格。我用 np.linspace 构造了三段趋势(涨-跌-涨),再叠加噪音。真实使用时要换成真实价格数据。 注意 np.exp(np.cumsum(...)) 是把对数收益还原成价格。
• 第3步 :计算双均线。用循环逐日计算移动平均。np.nan 表示前几个交易日均线还没形成(数据不够)。
• 第4步 :生成信号。核心逻辑就一句:短均线在上就做多(1),在下就做空(-1) 。这是整个策略的灵魂。
• 第5步 :计算收益。这里有个关键细节 ------用"昨天的信号 × 今天的收益",而不是"今天的信号 × 今天的收益"。为什么?因为今天的信号是用今天收盘价算的,如果用它来算今天的收益,就用了未来数据(未来函数) 。这是回测里最常见的错误,一定要避免。
• 第6步 :计算资金曲线。np.cumprod(1+r) 是累计净值。
• 第7步 :输出资金曲线特征。你看,我特意输出了"盈利天数占比"------它会告诉你,趋势策略的胜率可能不到50%,但依然赚钱 。因为赚钱的时候赚得多(盈亏比高)。
运行这段代码,你就能看到趋势策略最典型的资金曲线特征:震荡期缓慢回撤,趋势期快速拉升。
三、资金曲线特征:为什么它长得那么"怪"?
趋势型CTA的资金曲线,有几个鲜明特征:
特征一:胜率低(40%-50%),但盈亏比高(2以上)。
它靠少数几笔大赚覆盖大量小亏。所以你看它的交易记录,会看到"亏、亏、亏、赚、亏、大赚"。
特征二:长期横盘 + 偶尔暴涨。
在震荡市,它可能连续几个月小亏,资金曲线缓慢下移。然后一波大趋势来了,一个月赚回半年的收益。这就是所谓的"开张吃三年 "。
特征三:回撤大。
趋势策略在震荡市里,会反复被"假突破"打脸,产生连续回撤。历史上,优秀的趋势CTA产品,回撤20%-30%是正常的。
理解这三个特征,你就理解了趋势型CTA的"性格" :它是一个"平时不出彩、关键时刻爆发"的策略。
四、做趋势型CTA的三个关键纪律
纪律一:让利润奔跑。
这是最难的。当一笔交易赚钱了,不要急着止盈。让信号决定什么时候走(比如等到均线死叉)。很多人赚5%就跑,结果错过了后面50%的趋势。
纪律二:严格止损。
每一笔交易,都要有明确的止损。趋势策略的小亏是成本,但如果不止损,小亏会变成大亏 ,一次大亏就能吃掉几十次的利润。
纪律三:坚持执行。
趋势策略最难的是"坚持"。因为你要忍受长时间的横盘和回撤。很多人在回撤期放弃,然后在趋势启动前离场 ------这是最可惜的。
总结
我们把趋势型CTA捋了一遍。
为什么能赚钱? 因为市场有惯性,人性有惯性。趋势跟踪搭上"正反馈"的顺风车。它的收益高度集中在少数几笔大赚上。
它是什么? 是"追涨杀跌"的系统化版本。经典策略有双均线交叉、通道突破、动量指标。周期分短、中、长三档,中周期最适合上手。
该怎么做? 核心纪律:让利润奔跑、严格止损、坚持执行。资金曲线特征是"胜率低、盈亏比高、长期横盘、偶尔暴涨"。
最后送你一句话。
趋势型CTA,本质上是一场和自己的心理搏斗 。你要对抗"赚一点就想跑"的贪婪,对抗"亏了就想扛"的侥幸,对抗"横盘就想放弃"的焦躁。
它不复杂,甚至很简单------简单到几句话就能说清楚。但简单不等于容易。能做到的人,万里挑一。
而市场,永远把最大的奖赏,留给那些"简单的事,坚持做"的人。