问题描述
002668.SZ代码除权除息前后最新价不变,2018.7.5的最新价是20.1,2018.7.6除权后最新价仍为20.1。
解决方案
问题原因解析
在 ptrade 量化平台中,如果您发现某只股票在除权除息日(如 002668.SZ 在 2018年7月6日)前后的价格没有发生预期的跳空变化,这通常是因为您在获取历史行情时,使用了复权数据。
在调用 get_history 或 get_price 接口时,有一个关键参数 fq(复权选项)。如果 fq 被设置为 'pre'(前复权)或 'post'(后复权),系统会自动根据除权除息因子对历史价格进行平滑处理,消除因分红、送股等导致的价格缺口。因此,您看到的价格是经过数学调整后的价格,而非当时真实的交易价格。
解决方法
如果您希望看到股票在除权除息日真实的、未经过调整的价格(即包含跳空缺口的价格),您需要在获取行情数据时,将复权参数 fq 设置为 None(不复权)。
示例代码:获取不复权的真实价格
def initialize(context):
g.security = '002668.SZ'
set_universe(g.security)
def handle_data(context, data):
# 获取不复权的历史数据,fq=None
# 这样在除权除息日,您就能看到真实的价格跳空
history_data = get_history(5, '1d', 'close', security_list=g.security, fq=None)
log.info("不复权收盘价:\n%s" % history_data)
进阶:如何获取除权除息的具体信息?
如果您需要在策略中精确知道某只股票在何时发生了除权除息,以及具体的分红、送股比例,ptrade 提供了专门的 API:get_stock_exrights。
示例代码:查询除权除息信息
def initialize(context):
g.security = '002668.SZ'
set_universe(g.security)
def handle_data(context, data):
# 获取该股票历史上所有的除权除息信息
exrights_info = get_stock_exrights(g.security)
if exrights_info is not None:
log.info("除权除息信息:\n%s" % exrights_info)
get_stock_exrights 返回的 DataFrame 中包含以下重要字段:
bonus_ps: 每股分红allotted_ps: 每股送股rationed_ps: 每股配股exer_forward_a/exer_forward_b: 前复权除权因子
总结
- 价格不变:是因为使用了前复权(
fq='pre')或后复权(fq='post')。 - 看真实价格:在
get_history或get_price中设置fq=None。 - 查分红送股:使用
get_stock_exrights接口。