3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
针对您在 JoinQuant(聚宽)官网和一创聚宽平台使用 jqlib.technical_analysis 库时遇到的问题,以下是详细的解答:
聚宽官方 API 文档中并没有穷举 jqlib.technical_analysis 下所有技术指标(如 MTM、MACD、KDJ 等)的每一个参数。官方文档的建议是:在聚宽的“投资研究”环境中使用 Python 的内置帮助函数来查看源码和参数说明。
查询方法:
在聚宽的研究环境(Jupyter Notebook)中新建一个 Notebook,输入以下代码运行:
from jqlib.technical_analysis import MTM
# 方法一:使用问号查看(推荐)
MTM?
# 方法二:使用 help 函数
help(MTM)
这会直接打印出该函数的 Docstring,里面包含了计算公式、输入参数(Inputs)和输出结果(Outputs)的详细说明。
结论:这两种写法在底层数据处理上是不等价的。
MTM(df.index, today, timeperiod=8, unit='1d', include_now=True, fq_ref_date=None)jqlib 库经过了多次迭代升级,底层很可能接入了更强大的 get_bars API。因此它支持:
unit: 指定 K 线周期(如分钟线、日线)。include_now: 是否包含当前尚未走完的 Bar 的数据。fq_ref_date: 精确控制复权基准日。MTM(df.index, today, timeperiod=8)jqlib,底层可能依赖于旧版的 history 或 attribute_history 函数,这些旧函数不支持灵活的复权基准日和 include_now 参数。结果差异巨大,主要由以下几个原因导致:
根据聚宽官方文档的特别说明:“一创聚宽已于2023-12-29停止维护”。这意味着一创聚宽的代码库、数据源和底层 API 已经停留在过去,而聚宽官网一直在持续更新。两边的 jqlib 版本不同,计算逻辑可能已经发生了修正或优化。
官网代码中 fq_ref_date=None 表示获取不复权的真实价格来计算指标。而一创聚宽的旧版函数可能默认使用了前复权数据。技术指标(尤其是涉及价格差值的 MTM 动量指标)在复权和不复权数据上的计算结果会截然不同。
官网代码中 include_now=True 表示计算指标时包含了当天的最新价格(可能是盘中价格)。而一创聚宽的旧版函数可能默认不包含当天数据(只计算到昨天),或者处理当前 Bar 的逻辑不同。这会导致指标产生一根 K 线的滞后或数值偏差。
官方文档指出:“策略运行的环境如果不相同的话,可能导致不同,例如聚宽官网和一创聚宽”。底层 Python 版本(Python 2 vs Python 3)、底层 Pandas 库的版本差异,在处理 NaN 值或浮点数精度时也可能导致技术指标的细微偏差,进而引发交易信号的不同。
fq_ref_date=None 或显式设置为当前日期),以避免除权除息导致的技术指标跳空失真。get_bars 获取基础的 close 价格序列,然后使用 talib 库或 pandas 自行计算 MTM 指标,这样可以保证在任何环境下结果的绝对一致性。