🚀 AI 一键生成 joinquant 策略代码

JoinQuant聚宽平台获取个股股息率(Dividend Yield)的完整指南

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

问题描述

请教下大神,怎么获取个股的股息率

在策略中想加个股息率因子,
但是找了半天好像聚宽的因子里面没有现成的,
如果自己去季报提取,
因为日期对不上,
提取出来的数据比较混乱,
所以,想请教下大神,
怎么样获得个股最近一期的股息率数据?
非常感谢~~~

解决方案

在JoinQuant(聚宽)平台上获取个股的股息率(Dividend Yield)数据,确实是很多基本面量化策略中常见的需求。由于上市公司分红通常是按年度或半年度进行,直接从季报提取确实容易遇到时间对齐和数据缺失的问题。

为了解决这个问题,您可以采用以下两种主要方法来获取或计算个股最近一期的股息率:

方法一:直接使用聚宽因子库(推荐,最简单)

聚宽的因子库(jqfactor)中其实包含了数百个因子,您可以直接调用现成的因子数据,这样平台已经帮您处理好了时间对齐和前视偏差(未来函数)的问题。

虽然文档中没有全部列出,但您可以通过 get_all_factors() 查找。通常,股息率相关的因子可能存在于风格因子或基础因子中(例如 divyild 分红因子)。

获取因子值示例代码:

from jqfactor import get_factor_values

def initialize(context):
    g.security = '000001.XSHE'
    run_daily(market_open, time='09:30')

def market_open(context):
    # 假设我们要获取前一个交易日的股息率相关因子(具体因子名请通过 get_all_factors() 确认)
    # 这里以假设的因子名 'dividend_yield' 为例
    try:
        factor_data = get_factor_values(
            securities=[g.security], 
            factors=['dividend_yield'], 
            end_date=context.previous_date, 
            count=1
        )
        dy = factor_data['dividend_yield'].iloc[0, 0]
        log.info(f"{g.security} 的股息率因子值为: {dy}")
    except Exception as e:
        log.error(f"获取因子失败: {e}")

提示:您可以在研究环境中运行 print(get_all_factors()),在输出的 DataFrame 中搜索“股息”或“分红”,找到确切的因子 code。

方法二:利用财务数据和行情数据自行计算(最灵活)

如果因子库中的指标不完全符合您的定义(例如您想严格计算过去12个月的每股派息总额 / 当前股价),您可以通过 finance.run_query 查询分红送股表,结合 get_priceget_current_data 自行计算。

计算逻辑:

  1. 查询该股票过去一年(TTM)的每股派息金额(税前或税后)。
  2. 获取该股票当前的最新价格。
  3. 股息率 = 过去一年每股派息总额 / 当前股价

自行计算示例代码:

from jqdata import *
import pandas as pd
import datetime

def initialize(context):
    g.security = '000001.XSHE'
    run_daily(market_open, time='09:30')

def get_dividend_yield(security, current_dt):
    # 1. 计算过去一年的时间范围
    end_date = current_dt.date()
    start_date = end_date - datetime.timedelta(days=365)
    
    # 2. 查询过去一年的分红数据 (finance.STK_DIVIDEND 表)
    # 注意:实际表名和字段请参考聚宽数据字典中的“分红送股数据”
    q = query(
        finance.STK_DIVIDEND.code,
        finance.STK_DIVIDEND.bonus_amount_rmb # 假设这是每10股派息金额
    ).filter(
        finance.STK_DIVIDEND.code == security,
        finance.STK_DIVIDEND.ex_dividend_date >= start_date,
        finance.STK_DIVIDEND.ex_dividend_date <= end_date
    )
    
    df = finance.run_query(q)
    
    if df.empty:
        return 0.0
        
    # 3. 计算过去一年每股派息总额 (假设数据库中是每10股派息,需除以10)
    total_dividend_per_share = df['bonus_amount_rmb'].sum() / 10.0
    
    # 4. 获取最新股价 (使用前一天的收盘价,避免未来函数)
    price_df = get_price(security, end_date=end_date, count=1, fields=['close'], panel=False)
    if price_df.empty:
        return 0.0
        
    current_price = price_df['close'].iloc[0]
    
    # 5. 计算股息率
    if current_price > 0:
        dividend_yield = total_dividend_per_share / current_price
        return dividend_yield
    else:
        return 0.0

def market_open(context):
    dy = get_dividend_yield(g.security, context.current_dt)
    log.info(f"{g.security} 截至 {context.previous_date} 的计算股息率为: {dy:.4%}")

总结建议

  • 优先查找因子库:在研究环境中运行 get_all_factors() 导出为 CSV,仔细查找是否有现成的股息率因子,这能为您节省大量处理数据对齐的时间。
  • 注意复权问题:如果您自行计算,请确保分红金额与股价的复权状态相匹配。通常使用不复权的每股派息除以不复权的当前股价计算最为准确。