查看全课大纲(第 11 / 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.预案准备和实盘心理建设
技术指标的应用技巧
约 16 分钟
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
在实际量化交易中,单一指标的简单金叉死叉往往面临频繁的假突破和洗盘磨损。要将技术指标转化为具备统计显著性的有效策略,必须掌握多周期共振、指标钝化过滤、自适应动态阈值等进阶应用技巧。
💡 核心导读
- 量化实战中的三大进阶指标技巧:
- 多周期共振(Multi-Timeframe Resonance):高周期(日线)定趋势方向,低周期(60分钟/15分钟)找精确切入点;
- 指标钝化防洗盘(Anti-Saturation Filtering):在强趋势市场中,震荡指标(KDJ/RSI)长时间超买/超卖,需切换为趋势跟踪模式;
- 动态自适应阈值(Adaptive Thresholds):根据市场历史波动率(ATR/Std)动态调整超买超卖界限,取代静态 80/20 硬编码规则。
┌─────────────────────────────────────────────────────────────┐
│ 进阶技术指标多维协同过滤架构 │
└──────────────────────────────┬──────────────────────────────┘
│
┌─────────────────────────────┼─────────────────────────────┐
▼ ▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐ ┌─────────────────────────┐
│ 多周期趋势共振 │ │ 市场状态分类器 │ │ 自适应动态阈值 │
├─────────────────────────┤ ├─────────────────────────┤ ├─────────────────────────┤
│ • 日线: 200EMA 过滤大势 │ │ • ADX > 25: 趋势突破模式│ │ • 上轨: Mean + k * ATR │
│ • 60M: 动量指标找入场点 │ │ • ADX < 20: 均值回复模式│ │ • 下轨: Mean - k * ATR │
└─────────────────────────┘ └─────────────────────────┘ └─────────────────────────┘一、均线趋势信号与 ADX 市场状态分类思想
震荡指标在单边趋势中会发生严重的“指标钝化(Saturation)”,导致过早平仓甚至逆势摸顶遭致重创。解决此问题的核心是引入平均趋向指数(ADX)作为市场状态分类器:
当 时判定为强趋势市场,系统强制屏蔽所有逆势震荡信号;当 时判定为震荡市,启用布林带与 RSI 均值回复逻辑。下文示例代码实现的是均线趋势信号(收盘价上穿 SMA20);ADX 状态分类下的趋势/震荡自适应切换(>25 屏蔽逆势、<20 启用均值回复)留作课后扩展。
import pandas as pd
import numpy as np
def calculate_adaptive_strategy_signals(df: pd.DataFrame) -> pd.DataFrame:
"""
均线趋势信号引擎(ADX 状态分类与自适应切换留作课后扩展)
"""
res = df.copy()
# 1. 计算 ATR
high_low = res['high'] - res['low']
high_close = (res['high'] - res['close'].shift(1)).abs()
low_close = (res['low'] - res['close'].shift(1)).abs()
tr = pd.concat([high_low, high_close, low_close], axis=1).max(axis=1)
# SMA 口径 ATR; Wilder 原版为递归平滑 tr.ewm(alpha=1/14, adjust=False).mean()
res['ATR_14'] = tr.rolling(14).mean()
# 2. 动量与均线
res['SMA_20'] = res['close'].rolling(20).mean()
res['RSI_14'] = calculate_rsi(res['close'], 14)
# 3. 趋势信号:收盘价上穿 SMA20 金叉
res['Trend_Signal'] = (res['close'] > res['SMA_20']) & (res['close'].shift(1) <= res['SMA_20'].shift(1))
return res
def calculate_rsi(series: pd.Series, period: int = 14) -> pd.Series:
"""
RSI(Cutler 口径:涨跌幅用简单移动平均 SMA)
多数行情软件采用 Wilder 原版口径(递归平滑 RMA, 等价于 ewm(alpha=1/period, adjust=False)),
两者在长样本下趋近, 但窗口初期与剧烈波动期数值有差异, 与软件对数时需注意口径一致。
"""
delta = series.diff()
gain = (delta.where(delta > 0, 0)).rolling(period).mean()
loss = (-delta.where(delta < 0, 0)).rolling(period).mean()
rs = gain / (loss + 1e-8)
return 100 - (100 / (1 + rs))
# 合成数据演示(历史回测样例,不代表未来表现)
rng = np.random.default_rng(42)
base_price = 100.0
trend = np.linspace(0, 20, 50)
noise = rng.normal(0, 1.0, 50)
prices = base_price + trend + noise
df_demo = pd.DataFrame({
'high': prices + rng.uniform(0.5, 1.5, 50),
'low': prices - rng.uniform(0.5, 1.5, 50),
'close': prices
})
result_df = calculate_adaptive_strategy_signals(df_demo)
print("===== 自适应技术指标计算演示 =====")
print(f"数据样本量: {len(result_df)}")
print(f"ATR_14 均值: {result_df['ATR_14'].mean():.4f}")
print(f"RSI_14 均值: {result_df['RSI_14'].mean():.2f}")
print(f"趋势信号触发次数: {result_df['Trend_Signal'].sum()}")
print("注:合成数据用于教学,实际应用需警惕过拟合与未来函数风险。")===== 自适应技术指标计算演示 =====
数据样本量: 50
ATR_14 均值: 2.2099
RSI_14 均值: 73.01
趋势信号触发次数: 0
注:合成数据用于教学,实际应用需警惕过拟合与未来函数风险。二、多周期对齐与防偷看数据(No-Lookahead)
在多周期策略中,最常见的陷阱是在日线尚未收盘时,日内分钟线提前使用了当日尚未确定的日线收盘价(Lookahead Bias)。在工程实现中,低周期必须严格使用高周期前一完成周期的收盘数据(high_tf.shift(1))进行对齐。
import pandas as pd
import numpy as np
def align_multi_timeframe(df_minute: pd.DataFrame, df_daily: pd.DataFrame) -> pd.DataFrame:
"""
多周期安全对齐(严格无未来函数)
"""
# 日线趋势指标严格 shift(1) 后合并到分钟数据
df_daily_shifted = df_daily.copy()
df_daily_shifted['Daily_MA200_Valid'] = df_daily['close'].rolling(200).mean().shift(1)
merged = pd.merge_asof(
df_minute.sort_values('datetime'),
df_daily_shifted[['datetime', 'Daily_MA200_Valid']].sort_values('datetime'),
on='datetime',
direction='backward'
)
return merged
# 构造合成数据演示多周期对齐(历史回测样例,不代表未来表现)
rng = np.random.default_rng(2024)
# 生成日线数据(假设有250个交易日)
daily_dates = pd.date_range(start='2023-01-01', periods=250, freq='B')
daily_prices = 100.0 + np.cumsum(rng.normal(0, 0.5, 250))
df_daily = pd.DataFrame({
'datetime': daily_dates,
'close': daily_prices
})
# 生成分钟数据(选取某一天的分钟数据)
minute_dates = pd.date_range(start='2023-12-01 09:30', periods=240, freq='1min')
minute_prices = 120.0 + np.cumsum(rng.normal(0, 0.02, 240))
df_minute = pd.DataFrame({
'datetime': minute_dates,
'close': minute_prices
})
# 执行多周期对齐
aligned_df = align_multi_timeframe(df_minute, df_daily)
print("===== 多周期安全对齐演示 =====")
print(f"分钟数据条数: {len(df_minute)}")
print(f"对齐后数据条数: {len(aligned_df)}")
print(f"对齐后 Daily_MA200_Valid 非空值数量: {aligned_df['Daily_MA200_Valid'].notna().sum()}")
print("对齐后前3行数据预览:")
print(aligned_df[['datetime', 'close', 'Daily_MA200_Valid']].head(3))
print("注:日线指标滞后一期合并,避免未来函数风险。")===== 多周期安全对齐演示 =====
分钟数据条数: 240
对齐后数据条数: 240
对齐后 Daily_MA200_Valid 非空值数量: 240
对齐后前3行数据预览:
datetime close Daily_MA200_Valid
0 2023-12-01 09:30:00 119.987866 99.791752
1 2023-12-01 09:31:00 120.004172 99.791752
2 2023-12-01 09:32:00 120.004111 99.791752
注:日线指标滞后一期合并,避免未来函数风险。📝 动手练一练
编写 Python 验证程序,模拟自适应指标切换并在震荡与趋势行情中对比纯 RSI 与自适应策略的稳定性:
import pandas as pd
import numpy as np
def calculate_adaptive_strategy_signals(df: pd.DataFrame) -> pd.DataFrame:
"""
均线趋势信号引擎(ADX 状态分类与自适应切换留作课后扩展)
"""
res = df.copy()
# 1. 计算 ATR
high_low = res['high'] - res['low']
high_close = (res['high'] - res['close'].shift(1)).abs()
low_close = (res['low'] - res['close'].shift(1)).abs()
tr = pd.concat([high_low, high_close, low_close], axis=1).max(axis=1)
# SMA 口径 ATR; Wilder 原版为递归平滑 tr.ewm(alpha=1/14, adjust=False).mean()
res['ATR_14'] = tr.rolling(14).mean()
# 2. 动量与均线
res['SMA_20'] = res['close'].rolling(20).mean()
res['RSI_14'] = calculate_rsi(res['close'], 14)
# 3. 趋势信号:收盘价上穿 SMA20 金叉
res['Trend_Signal'] = (res['close'] > res['SMA_20']) & (res['close'].shift(1) <= res['SMA_20'].shift(1))
return res
def calculate_rsi(series: pd.Series, period: int = 14) -> pd.Series:
"""
RSI(Cutler 口径:涨跌幅用简单移动平均 SMA)
多数行情软件采用 Wilder 原版口径(递归平滑 RMA, 等价于 ewm(alpha=1/period, adjust=False)),
两者在长样本下趋近, 但窗口初期与剧烈波动期数值有差异, 与软件对数时需注意口径一致。
"""
delta = series.diff()
gain = (delta.where(delta > 0, 0)).rolling(period).mean()
loss = (-delta.where(delta < 0, 0)).rolling(period).mean()
rs = gain / (loss + 1e-8)
return 100 - (100 / (1 + rs))
def run_technique_validation():
rng = np.random.default_rng(42)
# 模拟单边牛市与高位震荡混合行情
trend_prices = 100.0 + np.linspace(0, 50, 100) + rng.normal(0, 0.5, 100)
osc_prices = trend_prices[-1] + 5.0 * np.sin(np.linspace(0, 4*np.pi, 100)) + rng.normal(0, 0.5, 100)
all_prices = np.concatenate([trend_prices, osc_prices])
df = pd.DataFrame({
'high': all_prices + 0.5,
'low': all_prices - 0.5,
'close': all_prices
})
res = calculate_adaptive_strategy_signals(df)
signals_count = res['Trend_Signal'].sum()
print("================ 自适应技术指标实战验证 ================")
print(f"全周期测试样本量: {len(df)} 根 K 线")
print(f"生成的有效突破信号数: {signals_count} 次")
print(f"信号触发率: {signals_count/len(df)*100:.2f}%")
assert signals_count > 0, "自适应信号未能成功触发!"
print("✅ 自适应指标技术应用技巧验证 PASS")
print("======================================================")
run_technique_validation()运行结果输出:
================ 自适应技术指标实战验证 ================
全周期测试样本量: 200 根 K 线
生成的有效突破信号数: 3 次
信号触发率: 1.50%
✅ 自适应指标技术应用技巧验证 PASS
======================================================👉 点击查看解析
本节练习通过代码演示技术指标的实战触发逻辑,重点在于理解指标信号存在滞后性,需结合价格趋势或多指标共振来过滤无效信号。核心结论是技术指标更适合作为辅助确认工具,而非单独依据。
本章小结
- 引入状态分类器:利用 ADX 或波动率通道对市场状态进行划分,防止震荡指标在单边市中钝化受损。
- 多周期严格防偷看:高周期过滤信号必须严格基于上一根已完结的 K 线进行
shift(1)对齐。 - 动态阈值取代硬编码:结合 ATR 与滚动标准差使指标边界具备自适应市场波动率的能力。
📋 行动清单 (Action Checklist)
- 运行自适应测试代码,观察在单边市与震荡市中信号触发频次的分布差异;
- 实现带成交量加权的 VWAP(成交量加权平均价)动态支撑阻力线;
- 预习下一节,掌握技术指标在组合决策与交易状态机中的综合应用。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第2章课件:从技术的角度重新认识技术指标PDF · 1.8MB