3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您好!导致您手动计算的 EMA 与官方接口返回的 EMA 不一致的根本原因在于价格的复权处理。
您的 EMA 计算公式本身是完全正确的:
EMA_today = EMA_yesterday * 11/13 + Close_today * 2/13
差异出在 Close_today(2020-11-19 的收盘价)上:
EMA、MACD 等)在计算时,默认使用的是前复权价格。因为只有使用复权价格,才能消除分红、送股等除权除息事件对技术指标造成的跳空影响。get_bars 调用:在您的 get_bars 代码中,没有显式指定 fq_ref_date 参数。在研究环境中,如果不指定该参数,默认获取的可能是不复权价格(您获取到的 1720.19 即为茅台当天的真实不复权收盘价)。我们可以反推一下官方接口使用的收盘价:
1696.59976 * (11/13) + X * (2/13) = 1697.759657
解得 X ≈ 1704.14。
这说明官方接口在计算 2020-11-19 的 EMA 时,使用的是前复权收盘价(约 1704.14 元),而不是不复权收盘价(1720.19 元)。
要让手动计算的结果与官方接口一致,您需要在获取 K 线数据时,确保获取的是前复权价格。可以通过在 get_bars 中设置 fq_ref_date 参数来实现。
import datetime
from jqdata import *
# 获取前复权数据,fq_ref_date 设置为当前日期(与官方指标库默认的复权基准一致)
bars = get_bars(
['600519.XSHG'],
8,
unit='1d',
fields=['date', 'open', 'close', 'high', 'low', 'volume', 'money'],
include_now=False,
end_dt=datetime.datetime(2020, 11, 30),
fq_ref_date=datetime.datetime.now() # 关键参数:指定复权基准日获取前复权数据
)
print(bars)
获取到前复权的 close 价格后,再代入您的公式 EMA_yesterday * 11/13 + Close_today * 2/13,计算出的结果就会与官方接口 EMA 的返回值完全一致了。
总结:在量化交易中计算任何依赖历史价格的技术指标(如均线、MACD、BOLL 等)时,都务必使用前复权数据,以保证指标的连续性和准确性。