SPL量化工作台使用教程-4 双均线策略——SPL公式
类似于Excel中的ifs函数,用Excel的语法写出来大概是这样:ifs(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;表示取区间
我们再来用这个工作台实现业界常见的双均线策略。
双均线策略基于这样一种假设:观察长期均线(如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:

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


所有评论(0)