核心思想: 市场在放量大涨时形成的阶段性高点具有重要的阻力意义。当价格后续能够强势突破这个由多个放量高点构成的“阻力墙”时,往往意味着真正的强势趋势到来,是极佳的入场时机。


A、策略逻辑

  1. 识别关键放量点:首先,我们不是关注所有的高点,而是只关注那些伴随着成交量显著放大(能量驱动)的价格高点。这些点代表了当时多空双方激烈博弈的位置,尤其是多方获胜的位置,其高点将成为未来重要的阻力位。
  2. 构建阻力区域:单个放量高点的阻力可能不可靠。因此,我们找出近期多个这样的放量高点,并取它们中的最高价TOP 5的平均值,形成一个“阻力区域”。这个区域比单一价格点更具代表性,过滤了噪音。
  3. 等待有效突破:当价格运行到这个阻力区域附近时,我们并不立即行动。而是等待价格以强势的姿态(例如,用收盘价确认)完全突破这个区域,这表明买方力量已经完全消化了历史上所有的抛压,后市继续上涨的概率较大。
  4. 出场与风险控制:入场后,如果价格再次跌回阻力区域下方,说明此次突破是“假突破”,应立即止损离场

B、计算公式与参数

  • N:回顾的历史周期,例如 N=100(天)。
  • Volume_Multiple:成交量放大倍数,例如 2。
  • Top_X:所要选取的放量高点的个数,例如 X=5。
  • Lookback_Close:突破确认的周期,例如 2(天),用于判断收盘价是否站稳。

具体计算步骤:

  1. 筛选条件K线

对于每一个交易日 t,在过去的 N 根K线中,筛选出所有满足以下条件的K线:
条件: (成交量(t_i) / 成交量(t_i-1)) >= Volume_Multiple

  1. 找出顶级高点:

将所有满足条件的K线对应的最高价 (high(t_i)) 取出,形成一个列表。

从这个列表中,找出前 Top_X 个最大的最高价(如 Top 5 Highest Highs)。

  1. 计算关键阻力位:

阻力位 Resistance = 平均值(Top_X个最高价)

  1. 生成交易信号:
    • 买入信号(Bullish Breakout):
      当前收盘价(close(t)) > Resistance
      AND
      前M根K线的收盘价(例如close(t-1)) <= Resistance (确保是刚刚突破,而不是早已突破)
    • 卖出信号(Sell / Stop Loss):
      当前收盘价(close(t)) < Resistance (突破后再次跌回阻力位下方,视为假突破,止损出场)

C、买卖时机

买入时机(开多仓):
在交易日结束时(例如,下午3点),如果系统计算出当日收盘价首次成功突破了计算得到的Resistance阻力位,则在下一个交易日开盘时以昨日收盘价买入。

  • 为什么用收盘价确认? 避免盘中假突破的噪音。
  • 为什么下一个交易日开盘买入? 这是一个非常普遍且合理的交易指令执行方式,确保了策略的可操作性。

卖出时机(平多仓/止损):

  • 主动止损:在持仓后的任何一天,如果收盘价跌破了之前突破的那个Resistance位

(此时它已转变为支撑位),则在下一个交易日开盘时卖出平仓,止损离场。

  • 主动止盈:可以设置一个固定的风险回报比,例如“盈利达到止损幅度2倍时止盈离

场”。

    • 假设你在 Entry_Price 入场,止损价是 Resistance。
    • 止损幅度 Stop_Loss_Range = Entry_Price - Resistance
    • 目标盈利价 Take_Profit_Price = Entry_Price + (2 * Stop_Loss_Range)
    • 当收盘价达到或超过 Take_Profit_Price 时,下一个交易日开盘止盈。
  • 被动止盈:如果一直未触发止损和主动止盈,可以一直持有,直到反向信号出现(例

如,一个基于放量低点的支撑下破策略信号)。

根据上述描述,我们来实现此策略(需要注意,这里因为需要用到前100个交易日的数据,所以要先设置提前读100天的数据):

第一步先定义关键阻力位Resistance指标:

  1. SPL公式:什么是~?

SPL公式中,波浪号~用作当前行引用符号。当对K线数据进行循环计算时,~表示当前正在处理的那根K线。在循环函数(如sum()select()等)中,~提供了对当前行的直接引用,简化了集合运算的表达。

用法示例:

~[-100:-1]   //其含义为过去100个交易日的K线数据组成的集合

技术特性说明:

  1. 上下文绑定~的取值由当前执行的迭代上下文决定
  2. 动态引用:在多层嵌套迭代中,~总是指向最内层循环的当前元素
  3. 类型多态~可以表示简单数据类型的值,也可以表示行、序列等对象
  4. 表达式简写:与字段名配合使用时可以省略,如~.成交量可简写为成交量。之前例子都使用了这个简写形式,也就一直没有出现过~。

此符号的设计显著提升了SPL公式处理结构化数据时的简洁性和表达效率。

  1. SPL公式:什么是select函数?

函数说明:

       选出序列中符合条件的成员

语法:

A.select( x )

备注:

       针对序列A的每个成员计算表达式x,返回使表达式的值为真的成员组成的新序列。参数省略时返回所有成员。

参数:

A

序列。

x

布尔表达式,可为null。

返回值:

       序列/序表

用法示例:

~[-100:-1].select(成交量/成交量[-1]>=2)   //其含义为从过去100个交易日的K线数据中,选出成交量比头天翻倍的K线

  1. SPL公式:什么是top函数?

函数说明:

序列成员计算表达式后获取前n个值组成的序列。

语法:

A.top(n,x)

针对序列A的成员计算表达式x后排序,返回前n个x值组成的序列。

A.top(n;x,...)

针对序列A的成员计算表达式x,…后排序,返回前n个A成员组成的序列。

A.top(n,y,x)

针对序列A的成员先计算表达式x,再对x结果值进行y计算,然后根据y值对x排序,获取前n个x值组成的序列。

备注:

针对序列的每个成员计算表达式,排序后返回前n个值组成的序列。

序列存在重复成员时,默认采用连续排名方式。

n>0时取前n个最小值,n<0时取前n个最大值,n为0时返回null,n不可省略,x省略解释为~。

参数:

A

序列。

n

整数。

y

表达式。

x

表达式。

选项:

@1

n为±1时返回单值。

@0

不忽略null,缺省忽略null。

@r

采用美式排序,即并列名次占用名次。

@i

采用中式排序,即并列名次不占用名次。

返回值:

序列

用法示例:

       ~[-100:-1].select(成交量/成交量[-1]>=2).top(-5,最高)          //其含义为从过去100个交易日的K线数中,选出成交量比头天翻倍的K线,再从中选出最高价排前五的K线


       第二步:定义买入信号:

       第三步:定义卖出信号:

       第四步:定义策略:

提交后可以看到回测结果:

可以看到,600690这只股票使用此策略后,在23年实现了3.08%的盈利。

SPL量化工作台(临时)网址:http://stock.raqsoft.com.cn:8092/model.jsp

因股票信息量大,请在大屏幕电脑上使用浏览器操作,不合适小屏幕手机体验。

工作台首页:https://www.raqsoft.com.cn/wx/splqt.html (长期有效,临时网址变更时可从这里获取最新的)。

社区网址:https://c.raqsoft.com.cn/tag/QuantitativeTrading

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