SPL 量化 获取数据
下载数据
我们将股票数据分享在百度网盘上供下载,每工作日更新。
目前可供下载的数据有 A 股的日 K 线数据、股票代码列表和上市公司的基本面数据
下载链接:
https://pan.baidu.com/s/1fTuqDtIjvxzX22EcbeOvtA?pwd=cd5r
下载数据的文件格式为 btx,是 SPL 的特有二进制格式。
btx 称为集文件,是一种简单、开放的二进制文件格式,它覆盖了 csv 文件的所有功能,并且性能要比 csv 文件快 4-5 倍。
SPL 可以支持 btx 文件的操作计算,也支持各种数据源与 btx 之间的相互转换。
股票日 K 线
文件名: yyyy.trade.btx。
yyyy.trade.btx 文件为yyyy当年的 A 股日线行情;
每天晚上 7、8 点左右会把当天的 A 股日线归并到当年的yyyy.trade.btx 文件中
数据示例:
数据结构:
字段名 |
字段类型 |
含义 |
code |
Integer |
股票代码 |
tdate |
Date |
日期 |
open |
Double |
开盘价 |
close |
Double |
收盘价 |
low |
Double |
最低价 |
high |
Double |
最高价 |
volume |
Long |
成交量 |
amount |
Double |
成交金额 |
pfactor |
Double |
当日价格复权因子 |
注意,股票代码用了整数,而不是常规的字符串,这里 1 表示 000001,2 表示 000002…以此类推。整数的运算性能会远高于字符串。
指数日 K 线
文件名: yyyyMMdd.index.btx, yyyy.index.btx。
yyyyMMdd.index.btx 文件为yyyyMMdd日之前的指数日线行情;
yyyy.index.btx 文件为yyyy当年的指数日线行情;
每天晚上 7、8 点左右会把当天的指数日线归并到当年的yyyy.index.btx 文件中
数据示例:
数据结构:
字段名 |
字段类型 |
含义 |
code |
Integer |
股票代码 |
tdate |
Date |
日期 |
open |
Double |
开盘价 |
close |
Double |
收盘价 |
low |
Double |
最低价 |
high |
Double |
最高价 |
volume |
Long |
成交量 |
amount |
Double |
成交金额 |
pfactor |
Double |
当日价格修正因子 |
注意,股票代码用了整数,而不是常规的字符串,这里 1 表示 000001,2 表示 000002…以此类推。整数的运算性能会远高于字符串。
公司基本面
文件名称:company.btx。
提供 2007 年至今的财务数据,每季度一条。
数据示例:
数据结构:
字段名 |
字段类型 |
含义 |
code |
Integer |
股票代码 |
statdate |
Date |
财报统计的季度的最后一天 |
totalshare |
Long |
总股本 |
liqashare |
Long |
流通股本 |
netprofit |
Double |
净利润 (元) |
mbrevenue |
Double |
主营营业收入 (元) |
未来会再补充更多信息
股票代码列表
文件名称:stock.btx。
提供股票基础信息,包括股票代码、名称、所属行业、上市日期、退市日期等。
数据示例:
数据结构:
字段名 |
字段类型 |
含义 |
code |
Integer |
股票代码 |
name |
String |
股票名 |
exchanges |
String |
中国三大交易所的简写 |
industry |
String |
所属行业 |
ipodate |
Date |
上市日期 |
outdate |
Date |
退市日期 |
指数代码列表
文件名称:indexlist.csv。
提供指数基础信息,包括指数代码、名称、上市日期、退市日期等。
数据示例:
数据结构:
字段名 |
字段类型 |
含义 |
code |
Integer |
股票代码 |
name |
String |
股票名 |
exchanges |
String |
中国三大交易所的简写 |
ipodate |
Date |
上市日期 |
outdate |
Date |
退市日期 |
数据读取
股票代码列表
读取股票列表可以用 T 函数全部读入。
A |
|
1 |
=T("stock.btx") |
运行效果:
指数代码列表
A |
|
1 |
=file("indexlist.csv").import@tc() |
运行效果:
股票日 K 线
将下载的所有yyyy.trade.btx 文件放到同一路径下。
读数脚本代码如下:
A |
|
1 |
=end=ifn(end,now()) |
2 |
=to(year(start),year(end)).(file(~/".trade.btx")).select(~.exists()) |
3 |
=cl=if(ifa(cl), cl.sort(),cl) |
4 |
=if(cl, A2.( ~.iselect@b(cl,code)), A2.(~.cursor@b()) ) |
5 |
=A4.merge(code,tdate).select(tdate>=start && tdate<=end) |
6 |
return A5.fetch@x() |
脚本参数:
cl |
股票代码序列,如 [600000,600001];可以为单值,如 600000;填空表示全读 |
start |
开始日期,如 2024-01-01 |
end |
截止日期,如 2024-12-31。end 为空时截止到当前日期 |
脚本保存为 loadkday.splx,此脚本可返回一支或多支股票任意时间段的 K 线数据。
如读取一支股票的 k 线数据:
A |
||
1 |
600000 |
股票代码 |
2 |
2024-01-01 |
开始日期 |
3 |
2024-12-31 |
截止日期 |
4 |
=call("loadkday.splx",A1,A2,A3) |
调用脚本,返回 600000 股票 2024 年数据 |
5 |
=call("loadkday.splx",A1,A2) |
end为空,截止到当前日期 |
运行效果:
读取多支股票数据,比如读取所有银行股或全部 A 股:
A |
||
1 |
=T("stock.btx").select(industry=="J66货币金融服务 ").(code) |
读取银行股票代码列表 |
2 |
2024-01-01 |
开始日期 |
3 |
2024-01-10 |
截止日期 |
4 |
=call("loadkday.splx",A1,A2,A3) |
调用脚本,返回银行股 2024 年数据 |
5 |
=call("loadkday.splx",A1,A2) |
end为空,截止到当前日期 |
6 |
=call("loadkday.splx",,A2,A3) |
cl为空,读取全部 A 股 |
运行效果:
对于经常使用的脚本,也可以用 register 登记成一个函数来使用。
代码示例:
A |
||
1 |
=register("loadkday","loadkday.splx") |
将脚本登记为函数 |
2 |
=T("stock.btx").select(industry=="J66货币金融服务 ").(code) |
读取银行股票代码列表 |
3 |
2024-01-01 |
开始日期 |
4 |
2024-01-10 |
截止日期 |
5 |
=loadkday(A2,A3,A4) |
返回开始到截止日期的数据 |
6 |
=loadkday(A2,A3) |
end为空,截止到当前日期 |
7 |
=loadkday(,A3,A4) |
cl为空,读取全部股票 |
运行效果同上。
指数日 K 线
将下载的yyyy.index.btx 和yyyyMMdd.index.btx 文件放到同一路径下。
读数脚本代码如下:
A |
|
1 |
=year(now()) |
2 |
=end=ifn(end,now()) |
3 |
=if(year(start)<A1,(A1-1)*10000+1231)|if(year(end)==A1,A1) |
4 |
=A3.(file(~/".index.btx")).select(~.exists()) |
5 |
=cl=if(ifa(cl), cl.sort(),cl) |
6 |
=if(cl, A4.( ~.iselect@b(cl,code)), A4.(~.cursor@b()) ) |
7 |
=A6.merge(code,tdate).select(tdate>=start && tdate<=end) |
8 |
return A7.fetch@x() |
脚本参数:
cl |
指数代码序列,如 [1,2];可以为单值,如 1;填空表示全读 |
start |
开始日期,如 2024-01-01 |
end |
截止日期,如 2024-12-31。end 为空时截止到当前日期 |
脚本保存为 loadkindex.splx,此脚本可返回一支或多支指数任意时间段的 K 线数据。
如读取一支指数的 k 线数据:
A |
||
1 |
1 |
指数代码 |
2 |
2024-01-01 |
开始日期 |
3 |
2024-12-31 |
截止日期 |
4 |
=call("loadkindex.splx",A1,A2,A3) |
调用脚本,返回 000001 指数 2024 年数据 |
5 |
=call("loadkindex.splx",A1,A2) |
end为空,截止到当前日期 |
运行效果:
读取多个指数数据:
A |
||
1 |
=[399001,399002] |
指数代码列表 |
2 |
2025-01-01 |
开始日期 |
3 |
2025-01-10 |
截止日期 |
4 |
=call("loadkindex.splx",A1,A2,A3) |
调用脚本,返回多个指数 |
5 |
=call("loadkindex.splx",A1,A2) |
end为空,截止到当前日期 |
6 |
=call("loadkindex.splx",,A2,A3) |
cl为空,读取全部指数 |
运行效果:
对于经常使用的脚本,也可以用 register 登记成一个函数来使用。
代码示例:
A |
||
1 |
=register("loadkindex","loadkindex.splx") |
将脚本登记为函数 |
2 |
=[399001,399002] |
指数列表 |
3 |
2025-01-01 |
开始日期 |
4 |
2025-01-10 |
截止日期 |
5 |
=loadkindex(A2,A3,A4) |
返回开始到截止日期的数据 |
6 |
=loadkindex(A2,A3) |
end为空,截止到当前日期 |
7 |
=loadkindex(,A3,A4) |
cl为空,读取全部指数 |
运行效果同上。
基本面
(1) 直接读入全部 btx 文件。
当数据文件不大时,可以直接全部读入内存。
代码示例:
A |
B |
|
1 |
=T("company.btx") |
读入基本面数据 |
2 |
=A1.select(code==600000 && statdate>=date("2024-01-01") && statdate<=date("2024-12-31")) |
选出 600000 股票 2024 年数据 |
运行效果:
A1
A2
(2) 只读取某些股票的基本面
也可以用脚本方式只读取某些股票的基本数据。
脚本代码:
A |
|
1 |
=file("company.btx") |
2 |
=if(cl, A1.iselect@b(cl,code), A1.cursor@b()) |
3 |
=end=ifn(end,now()) |
4 |
=A2.select(statdate>=start &&statdate<=end) |
5 |
=A4.fetch() |
6 |
>A2.close() |
7 |
return A5 |
脚本参数:
cl |
股票代码序列,如 [600000,600001];可以为单值,如 600000;也可为空表示全读 |
start |
开始日期,如 2024-01-01 |
end |
截止日期,如 2024-12-31。end 为空时截止到当前日期 |
脚本保存为 loadcompany.splx,此脚本可返回一支或多支股票任意时间段的基本面。
如读取一支股票的基本面:
A |
B |
|
1 |
600000 |
股票代码 |
2 |
2020-01-01 |
开始日期 |
3 |
2020-12-31 |
截止日期 |
4 |
=call("loadcompany.splx",A1,A2,A3) |
调用脚本,返回 2020 年基本面 |
5 |
=call("loadcompany.splx",A1,A2) |
end为空,截止到当前日期 |
运行效果:
读入多支股票的基本面,如读取所有银行股或全部 A 股。
A |
B |
|
1 |
=T("stock.btx").select(industry=="J66货币金融服务 ").(code) |
股票代码序列 |
2 |
2020-01-01 |
开始日期 |
3 |
2020-12-31 |
截止日期 |
4 |
=call("loadcompany.splx",A1,A2,A3) |
调用脚本,返回银行股 2020 年基本面 |
5 |
=call("loadcompany.splx",A1,A2) |
end为空,截止到当前日期 |
6 |
=call("loadcompany.splx",,A2,A3) |
cl为空,读取全部股票 |