问题描述
在策略中想加个股息率因子,
但是找了半天好像聚宽的因子里面没有现成的,
如果自己去季报提取,
因为日期对不上,
提取出来的数据比较混乱,
所以,想请教下大神,
怎么样获得个股最近一期的股息率数据?
非常感谢~~~
解决方案
在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_price 或 get_current_data 自行计算。
计算逻辑:
- 查询该股票过去一年(TTM)的每股派息金额(税前或税后)。
- 获取该股票当前的最新价格。
- 股息率 = 过去一年每股派息总额 / 当前股价
自行计算示例代码:
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,仔细查找是否有现成的股息率因子,这能为您节省大量处理数据对齐的时间。 - 注意复权问题:如果您自行计算,请确保分红金额与股价的复权状态相匹配。通常使用不复权的每股派息除以不复权的当前股价计算最为准确。