查看全课大纲(第 2 / 59 节)
- 1.量化投资必备基础知识
- 2.趋势型策略及模型原理
- 3.均值回复型策略及模型原理
- 4.配对交易策略及模型原理
- 5.量化策略研发流程与基本技能
- 6.常用的量化平台概述及如何选择
- 7.如何量化一个主观策略思路
- 8.常用技术指标及指标计算过程
- 9.如何编写指标代码
- 10.指标的物理意义
- 11.技术指标的应用技巧
- 12.更多的交易决策
- 13.编写程序去量化一个趋势型技术指标
- 14.编写趋势型技术指标的性能评价
- 15.策略对交易成本和持仓周期的影响
- 16.股票池策略的原理及基本框架
- 17.基于多因子分析的股票池设计与实现
- 18.股票池的性能评估
- 19.使用定制化财务因子构建股票池
- 20.趋势型策略原理及股票池机制的设计
- 21.趋势型择时信号的设计方法与编程实现
- 22.趋势型策略的回测与性能评估
- 23.优化趋势型策略的思路及方法
- 24.量化体系中的风险控制思想
- 25.风险的度量-波动率
- 26.常用的风险控制方法
- 27.实现止盈止损模块以提高策略性能
- 28.策略性能的评估与优化
- 29.探讨波动率与风险的关系
- 30.量化策略中的经典资金管理模型
- 31.用python编程实现资金管理模块
- 32.构建一个完善的量化交易策略
- 33.趋势型量化策略必备的期货知识
- 34.期货量化工具介绍
- 35.商品期货趋势型策略原理
- 36.用TB编写商品期货趋势型策略(上)
- 37.用TB编写商品期货趋势型策略(下)
- 38.分析优化商品期货趋势型策略的方法思路
- 39.期货交易策略的注意事项
- 40.均值回复型策略的原理
- 41.A股市场有没有稳定的均值回复效应?
- 42.编写一个均值回复型股票量化策略
- 43.编写多空组合策略进行策略改进
- 44.在策略中实现头寸管理进行策略优化
- 45.套利策略原理及常见套利类型
- 46.用MC开发一个跨品种套利交易策略(上)
- 47.用MC开发一个跨品种套利交易策略(下)
- 48.统计套利之股票配对交易策略
- 49.实盘中的细节问题:加减仓
- 50.关于高频交易
- 51.如何评价实盘量化策略的性能
- 52.量化系统的工作过程及研发流程
- 53.运气or实力
- 54.量化实盘交易需要满足什么条件
- 55.未来函数的坑
- 56.实盘数据接口异常的自动报警
- 57.交易系统的压力测试
- 58.自动运行的交易策略,什么时候需要人工干预
- 59.预案准备和实盘心理建设
趋势型策略及模型原理
约 18 分钟
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
在量化交易的策略体系中,趋势跟踪策略(Trend Following)是历经数十年市场牛熊考验的最经典流派之一。许多初学者在构建策略时,往往陷入对高胜率的执着追求,然而在真实的金融市场中,趋势型策略的核心盈利哲学并非依靠高胜率,而是依靠在趋势主升浪中捕捉超高盈亏比(Profit-Loss Ratio)。本讲系统梳理趋势型策略的物理机制、供求关系与收益分布特征,帮助开发者建立科学的量化研发认知。
💡 核心导读
- 什么是趋势的内在动力学机制?
- 供求关系不平衡(Supply & Demand):价格运动的本质是买卖双方筹码与资金力量的不对等,增量资金的持续流入形成单边价格推动力;
- 因果关系(Cause & Effect):没有无缘无故的暴涨暴跌,主升浪趋势形成之前必定经历长期的底部横盘吸筹或能量积聚;
- 努力与结果(Effort vs Result):成交量代表主力的资金努力,价格幅度代表市场结果;若天量成交却价格滞涨,往往预示着趋势即将反转。
- 趋势型策略的典型收益分布特征:
- 胜率偏低(35% ~ 45%):在震荡市中需要承受频繁的均线缠绕与小额假突破止损磨损;
- 盈亏比极高(3:1 ~ 5:1 以上):一旦抓住单边趋势行情,单笔盈利足以覆盖数十次试错成本,呈现典型的”右侧肥尾”特征。
- 趋势策略四大核心工程模块:
- 趋势识别与入场信号:唐奇安通道突破、双均线金叉;
- 顺势头寸加仓(Pyramiding):随趋势确立阶梯式追加 Unit;
- 防御性硬性止损:入场后设定初始风险底线(如 2×ATR);
- 浮动跟踪止盈离场:自最高点回撤一定比例或跌破关键均线离场。
┌─────────────────────────────────────────────────────────────┐
│ 趋势型策略收益非对称分布模型 │
└──────────────────────────────┬──────────────────────────────┘
│
概率密度 P(R) ▲
▲ │
│ │ [震荡市试错磨损: -2% ~ -5%]
│ │ ┌─────────┐
│ │ │ 胜率 40%│
────────────────────────────┼─┼───┴─────────┴────────────────► 收益率 R
-5% 0 │ +5% +20% +50%
│ └───────────────────────┘
│ [单边趋势爆发: +20% ~ +50%] (盈亏比 4:1)一、趋势识别与唐奇安通道(Donchian Channel)模型
唐奇安通道是趋势跟踪系统中最具代表性的突破判定工具。其数学定义如下:
当最新价格突破过去 日最高价时,代表市场打破震荡箱体,多头动能占据绝对优势,系统生成顺势做多信号。
import pandas as pd
import numpy as np
def calculate_donchian_channels(prices_df, window=20):
"""
计算标准唐奇安通道 (Donchian Channels)
- UpperBand: 过去 N 日最高价 (不含当日)
- LowerBand: 过去 N 日最低价 (不含当日)
- MiddleBand: 上下轨均值
"""
df = prices_df.copy()
df['donchian_high'] = df['high'].rolling(window=window).max().shift(1)
df['donchian_low'] = df['low'].rolling(window=window).min().shift(1)
df['donchian_mid'] = (df['donchian_high'] + df['donchian_low']) / 2.0
return df
# 合成价格数据(教学样例,不代表真实市场)
rng = np.random.default_rng(42)
dates = pd.date_range("2024-01-02", periods=30, freq="B")
base_price = 100.0
returns = rng.normal(0.001, 0.02, 30)
prices = base_price * np.exp(np.cumsum(returns))
synthetic_prices = pd.DataFrame({
'date': dates,
'open': prices * 0.995,
'high': prices * 1.015,
'low': prices * 0.985,
'close': prices
}).set_index('date')
# 计算并展示唐奇安通道
window = 5
result_df = calculate_donchian_channels(synthetic_prices, window=window)
print("===== 唐奇安通道计算示例 =====")
print(f"数据周期: {len(result_df)} 个交易日,通道窗口: {window} 日")
print(f"最新价格 (Close): {result_df['close'].iloc[-1]:.4f}")
print(f"上轨 (Donchian High): {result_df['donchian_high'].iloc[-1]:.4f}")
print(f"下轨 (Donchian Low): {result_df['donchian_low'].iloc[-1]:.4f}")
print(f"中轨 (Donchian Mid): {result_df['donchian_mid'].iloc[-1]:.4f}")
print("----------------------------")
print("通道计算基于历史最高/最低价,突破信号需结合完整策略逻辑。")===== 唐奇安通道计算示例 =====
数据周期: 30 个交易日,通道窗口: 5 日
最新价格 (Close): 104.0903
上轨 (Donchian High): 104.6405
下轨 (Donchian Low): 98.6244
中轨 (Donchian Mid): 101.6325
----------------------------
通道计算基于历史最高/最低价,突破信号需结合完整策略逻辑。二、从物理学视角理解量化指标的三大物理量
在量化建模中,技术指标本质上是对行情时序物理特征的降维提取:
- 位移(Position):价格偏离均线的绝对距离,对应乖离率(BIAS);
- 速度(Velocity):价格在一阶时间差分上的变动率,对应动量指标(Momentum / ROC);
- 加速度(Acceleration):动量指标的变化率(如 MACD 柱状图的斜率变化),预示着趋势动能的衰竭或爆发。
import pandas as pd
import numpy as np
def calculate_price_kinematics(close_series, n=10):
"""
计算价格时序的物理学特征量: 位移、速度、加速度
"""
displacement = close_series - close_series.rolling(n).mean()
velocity = close_series.pct_change(periods=n)
acceleration = velocity.diff()
return pd.DataFrame({
'displacement': displacement,
'velocity': velocity,
'acceleration': acceleration
})
# 合成价格序列(教学样例)
rng = np.random.default_rng(123)
periods = 25
base = 50.0
trend = np.linspace(0, 0.1, periods)
noise = rng.normal(0, 0.5, periods)
synthetic_close = base + np.cumsum(trend + noise)
close_series = pd.Series(synthetic_close, name='close')
# 计算价格运动学特征
n_period = 5
kinematics_df = calculate_price_kinematics(close_series, n=n_period)
print("===== 价格运动学特征计算 =====")
print(f"分析周期 N = {n_period},总数据点 = {len(close_series)}")
print("最后 5 个数据点的特征值:")
sample_df = kinematics_df.iloc[-5:].copy()
sample_df['close'] = close_series.iloc[-5:].values
for idx, row in sample_df.iterrows():
print(f" Bar {idx}: Close={row['close']:6.3f}, "
f"Disp={row['displacement']:7.3f}, "
f"Vel={row['velocity']:7.3%}, "
f"Acc={row['acceleration']:7.3%}")
print("----------------------------")
print("位移: 价格偏离其N期均线的距离,表征趋势强度。")
print("速度: N期收益率,表征趋势方向与速率。")
print("加速度: 速度的变化率,表征趋势的加速或减速。")===== 价格运动学特征计算 =====
分析周期 N = 5,总数据点 = 25
最后 5 个数据点的特征值:
Bar 20: Close=50.779, Disp= -0.752, Vel=-0.548%, Acc=-2.259%
Bar 21: Close=51.281, Disp= -0.128, Vel=-1.177%, Acc=-0.630%
Bar 22: Close=52.143, Disp= 0.632, Vel= 0.989%, Acc= 2.166%
Bar 23: Close=52.802, Disp= 1.041, Vel= 2.426%, Acc= 1.437%
Bar 24: Close=53.280, Disp= 1.223, Vel= 2.857%, Acc= 0.431%
----------------------------
位移: 价格偏离其N期均线的距离,表征趋势强度。
速度: N期收益率,表征趋势方向与速率。
加速度: 速度的变化率,表征趋势的加速或减速。📝 动手练一练
下面我们用 Python 编写一段 趋势跟踪策略收益特征与唐奇安通道突破模拟引擎,从持仓序列中逐笔还原真实交易明细,统计胜率、平均盈亏与盈亏比,并对比策略与基准的全周期收益:
import pandas as pd
import numpy as np
def run_trend_following_simulation():
"""
趋势型策略核心收益分布与唐奇安通道突破模拟
- 从持仓序列还原真实交易明细,统计胜率与盈亏比
- 合成数据历史回测,存在过拟合与未来函数风险,不代表未来表现。
"""
rng = np.random.default_rng(2024)
dates = pd.date_range("2024-03-01", periods=100, freq="B")
# 构造含有一段主升浪趋势的合成行情
returns = rng.normal(0.0003, 0.012, 100)
returns[30:60] += 0.008 # 模拟主升浪趋势波段
returns[70:85] -= 0.006 # 模拟一段下跌趋势
prices = 100.0 * np.exp(np.cumsum(returns))
df = pd.DataFrame({'close': prices,
'high': prices * (1 + rng.uniform(0.005, 0.015, 100)),
'low': prices * (1 - rng.uniform(0.005, 0.015, 100))},
index=dates)
# 计算唐奇安通道: 突破20日高点做多,跌破10日低点离场
df['donchian_high'] = df['high'].rolling(20).max().shift(1)
df['donchian_low'] = df['low'].rolling(10).min().shift(1)
# 生成持仓信号
df['signal'] = np.nan
df.loc[df['close'] > df['donchian_high'], 'signal'] = 1
df.loc[df['close'] < df['donchian_low'], 'signal'] = 0
df['position'] = df['signal'].ffill().fillna(0)
# 策略收益计算
df['pct_change'] = df['close'].pct_change()
df['strat_ret'] = df['position'].shift(1) * df['pct_change']
df['cum_ret'] = (1 + df['strat_ret'].fillna(0)).cumprod()
# 从持仓序列还原真实交易明细
pos = df['position'].values
closes = df['close'].values
trade_returns = []
entry_price = None
entry_bar = None
for i in range(1, len(df)):
if pos[i] == 1 and pos[i - 1] == 0:
entry_price = closes[i]
entry_bar = i
elif pos[i] == 0 and pos[i - 1] == 1 and entry_price is not None:
trade_returns.append(closes[i] / entry_price - 1.0)
entry_price = None
if entry_price is not None and entry_bar < len(df) - 1:
trade_returns.append(closes[-1] / entry_price - 1.0)
# 绩效统计
total_trades = len(trade_returns)
if total_trades > 0:
trade_returns_array = np.array(trade_returns)
wins = trade_returns_array[trade_returns_array > 0]
losses = trade_returns_array[trade_returns_array <= 0]
win_rate = len(wins) / total_trades
avg_win = float(wins.mean()) if len(wins) > 0 else 0.0
avg_loss = float(losses.mean()) if len(losses) > 0 else 0.0
profit_loss_ratio = abs(avg_win / avg_loss) if avg_loss < 0 else float('inf')
else:
win_rate = avg_win = avg_loss = 0.0
profit_loss_ratio = float('inf')
benchmark_return = (df['close'].iloc[-1] / df['close'].iloc[0] - 1)
strategy_return = (df['cum_ret'].iloc[-1] - 1)
return {
"total_trades": total_trades,
"win_rate": win_rate,
"avg_win": avg_win,
"avg_loss": avg_loss,
"profit_loss_ratio": profit_loss_ratio,
"benchmark_return": benchmark_return,
"strategy_return": strategy_return,
"trade_returns_sample": trade_returns[:5] if total_trades > 5 else trade_returns
}
# 执行模拟并打印结果
results = run_trend_following_simulation()
print("===== 趋势跟踪策略模拟:收益分布与唐奇安突破 =====")
print(f"总交易次数 : {results['total_trades']}")
print(f"胜率 : {results['win_rate']:.1%}")
print(f"平均盈利 : {results['avg_win']:.2%}")
print(f"平均亏损 : {results['avg_loss']:.2%}")
print(f"盈亏比 : {results['profit_loss_ratio']:.2f}")
print(f"基准收益率 : {results['benchmark_return']:.2%}")
print(f"策略收益率 : {results['strategy_return']:.2%}")
print("----------------------------------------------")
if results['total_trades'] > 0:
print("前几笔交易收益率样本:")
for i, ret in enumerate(results['trade_returns_sample']):
print(f" 交易 {i+1}: {ret:+.2%}")
print("==============================================")
print("核心观察:趋势策略常呈现低胜率、高盈亏比特征。")
print("风险提示:合成数据回测,存在过拟合风险。")运行结果输出:
===== 趋势跟踪策略模拟:收益分布与唐奇安突破 =====
总交易次数 : 1
胜率 : 100.0%
平均盈利 : 18.59%
平均亏损 : 0.00%
盈亏比 : inf
基准收益率 : 29.97%
策略收益率 : 18.59%
----------------------------------------------
前几笔交易收益率样本:
交易 1: +18.59%
==============================================
核心观察:趋势策略常呈现低胜率、高盈亏比特征。
风险提示:合成数据回测,存在过拟合风险。⚠️ 统计显著性警示:本次合成行情仅触发 1 笔交易(胜率 100%),策略收益 18.59% 跑输基准 29.97%。1 笔样本完全不具有统计意义——实盘中趋势策略的典型胜率仅 35%~45%,本例的全胜只是”主升浪恰好被通道完整捕捉”的幸运结果。这也解释了为什么量化统计必须从持仓序列真实还原交易明细(而非预设数字):只有样本量足够大(数百笔以上),胜率与盈亏比的分布特征才会收敛到策略的真实期望。
👉 点击查看解析
本练习围绕趋势型策略的构建与回测展开,核心是用均线或价格突破等方式识别趋势方向,并验证顺势交易在趋势行情中的有效性。关键结论是趋势策略的收益主要来自少数持续行情,需配合止损与过滤条件控制震荡期的回撤。
本章小结
- 重塑盈利思维:趋势跟踪的核心是用小额且可控的试错成本,博取单边主升浪的超额回报,不盲目追求高胜率。
- 严守纪律四部曲:在实际工程中必须严格固化入场确认、阶梯加仓、硬性止损与跟踪止盈的完整闭环。
- 理解市场物理特性:从供需失衡、因果积累与量价共振三个维度辅助研判趋势的可持续性。
📋 行动清单 (Action Checklist)
- 运行本讲唐奇安通道模拟代码,观察低胜率与高盈亏比的数学协同关系;
- 在真实行情历史数据中绘制 20 日唐奇安通道与 10 日出场线,统计震荡期与单边期的交易次数;
- 预习下一节,探讨均值回复型(Mean Reversion)策略的统计特性与模型架构。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第1章课件:实战量化投资必备基础知识PDF · 4.5MB