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) |
运行效果: