Skip to content

5.4 CTA趋势跟踪

概念详解

CTA(Commodity Trading Advisor)策略,更广义地称为管理期货策略,主要以期货、期权等衍生品为交易工具,在多个资产类别(商品、利率、外汇、股指等)上进行趋势跟踪。CTA策略的核心信仰是:价格趋势会持续——上涨的资产倾向于继续上涨,下跌的资产倾向于继续下跌。

CTA策略的三大特征:

  1. 多品种分散:同时交易几十到上百个不同市场的品种,通过分散化降低单一市场风险
  2. 趋势跟踪为主:大部分CTA策略属于中长期趋势跟踪,持仓周期从数周到数月
  3. 危机Alpha:在股市大幅下跌时,CTA策略往往表现良好(如2008年、2020年3月),提供宝贵的对冲效果
名词解释:海龟交易法则

著名的趋势跟踪策略,由Richard Dennis和William Eckhardt在1980年代创立。核心规则:使用20日和55日通道突破作为入场信号,以ATR(平均真实波幅)动态确定仓位大小(风险预算),同时包含严格的加仓规则和止损规则。海龟法则至今仍是趋势跟踪策略的经典范本。

名词解释:ATR(平均真实波幅)

衡量市场波动性的技术指标。计算三个值中的最大值:(1)当日最高-最低;(2)|当日最高-昨日收盘|;(3)|当日最低-昨日收盘|。然后对N日取平均。ATR = MA(N, TrueRange)。ATR越大,市场波动越剧烈,用于动态调整仓位和止损。

名词解释:通道突破

价格突破过去N日的最高价(做多信号)或跌破过去N日的最低价(做空信号)。这是海龟法则的核心入场规则。与均线交叉相比,通道突破能更及时地捕捉到趋势启动。

数学原理

通道突破信号

