SPL 量化 指标计算

在股票投资领域,量化指标是一种重要的分析工具,它能够帮助投资者更加客观、科学地评估股票的价值和风险。量化指标通常应用一定的数学公式,对原始数据进行处理,得出指标值,然后根据指标值对股票的未来走势进行分析和预测。每一个技术指标都是从一个特定的方面对股价进行观察,通过它们能对股价进行定量分析,反映市场某一方面的深层次内涵,而这些内涵仅仅通过原始数据是很难得出来的。股票的指标种类很多,比如有根据每日交易数据计算的相关指标如 MA、MACD、KDJ 等,还有和股票基本面相关的指标如市盈率、市净率、净利润增长、新增流通股数等。

交易数据相关指标

这里我们以 MA 为例。

MA(Moving average) 移动平均线,以道·琼斯的“平均成本概念”为理论基础,采用统计学中“移动平均”的原理,将一段时期内的股票价格平均值连成曲线,用来显示股价的历史波动情况。

移动平均线 (MA) 计算方法就是求连续若干天收盘价的算术平均。
计算公式: MA = (C1+C2+C3+C4+C5+….+Cn)/n
C 为收盘价,n 为移动平均周期数
例如,5 日移动平均价格计算方法为: MA 5 = (前四天收盘价 + 前三天收盘价 + 前天收盘价 + 昨天收盘价 + 今天收盘价)/5

以时间的长短划分,移动平均线可分为短期、中期、长期几种,综合观察长、中、短期移动平均线,可以研判市场的多重倾向。长、中、短是相对的,可以自己确定。在国内股市中,常利用的移动平均线组合为 5 日、10 日、30 日、60 日、120 日、250 日线。

我们将 MA 的计算写成脚本,使用时直接调用。

脚本代码:


A

1

=data.new(code,tdate,avg(${field}[-(N-1):0]):${field}_MA_${N})

脚本参数:

..

将脚本保存为 "ma.splx"。此脚本可计算任意周期的不同种类的 MA 值。

例如,调用脚本计算浦发银行 2024 年收盘价的 5 日 MA 和成交量的 10 日 MA。


A

B

1

=register@o("fetch_data","fetch_data.splx")

读取交易数据

2

600000

3

2024-01-01

4

2024-12-31

5

=fetch_data@b(A2,A3,A4)

6

=register("ma","ma.splx")

将脚本登记为函数

7

=ma(A5,"close",5)

收盘价 5 日 MA

8

=ma(A5,"volume",10)

成交量 10 日 MA

运行效果:

A7 收盘价 5 日 MA:

..

A8 成交量 10 日 MA:

..

ma.splx这个脚本很短,只有一句就写成一个脚本文件会显得有点累赘。SPL 还有一种函数机制可以把脚本中的自定义函数登记成固有函数。这样我们就可以只定义一个脚本,然后把一些短小的指标用自定义函数的形式写到这个脚本中。

脚本代码示例:


A

B

1

func ma(data,field,N)

=data.new(code,tdate,avg(${field}[-(N-1):0]):${field}_MA_${N})

2

func ema()

……

3

func sma()

……

……


脚本保存为 index.splx。

调用脚本计算 MA:


A

B

读取交易数据

6

=call@f("index.splx")

调用脚本并登记其中的函数

7

=ma(A5,"close",5)

调用函数 ma

股票基本面相关的指标

这里我们以当日新增流通股占比为例。

新增流通股占比 = 新增流通股数 / 流通股本。

脚本代码:


A

B

1

=register@o("fetch_data","fetch_data.splx")

读取交易数据

2

=fetch_data(cn,date(start),date(end))

3

=file("company.btx").cursor@b(code,statdate,liqashare)

读取基本面数据

4

=A3.select(code==cn && statdate>=date(start) && statdate<=date(end)).fetch()

5

=A4.(statdate)

将交易数据按照财报统计日期分组,每个季度为一组

6

=A2.derive(A5.pseg(date(tdate-1)):pseg)

7

=A6.group(pseg)

8

=A7.(~.derive(A4(A7.#).liqashare)).conj()

按季度去基本面数据取数

9

=A8.new(code,tdate,liqashare,if(#>1,(liqashare-liqashare[-1])/liqashare,0):add_liqashare)

计算当日新增流通股占比

脚本参数:

..

将脚本保存为 "add_liqashare.splx"。此脚本可计算某支股票在任意时间段的当日新增流通股占比。

例如计算浦发银行在 2010-01-01 至 2020-12-31 之间的当日新增流通股占比。


A

1

=register("add_liqashare","add_liqashare.splx")

2

600000

3

2010-01-01

4

2020-12-31

5

=add_liqashare(A2,A3,A4)

运行效果:

..