3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,股票的除权除息(如送股、分红)会导致股价出现非交易因素的断崖式下跌。如果不对历史和实时行情进行**复权(Adjustment)**处理,技术指标(如均线、MACD)就会产生错误的买卖信号。
QMT 平台提供了完善的复权机制,支持前复权、后复权、等比前复权、等比后复权。本文将详细介绍如何在 QMT 实盘或运行模式中获取并处理复权数据。
在编写策略时,你可以通过 ContextInfo.dividend_type 获取当前运行环境(主图)所设置的复权处理方式:
def handlebar(ContextInfo):
# 获取当前主图复权方式
# 返回值可能为: 'none'(不复权), 'front'(前复权), 'back'(后复权), 'front_ratio'(等比前复权), 'back_ratio'(等比后复权)
div_type = ContextInfo.dividend_type
print(f"当前主图复权方式为: {div_type}")
在实盘或运行模式中,推荐使用 ContextInfo.get_market_data_ex() 接口获取行情,并通过 dividend_type 参数指定复权方式。若设置为 'follow',则会自动跟随主图的复权设置。
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
# 获取沪深300成分股的前复权数据
data = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close'],
stock_code=['600000.SH'],
period='1d',
count=100,
dividend_type='front', # 可选: 'none', 'front', 'back', 'front_ratio', 'back_ratio', 'follow'
subscribe=True
)
df = data['600000.SH']
print(df.tail())
如果你需要自主计算复权价格,或者在策略中记录除权除息事件,可以使用 ContextInfo.get_divid_factors() 接口获取指定股票的除权除息日和复权因子映射关系:
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
# 获取浦发银行的除权除息日和复权因子
factors = ContextInfo.get_divid_factors('600000.SH')
print("除权除息因子数据:", factors)
如果你使用的是较早的 get_history_data 或 get_market_data 接口,其复权参数定义如下:
ContextInfo.get_history_data 的 dividend_type 参数:0:不复权1:向前复权2:向后复权3:等比向前复权4:等比向后复权# 示例:获取2天前复权收盘价
his_dict = ContextInfo.get_history_data(len=2, period='1d', field='close', dividend_type=1)
tick 级实时分笔数据时,返回的均是不复权的真实成交价。若策略基于 Tick 驱动且需要复权价格,需结合日线复权因子自行换算。