Signaltlong={1if Closet>max(HightN,HightN+1,...,Hight1)0otherwiseSignaltshort={1if Closet<min(LowtN,LowtN+1,...,Lowt1)0otherwise

ATR计算

TRt=max{HightLowt|HightCloset1||LowtCloset1|ATRt(N)=1Ni=0N1TRti

海龟仓位管理

海龟仓位由账户风险和品种波动率共同决定:

Units=AccountValue×RiskRatioATR×PointValue

例如:100万账户,每次风险1%(1万),ATR=2个点位,每点价值50元,则 Units = 10000 / (2 × 50) = 100手。

时间序列动量(Moskowitz et al., 2012)

rt,t+h(TSM)=sign(rt12,t)rt,t+h

即:做多过去12个月收益为正的品种,做空收益为负的品种,持有h个月。研究发现,1-12个月的时序动量在不同资产类别中广泛存在。

Python实战

📌 案例:通道突破

PYTHON3 行 · 171 B
📄此处有展示代码3 行 · 171 B展开 ▼
python
high = df['High'].rolling(20).max()
low = df['Low'].rolling(20).min()
df['signal'] = np.where(df['Close'] > high.shift(1), 1, np.where(df['Close'] < low.shift(1), -1, 0))
点击展开可浏览运行结果
--- 结果 ---
high tail(): 2024-09-04    101.008184
2024-09-05    101.008184
2024-09-06    101.004877
2024-09-07    101.004877
2024-09-08    101.443546
Freq: D
low tail(): 2024-09-04    99.69635
2024-09-05    99.69635
2024-09-06    99.69635
2024-09-07    99.69635
2024-09-08    99.69635
Freq: D

📌 案例:完整的海龟交易策略

PYTHON65 行 · 2.4 KB
📄此处有展示代码65 行 · 2.4 KB展开 ▼
python
class TurtleTradingSystem:
    """
    海龟交易法则的完整实现

    包含两个子系统:
    - System 1: 20日通道突破入场, 10日通道突破出场
    - System 2: 55日通道突破入场, 20日通道突破出场
    """
    def __init__(self, atr_period=20, risk_per_trade=0.01):
        self.atr_period = atr_period
        self.risk_per_trade = risk_per_trade

    def compute_signals(self, df):
        """计算双系统信号"""
        data = df.copy()

        # 通道
        for period in [10, 20, 55]:
            data[f'high_{period}'] = data['High'].rolling(period).max().shift(1)
            data[f'low_{period}'] = data['Low'].rolling(period).min().shift(1)

        # System 1 entry: 20日突破
        data['sys1_entry_long'] = data['Close'] > data['high_20']
        data['sys1_entry_short'] = data['Close'] < data['low_20']
        # System 1 exit: 10日反向突破
        data['sys1_exit_long'] = data['Close'] < data['low_10']
        data['sys1_exit_short'] = data['Close'] > data['high_10']

        # System 2 entry: 55日突破
        data['sys2_entry_long'] = data['Close'] > data['high_55']
        data['sys2_entry_short'] = data['Close'] < data['low_55']
        # System 2 exit: 20日反向突破
        data['sys2_exit_long'] = data['Close'] < data['low_20']
        data['sys2_exit_short'] = data['Close'] > data['high_20']

        return data

    def compute_atr(self, df):
        """计算ATR"""
        data = df.copy()
        data['prev_close'] = data['Close'].shift(1)
        data['tr1'] = data['High'] - data['Low']
        data['tr2'] = abs(data['High'] - data['prev_close'])
        data['tr3'] = abs(data['Low'] - data['prev_close'])
        data['TR'] = data[['tr1', 'tr2', 'tr3']].max(axis=1)
        data['ATR'] = data['TR'].rolling(self.atr_period).mean()
        return data['ATR']

    def position_sizing(self, capital, atr, point_value, max_units=None):
        """
        海龟仓位计算

        Parameters:
            capital: 当前账户总资金
            atr: 当前ATR值
            point_value: 每点价值(如股指期货每点300元)
            max_units: 最大持仓手数(单个品种上限)
        """
        risk_amount = capital * self.risk_per_trade
        units = int(risk_amount / (atr * point_value))

        if max_units:
            units = min(units, max_units)

        return max(units, 1)  # 最少1手
点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:类 `TurtleTradingSystem`(海龟交易法则的完整实现)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

📌 案例:多品种趋势跟踪组合

PYTHON35 行 · 1.2 KB
📄此处有展示代码35 行 · 1.2 KB展开 ▼
python
def multi_asset_trend_following(prices_dict, lookback=252):
    """
    多品种趋势跟踪:对每个品种独立计算趋势信号
    最终组合为各品种的等权组合

    Parameters:
        prices_dict: dict, {asset_name: pd.Series of prices}
    """
    signals = {}
    returns = {}

    for asset, price in prices_dict.items():
        # 时间序列动量信号:基于过去N日收益的方向
        momentum = price.pct_change(lookback).dropna()

        # 信号:做多正动量,做空负动量
        signal = pd.Series(np.sign(momentum), index=momentum.index)

        # 日收益(扣除前移一期信号,避免前视偏差)
        daily_ret = price.pct_change()
        strategy_ret = signal.shift(1) * daily_ret

        signals[asset] = signal
        returns[asset] = strategy_ret

    # 组合收益:各品种等权
    returns_df = pd.DataFrame(returns)
    portfolio_returns = returns_df.mean(axis=1)

    # 年化波动率目标(如15%),调整杠杆
    current_vol = portfolio_returns.std() * np.sqrt(252)
    target_vol = 0.15
    scaled_returns = portfolio_returns * (target_vol / current_vol)

    return scaled_returns, signals
点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `multi_asset_trend_following`(多品种趋势跟踪:对每个品种独立计算趋势信号)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

常见误区

  1. 只看单品种效果:CTA策略的核心竞争力在于多品种分散化。单个品种的趋势跟踪策略可能夏普很低(0.3-0.5),但30个低相关性品种的等权组合可以把夏普提升到1.0以上。分散化是CTA的免费午餐。

  2. 择时进出场:很多新手花大量精力优化精确的进出场点,但CTA策略的利润主要来自少数大趋势行情("肥尾收益")。过度优化出场规则可能让你错失大行情。

  3. 忽略波动率目标:不同品种的波动率差异极大(国债期货vs原油期货,年化波动率可差10倍)。如果不对齐波动率,组合的实际风险将完全由高波动品种主导。

  4. 在趋势市场用震荡策略,在震荡市场用趋势策略:CTA策略在趋势市场中赚钱、在震荡市场中亏钱是正常的。不要因为一段时间的震荡行情就放弃趋势跟踪——趋势总会回归。

  5. 参数过度优化:海龟法则用20/55日并不是经过统计优化选出来的。过于精细的参数搜索只会让策略过拟合。趋势跟踪策略对参数的敏感性通常较低——只要坚持趋势跟踪的理念,具体参数在合理范围内调整影响有限。

实战练习

  1. 实现一个简化版的海龟策略(20日通道突破入场,10日通道反向突破出场),在以下品种上分别回测:沪深300股指期货、螺纹钢期货、原油期货(或使用它们的ETF代理),观察各品种的收益特征差异。

  2. 多品种组合实验:将上述3个品种的信号等权组合,对比组合的夏普比率与单个品种最高夏普的差异。验证分散化的价值。

  3. 波动率目标实验:将每个品种的日收益缩放到年化波动率15%的等风险水平,观察缩放前后组合的波动率和最大回撤变化。

延伸阅读

  • Faith, C. M. (2007). Way of the Turtle. McGraw-Hill. 海龟交易学员亲述的交易法则。
  • Covel, M. W. (2009). Trend Following. FT Press. 全面介绍全球顶级趋势跟踪交易者。
  • Moskowitz, T. J., Ooi, Y. H., & Pedersen, L. H. (2012). "Time Series Momentum." Journal of Financial Economics. 实证检验了跨资产类别的时序动量效应。
  • Hurst, B., Ooi, Y. H., & Pedersen, L. H. (2017). "A Century of Evidence on Trend-Following Investing." 覆盖100年数据的趋势跟踪长期证据。
  • Clare, A., Seaton, J., Smith, P. N., & Thomas, S. (2013). "Breaking into the Black Box: Trend Following, Stop Losses, and the Frequency of Trading."

本章要点

  • CTA策略的核心是趋势跟踪,其理论基础是时间序列动量——过去上涨的品种未来倾向于继续上涨。
  • 海龟交易法则是趋势跟踪的经典范本:通道突破入场 + ATR动态仓位管理 + 严格的止损纪律。
  • CTA策略的三大支柱:多品种分散化 + 波动率目标 + 严格的资金管理。分散化是免费午餐,将夏普从0.3-0.5提升到1.0+。
  • ATR(平均真实波幅)是CTA策略的核心参数:用于确定仓位大小、设置止损位和衡量市场波动环境。
  • CTA策略的收益特征是"危机Alpha"——在股市危机期间往往表现优异,提供珍贵的对冲保护。
  • 趋势跟踪需要信念:在漫长的震荡市中持续承受小亏损,才能在罕见的大趋势中获取超额回报。