🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant 平台如何检测股票是否发生转送(高送转/除权除息)?

joinquant | 发布时间: 2026/5/29
以下内容由 EasyQuant 生成。

问题描述

如何判断股票出现了转送?

请问应该如何判断股票出现了转送?比如我需要在2022年5月14号知道13号002709出现了转送,应该怎么检测?这只股票当时不在我的持仓中。

解决方案

在 JoinQuant(聚宽)平台上,如果股票在你的持仓中,你可以通过 on_event 回调函数中的 DividendsEvent 来捕获分红送股事件。但正如你所说,如果该股票当时不在你的持仓中,这个回调是不会触发的。\n\n对于未持仓的股票,最简单且最可靠的检测方法是对比该股票相邻两个交易日的“复权因子(factor)”。\n\n### 核心逻辑\n当股票发生除权除息(包括分红、送股、转增股本等)时,交易所会调整股票的价格,为了保证历史价格的连续性,聚宽系统中的“复权因子(factor)”会发生变化。因此,只要判断 T 日的复权因子是否与 T-1 日不同,就可以准确知道 T 日是否发生了除权除息(转送)事件。\n\n### Python 实现代码\n你可以使用 get_price 函数获取 factor 字段来进行判断。以下是针对你提出的需求(在2022年5月14日判断 002709 在 5月13日是否发生转送)的代码示例:\n\npython\nimport jqdata\n\ndef check_dividend_or_split(security, target_date):\n # 获取目标日期及前一个交易日,共2天的复权因子数据\n # 注意:这里不需要复权,直接取 factor 字段即可\n df = get_price(security, end_date=target_date, count=2, fields=['factor'], panel=False)\n \n if len(df) < 2:\n print(f"获取 {security} 数据不足,无法判断")\n return False\n \n # 获取 T-1 日和 T 日的复权因子\n factor_prev = df['factor'].iloc[0]\n factor_curr = df['factor'].iloc[1]\n \n # 如果复权因子发生变化,说明发生了除权除息(包含转送)\n if factor_prev != factor_curr:\n print(f"{security} 在 {df.index[1].date()} 发生了除权除息/转送!")\n return True\n else:\n print(f"{security} 在 {df.index[1].date()} 未发生除权除息/转送。")\n return False\n\n# 测试调用(假设当前逻辑时间为 2022-05-14,我们查询 2022-05-13 的情况)\n# 注意:get_price 的 end_date 包含当日,取 count=2 即取 13号 和 12号 的数据\ncheck_dividend_or_split('002709.XSHE', '2022-05-13')\n\n\n### 补充说明\n1. 复权因子的更新时间:聚宽的复权因子会在除权除息日(T日)生效。因此,对比 T 日和 T-1 日的 factor 即可。\n2. 区分分红与送转:复权因子的变化只能告诉你发生了“除权除息”。如果你需要精确区分到底是“现金分红”还是“高送转”,可以通过查询财务数据中的分红配送表,或者结合当天的 closepre_close 价格差异幅度做进一步的逻辑推断。