3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
非常理解您的困扰。复权数据作为量化回测和实盘交易的基础,其准确性至关重要。您在 600375.SH (ST 汉马) 上观察到的 get_divid_factors 数据反复变动(从 2.4 到消失,再到 1),确实反映了底层数据处理上的一些问题。
这种情况通常由以下几个原因导致,尤其是在处理 ST 股票或发生复杂公司事件时:
面对这种底层数据异常,您可以采取以下步骤进行处理和规避:
很多时候数据变来变去是因为本地缓存错乱。请尝试手动清理并重新下载:
600375.SH 的相关数据,然后重新补充下载最新数据。由于这是底层数据源的问题,最根本的解决方式是让官方修复。建议您通过券商的专属服务群或 QMT 官方渠道,直接提交该股票代码和具体日期的复权异常情况,要求技术人员核实上游数据。
如果 get_divid_factors 接口暂时不可靠,而您又急需准确的复权因子,可以通过获取同一时间段的复权收盘价和不复权收盘价,自行反推复权因子。QMT 的行情数据(get_market_data_ex)通常比单独的除权除息字典修复得更快。
Python 替代方案示例代码:
#coding:gbk
def init(ContextInfo):
ContextInfo.stock = '600375.SH'
# 订阅数据,确保本地有最新行情
ContextInfo.subscribe_quote(ContextInfo.stock, '1d', 'none')
ContextInfo.subscribe_quote(ContextInfo.stock, '1d', 'front')
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
stock = ContextInfo.stock
# 1. 获取不复权数据
df_none = ContextInfo.get_market_data_ex(
['close'], [stock], period='1d', count=10, dividend_type='none'
)
# 2. 获取前复权数据
df_front = ContextInfo.get_market_data_ex(
['close'], [stock], period='1d', count=10, dividend_type='front'
)
if stock in df_none and stock in df_front:
close_none = df_none[stock]['close']
close_front = df_front[stock]['close']
print(f"--- {stock} 最近10日复权因子推算 ---")
# 遍历日期,计算复权因子 (前复权价格 / 不复权价格)
# 注意:实际复权因子计算可能涉及等比或精确的除权公式,这里提供一个近似的比例参考
for date in close_none.index:
if date in close_front.index:
p_none = close_none[date]
p_front = close_front[date]
if p_none != 0:
# 简单的价格比值,反映复权影响
factor_approx = p_front / p_none
print(f"日期: {date}, 不复权收盘: {p_none:.2f}, 前复权收盘: {p_front:.2f}, 推算比例: {factor_approx:.4f}")
总结:
量化交易中,数据清洗和容错处理是必不可少的一环。对于 ST 股票或发生重大重组的股票,其财务和复权数据往往是“重灾区”。建议在策略中加入对异常复权因子(如突变过大)的过滤逻辑,或者在关键节点使用行情数据进行交叉验证。