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