问题描述
解决方案
在PTrade量化交易平台中,获取一只股票的除权除息(分红、送股、配股)历史记录,主要使用 get_stock_exrights 接口。
以下是具体的获取方法、代码示例及字段说明。
1. 核心函数
get_stock_exrights(stock_code, date=None)
- stock_code: 股票代码(如
'600570.SS')。 - date: 查询日期。
- 如果不传入该参数(默认
None),则返回该股票历史上所有的除权除息信息。 - 如果传入具体日期(如
'20230510'),则只返回该日期的信息。
- 如果不传入该参数(默认
2. 代码示例
以下策略代码展示了如何在 initialize 或 handle_data 中获取某只股票的全部除权除息记录并打印到日志中。
def initialize(context):
# 设置要查询的股票代码,例如:恒生电子
g.security = '600570.SS'
set_universe(g.security)
# 在初始化阶段直接调用(也可以在 handle_data 中调用)
# 不传入 date 参数,获取该股票上市以来的所有除权除息记录
ex_rights_df = get_stock_exrights(g.security)
if ex_rights_df is not None:
log.info("股票 %s 的除权除息历史记录如下:" % g.security)
log.info(ex_rights_df)
else:
log.info("股票 %s 没有查询到除权除息记录。" % g.security)
def handle_data(context, data):
pass
3. 返回数据说明
该函数返回一个 pandas.DataFrame 对象,索引(Index)为除权除息日(date,格式为 int64,如 20230615)。
主要列名及其含义如下:
| 字段名 | 类型 | 含义说明 |
|---|---|---|
| bonus_ps | float | 每股分红(单位:元)。即每股派发的现金红利。 |
| allotted_ps | float | 每股送股(单位:股)。即每股送红股的数量。 |
| rationed_ps | float | 每股配股(单位:股)。即每股配股的数量。 |
| rationed_px | float | 配股价(单位:元)。配股时的执行价格。 |
| exer_forward_a | float | 前复权因子A(用于计算前复权价格:Price * A + B)。 |
| exer_forward_b | float | 前复权因子B。 |
| exer_backward_a | float | 后复权因子A。 |
| exer_backward_b | float | 后复权因子B。 |
4. 注意事项
- 数据类型:返回的 DataFrame 中,日期的索引通常是整数类型(如
20200605),在进行时间序列处理时可能需要转换为 datetime 对象。 - 空值处理:如果某只股票没有任何除权除息记录(例如刚上市的新股),该函数会返回
None,代码中务必增加if ex_rights_df is not None:的判断,防止报错。 - 适用范围:该函数在研究、回测和交易模块中均可使用。
Q&A
Q: 如何只查询某一天的除权除息信息?
A: 在调用函数时传入 date 参数即可,例如:get_stock_exrights('600570.SS', date='20220615')。
Q: 返回的数据中 bonus_ps 是税前还是税后?
A: 通常情况下,行情数据中提供的每股分红(bonus_ps)指的是税前派息金额。
Q: 为什么我查询到的 DataFrame 是空的或者 None?
A: 如果返回 None,说明该股票在历史上没有发生过除权除息事件,或者该股票代码输入有误。请检查代码后缀(如 .SS 或 .SZ)是否正确。
Q: 这个函数能获取到未来的分红预案吗?
A: 不能。get_stock_exrights 获取的是已经实施或正式公告确权的除权除息信息(即交易所发布的除权数据),不包含董事会预案阶段的数据。