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: 根据分组后的股市数据创建序表。循环选出每支股票收盘价最高的记录所在的行号,并计算出当日成交量与前日成交量的涨幅。

SSEC.csv

Stock.csv