3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化平台中使用 get_history 函数获取历史行情时,如果遇到复权参数 fq 不起作用的情况,通常有以下几个原因。同时,理解 pre(前复权)和 dypre(动态前复权)的区别对于编写严谨的回测策略至关重要。
fq 失效的常见原因fq 参数设置为什么,获取到的价格都是一样的。fq='pre',而不是变量名。pre (前复权) 与 dypre (动态前复权) 的区别在量化回测中,复权方式的选择直接影响策略的收益计算和是否引入“未来函数”。
pre (前复权 - 静态前复权)pre,假设回测时间是 2020 年,但系统使用的是 2023 年的最新除权数据来调整 2020 年的价格。这意味着你在 2020 年“提前”知道了未来的分红送转信息,会导致回测结果失真(通常会夸大收益)。dypre (动态前复权)context.blotter.current_dt)的价格为基准,向历史倒推进行前复权。dypre。这样可以保证策略在回测时看到的价格曲线,与当时真实站在那个时间点看到的前复权曲线完全一致,从而保证回测的严谨性。你可以通过以下代码在研究模块或回测中验证复权的效果(选择一只近期有过大比例分红或送转的股票,例如某只高送转股票):
def initialize(context):
g.security = '600570.SS' # 恒生电子
set_universe(g.security)
def handle_data(context, data):
# 获取不复权数据
hist_none = get_history(5, '1d', 'close', security_list=g.security, fq=None)
# 获取前复权数据
hist_pre = get_history(5, '1d', 'close', security_list=g.security, fq='pre')
# 获取动态前复权数据
hist_dypre = get_history(5, '1d', 'close', security_list=g.security, fq='dypre')
log.info("不复权收盘价: \n%s", hist_none)
log.info("前复权收盘价: \n%s", hist_pre)
log.info("动态前复权收盘价: \n%s", hist_dypre)
总结:
fq='dypre' 或 fq='post'(后复权),以防止未来函数。fq='pre' 方便与行情软件对照。