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