次方量化 全球宏观 每月宏观 公众号 股票开户

量价过滤+2种动量先后过滤(优)

lindercube 2个月前 (11-07) 阅读数 121 #量化教程
核心原理:从 “大类资产 ETF 池” 中,通过「基础过滤→动量评分→成交量验证→RSRS 趋势强度」四轮筛选,选出单只最强势标的持仓,叠加日内止损和年度治理,追求稳健趋势收益。

一、核心前提(复现必固定)

  1. 运行依赖:聚宽(JQData)环境,需调用 jqdata numpy pandas 库,数据接口和下单函数用聚宽原生工具。
  2. 基础参数(不可改)
    • 动量计算周期:25 天

    • 日内止损线:-3%(当日跌幅超 3% 清仓)

    • 成交量阈值:近 7 日均量的 2 倍(超阈值排除)

    • RSRS 计算参数:18 天斜率周期、250 天滚动窗口(20 天子窗口)

    • 调仓时间:每日 10:40 执行核心调仓;10:00 检测日内止损;13:30 检测成交量异常

    • 资金来源:子账户 1(占总资金 50%),单笔最小下单 2000 元,ETF 最小买入 100 份

  3. 固定 ETF 池(7 只,大类资产覆盖)
    代码名称资产类型
    513520.XSHG日经 ETF跨境指数
    513100.XSHG纳指 100跨境指数
    513020.XSHG港股科技港股科技
    510180.XSHG上证 180国内宽基
    588120.XSHG科创板国内科技成长
    159915.XSHE创业板国内成长
    511090.XSHG30 年国债 ETF债券(避险)

二、核心逻辑:四轮筛选(按顺序执行,缺一不可)

1. 第一轮:基础过滤(规避短期风险)

目的:先排除明显有问题的标的,减少后续计算量。
  • 筛选规则:

    ① 上市时间:无需额外过滤(代码池标的均满足上市时长要求,复现时可直接用)。

    ② 短期暴跌过滤:取标的过去 3 天价格(含当日最新价),计算每日跌幅(当日价 / 前一日价)。若任意一天跌幅<0.95(即跌超 5%),直接排除。【近3天,无暴跌5%】

2. 第二轮:日内止损过滤(10:00 提前执行)

目的:避免当日持仓大幅亏损,提前止损。
  • 计算逻辑:

    当日实时涨幅 =(当前最新价 - 当日开盘价)/ 当日开盘价

  • 筛选规则:若涨幅 ≤ -3%(即跌超 3%),直接排除该标的(哪怕后续得分高也不纳入选择)。【当天无下跌3%】

3. 第三轮:动量评分(核心筛选,和全球选基策略完全一致)

目的:量化标的 “短期趋势强度 + 可靠性”,得分越高,趋势越稳。【加权斜率动量】
  • 计算步骤(必须按公式复现):

    ① 数据准备:

    取标的过去 25 天的前复权收盘价 + 当日最新价,共 26 个价格数据(记为 prices)。

    ② 对数转换:log_prices = np.log(prices)(把非线性的价格涨幅,转化为线性可拟合的序列)。

    ③ 构造自变量和权重:

    • 自变量 x:[0,1,2,...,25](共 26 个数字,对应 26 个价格时间点)。

    • 权重 w:[1, 1.04, 1.08,...,2](线性递增,近期价格权重更高,计算:np.linspace(1,2,26))。

      ④ 加权最小二乘拟合:

      用 np.polyfit(x, log_prices, 1, w=w) 得到斜率 slope(核心)和截距(无用,可忽略)。

      ⑤ 计算年化收益率:annualized_return = math.exp(slope × 250) - 1(250 为年化交易日数)。

      ⑥ 计算拟合优度 R²(判断趋势可靠性):

    • 残差 resid = log_prices - (slope×x + 截距)(实际值与拟合值的差距)。

    • 加权残差平方和 ss_res = np.sum(w × resid × resid)

    • 加权总平方和 ss_tot = np.sum(w × (log_prices - np.mean(log_prices))²)

    • R² = 1 - ss_res/ss_tot(R² 越接近 1,价格趋势越线性,越可靠)。

      ⑦ 最终得分:score = annualized_return × R²

  • 筛选规则:只保留得分>0 的标的(得分≤0 代表无正向趋势,直接排除)。


4. 第四轮:成交量过滤(13:30 执行,分回测 / 实盘)

