SPL:相邻记录引用
对于按照一定次序排列的数据进行计算,经常会遇到跨行引用的情况,比如股票价格相比前一天的涨幅是多少,求某支股票的 20 日均价等等。
SPL支持在循环计算时,通过相对位置进行相邻记录的引用。
【例 1】 求上证指数每天收盘价较前日上涨了多少。上证指数部分数据如下:
DATE |
CLOSE |
OPEN |
VOLUME |
AMOUNT |
2020/01/02 |
3085.1976 |
3066.3357 |
292470208 |
3.27197122606E11 |
2020/01/03 |
3083.7858 |
3089.022 |
261496667 |
2.89991708382E11 |
2020/01/06 |
3083.4083 |
3070.9088 |
312575842 |
3.31182549906E11 |
2020/01/07 |
3104.8015 |
3085.4882 |
276583111 |
2.88159227657E11 |
2020/01/08 |
3066.8925 |
3094.2389 |
297872553 |
3.06517394459E11 |
… |
… |
… |
… |
… |
SPL脚本如下:
A |
|
1 |
=T("SSEC.csv") |
2 |
=A1.sort(DATE) |
3 |
=A2.derive(CLOSE/CLOSE[-1]:INCREASE) |
A1: 导入上证指数表。
A2: 使用函数 sort 按日期排序。
A3: 计算每天股价与前日的涨幅。其中 CLOSE[-1] 表示前日的价格。函数 derive 用于为序表增加计算列。
我们可以使用相对位置的区间,来引用相邻记录组成的序列。
【例 2】列出上证指数 2020 年 1 月 1 日至 10 日每天的 20 日收盘均价。上证指数部分数据如下:
DATE |
CLOSE |
OPEN |
VOLUME |
AMOUNT |
2020/01/02 |
3085.1976 |
3066.3357 |
292470208 |
3.27197122606E11 |
2020/01/03 |
3083.7858 |
3089.022 |
261496667 |
2.89991708382E11 |
2020/01/06 |
3083.4083 |
3070.9088 |
312575842 |
3.31182549906E11 |
2020/01/07 |
3104.8015 |
3085.4882 |
276583111 |
2.88159227657E11 |
2020/01/08 |
3066.8925 |
3094.2389 |
297872553 |
3.06517394459E11 |
… |
… |
… |
… |
… |
A |
|
1 |
=T("SSEC.csv") |
2 |
=A1.sort(DATE) |
3 |
=A2.pselect@a(DATE>=date("2020/01/01") &&DATE<=date("2020/01/10")) |
4 |
=A2(A3).derive(A2.calc(A3(#),avg(CLOSE[-19:0])):MA20) |
A1: 导入上证指数表。
A2: 使用函数 sort 按日期排序。
A3: 选出 2020 年 1 月 1 日到 10 日之间的记录所在的行号。
A3: 根据选出的行号循环计算每天的 20 日收盘均价。其中 CLOSE[-19:0] 表示前 19 日和当日的收盘价序列。
SPL也支持分组内的相邻记录引用。
【例 3】 多支股票数据,计算每支股票内的每日涨幅。股市部分数据如下:
DATE |
CODE |
NAME |
CLOSE |
OPEN |
AMOUNT |
2020/01/02 |
000001 |
SS |
3085.1976 |
3066.3357 |
3.27197122606E11 |
2020/01/03 |
000001 |
SS |
3083.7858 |
3089.022 |
2.89991708382E11 |
2020/01/06 |
000001 |
SS |
3083.4083 |
3070.9088 |
3.31182549906E11 |
2020/01/07 |
000001 |
SS |
3104.8015 |
3085.4882 |
2.88159227657E11 |
2020/01/08 |
000001 |
SS |
3066.8925 |
3094.2389 |
3.06517394459E11 |
… |
… |
… |
… |
… |
… |
SPL脚本如下:
A |
|
1 |
=T("Stock.csv") |
2 |
=A1.sort(DATE) |
3 |
=A2.group(CODE) |
4 |
=A3.(~.derive(CLOSE/CLOSE[-1]:INCREASE)).conj() |
A1: 导入股市数据表。
A2: 使用函数 sort 按日期排序。
A3: 将股市数据按照股票代码分组。
A4: 循环对每支股票,计算其每天股价与前日的涨幅。最后将所有记录合并。
【例 4】 求每支股票的最高收盘价那一天,与前一日相比交易量的涨幅是多少。股市部分数据如下:
DATE |
CODE |
NAME |
CLOSE |
OPEN |
AMOUNT |
2020/01/02 |
000001 |
SS |
3085.1976 |
3066.3357 |
3.27197122606E11 |
2020/01/03 |
000001 |
SS |
3083.7858 |
3089.022 |
2.89991708382E11 |
2020/01/06 |
000001 |
SS |
3083.4083 |
3070.9088 |
3.31182549906E11 |
2020/01/07 |
000001 |
SS |
3104.8015 |
3085.4882 |
2.88159227657E11 |
2020/01/08 |
000001 |
SS |
3066.8925 |
3094.2389 |
3.06517394459E11 |
… |
… |
… |
… |
… |
… |
SPL脚本如下:
A |
|
1 |
=T("Stock.csv") |
2 |
=A1.sort(DATE) |
3 |
=A2.group(CODE) |
4 |
=A3.new(CODE,NAME,(p=~.pmax(CLOSE),~.calc(p,AMOUNT/AMOUNT[-1])):INCREASE) |
A1: 导入股市数据表。
A2: 使用函数 sort 按日期排序。
A3: 将股市数据按照股票代码分组。
A4: 根据分组后的股市数据创建序表。循环选出每支股票收盘价最高的记录所在的行号,并计算出当日成交量与前日成交量的涨幅。