RQData 是一个基于 Python 的金融数据工具包。它为量化工程师们提供了丰富整齐的历史数据以及简单高效的 API 接口,最大限度地免除了您进行数据搜索、清洗的烦恼。这样的数据服务是整个 Ricequant SDK 的基础,取决于您的需求,它可以独立使用而不依赖 Ricequant SDK 的其他组件。
# 关于 RQData 的一些基础知识
# 关于架构
RQData 的基本架构为客户端——服务端模式,即数据存储在服务端,而客户端向服务端发送数据请求,服务端向客户端返回数据的模式。因此客户端被叫做rqdatac
,这里c
代表client
,即客户端的意思。
# 安装
Rqdatac 的安装:
pip install rqdatac
若您有 rqdatac_fund 和 rqdatac_bond 包,请执行以下代码同时安装 rqdatac 和对应包
仅安装其中一个包,请将[]中名字换成您的包名
pip install "rqdatac[fund]"
同时安装多个包
pip install "rqdatac[fund,bond]"
# RQData 初始化
跟所有的 Python 包一样,如果要使用它,就必须导入它。使用 RQData 只需要在安装了 Ricequant SDK 的虚拟环境中运行 Python 代码,并在调用任何金融数据之前导入一个rqdatac
的包。
随后调用rqdatac.init()
来对 RQData 进行初始化。在首次调用 RQData 的任何 API 之前都必须执行该语句,但例外的是如果您在 Ricequant SDK 环境下使用rqsdk shell
命令调出的 iPython 环境不需要执行rqdatac.init()
语句,而是import rqdatac
之后可以直接调用其他 API。
import rqdatac
rqdatac.init()
# 查看版本号及登录信息
就像任何软件一样,RQData 也有它自己的版本号,可以通过下面的 API 检查当前的登录状态版本号:
# rqdatac.info
获取用户当前登录版本、服务器信息
# 返回
rqdatac version: 当前使用的 rqdata 版本号
server address:域名:端口
# 范例
- 获取用户登录信息
[In]
info()
[Out]
rqdatac version: 2.6.0
sever address: rqdatad-pro.ricequant.com:16011
You are using account: +86186XXXX6610
# 流量配额
在非本地化部署的情况下,RQData 的每一次调用都需要从服务端拉取对应的数据,这些数据量将会产生流量。米筐为每日可拉取的最高流量做了限制(或不做限制,取决于您购买的授权类型),您可以通过下面的 API 来查看当前的流量使用情况。同时还能查看当前许可证的到期期限和许可证类型。
客户端与服务端之间的传输协议为米筐为数据传输开发的二进制协议,并在传输时对数据进行了压缩,因此传输流量大概在实际数据量的三分之一左右。而米筐的流量配额是按实际传输流量来计算的,因此完全可以满足正常的甚至突发的使用情况。
为避免影响正式的客户,RQData 对于试用账户进行了每天 50MB 的配额限制。虽然正式使用账户米筐有不限量的选项,但是普通的限额账户在上述的压缩算法下,已经完全满足绝大部分的使用需求了。
如果您对这些信息有任何疑虑,请立即联系我们的技术支持团队。
# rqdatac.user.get_quota - 获取用户配额信息
获取用户当前配额使用信息,目前可以提供的有今日已用流量、今日可用流量上限。
# 返回
dict
字段 | 类型 | 说明 |
---|---|---|
bytes_limit | int | 每日流量使用上限(单位为字节),如为 0 则表示不受限 |
bytes_used | int | 当日已用流量(单位为字节) |
remaining_days | int | 剩余期限(单位为天) |
license_type | str | “TRIAL” 表示试用账户,“FULL” 表示付费用户 |
# 范例
- 获取用户配额信息
[In]
rqdatac.user.get_quota()
[Out]
{'bytes_limit': 0, 'bytes_used': 954'remaining_days': 16,'license_type': 'TRIAL'}
# API 中关于日期的格式支持
RQData 的 API 中设计日期作为参数的非常多,因此对于日期格式的支持也非常丰富。具体支持见下表:
格式描述 | 格式示例 |
---|---|
数字 YYYYDDMM | 20150101 |
字符串"YYYY-DD-MM" | "2015-01-01" |
datetime 对象 | datetime.datetime (2015, 1, 3) |
date 对象 | datetime.date (2015, 1, 3) |
Pandas Timestamp | pandas.Timestamp ('20150103') |
具体示例如下:
import rqdatac, pandas, datetime
rqdatac.init()
rqdatac.get_price('000001.XSHE', start_date=20150101, end_date="2015-02-01")
rqdatac.get_price('000002.XSHE', start_date=pandas.Timestamp("20150101"), end_date=datetime.datetime(2015,2,1))
# 保存数据为 csv 文件
通过 RQData API 返回的数据绝大部分为Pandas (opens new window)的DataFrame
格式,方便您通过 Pandas 强大的 API 进行后续的分析工作。但是如果您已有用其他语言编写的投研工具,只是希望获得 RQData 中的原始金融数据,则可以通过下面的方法输出原始数据为 csv 文件:
import rqdatac
rqdatac.init()
# get_price的返回值为Pandas.DataFrame类型,可以直接调用其to_csv接口
value = rqdatac.get_price('000001.XSHE', start_date=20150101, end_date=20150201)
value.to_csv('xxxx.csv')
# RQData 内部的专有名词解释
- rqdatac:RQData 客户端(即 RQData Client)。
- rqdatad:RQData 服务端(即 RQData Daemon)。
- order_book_id:这是米筐内部对于合约代码、股票代码、债券代号等指向某个金融产品实例的编号的统称。这是米筐为了兼容多市场而自定义的一个字段,它的取值在任何时间跨度内全局唯一。
# 快速上手
# 安装及配置
RQData 的安装根据于您的使用方式也会有所不同。
# 使用线上平台的 IPython Notebook 环境及回测环境
不需要任何的安装或配置,而且所有的包已经预先导入,您无需使用前述的import rqdatac
或rqdatac.init()
,在使用 RQData API 时也无需添加rqdatac
的前缀,可以直接使用,例如:
get_price('000001.XSHE', start_date=20150101, end_date=20150201)
# 本地安装 RQData
请参考Ricequant SDK 安装教程。在您完成 Ricequant SDK 的安装之后,您的环境里即可以使用 RQData。
米筐也提供独立的 RQData 安装方式,请在申请试用或开通正式账户后查收米筐为您准备的安装指引邮件。米筐推荐使用 Ricequant SDK 的方式安装并管理 RQData 及其许可证信息。
如果您在回测引擎 RQAlpha Plus 中使用 RQData,可以省略rqdatac.init()
语句的调用。
# 私有化部署的安装
将 RQData 的服务端rqdatad
及其依赖的数据库部署到本地服务中以实现局域网环境低时延的访问体验,是 RQData 产品提供的私有化部署方案。如果您有这方面的需求,请联系我们的销售。
私有化部署的服务端将由米筐工作人员为您完成,您只需要提供服务器的访问端口即可。而客户端的安装与互联网版本的 RQData 并无二致,米筐技术支持会提供详细的安装帮助。
# 开始使用
前文已描述过 RQData 的安装及其在不同环境中的初始化过程,事实上所有的准备工作就已经就绪了。
而使用 RQData 则异常简单,只需要直接调用您想要的 API 获取数据即可。具体的 API 使用示范都在 API 参考中列出。
RQData 客户端rqdatac
以框架+模块的形式提供了丰富的金融数据。你只需要在文档目录中找到相应的金融产品类型即可。但是在查阅具体金融产品类型之前,我们推荐您先浏览一下 RQData 的基础 API,也可在文档目录中找到相关链接,或直接点击这里。
# 关于数据本身的一些约定
# 期货连续合约
为方便研究,尤其是回测,米筐对期货合约进行了一定的处理,规则如下:
# 主力连续合约
合约首次上市时,以当日收盘同品种持仓量最大者作为从第二个交易日开始的主力合约。当同品种其他合约持仓量在收盘后超过当前主力合约 1.1 倍时,从第二个交易日开始进行主力合约的切换。日内不会进行主力合约的切换。主力连续合约是由该品种期货不同时期主力合约接续而成。
主力连续合约代码以 88、888、889 结尾为例,例如 IF88、IF888、IF889,分别对应了不同的平滑处理算法。
- IF88 为合约量价数据的简单拼接,未做平滑处理
- IF888 为对价格进行了"前复权平滑"处理,处理规则如下:以主力合约切换前一天(T-1 日)新、旧两个主力合约收盘价做差,之后将 T-1 日及以前的主力连续合约的所有价格水平整体加上或减去该价差,以"整体抬升"或"整体下降"主力合约的价格水平,成交量、持仓量均不作调整,成交额统一设置为 0。
- IF889 为对价格进行“后复权平滑”处理,处理规则如下:以主力合约切换当天(T 日)旧、新两个主力合约开盘价做差, 之后将 T 日及以后的主力连续合约的所有价格水平整体加上或减去该价差,成交量、持仓量均不作调整,成交额统一设置为 0。
# 指数连续合约
由当前品种全部可交易合约以累计持仓量为权重加权平均得到,代码以 99 结尾,例如 IF99。
主力合约的判断标准:合约首次上市时,以当日收盘同品种持仓量最大者作为从第二个交易日开始的主力合约。当同品种其他合约持仓量在收盘后超过当前主力合约 1.1 倍时,从第二个交易日开始进行主力合约的切换。日内不会进行主力合约的切换。
# 郑商所相关
由于郑商所本身的一些问题,我们在数据上做了一定的处理,规则如下:
合约代码:郑商所的合约代码我们统一做了补齐,例如 CF701 补齐为 CF1701 以避免 2007 年的合约与 2017 年的合约无法分辨的问题。
成交额及成交量:由于郑商所的历史数据中 tick 成交额存在错误(该累积量存在随时间递减的情况),导致整个数据不可信。所以合成过程中若分钟成交额
TotalTurnover
出现负数,则将该分钟字段设置为 0,但分钟成交量TotalVolumeTrade
正常。日线合成:日线数据由当日 tick 数据合成,未包含盘后交易的成交数据(该数据交易所未披露完全)。
品种代码切换:一些商品期货交易品种存在合约代码修改的问题。因为变动前后它们的合约乘数产生了变化,所以目前我们将修改前后的期货合约当做两种合约来处理。而实际上,它们交易的又是同一品种,价格水平具备连续性。所以在主力连续与指数连续合约的处理上,我们做了区分处理。举例来说,强麦的主力连续合约我们有“强麦主力连续(旧)”和“强麦主力连续”,分别对应'WS88'和'WH88'的合约代码。一些变动的期货代码列举如下:
品种 | 品种代码(变动前) | 品种代码(变动后) |
---|---|---|
强麦 | WS(1305 及以前) | WH |
普麦 | WT (1211 及以前) | PM |
菜籽油 | RO(1305 及以前) | OI |
早籼稻 | ER(1305 及以前) | RI |
甲醇 | ME(1505 及以前) | MA |
动力煤 | TC(1604 及以前) | ZC |
# 期权数据相关
支持的期权数据品种
交易所 | 品种 | 行权方式 | 上市日期 | 交易时间 |
---|---|---|---|---|
上交所 | 50ETF 期权 | 欧式 | 2015-02-09 | 09:31 至 11:30, 13:01 至 15:00 |
上交所 | 300ETF 期权 | 欧式 | 2019-12-23 | 09:31 至 11:30, 13:01 至 15:00 |
上交所 | 500ETF 期权 | 欧式 | 2022-09-19 | 09:31 至 11:30, 13:01 至 15:00 |
上交所 | 科创 50 期权 | 欧式 | 2023-06-05 | 09:31 至 11:30, 13:01 至 15:00 |
上交所 | 科创板 50 期权 | 欧式 | 2023-06-05 | 09:31 至 11:30, 13:01 至 15:00 |
上期所 | CU 铜期权 | 欧式 | 2018-09-21 | 21:01 至 01:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
上期所 | RU 天然橡胶期权 | 美式 | 2019-01-28 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
上期所 | AU 黄金期权 | 欧式 | 2019-12-20 | 21:01 至 02:30, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
上期所 | ZN 锌期权 | 欧式 | 2020-08-10 | 21:01 至 01:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
上期所 | AL 铝期权 | 欧式 | 2020-08-10 | 21:01 至 01:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
上期所 | AG 白银期权 | 美式 | 2022-12-26 | 21:01 至 02:30, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
上期所 | RB 螺纹钢期权 | 美式 | 2022-12-26 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
上期所 | BR 丁二烯橡胶期权 | 美式 | 2023-07-31 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
上海能源 | SC 原油期权 | 美式 | 2021-06-21 | 21:01 至 02:30, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
中金所 | IO 沪深 300 股指期权 | 欧式 | 2019-12-23 | 09:31 至 11:30, 13:01 至 15:00 |
中金所 | MO 中证 1000 股指期权 | 欧式 | 2022-07-22 | 09:31 至 11:30, 13:01 至 15:00 |
中金所 | HO 上证 50 股指期权 | 欧式 | 2022-12-19 | 09:31 至 11:30, 13:01 至 15:00 |
大商所 | M 豆粕期权 | 美式 | 2017-03-31 | 21:01 至 23:30, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
大商所 | C 玉米期权 | 美式 | 2019-01-28 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
大商所 | I 铁矿石期权 | 美式 | 2019-12-09 | 21:01 至 23:30, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
大商所 | PG 液化石油气期权 | 美式 | 2020-03-31 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
大商所 | V 聚氯乙烯期权 | 美式 | 2020-07-06 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
大商所 | L 线型低密度聚乙烯期权 | 美式 | 2020-07-06 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
大商所 | PP 聚丙烯期权 | 美式 | 2020-07-06 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
大商所 | P 棕榈油期权 | 美式 | 2021-06-18 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
大商所 | B 黄大豆期权 | 美式 | 2022-08-08 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
大商所 | Y 豆油期权 | 美式 | 2022-08-08 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
大商所 | A 黄大豆期权 | 美式 | 2022-08-08 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
大商所 | EB 苯乙烯期权 | 美式 | 2023-05-15 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
大商所 | EG 乙二醇期权 | 美式 | 2023-05-15 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
广期所 | SI 工业硅期权 | 美式 | 2022-12-23 | 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
广期所 | LC 碳酸锂期权 | 美式 | 2023-07-24 | 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
深交所 | 300ETF 期权 | 欧式 | 2019-12-23 | 09:31 至 11:30, 13:01 至 15:00 |
深交所 | 创业板 ETF 期权 | 欧式 | 2022-09-19 | 09:31 至 11:30, 13:01 至 15:00 |
深交所 | 中证 500ETF 期权 | 欧式 | 2022-09-19 | 09:31 至 11:30, 13:01 至 15:00 |
深交所 | 深证 1000ETF 期权 | 欧式 | 2022-12-12 | 09:31 至 11:30, 13:01 至 15:00 |
郑商所 | SR 白糖期权 | 美式 | 2017-04-19 | 21:01 至 23:30, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | CF 棉花期权 | 美式 | 2019-01-28 | 21:01 至 23:30, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | MA 甲醇期权 | 美式 | 2019-12-16 | 21:01 至 23:30, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | TA 精对苯二甲酸期权 | 美式 | 2019-12-16 | 21:01 至 23:30, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | RM 菜粕期权 | 美式 | 2020-01-16 | 21:01 至 23:30, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | ZC 煤期权 | 美式 | 2020-06-30 | 21:01 至 23:30, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | OI 菜籽油期权 | 美式 | 2022-08-26 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | PK 花生仁期权 | 美式 | 2022-08-26 | 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | PX 对二甲苯期权 | 美式 | 2023-09-18 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | SH 烧碱期权 | 美式 | 2023-09-18 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | SA 纯碱期权 | 美式 | 2023-10-20 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | PF 短纤期权 | 美式 | 2023-10-20 | 21:01 至 23:00, 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | AP 苹果期权 | 美式 | 2023-10-20 | 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | SM 锰硅期权 | 美式 | 2023-10-20 | 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | SF 硅铁期权 | 美式 | 2023-10-20 | 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
郑商所 | UR 尿素期权 | 美式 | 2023-10-20 | 09:01 至 10:15, 10:31 至 11:30, 13:31 至 15:00 |
合约代码规则
合约代码用以唯一标识当前合约,针对商品期权,不同交易所的命名规则有所不同。简便起见,米筐提供的期权数据统一合约规则为【标的合约代码(大写)】+【四位到期年月】+【认购认沽类型(大写)】+【行权价格水平】的方式进行:
交易所 | 原始合约代码 | 米筐合约代码 | 变动规则 |
---|---|---|---|
上期所 | cu1901C46000 | CU1901C46000 | 标的合约代码大写 |
郑商所 | SR901C4400 | SR1901C4400 | 到期月份改为 4 位 |
大商所 | m1901-C-2500 | M1901C2500 | 标的合约代码大写,去掉连字符 |
上证 50ETF 期权标的分红问题
与商品期权不同,上证 50ETF 期权存在行权价以及合约乘数变动的情况(因标的 50ETF 分红而进行的调整,详情请参考上证有关合约条款)故 50ETF 期权全部以数字作为合约代码,例如:合约代码10000615
对应的合约简称为510050C1612M02050
,代表 2016 年 12 月到期的行权价是 2.05 元的认购期权。但由于 50ETF 于当年 11 月 29 日分红,交易所对合约进行了调整 —— 合约行权价由 2.05 变为了 2.006,合约乘数由 10000 变为了 10220,合约简称变为了510050C1612A02050
,但合约代码并没有变。由于存在上述情况,您就需要通过10000615
这一合约代码来获取这一期权合约的历史数据了。并且我们在日线中加入了行权价与合约乘数信息,让您能够追踪它们的变动。
# 指数相关
米筐 399001.XSHE、399006.XSHE、399005.XSHE 成交量和成交额的计算范围为各自的成分股,和深交所公布的上述指数的成交量和成交额存在差异。
深交所公布的行情中深证综指(399106.XSHE)和深证成指(399001.XSHE),创业板综(399102.XSHE)和创业板指(399006.XSHE),中小板综(399010.XSHE)和中小板指(399005.XSHE)的成交量和成交额相同。