目的:规避异常放量后的回调风险,确保趋势有资金支撑。
  • 计算逻辑:

    ① 近 7 日均量:avg_vol = 过去7天成交量之和 ÷ 7(用 attribute_history 获取历史成交量)。

    ② 当日成交量:

    • 回测场景:用前一日成交量替代(因回测无实时 1 分钟数据)。

    • 实盘场景:用当日截至 13:30 的累计成交量(用 get_price 取 1 分钟数据求和)。

  • 筛选规则:若当日成交量 > avg_vol × 2(即异常放量),直接排除该标的。【避免当日放2倍均量】

5. 第五轮:RSRS 过滤(趋势强度验证,关键风控)

目的:通过高低点斜率判断标的 “支撑 - 阻力强度”,避免弱势反弹标的。
  • 核心逻辑:RSRS 斜率越大,说明标的 “低点抬高、高点也抬高” 的趋势越强,支撑越稳固。【计算rsrs动量值】

  • 计算步骤:

    ① 计算 18 天 RSRS 斜率(slope18):

    取过去 18 天的每日最低价和最高价,用 np.polyfit(最低价序列, 最高价序列, 1) 得到斜率(斜率为正,代表低点和高点同步上升)。

    ② 计算斜率阈值 beta(安全线):

    • 取过去 250 天的高低点数据,按 20 天为一个窗口,滚动计算斜率(每次算 20 天的高低点斜率),得到多个斜率值。

    • beta = 斜率均值 - 2×斜率标准差(相当于斜率的 “下限安全线”,低于则趋势过弱)。

      ③ 计算趋势强度:strength = (slope18 - beta) ÷ abs(beta)(大于 0 代表强于安全线)。

  • 筛选规则(满足任一即可):【rsrs动量强度和均线配合】

    ① strength > 0.15(趋势极强,直接通过)。

    ② 0.03 < strength ≤ 0.15 + 当前价 ≥ 5 日均线(趋势较强,且价格在短期均线上方)。

    ③ strength ≤ 0.03 + 当前价 ≥ 10 日均线(趋势一般,但价格在中期均线上方,有支撑)。

    • 不满足以上任意一条 → 排除。


三、调仓执行逻辑(每日 10:40 触发)

1. 无合格标的 → 清仓

如果四轮筛选后,没有符合条件的 ETF,直接清仓子账户 1 的所有持仓(目标金额设为 0),持现金等待。

2. 有合格标的 → 轮动持仓(只持 1 只)

① 确定目标标的:筛选后按动量得分降序排序,取排名第一的 ETF。② 现有持仓判断:
  • 若当前持仓就是目标标的 → 不调仓(保持持仓)。

  • 若当前持仓不是目标标的 → 先卖出原有持仓(目标金额 0),再用子账户 1 全部可用资金买入目标标的(需满足:单笔金额≥2000 元,且为 100 份的整数倍)。

3. 额外风控执行(每日固定时间)

  • 10:00 日内止损:检查当前持仓标的,若当日跌幅≤-3%,立即清仓。

  • 13:30 成交量异常检测:检查当前持仓标的,若当日成交量>近 7 日均量 ×2且价格低于当日开盘价,立即清仓。

四、年度治理(固定时间执行,无需手动干预)

  1. 11 月最后一个交易日 14:50 → 清仓子账户 1 所有持仓(为 12 月再平衡做准备)。

  2. 12 月第一个交易日 09:20 → 按目标权重(子账户 1 占总资金 50%)重新分配资金,之后执行正常调仓逻辑(买入筛选出的标的)。

五、复现关键细节(避坑重点)

  1. 数据缓存:当日的 get_current_data()(实时数据)、attribute_history(历史数据)只获取一次,缓存复用(代码中 _cur() _ah() 函数的作用,提升复现速度)。

  2. 下单函数:必须用 order_target_value_send,先按金额下单,失败后自动回退为 “100 份整数倍” 下单(避免因金额不足一手导致下单失败)。

  3. 均线计算:5 日均线 / 10 日均线,用过去 5 天 / 10 天的收盘价均值计算(用 attribute_history 获取数据后求平均)。

要不要我帮你整理一份ETF 轮动策略复现核对表,把每个步骤的 “计算公式 + 数据来源 + 检查点” 列出来,直接对照就能完成复现?



image.png

分享到:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门
标签列表