我们再来用这个工作台实现业界常见的双均线策略。

双均线策略基于这样一种假设:观察长期均线(如10日均线),和短期均线(如5日均线)。股票价格的动量会朝着短期均线的方向移动。当短期均线穿过长期均线,并超过长期移动平均线时,动量将向上,此时股价可能会上涨,判断为买入。反之,如果短期均线的移动方向相反,股价则可能下跌,判断为卖出。

这时候,对于回测区间的第一天来说,判断是否买入卖出要用前面10个交易日的数据来计算,因此需要往前读10天的数据,这就用到了提前读数的功能:

提前读的这10天数据可以显示也可以不显示,由显示勾选框来决定。

此策略用到的长期均线和短期均线都需要先定义成指标,方便后面的表达式使用,所以我们第一步先定义这两个指标:

选择SPL公式,输出列类型为普通,输出列名为MA5(表示5日均线),表达式为收盘[-4:0].avg()

这句公式中出现了中括号的语法,[a:b]的形式表示取区间值,如,收盘[-4:0]表示取区间收盘价,从往前数第4天开始取,一直取到当前行(0表示当前行),即共计取到5天的收盘价,再用avg()函数求平均值就是5日MA;同理,收盘[-9:0].avg()就是计算10日均价,10日均价的输出列名定义为MA10:

  1. SPL公式:什么是收盘[-4:0]

在SPL公式中,收盘[-4:0]表示对 收盘列进行相对位置范围引用,这是一种强大的滑动窗口引用语法。

收盘[-4:0] 表示以当前行为中心,向前取4行,再加上当前行本身(0表示当前行)构成的子序列。这种引用方式特别适合实现滑动窗口计算、移动平均等需要上下文数据的分析场景。"

这种灵活的窗口引用机制使得SPL公式能够用非常简洁的语法实现复杂的滑动窗口分析,包括:

函数说明:

用于计算序列中所有数值元素的算术平均值,它会自动忽略非数值元素,确保计算的准确性。

函数语法:

A.avg()

参数说明:

       A     序列

用法示例:

       收盘[-4:0].avg()

类似的函数:

       count:统计序列中非空元素的数量

sum:计算数值序列中所有元素的总和,自动忽略非数值元素

max:找出序列中的最大值

min:找出序列中的最小值

mode:找出序列中出现频率最高的值(众数)

以上这些函数的语法和用法都和avg一致,不再一一赘述。


有了这两个均价指标列,可以先以图形的方式观察一下:

  • 基本特性
    • 窗口定义:[起始偏移:结束偏移] 定义相对位置窗口
    • 包含边界:包含起始和结束偏移位置的行
    • 动态窗口:窗口大小固定但内容随当前行位置变化
    • 自动截断:当窗口超出序列边界时自动截断
  • 示例数据表
  • 行号

    日期

    收盘

    1

    2022-01-04

    28.85

    2

    2022-01-05

    29.43

    3

    2022-01-06

    29.57

    4

    2022-01-07

    30.22

    5

    2022-01-10

    29.62

  • 收盘[-4:0] 运算过程
  • 当前处理行

    收盘[-4:0]取值

    窗口包含的行位置

    2022-01-04

    [28.85]

    行1,无法向前取4行

    2022-01-05

    [28.85,29.43]

    行1-2,无法向前取足4行

    2022-01-06

    [28.85,29.43,29.57]

    行1-3,无法向前取足4行

    2022-01-07

    [28.85,29.43,29.57,30.22]

    行1-4,无法向前取足4行

    2022-01-10

    [28.85,29.43,29.57,30.22,29.62]

    行1-5,完整取足前4行

  • 边界情况处理
    • 起始边界:当向前取不到足够行时,窗口自动缩小
    • 结束边界:当向后取不到足够行时,窗口自动缩小
    • 空窗口:极端情况下可能返回空序列
    • 对称窗口:也支持如 收盘[-2:2] 这样的对称窗口
  • 应用场景
    • 移动平均计算
    • 滚动统计量
    • 前后行对比分析
    • 局部趋势计算等
  • SPL公式:avg()函数

从图上可以看到一些很明显的上穿下穿交叉点。

下一步就定义买卖信号列:

选择SPL公式,输出列类型选择信号,输出列名MA5_10_Signal,表达式if(MA5>MA10 && MA5[-1]<=MA10[-1]:1,MA5<MA10 && MA5[-1]>=MA10[-1]:-1;0),最后点提交:

数据显示框中可以看到MA5_10_Signal的值:

说明:if(MA5>MA10 && MA5[-1]<=MA10[-1]:1,MA5<MA10 && MA5[-1]>=MA10[-1]:-1;0)表达式的含义:当MA5>MA10 && MA5[-1]<=MA10[-1]满足时返回1,当MA5<MA10 && MA5[-1]>=MA10[-1]满足时返回-1,否则返回0,类似于Excel中的ifs函数,用Excel的语法写出来大概是这样:ifs(MA5>MA10 && MA5[-1]<=MA10[-1],1,MA5<MA10 && MA5[-1]>=MA10[-1],-1,0)

有了信号列,我们再用统计图来对比看一下MA5,MA10, MA5_10_Signal,这里就用到右轴了:

可以看出MA5_10_Signal取值为1或-1的日期,正好是MA5和MA10交叉后的第一天。

最后来定义策略:买入/卖出信号列均下拉选择MA5_10_Signal,买入卖出价格均选择昨日收盘价(因为根据昨日的买卖信号列的值决定第二天的买卖操作,在开盘前只知道昨日的收盘价,没法知道第二天的价格,所以用昨日的收盘价来回测更加符合实际情况),买入股数填100,最大持仓数置空(表示持续买入),最后点提交:

这里,也可以把买入价格和卖出价格配置为今日开盘/收盘价,来感觉一下策略的效果,毕竟实际操盘时是人工操作,可以灵活选用第二天当时发生的实际价格。

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

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

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

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

有疑问可到社区发贴(微信扫码注册),特别是有需要的新指标或做不出来的策略,都可以提出来,我们会再继续完善补充。

Logo

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

更多推荐