查看全课大纲(第 20 / 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.预案准备和实盘心理建设
趋势型策略原理及股票池机制的设计
约 20 分钟
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)
小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。
单只标的的趋势策略极易受到个股黑天鹅与长时间盘整磨损的困扰。将趋势型择时逻辑与动态多因子股票池有机结合,在具备高动量与成长潜力的精选股票池内捕捉大级别突破行情,是实现稳健复利的核心机制。
💡 核心导读
- 趋势策略与股票池协同机制的两级火箭:
- 一级火箭(股票池选优):每月初在全市场中按相对强弱(RPS)先以 RPS>85 分位初筛候选池,再从中精选排名前 5 名构成最终高动能交易池(本节示意规模);
- 二级火箭(趋势择时进出场):在股票池内,个股触发唐奇安通道突破(Donchian Breakout)或双均线金叉时开仓,跌破动态止损线时止损出场;
- 低相关分散与资金动态再平衡:
- 限制单只个股持仓上限(如不超过总资金 10%),实现跨板块趋势捕捉。
┌─────────────────────────────────────────────────────────────┐
│ 趋势择时与股票池协同驱动拓扑图 │
└──────────────────────────────┬──────────────────────────────┘
│
┌─────────────────────────────┴─────────────────────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ 多因子股票池 (一级火箭) │ │ 趋势择时执行 (二级火箭) │
├─────────────────────────┤ ├─────────────────────────┤
│ • 每月重平衡 │ │ • 每日动态监控 │
│ • RPS 动量 > 85 分位 │ │ • 唐奇安 20 日突破开仓 │
│ • 财务质量基本面及格 │ ──────── RPS>85 初筛取 Top5 ───►│ • ATR 吊灯跟踪止损平仓 │
└─────────────────────────┘ └─────────────────────────┘一、相对强弱指标(RPS)与动态股票池联动
相对价格强度(Relative Price Strength, RPS)衡量个股过去 日涨幅在全市场股票中的分位数排名:
只有 的领涨强势股才能进入趋势交易备选池(初筛候选池),再从中取 RPS 排名前 5 名构成最终交易池,有效避开弱势盘整股对资金的无谓占用。
import pandas as pd
import numpy as np
def calculate_market_rps(df_prices: pd.DataFrame, window: int = 120) -> pd.Series:
"""
计算截面相对强弱分位数 RPS(合成教学样例,历史表现不代表未来,存在幸存者偏差风险)
输入 df_prices 为宽表价格(行=日期、列=股票代码), 函数内部先做 pct_change 计算区间涨幅;
切勿传入已算好的收益率序列, 否则会被再次 pct_change 导致结果错误。
"""
returns_n = df_prices.pct_change(window).iloc[-1]
rps_series = returns_n.rank(pct=True) * 100.0
return rps_series
# 合成数据示例:5只股票,10个交易日价格
rng = np.random.default_rng(42)
dates = pd.date_range('2023-01-01', periods=10)
symbols = ['AAPL', 'GOOGL', 'MSFT', 'AMZN', 'TSLA']
price_data = {}
for sym in symbols:
price_data[sym] = 100.0 * np.cumprod(1.0 + rng.normal(0.001, 0.02, 10))
df_prices = pd.DataFrame(price_data, index=dates)
# 计算 RPS 并打印结果
rps_result = calculate_market_rps(df_prices, window=5)
print("===== 截面相对强弱分位数 (RPS) 计算示例 =====")
print(f"计算日期: {df_prices.index[-1].date()}")
print(f"计算窗口: 5个交易日")
print("各股票 RPS 值:")
for sym, val in rps_result.items():
print(f" {sym}: {val:.2f}")
print(f"RPS 最高股票: {rps_result.idxmax()} ({rps_result.max():.2f})")===== 截面相对强弱分位数 (RPS) 计算示例 =====
计算日期: 2023-01-10
计算窗口: 5个交易日
各股票 RPS 值:
AAPL: 20.00
GOOGL: 40.00
MSFT: 80.00
AMZN: 60.00
TSLA: 100.00
RPS 最高股票: TSLA (100.00)二、股票池内趋势择时信号生成与仓位限制
在入选池内,个股收盘价突破过去 20 日最高价时触发买入信号。为控制组合集中度风险,单只标的最大分配权重为 。
import pandas as pd
import numpy as np
def generate_pool_trend_signals(df_prices: pd.DataFrame, pool_symbols: list) -> pd.DataFrame:
"""
股票池内趋势突破信号生成(合成教学样例,历史回测不代表未来,存在前视偏差风险)
"""
signals = pd.DataFrame(index=df_prices.index)
for sym in pool_symbols:
high_20 = df_prices[sym].rolling(20).max().shift(1)
signals[sym] = (df_prices[sym] > high_20).astype(int)
return signals
# 合成数据示例:3只股票,30个交易日价格
rng = np.random.default_rng(123)
dates = pd.date_range('2023-01-01', periods=30)
pool_symbols = ['STK_A', 'STK_B', 'STK_C']
price_data = {}
for sym in pool_symbols:
price_data[sym] = 50.0 * np.cumprod(1.0 + rng.normal(0.0002, 0.015, 30))
df_prices = pd.DataFrame(price_data, index=dates)
# 生成趋势突破信号
signals_df = generate_pool_trend_signals(df_prices, pool_symbols)
print("===== 股票池趋势突破信号生成示例 =====")
print(f"股票池: {pool_symbols}")
print(f"数据期间: {df_prices.index[0].date()} 至 {df_prices.index[-1].date()}")
print("最近5个交易日的信号矩阵:")
print(signals_df.tail())
print(f"信号触发总次数: {signals_df.sum().sum()}")===== 股票池趋势突破信号生成示例 =====
股票池: ['STK_A', 'STK_B', 'STK_C']
数据期间: 2023-01-01 至 2023-01-30
最近5个交易日的信号矩阵:
STK_A STK_B STK_C
2023-01-26 0 0 0
2023-01-27 1 0 0
2023-01-28 1 0 0
2023-01-29 1 0 0
2023-01-30 1 0 0
信号触发总次数: 7📝 动手练一练
编写 Python 仿真测试,模拟 RPS 筛选前 5 名股票池并在池内触发趋势突破交易:
import pandas as pd
import numpy as np
def calculate_market_rps(df_prices: pd.DataFrame, window: int = 120) -> pd.Series:
"""
计算截面相对强弱分位数 RPS(合成教学样例,历史表现不代表未来,存在幸存者偏差风险)
输入 df_prices 为宽表价格(行=日期、列=股票代码), 函数内部先做 pct_change 计算区间涨幅;
切勿传入已算好的收益率序列, 否则会被再次 pct_change 导致结果错误。
"""
returns_n = df_prices.pct_change(window).iloc[-1]
rps_series = returns_n.rank(pct=True) * 100.0
return rps_series
def generate_pool_trend_signals(df_prices: pd.DataFrame, pool_symbols: list) -> pd.DataFrame:
"""
股票池内趋势突破信号生成(合成教学样例,历史回测不代表未来,存在前视偏差风险)
"""
signals = pd.DataFrame(index=df_prices.index)
for sym in pool_symbols:
high_20 = df_prices[sym].rolling(20).max().shift(1)
signals[sym] = (df_prices[sym] > high_20).astype(int)
return signals
# 合成数据:20只股票,100个交易日
rng = np.random.default_rng(42)
dates = pd.date_range('2023-01-01', periods=100)
symbols = [f'S_{i:02d}' for i in range(20)]
price_data = {}
for s in symbols:
price_data[s] = 100.0 * np.cumprod(1.0 + rng.normal(0.0005, 0.02, 100))
df_prices = pd.DataFrame(price_data, index=dates)
# 1. 计算 RPS 选出 Top 5
rps = calculate_market_rps(df_prices, window=60)
top_symbols = list(rps.nlargest(5).index)
# 2. 生成趋势信号
signals = generate_pool_trend_signals(df_prices, top_symbols)
total_signals = signals.sum().sum()
print("================ 股票池趋势协同策略测试 ================")
print(f"入选 Top 5 强势股票池: {sorted(top_symbols)}")
print(f"股票池内累计触发突破次数: {total_signals} 次")
print(f"策略验证: 股票池筛选数量 {'PASS' if len(top_symbols) == 5 else 'FAIL'}")
print("注:合成样例演示机制,历史回测不代表未来,实盘需防范过拟合风险。")
print("======================================================")运行结果输出:
================ 股票池趋势协同策略测试 ================
入选 Top 5 强势股票池: ['S_03', 'S_04', 'S_07', 'S_09', 'S_10']
股票池内累计触发突破次数: 79 次
策略验证: 股票池筛选数量 PASS
注:合成样例演示机制,历史回测不代表未来,实盘需防范过拟合风险。
======================================================👉 点击查看解析
本次练习重点演示趋势型策略与股票池机制的协同设计。关键结论是:先按趋势条件构建或更新候选股票池,再在池内触发买卖信号,能有效缩小策略作用范围、减少无效交易。
本章小结
- 两级火箭驱动机制:一级火箭通过多因子股票池锁定强势领涨主线,二级火箭利用技术突破精准择时。
- 严格单票权重控制:通过等权重或风险平价限制单一标的暴露上限,防范个股踩雷风险。
- 动态淘汰与更新:跌出 RPS 阈值或触发止损的标的立即移出股票池,资金迅速释放至高分候选标的。
📋 行动清单 (Action Checklist)
- 运行股票池趋势测试代码,测算 RPS 阈值(80 vs 90)对交易胜率的影响;
- 为趋势信号增加成交量放大(Volume > 1.5 * VMA)确认条件;
- 预习下一节,深入掌握趋势择时信号的设计方法与状态机实现。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。