主题切换
5.4 CTA趋势跟踪
概念详解
CTA(Commodity Trading Advisor)策略,更广义地称为管理期货策略,主要以期货、期权等衍生品为交易工具,在多个资产类别(商品、利率、外汇、股指等)上进行趋势跟踪。CTA策略的核心信仰是:价格趋势会持续——上涨的资产倾向于继续上涨,下跌的资产倾向于继续下跌。
CTA策略的三大特征:
- 多品种分散:同时交易几十到上百个不同市场的品种,通过分散化降低单一市场风险
- 趋势跟踪为主:大部分CTA策略属于中长期趋势跟踪,持仓周期从数周到数月
- 危机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日的最低价(做空信号)。这是海龟法则的核心入场规则。与均线交叉相比,通道突破能更及时地捕捉到趋势启动。
数学原理
通道突破信号
ATR计算
海龟仓位管理
海龟仓位由账户风险和品种波动率共同决定:
例如:100万账户,每次风险1%(1万),ATR=2个点位,每点价值50元,则 Units = 10000 / (2 × 50) = 100手。
时间序列动量(Moskowitz et al., 2012)
即:做多过去12个月收益为正的品种,做空收益为负的品种,持有h个月。研究发现,1-12个月的时序动量在不同资产类别中广泛存在。
Python实战
📌 案例:通道突破
此处有展示代码展开 ▼
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
📌 案例:完整的海龟交易策略
此处有展示代码展开 ▼
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`(海龟交易法则的完整实现)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
📌 案例:多品种趋势跟踪组合
此处有展示代码展开 ▼
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`(多品种趋势跟踪:对每个品种独立计算趋势信号)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
常见误区
只看单品种效果:CTA策略的核心竞争力在于多品种分散化。单个品种的趋势跟踪策略可能夏普很低(0.3-0.5),但30个低相关性品种的等权组合可以把夏普提升到1.0以上。分散化是CTA的免费午餐。
择时进出场:很多新手花大量精力优化精确的进出场点,但CTA策略的利润主要来自少数大趋势行情("肥尾收益")。过度优化出场规则可能让你错失大行情。
忽略波动率目标:不同品种的波动率差异极大(国债期货vs原油期货,年化波动率可差10倍)。如果不对齐波动率,组合的实际风险将完全由高波动品种主导。
在趋势市场用震荡策略,在震荡市场用趋势策略:CTA策略在趋势市场中赚钱、在震荡市场中亏钱是正常的。不要因为一段时间的震荡行情就放弃趋势跟踪——趋势总会回归。
参数过度优化:海龟法则用20/55日并不是经过统计优化选出来的。过于精细的参数搜索只会让策略过拟合。趋势跟踪策略对参数的敏感性通常较低——只要坚持趋势跟踪的理念,具体参数在合理范围内调整影响有限。
实战练习
实现一个简化版的海龟策略(20日通道突破入场,10日通道反向突破出场),在以下品种上分别回测:沪深300股指期货、螺纹钢期货、原油期货(或使用它们的ETF代理),观察各品种的收益特征差异。
多品种组合实验:将上述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"——在股市危机期间往往表现优异,提供珍贵的对冲保护。
- 趋势跟踪需要信念:在漫长的震荡市中持续承受小亏损,才能在罕见的大趋势中获取超额回报。