问题描述
解决方案
在 JoinQuant(聚宽)等严谨的量化交易平台中,关于**股息率 TTM(最近十二个月股息率)**的计算和更新机制,通常遵循“基于确定性事实”的原则。针对您的问题,具体解答如下:
1. 股息率 TTM 的更新触发点是什么?
股息率 TTM 的计算通常是基于正式的“实施公告”或“除权除息日”,而不是基于“董事会预案”或“股东大会决议”。
- 预案的不确定性:董事会预案和股东大会决议虽然公布了分红计划,但此时分红尚未实际发生,且在极端情况下仍有变动的可能。量化平台为了保证财务指标的准确性和确定性,通常不会将预案阶段的数据直接纳入 TTM 股息率的计算中。
- 除权除息日 (a_xr_date) 的重要性:在除权除息日,分红派息正式生效,股票价格会进行除息处理,投资者的账户也会在此时(或派息日)实际获得红利。因此,股息数据的正式更新和股息率 TTM 的重新计算,通常是在除权除息日(或实施公告发布后)进行的。
2. JoinQuant 平台的数据处理逻辑
根据 JoinQuant 的 API 文档和数据处理规范:
- 避免未来函数:JoinQuant 的财务数据查询(如
get_fundamentals)严格遵循时间戳。您在某一天查询到的数据,必定是该日期之前(含当日)已经正式披露且生效的数据。 - 动态复权与账户分红:在回测和模拟交易中,如果您开启了动态复权模式(
set_option('use_real_price', True)),当股票发生分红时,系统会在**分红当天(除权除息日)**自动将扣税后的分红现金发放到您的账户中。这也侧面印证了平台是基于实际除权除息日来处理分红逻辑的。 - 事件驱动:JoinQuant 提供了
on_event回调函数,其中的DividendsEvent(分红送股事件)也是在持仓标的实际发生分红送股时触发的。
3. 如何在 JoinQuant 中获取分红数据?
如果您需要查询具体的除权除息日或分红金额,可以使用 JoinQuant 的 finance.run_query 接口查询相关的财务/公司行动数据表(具体表名请参考 JoinQuant 数据字典中的“公司分红”相关表)。
示例代码:在策略中处理分红事件
# 导入聚宽函数库
import jqdata
def initialize(context):
# 开启动态复权模式(真实价格),确保分红能真实反映到账户现金中
set_option('use_real_price', True)
g.security = '000001.XSHE'
order_target(g.security, 1000)
# 监听分红送股事件
def on_event(context, event):
# 判断是否为分红送股事件
if isinstance(event, DividendsEvent):
log.info(f"标的 {event.security} 发生分红送股!")
# 获取分红详情
for dividend in event.dividends:
log.info(f"除权除息日: {dividend['date']}")
if 'bonus_pre_tax' in dividend:
log.info(f"税前分红: {dividend['bonus_pre_tax']}")
总结
计算股息率 TTM 时,不会因为董事会预案或股东大会预案的发布而频繁更新。它依赖于除权除息日(或正式实施公告)这一确定性事件。这样设计是为了确保量化回测的数据严谨性,避免因预案变更而导致的历史数据重绘或未来函数问题。