3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 PTrade 量化平台中,调用历史行情接口(如 get_history 和 get_price)时,fq(复权)参数用于处理股票因送股、转增、分红等除权除息事件导致的价格不连续问题。正确选择复权模式对于真实还原历史走势、避免回测未来函数至关重要。
PTrade 的 fq 参数支持以下 4 种模式:
| fq 参数值 | 复权模式名称 | 价格基准 | 适用场景 | 说明 |
|---|---|---|---|---|
None |
不复权 | 当前实际历史成交价 | 实盘委托、计算真实交易成本 | 真实还原历史撮合价格,但在除权除息日价格会出现缺口 |
'pre' |
前复权 | 以当前最新除权日/今天为基准 | 因子计算、技术指标分析(如 MA、MACD) | 保持当前价格不变,将历史价格向下修正,适合大多数日线及分钟线技术指标计算 |
'dypre' |
动态前复权 | 以**查询时间点(回测当时)**为基准 | 量化策略回测 | 严格避免未来函数。仅根据查询时刻前已发生的除权信息调整历史价格 |
'post' |
后复权 | 以股票上市首日为基准 | 长期业绩评估、复利收益率计算 | 保持上市首日价格不变,将后续价格向上修正,真实反映股票自上市以来的累计涨幅 |
fq='pre') 与 动态前复权 (fq='dypre') 的关键区别pre):每次计算都以“今天(最新日)”为基准调整历史所有价格。如果在回测中间节点调用 fq='pre',可能会引入历史时刻未知的“未来分红/送股”除权因子(即未来的信息影响了过去的价格),产生轻微的未来函数风险。dypre):以回测当时的那个交易日作为复权基准,仅使用当时已经发生的除权数据进行动态前复权,能够彻底消除因使用未来除权因子导致的回测偏差。fq=None) 的场景limit_price)或计算交易印花税/佣金时,必须使用不复权数据。fq='dypre' 或 fq='pre'):
fq='dypre';一般常规回测使用 fq='pre' 即可。fq='post'):
fq=None 或挂单前转化):
limit_price 时,请确保使用未复权行情。def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 1. 计算均线指标:使用动态前复权(dypre)或前复权(pre)数据
df_pre = get_history(10, '1d', 'close', security_list=g.security, fq='dypre', include=False)
ma5 = df_pre['close'][-5:].mean()
# 2. 取得上一个时间点真实收盘价(不复权),用于资金与下单量计算
df_real = get_history(1, '1d', 'close', security_list=g.security, fq=None, include=False)
current_real_price = df_real['close'][-1]
# 策略逻辑:均线突破买入
cash = context.portfolio.cash
if current_real_price > ma5 and get_position(g.security).amount == 0:
# 下单委托时建议使用限价,价格以不复权的实时价格为参考
order_value(g.security, cash, limit_price=current_real_price)
log.info("前复权MA5: %s, 当前真实价格: %s, 买入" % (ma5, current_real_price))